Tacotron2语音合成之复刻主播声音
最近在阿B看到许多语音合成的视频,效果比小爱的声音定制略胜一筹,不能说和本人一模一样,但是也相当近似。
从实现方式讲,有阿里云商用闭源方案,有Tacotron2和VIST开源方案,以及更早的MockingBird。目前我用了Tacotron2,自我感觉上手难度较低,但是时间开销有些大。
在这里总结一下经验并作一个技术分享。
背景
目前的多数示例是使用游戏音频素材做训练和合成的。游戏音频素材已经是每句一个录音文件,发音吐字清晰,没有不必要的停顿和重读,录音音量稳定,无噪音和背景音,而主播录播内容恰恰相反,唯一的优势是录播素材多,可以手动精选。
准备
一台电脑
访问外网的工具
一个谷歌账户
预先下载录播(首选杂谈类型的录播,毕竟游戏、歌回、同步视听不是话说的少就是干扰因素多;杂谈也尽量选择纯音乐做BGM的录播)

MockingBird
先简单说一下MockingBird,MockingBird的上手难度短和时间开销低,但是实际效果很不理想。简单讲,MockingBird需要内置一个模型,然后你提供一条10秒左右录音文件,MockingBird从录音文件学习,然后合成新的声音。
当内置模型和录音文件差异很大时,合成的结果就会翻车。
其次这种学习是无法学到平翘舌、前后鼻音之类的不标准的发音的。
因此不推荐使用这个工具。
简介
主要使用了 @梅雨初霁 的工具包进行训练
https://t.bilibili.com/695241886813650984
也参考了这个视频对录播的处理
https://www.bilibili.com/video/BV1dq4y137pH
文件准备
录播的录音文件需要做一定的预处理。我在处理过程中均使用wav文件格式,不一定非wav不可,但是理论上这可以减少重复编码解码造成的信息损失。
切割
由于直播间通常有背景音乐,需要使用工具去除背景音;而录音文件越大,工具对内存就有更高的需求,因此录音文件需要根据具体情况预先切割。
通常来说10分钟是不会有问题的

切割录音文件使用的工具我推荐QuickCut
https://github.com/HaujetZhao/QuickCut/releases
重命名音频后缀为wav,拖文件到输入路径;选择一个输出文件夹,设置片段时长(秒),点击运行

2. 去除背景音乐
下载并使用Spleeter为核心二次开发的程序,并处理已经切割后的文件。我推荐(个人感觉资源开销低,其他工具可能真的只能处理切割为10分钟的片段) https://github.com/wudicgi/SpleeterMsvcExe/releases/ ,也可以使用https://github.com/otomad/SpleeterGui 或者 https://github.com/Anjok07/ultimatevocalremovergui/releases
处理结束,文件名包含vodal的就是去除了背景音乐的纯人声录音,其他文件都可以删除。
由于主播通常使用单通道麦克风录音,而背景音乐通常是立体声,可以使用音频处理软件(比如golden wave的立体声通道处理功能,选择“提升人声”或者“提升中央”,对录音文件中的噪音再次消除。

3. 修改编码
在golden wave中新建文件,选择单声道 22050采样率的文件

复制调整过音量的内容并粘贴到新文件中,保存为wav格式。
4. 音量增益
如果音量较小,需要把录音文件的音量调大。我使用golden wave的自动增益功能,设置目标音量-3db(当然也可以更大)

音量调节前后对比

5. 语音识别并生成字幕
我推荐使用剪映,白嫖字节跳动的服务器资源。
直接拖拽录音文件到剪映的音频轨道上,右键识别字幕/歌词

识别结束,导出。注意导出时不勾选视频导出,勾选字幕导出,字幕格式选择srt。

6. 校对字幕
剪映其实也可以校对字幕,但是我推荐aegisub,效率更高 https://github.com/Aegisub/Aegisub/releases
把录音和字幕拖到aegisub上,就可以预览波形图、播放选区、校对字幕了。
需要注意的是:
a. 尽量只保留陈述句。如果录音有笑声、拍肚皮声,建议删掉,字音不清楚建议删掉
b. 字幕有同音错字可以不处理
c. 有英语的内容建议删除
d. 相邻两句距离太短,建议合并字幕为一句
e. 如果字幕在音频的边缘,需要注意字音是否完整。宁愿多选不要让字音有破音

7. 切割音频
按照字幕的时间,切割录音文件。可以使用https://gitee.com/kslizi/Sound_File_Procesing 或者前边用过的QuickCut https://github.com/HaujetZhao/QuickCut/releases
两者其实都有问题,前者是Python项目,需要安装环境、依赖,可以参考这个视频 https://www.bilibili.com/video/BV1dq4y137pH
后者切割文件后,需要手动生成文件列表,把左图的文件修改为右图的格式。熟悉文本编辑器或者excel倒是不难。

8. 上传文件。
解压tacotron2压缩包上传到谷歌云端硬盘;
把录音文件拆分训练集和测试集,放到training和testing两个不同的文件夹,在谷歌硬盘的tactron2目录中新建一个文件夹(举例命名为Miki)放进去。

文件列表同样需要拆分为训练集和测试集两个文件,文件名必须与放置的录音文件一致(录音文件为Miki目录,训练集文件列表命名Miki.txt,测试集文件列表命名Miki_testing.txt),放到谷歌硬盘的tactron2/filelists目录中
在线训练
由于深度学习需要使用高性能电脑,而看这个文档的你一定这样的电脑。
我们可以白嫖谷歌的高性能服务器。
在谷歌硬盘中点击Tacotron2+HifiGAN.ipynb这个文件并打开,修改
修改TTS/tacotron2为你上传到谷歌硬盘的路径,修改Miki为你的录音文件的文件夹名称
然后顺次点击每个白色的小箭头即可

其中trainning会耗费数天的时间。根据我的经验,每个谷歌账户应该一天只能白嫖4小时左右。但是问题不大,你可以多注册几个账户,通过共享文件的方式接力训练,或者充值变强。

离线合成
除在colob中在线合成,也可以使用MoeTTS加载Tacotron2模型。https://github.com/luoyily/MoeTTS/releases/tag/v1.0.1
首先从Google drive中,colab/outdir中下载训练过的模型。
再从tacotron2压缩包中获取hifimodel和config.json两个文件,
在moetts中选择模型、路径,
在文本框内输入拼音,注意句尾添加英文句号,点击成声音文件,稍等几秒即可得到录音文件。
每次生成录音具有一定的随机性,如果不理想可以重试几次

网盘链接
只打包了Tacotron2,考虑到录音文件和训练的模型存在风险,不做分享。
链接: https://pan.baidu.com/s/1KCHV3YWHVzPdb-62STMKlQ?pwd=3uyx 提取码: 3uyx