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

使用步骤

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

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

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

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

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

音频使用VUR5进行分离伴奏和人声以及消除音频的混响和声,也就是上传一段纯净人声音不要有杂音和伴奏。
视频效果
这个开源伊卡洛斯模型只有24000step,继续训练下去效果可能会更好点。
在线翻唱 | 在线合成 | 训练教程
AI - 女生
AI - 君若
AI - 自己
训练了自己的声音,一个晚上笔记本跑了32000步,效果还是挺好的,数据采集就是声音偏中低,所以高音它唱不了(哭笑)。
模型训练

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

默认写入配置文件,就可以开始训练了,训练途中不想训练了可以停止,下一次可点击继续上一次的训练,当模型跑到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)
评论 (0)