Cainong
文章8
標籤19
類別0
把自己变成初音未来!Diffsinger折腾记录

把自己变成初音未来!Diffsinger折腾记录

起因:

又是東雪蓮!B站上的Diffsinger Ai東雪蓮让我发现了Diffsinger这个项目

众所周知,東雪蓮作为罕见,当然是不唱中文歌的

而Diffsinger默认词典又需要大量的中文干声素材

所以我猜测B站上那个视频用的是语音数据

因为不是干声,也就不会有广阔的音域和转音

那么那个视频里的电也就合情合理了

虽然说SVS类型的Ai应该尽可能接近真人才对(像ACE Studio,SynthesizerV那种)

但电音却有种VOCALOID的感觉,倒也不是坏事

一开始我是打算接着用我兄弟的数据集的,但问题来了:

diff项目需要大量的数据集(该项目建议4-5小时)我兄弟的语音数据仅仅只有20分钟

有人说:我可以用Sovits Diff-svc把开源数据集(Opencpop那种)换成兄弟的声音啊?

是,但只要有音色泄露的问题存在出来的声音就不会像本人,况且这样套娃音质是不可控的

所以我兄弟得等以后了

那我又想折腾,就只能迫害我自己了

正片开始

考虑到听自己唱歌实在太处刑了,所以我决定也先用说话数据试试看

这里有必要列一下我的麦:Blue Snowball

虽然不是高端麦克风,但是折腾Ai足矣

准备数据集

我认为流程应该是:

前期录制——匹配响度——降噪——切片——标注

前期录制

内容很简单,就是我找各种中文念出来,语速平缓,吐字清晰

总共大概半个小时

匹配响度

这里选择Au,按照DiffSinger的官方教程来

降噪

去你妈的Au和什么RX9,我单方面宣布UVR是最强的降噪工具

试了一圈,UVR太强了只能说

Kim_Vocal模型,Vocal Only,直接输出,降噪出来不仅安静人声几乎无失真,真的比Au强太多了

切片

按照上面下来就用自动切片机切就好了

标注

你以为我会手动标注吗?

不可能,我们是懒狗炼丹师,所以我选择了阿里巴巴达摩院的Paraformer项目进行自动标注

一开始其实用的OpenAi的whisper,但那个对于中文的准确性远远不如Paraformer

也能理解,毕竟Whisper兼顾多种语言,Paraformer则是专精于中文和少量的英语

之前用的venv,这次为了随时调用,我选择anaconda

Conda安装教程不多说了,这里说配环境:

首先我们要给funasr创建一个环境:

conda create -n funasr python=3.7

然后激活环境:

conda activate funasr

于是就可以安装了:

pip install funasr

你也可以

git clone [https://github.com/alibaba/FunASR.git](https://github.com/alibaba/FunASR.git) && cd FunASR

pip install --editable ./

前提是你的电脑里有git

为了调用模型我们需要 Model Scope

pip install "modelscope[audio_asr]" --upgrade -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html

这里两步如果报错了大概是需要安装Visual Studio

你需要在Visual Studio Installer中安装“使用C++的桌面开发”并确保安装详细信息的两项勾选:MSVC生成工具、Windows SDK

完事安装Torch,可以是CPU也可以是GPU版本

由于Python版本问题,我们只能装11.6的版本

conda install pytorch torchvision torchaudio pytorch-cuda=11.6 -c pytorch -c nvidia

(这里是GPU版本)

然后我们调用一下官方Demo:

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

inference_pipeline = pipeline(
    task=Tasks.auto_speech_recognition,
    model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch')

rec_result = inference_pipeline(audio_in='你自己的音频.wav')
print(rec_result)

效果还是可以的,中英语混合而且准确度很高

我们引用os和pypinyin批量处理并把它们转成对应的拼音保存在.lab里

import os
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from pypinyin import lazy_pinyin


inference_pipeline = pipeline(
    task=Tasks.auto_speech_recognition,
    model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch')
raw_path = r"源wav的地址"
list = os.listdir(raw_path)
OUTPUT_PATH = r".lab输出地址"
print(list)


for i in list:
    path = raw_path + "\\" + i
    rec_result = inference_pipeline(path)
    print(rec_result)
    pinyin = lazy_pinyin(rec_result['text'])
    print(pinyin)
    str = ' '.join(pinyin)
    no_prefix = i.split(".")[0]
    lab = OUTPUT_PATH + "\\" + no_prefix
    with open(lab + '.lab','w') as f:
        f.write(str)

别骂了别骂了我知道我的代码跟屎一样能用就可以了

用MinLable查看一下是否正确,核对一下

完事之后就用项目里的notebook一路下一步就好了

最后他会输出训练的命令,在你项目的根目录运行就好了

最后我练了3天,22w步

您猜怎么的?翻车了

出来我本人的声音是电的,电流声非常明显,处于完全不可用的状态

看来还是得要干声数据,下次写

咕咕

博主:Cainong
文章連結:https://cainongw.cn/2023/05/01/diffsinger/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×