SUI-svc-4.0 / app.py
Miuzarte's picture
Upload app.py
003d572
import io
import os
# os.system("wget -P hubert/ https://huggingface.co/innnky/contentvec/resolve/main/checkpoint_best_legacy_500.pt")
import gradio as gr
import librosa
import numpy as np
import soundfile
from inference.infer_tool import Svc
import logging
logging.getLogger('numba').setLevel(logging.WARNING)
logging.getLogger('markdown_it').setLevel(logging.WARNING)
logging.getLogger('urllib3').setLevel(logging.WARNING)
logging.getLogger('matplotlib').setLevel(logging.WARNING)
model = Svc("logs/44k/G_210000.pth", "configs/config.json", cluster_model_path="logs/44k/kmeans_10000.pt")
# def vc_fn(sid, input_audio, vc_transform, auto_f0,cluster_ratio, noise_scale):
def vc_fn(input_audio, vc_transform, auto_f0,cluster_ratio, noise_scale):
if input_audio is None:
# return "You need to upload an audio", None
return None
sampling_rate, audio = input_audio
# print(audio.shape,sampling_rate)
duration = audio.shape[0] / sampling_rate
# if duration > 45:
# return "请上传小于45s的音频,需要转换长音频请本地进行转换", None
audio = (audio / np.iinfo(audio.dtype).max).astype(np.float32)
if len(audio.shape) > 1:
audio = librosa.to_mono(audio.transpose(1, 0))
if sampling_rate != 16000:
audio = librosa.resample(audio, orig_sr=sampling_rate, target_sr=16000)
print(audio.shape)
out_wav_path = "temp.wav"
soundfile.write(out_wav_path, audio, 16000, format="wav")
print( cluster_ratio, auto_f0, noise_scale)
# out_audio, out_sr = model.infer(sid, vc_transform, out_wav_path,
# cluster_infer_ratio=cluster_ratio,
# auto_predict_f0=auto_f0,
# noice_scale=noise_scale
# )
out_audio, out_sr = model.infer("suijiSUI", vc_transform, out_wav_path,
cluster_infer_ratio=cluster_ratio,
auto_predict_f0=auto_f0,
noice_scale=noise_scale
)
# return "Success", (44100, out_audio.numpy())
return (44100, out_audio.numpy())
app = gr.Blocks()
with app:
with gr.Tabs():
with gr.TabItem("SUI-svc-4.0"):
gr.Markdown(value="""
# 这是AI岁己歌声变声器第二代的在线demo
### 项目:[sovits 4.0](https://github.com/innnky/so-vits-svc/tree/4.0) | 目前模型训练状态:100000steps底模 + 150000steps
#### 查看模型介绍、获取模型移步[Miuzarte/SUImodels](https://huggingface.co/Miuzarte/SUImodels)
||
|-|
||
## 一些注意事项❗❕❗❕:
#### 输入的音频一定要是纯净的干音,不要把歌曲直接扔进来
#### 和声和混响也不能有,UVR分离出人声之后需要注意一下
#### 对陈述语气没多大作用,实在没干音库的话,你可以自己唱然后升十几个调慢慢试效果
#### 推理出来可能吸气音会有较大的电流声,需要后期小修一下,RX10有一键控制呼吸的模块
""")
# spks = list(model.spk2id.keys())
# sid = gr.Dropdown(label="音色", choices=["suijiSUI"], value="suijiSUI")
vc_input3 = gr.Audio(label="输入音频(长度请控制在45s左右,过长可能会爆内存)")
vc_transform = gr.Number(label="变调(整数,可以正负,半音数量,升高八度就是12)", value=0)
cluster_ratio = gr.Number(label="聚类模型混合比例,0-1之间,默认为0不启用聚类,能提升音色相似度,但会导致咬字下降(如果使用建议0.5左右)", value=0)
auto_f0 = gr.Checkbox(label="自动f0预测,配合聚类模型f0预测效果更好,会导致变调功能失效(仅限转换语音,歌声不要勾选此项会究极跑调)", value=False)
noise_scale = gr.Number(label="noise_scale 建议不要动,会影响音质,玄学参数", value=0.4)
vc_submit = gr.Button("转换", variant="primary")
# vc_output1 = gr.Textbox(label="Output Message")
vc_output2 = gr.Audio(label="输出音频(最右侧三个点可以下载)")
# vc_submit.click(vc_fn, [sid, vc_input3, vc_transform,auto_f0,cluster_ratio, noise_scale], [vc_output1, vc_output2])
vc_submit.click(vc_fn, [vc_input3, vc_transform,auto_f0,cluster_ratio, noise_scale], [vc_output2])
with gr.TabItem("在本地推理的教程(MoeSS、sovits4.0)"):
gr.Markdown(value="""
# 在本地使用 [MoeSS](https://github.com/NaruseMioShirakana/MoeSS) 推理:
注意:MoeSS暂未支持使用聚类模型,也没有自动变调,非常建议直接拉取本仓库然后装好环境用sovits4.0的推理脚本进行推理,教程在MoeSS部分之后
#### 备注:
种子影响推理后的随机性效果,噪声规模可以设置成默认的0.4或者直接拉到0,效果有点玄学,可以都试试
推理出来如果出现了一长段较响的电流杂音则需要手动对输入音频分段,或尝试在点击开始转换后出现的“设置SVC参数”对话框中调整(往高了拉,+10 +20)切片阈值再次推理
#### 因为该程序每次更新都会有较大的变化,下面的下载链接都将指向[[MoeSS 4.2.3]](https://github.com/NaruseMioShirakana/MoeSS/releases/tag/4.2.3)
### 0. 下载[[MoeSS本体]](https://github.com/NaruseMioShirakana/MoeSS/releases/download/4.2.3/MoeSS-CPU.7z)、[[hubert]](https://huggingface.co/NaruseMioShirakana/MoeSS-SUBModel/resolve/main/hubert4.0.7z),并解压成以下的文件结构
Windows 7用户需要使用另一个编译版本的本体[[MoeSS-Win7.7z]](https://github.com/NaruseMioShirakana/MoeSS/releases/download/4.2.3/MoeSS-Win7.7z)
```
MoeSS
├── cleaners
├── emotion
├── hifigan
├── hubert
│ └── hubert.onnx
├── Mods
├── OutPuts
├── temp
├── avcodec-58.dll
├── avformat-58.dll
├── avutil-56.dll
├── MoeSS.exe
├── onnxruntime.dll
├── onnxruntime_providers_shared.dll
├── ParamsRegex.json
├── ShirakanaUI.dmres
├── swresample-3.dll
└── swscale-5.dll
```
### 1. 下载[[转换好的onnx模型]](https://huggingface.co/Miuzarte/SUImodels/blob/main/sovits3_48k/v1/Singing/suijiSUI_v1_1M111000_SoVits.onnx),放在 MoeSS\\\Mods\\suijiSUI_v3_100k150000 里面
### 2. 在 MoeSS\\Mods 新建一个 岁己SUI_v3_100k150k.json (文件名不影响程序读取)并写入以下文本,保存时请确保编码为UTF-8,保存时请确保编码为UTF-8,保存时请确保编码为UTF-8
```json
{
"Folder" : "suijiSUI_v3_100k150000",
"Name" : "岁己SUI_v3_100k150k",
"Type" : "SoVits",
"Rate" : 44100,
"Hop" : 512,
"Hubert": "hubert4.0",
"SoVits4": true,
"Characters" : ["岁己SUI"]
}
```
#### 以上步骤完成之后的文件结构应该长这样
```
MoeSS
├── cleaners
├── emotion
├── hifigan
├── hubert
│ └── hubert.onnx
├── Mods
│ ├── 岁己SUI_v3_100k150k.json
│ └── suijiSUI_v3_100k150000
│ └── suijiSUI_v3_100k150000_SoVits.onnx
├── OutPuts
├── temp
├── avcodec-58.dll
├── avformat-58.dll
├── avutil-56.dll
├── MoeSS.exe
├── onnxruntime.dll
├── onnxruntime_providers_shared.dll
├── ParamsRegex.json
├── ShirakanaUI.dmres
├── swresample-3.dll
└── swscale-5.dll
```
### (A卡不用看)如果要使用GPU推理的话,下载[[MoeSS-CUDA.7z]](https://github.com/NaruseMioShirakana/MoeSS/releases/download/4.2.3/MoeSS-CUDA.7z)并按照上方第0步解压,注意需要CUDA版本 ≥ 11.6 < 12 、 CUdnn < 83.0 ,目前30系显卡最新驱动是cuda12,需要降级,建议直接选CPU版本
### 3. 运行 MoeSS.exe / Moess - CUDA.exe
1. 在左上角选择模型 “SoVits:岁己SUI_v1_1M111k” 并等待加载,完成后右边会显示 “当前模型: 岁己SUI_v1_1M111k”
2. 将音频文件拖入程序窗口 或 直接点击开始转换后选择文件 或 在左下角输入框中写入音频文件路径再点击开始转换,支持批量,如:
从 3.0.0 到 4.0.1 MoeSS 终于支持了文件拖放
```
A:\\SUI\\so-vits-svc\\raw\\wavs\\2043.wav
A:\\SUI\\so-vits-svc\\raw\\wavs\\2044.flac
"B:\\引号\\加不加\\都行.mp3"
"D:\\应该吧\\路径有空格\\最好还是加.aac"
"Z:\\作者说\\只能用\\这五种格式.ogg"
```
3. 点击开始转换后可在弹出的参数框中调整对输入音频的升降调,确定后等待最下方进度条走完然后点右上角保存音频文件,批量推理会直接输出至 MoeSS\\OutPuts\\ 无需再保存
# 在本地部署并使用 inference_main.py 处理
#### 我都写成这样了再小白应该都能搞定(不怕麻烦的话)
### 0. 创建一个存放文件的目录,例如 D:\\SUI\\
### 1. 安装所需的软件
1. [miniconda-Python3.8](https://docs.conda.io/en/latest/miniconda.html#windows-installers)(未测试其他Python版本)[点这里可以直接下载](https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Windows-x86_64.exe),Just Me 与 All Users 都行,其余可无脑下一步
2. [git](https://git-scm.com/download/win)(建议使用便携版)[点这里可以直接下载(便携版v2.39.2)](https://github.com/git-for-windows/git/releases/download/v2.39.2.windows.1/PortableGit-2.39.2-64-bit.7z.exe),路径填 D:\\SUI\\git\\
### 2. 在开始菜单中运行 Anaconda Powershell Prompt 并配置环境(除了工作目录,复制粘贴回车即可)
```
# 切换工作目录
cd D:\\SUI\\
# 拉取仓库
.\\git\\bin\\git lfs clone https://huggingface.co/spaces/Miuzarte/SUI-svc-4.0
# 切换工作目录至仓库内
cd D:\\SUI\\SUI-svc-4.0\\
# 创建并激活环境
# 如果conda报SSL相关错误请关闭科学上网
conda create -n sovits python=3.8 -y
conda activate sovits
# 更换国内上交源
conda config --set show_channel_urls yes
conda config --remove-key channels
conda config --add channels https://mirror.sjtu.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirror.sjtu.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirror.sjtu.edu.cn/anaconda/pkgs/mro
conda config --add channels https://mirror.sjtu.edu.cn/anaconda/pkgs/msys2
conda config --set custom_channels.bioconda https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.conda-forge https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.menpo https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.soumith https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.viscid-hub https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.atztogo https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.pytorch https://mirror.sjtu.edu.cn/anaconda/cloud/
conda config --set custom_channels.pytorch-test https://mirror.sjtu.edu.cn/anaconda/cloud/
pip config set global.index-url https://mirror.sjtu.edu.cn/pypi/web/simple
# 安装依赖
# 如果pip报SSL相关错误请关闭科学上网
pip install -r requirements.txt
```
至此环境配置完成,关闭该终端窗口(方便我写下一步)
### 3. 歌声音色转换(之后还要推理直接从这里开始)
1. 运行 Anaconda Powershell Prompt
```
# 切换工作目录并激活环境
cd D:\\SUI\\SUI-svc-4.0\\
conda activate sovits
```
2. 推理
```
# 参数列表在下面
pyhon inference_main.py -n "<wav音频源文件路径>" "<wav音频源文件路径_2>" -t <文件1变调值> <文件2变调值> -wf <输出音频格式> -cr [0-1]
# 音频将输出至输入音频的旁边
# 例:
# 处理单个文件,不变调
python inference_main.py -n "file.wav"
# 处理多个文件,file1.wav变调0key、file2.wav升调1key、file3.wav降调2key
python inference_main.py -n "file1.wav" "file2.wav" "file3.wav" -t 0 1 -2
# 语音转换使用自动变调并使用聚类模型,输出为wav格式
python inference_main.py -n "vocal.wav" -a -cr 0.5 -wf wav
```
输入源需要转换为wav格式
参数:
-n, --clean_names:wav文件路径,可以是相对路径
-t, --trans:变调,多个变调值会与各个文件一一对应
-wf, --wav_format:输出音频格式,默认flac
-a, --auto_predict_f0:语音转换自动预测音高,转换歌声时不要打开这个会严重跑调。
-cr, --cluster_infer_ratio:聚类方案占比,范围 0-1,如要使用建议设为0.5,具体可以访问[sovits4/README.md/聚类音色泄漏控制](https://github.com/innnky/so-vits-svc/tree/4.0#%E8%81%9A%E7%B1%BB%E9%9F%B3%E8%89%B2%E6%B3%84%E6%BC%8F%E6%8E%A7%E5%88%B6)
针对本仓库设好了默认值的:
-m, --model_path:模型路径
-c, --config_path:配置文件路径
-cm, --cluster_model_path:聚类模型路径
-s, --spk_list:合成目标说话人名称
一般情况下不用动的:
-sd, --slice_db:分段阈值,默认-40
-ns, --noice_scale:噪声规模
-d, --device:推理设备,默认自动选择
""")
app.launch()