安装

1
2
3
4
git clone https://github.com/ranchlai/mandarin-tts.git
cd mandarin-tts
git submodule update --force --recursive --init --remote
pip install -e . f

下载模型文件(可能会有更新)

mtts检查点 https://zenodo.org/record/4912321#.YMN2-FMzakA

VocGAN https://zenodo.org/record/4743731/files/vctk_pretrained_model_3180.pt

放置到examples/aishell3/checkpoints目录下

获取汉字对应的拼音

1
2
3
cd examples/aishell3/
python ../../mtts/text/gp2py.py -t "为适应新的网络传播方式和读者阅读习惯"
>> sil wei4 shi4 ying4 xin1 de5 wang3 luo4 chuan2 bo1 fang1 shi4 he2 du2 zhe3 yue4 du2 xi2 guan4 sil|sil 为 适 应 新 的 网 络 传 播 方 式 和 读 者 阅 读 习 惯 sil

发音指导文本文件格式如项目中input.txt所示,是“生成的语音文件名|拼音|汉语句子|语者属性”的结构。

开箱即用:

1
2
cd examples/aishell3/
python ../../mtts/synthesize.py -d cuda --config config.yaml --checkpoint ./checkpoints/checkpoint_1350000.pth.tar -i input.txt

程序会告诉你生成的语音文件在哪里,就在example/aishell3/outputs目录下

https://github.com/ranchlai/mandarin-tts

批量化生成语音文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
import subprocess
import json

l=['最大的意', '各异的小', '的最近有', '的大个', '得一直', '有意义', '的最大', '最大的', '有个不', '最近小', '最近的', '的意义', '个大 个', '有小部', '的有的', '一直不', '个小个', '大小不', '议值得', '的小个', '有异议', '最大', '直直', '有的', '的义', '有最', '的直', '近不', '有各', '得小', '个意', '有异', '罪有', '异的', '不进', '易的', '最不', '的最', '近有', '个劲', '小大', '易不', '翼翼', '的尽', '有筱', '的一', '的困', '抑的', '的有', '祸的', '不有', '禁的', '不不', '步不', '大大', '不小', '惑大', '职进', '部获', '最近', '进的', '部的', '的大', '小有', '大的', '个大', '不亦', '不大', '小个', '的小', '最有', '意不', '值得', '个小', '有不', '大步', '小的', '得有', '尽的', '的各', '步有', '议的', '意小', '大小', '的罪', '的个', '有大', '有得', '大个', '议不', '小一', '部进', '的异', '的意', '大部', '的不', '大不', '有困', '进大', '各大', '个个', '的布', '意义', '有意', '有小', '一直', '步的', '意的', '不意', '友的', '个部', '个有', '的或', '得不', '有义', '或困', '大意', '近的', '的部', '有一']

with open('test.json','r',encoding='utf8') as f:
fnn=json.load(f)

with open('test.txt','w',encoding='utf8') as f:
os.chdir('/home/tellw/mandarin-tts/examples/aishell3')
for le in l:
print(f'processing {le}')
p=subprocess.Popen(f'python ../../mtts/text/gp2py.py -t "{le}"',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,err=p.communicate()
s=output.decode().strip().split("\n")[1]
f.write(f'{le}{fnn[le]}|{s}|20 20 88 88\n')

得到如input.txt格式的文件,再如上所述 python ../../mtts/synthesize.py -d cuda --config config.yaml --checkpoint ./checkpoints/checkpoint_1350000.pth.tar -i input.txt批量生成语音文件

在此说明config.yaml的用处和一些细节的用法,在前面mtts检查点的下载页面还会下载到一个config.yaml文件,这个文件里的配置项没有git clone下来的原始配置文件里的配置项全,我照着原始配置文件的配置项搞了vocoder的模型文件路径(跟checkpoint_1350000.pth.tar一同放在checkpoints目录下)和合成是否规范化的配置,上一段里的命令才能正常执行,合成语音。

标签编号的确定

因为一句话可能有好几个语者来生成,需要给句子编号,在生成的语音文件目录中根据已有的句子的最大编号确定要生成的语音文件下一个编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
from collections import defaultdict
import json

fl=os.listdir('/home/tellw/dataset/asr')
lc=defaultdict(list)
for fle in fl:
if fle.endswith('.wav'):
fle=os.path.splitext(fle)[0]
lc[fle[:-1]].append(int(fle[-1]))
res={}
for lck in lc:
res[lck]=max(lc[lck])+1
with open('test.json','w',encoding='utf8') as f:
json.dump(res,f,ensure_ascii=False)

这就是批量化生成语音程序中fnn的来源(file name number)

创建于2312231605,修改于2404031558