【每日随记】AI翻唱 SO-VITS-SVC 4.0
2023-04-19 / 0 评论 / 116 阅读 / 9 点赞

【每日随记】AI翻唱 SO-VITS-SVC 4.0

发光的神
2023-04-19 / 0 评论 / 116 阅读 / 正在检测是否收录...

简介

So-VITS-SVC是一个开源的离线项目,它使用 SoftVC 内容编码器提取源音频语音特征,然后直接将向量馈入 VITS 中进行转换,它能够保留原始声音的音高和语调特征,目采用NSF HiFiGAN作为声码器来解决声音中断等问题,适用于学术交流和用于通信和学习目的,声音模型的训练用户可以自行训练模型。

lgnhnl24.png

使用步骤

lgnigeuh.png

整合包里是没有模型的,这里我推荐一个训练好了的模型,到这里下载以上三个文件。
伊卡洛斯模型

lgnik5jv.png

下载好后,将这三个文件拖入到 logs\44k 文件内,这样初始化 so-vits-svc 才会有模型文件加载。

lgni9urn.png

安装包是整合好了的,没有什么地方要改的,唯一一个就是给FFmpeg添加环境变量,让so-vits-svc能调用到它,将FFmpeg所在的路径添加到path环境变量中即可。

lgni4iv8.png

好了就是启动web界面的so-vits-svc,启动成功后会自动打开浏览器。

lgni8c7a.png

按照步骤设置好后就点击加载模型,模型加载成功后就可以上传音频了。

lgnj8ls7.png

音频使用VUR5进行分离伴奏和人声以及消除音频的混响和声,也就是上传一段纯净人声音不要有杂音和伴奏。

视频效果

这个开源伊卡洛斯模型只有24000step,继续训练下去效果可能会更好点。
在线翻唱 | 在线合成 | 训练教程

AI - 女生

AI - 君若

AI - 自己

训练了自己的声音,一个晚上笔记本跑了32000步,效果还是挺好的,数据采集就是声音偏中低,所以高音它唱不了(哭笑)。

模型训练

lgnv4kfq.png

将处理好的数据集,创建一个文件例如:tianyi放入到 dataset_raw 文件夹里,音频数据最好是8MB一个音频(数据集越多越好),大小可以用格式工厂进行转换,完成后最后一步点击识别数据集,等待一会就好。

lgnv4em8.png

默认写入配置文件,就可以开始训练了,训练途中不想训练了可以停止,下一次可点击继续上一次的训练,当模型跑到10000步就可以点击训练聚类模型,当然不一定要10000步才算好模型,看自己啦模型好不好要自己测试的。

Py3 API调用

import requests
import soundfile

# Set up the URL of the Flask app
url = "http://127.0.0.1:6842/voice"
input_filename = "1.wav"
input_data, sr = soundfile.read(input_filename)
# Set the desired pitch change and speaker ID
params = {
    "fPitchChange": 1.5,
    "sampleRate": sr,
    "sSpeakId": 0
}

# Send the POST request with the audio file and parameters
with open(input_filename, "rb") as f:
    response = requests.post(url, data=params, files={"sample": f})

# Save the modified audio file returned by the Flask app
output_filename = "output.wav"
with open(output_filename, "wb") as f:
    f.write(response.content)

翻唱API服务

import torch, soundfile, io
import torchaudio, logging
from flask import Flask, request, send_file
from flask_cors import CORS
from inference.infer_tool import Svc, RealTimeVC

app = Flask(__name__)
CORS(app)
logging.getLogger('numba').setLevel(logging.WARNING)

@app.route("/voice", methods=["POST"])
def voice_change_model():
    request_form = request.form
    wave_file = request.files.get("sample", None)
    # 变调信息
    f_pitch_change = float(request_form.get("fPitchChange", 0))
    # DAW所需的采样率
    daw_sample = int(float(request_form.get("sampleRate", 0)))
    speaker_id = int(float(request_form.get("sSpeakId", 0)))
    # http获得wav文件并转换
    input_wav_path = io.BytesIO(wave_file.read())

    # 模型推理
    if raw_infer:
        # out_audio, out_sr = svc_model.infer(speaker_id, f_pitch_change, input_wav_path)
        out_audio, out_sr = svc_model.infer(speaker_id, f_pitch_change, input_wav_path, cluster_infer_ratio=0,
                                            auto_predict_f0=False, noice_scale=0.4, f0_filter=False)
        tar_audio = torchaudio.functional.resample(out_audio, svc_model.target_sample, daw_sample)
    else:
        out_audio = svc.process(svc_model, speaker_id, f_pitch_change, input_wav_path, cluster_infer_ratio=0,
                                auto_predict_f0=False, noice_scale=0.4, f0_filter=False)
        tar_audio = torchaudio.functional.resample(torch.from_numpy(out_audio), svc_model.target_sample, daw_sample)
    # 返回音频
    out_wav_path = io.BytesIO()
    soundfile.write(out_wav_path, tar_audio.cpu().numpy(), daw_sample, format="wav")
    out_wav_path.seek(0)
    return send_file(out_wav_path, download_name="temp.wav", as_attachment=True)


if __name__ == '__main__':
    # 启用则为直接切片合成,False为交叉淡化方式
    # vst插件调整0.3-0.5s切片时间可以降低延迟,直接切片方法会有连接处爆音、交叉淡化会有轻微重叠声音
    # 自行选择能接受的方法,或将vst最大切片时间调整为1s,此处设为Ture,延迟大音质稳定一些
    raw_infer = True
    model_name = "logs/44k/G_3200.pth"
    config_name = "logs/44k/config.json"
    cluster_model_path = "logs/44k/kmeans_10000.pt"
    svc_model = Svc(model_name, config_name, cluster_model_path=cluster_model_path)
    svc = RealTimeVC()
    app.run(port=6842, host="0.0.0.0", debug=False, threaded=True)

9

评论 (0)

取消
0:00