GPT-SoVITS的使用体验、目前主流TTS对比、我的优化方向
声音克隆(gpt-sovits)
近期因为做数字人,需要对TTS的一些技术有所了解,尝试了很多。在线服务包括heygen、elevenlabs这些,前者并不单独提供声音克隆服务,而是作为自家数字人的必要附属,效果很好,特别是针对多语种混合,应该是做了很多功课在上面的。后者是完完全全的TTS服务提供商,中文效果不好,会带有奇怪的口音,可能训练多语种模型的时候关于中文的数据集不是特别多,反之如果是做翻译之类的服务的话,elevenlabs还是有一定优势的。两者基本上都算few-shot,前者需要上传的视频满1分钟,并且需要说满话(heygen会提供给你一些台词本叫你念),后者任意长度声音样本,5s-3min都行,我的尝试下,如果要涉及到中文,跟样本声音的长度就没关系了,再饱和还是会有口音,属于是模型的泛化性不是很强了(虽然他自己官方宣称Multilingual)
开源项目也跑过一些,coqui-ai🐸的TTSv2、微软的VALL-E X、和一些Sovits的衍生项目。
coqui-a的TTSv2整体效果要好于elevenlabs,它模型的迭代速度也是很快的,也支持Multilingual。但唯一美中不足的是存在良品率,有时候生成的声音文件莫名多了一段空时长,有时候也会出现口音、电音等奇奇怪怪的问题,并且长文本需要进行切分生成再合成,由于有底噪的存在不得不加降噪才能让出来的成品声音不像是剪切过的。
微软的VALL-E X更多像是一种学术上的成果,从huggingface space上的demo效果听起来没有目前主流的tts效果好。
SoVITS相关的话目前最好的就是最新的GPT-SoVITS了,RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) (github.com),作者似乎B站还有号,大家有时间可以关注一下。
说是中文最强也不过分,它会对你的声音样本进行切分,每一段单独编码,然后进行训练、微调,生成一个单独属于你自己上传这段声音样本的模型,之后用生成的模型再加上一段你自己的相关音频作为reference进行推理。但目前仅支持中、日、英三种语言,如果有针对中文做克隆的产品这个技术可能会有用。
我这里上传一个用我自己声音生成的音频跟大家分享一下,效果真的达到以假乱真的程度了。
分支内容
clone了它的代码,发现作者为了便于使用,大部分都是用的gradio做的网页,虽然有API的存在但还是不是很便于工程化,并且因为做音频识别的库用到了modelscope和funasr,这两个的版本不一样还不能注册进modelscope的pipeline里面,非常的鸡肋,这个仓库的40%的issue都是在说这两个库的问题。取代的是faster_whisper库,需要用它来进行语音识别,同时还要用到spacy推理时做切分。
1 | pip install faster_whisper |
于是为了使用的便捷性,我重写了一个统一的命令行接口,使用控制台参数传递部分需要的参数,并且规范了其中的一些代码,去掉了funasr,改用whisper,并且新的list也兼容原流程的格式。为了工程化,还支持用户训练的自己的模型单独进行保存,参数里面提供了一个work_dir用于保存训练、微调时的模型,便于下次使用。
但为了易用,例如sovits和gpt的训练、微调阶段我都传入了默认的batch_size和epoch,但接口我都暴露出来了,你们使用的时候可以进行修改。
如果你使用我写的inference_cli.py的话,请注意你运行程序的根目录是需要在GPT_SoVITS下的,外层所有的代码都是不需要的,我已经做了迁移和兼容。
1 | Usage: |
参数介绍:
- work_dir:工作目录,保存的所有模型、切分的音频、推理输出的音频都会放在这个文件夹目录下。
- input_wav_file:输入音频,用户上传的声音样本,作者推荐1min左右。
- exp_name:模型名称,类似于特征码的参数。
- tts_prompt:推理生成的文本。
具体的fork地址在这里hawcat/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) (github.com),因为改动太大就不提交pr了。
我自己的版本似乎丢掉了去背景音的流程,下次有空再更新吧….
2024/1/29 更新
分离了训练和推理脚本
使用
[FRCRN语音降噪模型]: https://modelscope.cn/models/iic/speech_frcrn_ans_cirm_16k/summary “FRCRN model from modelscope”
代替UVR5进行训练集、导出流程的人声抽离、降噪
TODOList:
- 关于ref_wav这块还是采用的训练集中的一条,代码中标识了 # TODO,按照规范应该是自己上传并填写音频内容。
Usage:
1 | cd GPT-SoVITS |
Reference:
1 | @INPROCEEDINGS{9747578, |
1 | @INPROCEEDINGS{9747230, |
总结
中文效果很好、吞字情况时有发生、作者部分代码写的比较乱,我在重写cli的时候很困难….