★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>
背景
✨ 众所周知,粤语是除了普通话之外第二大中文语言(想当年,粤语差点就成了国语),也是世界上为数不多被联合国定义为“语言”的方言。
✨ 据官方统计,目前全球有将近1.2亿人口在使用粤语(冤有头债有主,数据来源:2019年《关于粤语传承与保护现状的调查报告》)。
✨ 同时粤语是香港、澳门的官方语言,除此之外,还有一个冷知识:粤语是美国和加拿大的第三大语言,是澳大利亚的第四大语言。更冷的一个知识点是,如果一个人只身前往东南亚国家旅游,懂粤语可以节省一大笔请翻译的费用。
✨ 某个知名二次元视频网站没有粤语审核!🤫
根据字幕大家都能知道是什么意思,但却不知道怎么读,有的人会读,但是因为音发不准导致这句话的气势就丧失掉🐶。你们笑广东人说的广(港)式普通话的同时,其实我们也在笑你们的塑料粤语。
为了让大家告别塑料粤语,让自己同时也让机器能说一口标准的粤语——
PaddleSpeech 承载了1.2亿人口的理想,不负众望,开源了社区首个粤语语音合成模型,在此感谢子龙和她强大的实习生 WongLaw 为粤语传承(超越国语称霸世界千秋万代💪)做出的亿点贡献🎉。
事不宜迟,下面就用粤语天花板难度的句子——各个国家有各个国家的国歌,为大家演示如何使用粤语语音合成模型。
快速体验
下载和安装PaddleSpeech
!git clone https://gitee.com/paddlepaddle/PaddleSpeech.git
%cd PaddleSpeech
!pip install . --user
%cd ..
CLI快速体验
!paddlespeech tts --am fastspeech2_canton \
--voc hifigan_csmsc \
--lang canton \
--spk_id 10 \
--input "各个国家有各个国家嘅国歌" \
--output test_cli.wav \
--use_onnx True
试听效果⬇️
import IPython
IPython.display.Audio('test_cli.wav')
Python API
from paddlespeech.cli.tts import TTSExecutor
tts_executor = TTSExecutor()
wav_file = tts_executor(
text='各个国家有各个国家嘅国歌',
am='fastspeech2_canton',
voc='hifigan_csmsc',
lang='canton',
spk_id=10,
use_onnx=True,
output='api_1.wav',
cpu_threads=2)
import IPython
IPython.display.Audio('api_1.wav')
本地离线部署
如果你的部署需求是本地离线环境,可以将模型文件和对应的配置文件下载到本地,然后在参数中修改对应文件路径
!wget https://paddlespeech.bj.bcebos.com/Parakeet/released_models/fastspeech2/fastspeech2_canton_onnx_1.4.0.zip
!wget https://paddlespeech.bj.bcebos.com/Parakeet/released_models/hifigan/hifigan_csmsc_onnx_0.2.0.zip
!unzip fastspeech2_canton_onnx_1.4.0.zip
!unzip hifigan_csmsc_onnx_0.2.0.zip
from paddlespeech.cli.tts import TTSExecutor
tts_executor = TTSExecutor()
wav_file = tts_executor(
text='喂!三点几嚟,饮茶先嚟,做咁多都冇用嘅,老细唔锡你嘅嚟',
output='api_offline.wav',
am='fastspeech2_canton',
am_ckpt='fastspeech2_canton_onnx_1.4.0/fastspeech2_canton.onnx',
phones_dict='fastspeech2_canton_onnx_1.4.0/phone_id_map.txt',
speaker_dict='fastspeech2_canton_onnx_1.4.0/speaker_id_map.txt',
voc='hifigan_csmsc',
voc_ckpt='hifigan_csmsc_onnx_0.2.0/hifigan_csmsc.onnx',
lang='canton',
spk_id=10,
use_onnx=True,
cpu_threads=2)
import IPython
IPython.display.Audio('api_offline.wav')
定制前端
虽然已经实现了粤语合成,但合成效果的优化工作仍任重道远,比如粤语口语的语法和表达与书面语有很大的差别。举两个例子,抱歉,有钱是真的能为所欲为的
和 大象和猴子在玩耍
这两句话,如果硬要用粤语逐字直接说出来给广东人听,emmm为了你的人身安全着想我建议你还是不要这么干。因此,为了合成的粤语语音效果更加口语化,符合粤语表达习惯,我们需要在合成前,对输入文本进行处理。在PaddleSpeech中,合成前的文本处理工作在文本前端(Frontend)部分完成。
PaddleSpeech粤语前端源代码链接:https://github.com/PaddlePaddle/PaddleSpeech/blob/develop/paddlespeech/t2s/frontend/canton_frontend.py
💡商用落地我推荐在前端部分加入一个中文->粤语
的翻译模型(可自行训练或调用百度翻译的商业API)。
💡如果不想投入太多成本,对生成效果要求不高,你可以在前端源代码加入规则,将常用的词汇做转换替代即可。
def diy_frontend(ori_text):
synonym_dict = {
"大象":"大笨象",
"在": "喺度",
"和": "同紧",
"猴子": "马骝",
"玩耍": "玩",
"抱歉": "对唔住",
"是真的": "真喺",
"能": "可以",
"的": "嘅"
}
for w in synonym_dict:
text = ori_text.replace(w, synonym_dict[w])
ori_text = text
return text
# 书面表达直接生成
import os
os.system('paddlespeech tts --input "抱歉,有钱是真的能为所欲为的" --am fastspeech2_canton --voc hifigan_csmsc --lang canton --spk_id 10 --output test_without_translate.wav --use_onnx True')
# 口语化转换后生成
sentence_translated = diy_frontend("抱歉,有钱是真的能为所欲为的")
os.system(f'paddlespeech tts --input "{sentence_translated}" --am fastspeech2_canton --voc hifigan_csmsc --lang canton --spk_id 10 --output test_with_translate.wav --use_onnx True')
书面表达直接生成效果:
import IPython
IPython.display.Audio('test_without_translate.wav')
对唔住,3秒的音频听了0.5秒之后血压已经开始飙升了🩸
还是让我们听下正宗地道的口语表达方式吧:
import IPython
IPython.display.Audio('test_with_translate.wav')
还是这个表达听起来正常舒服很多!😄
训练方案
PaddleSpeech的粤语语音合成模型基于大家熟悉的FastSpeech2
,详细的数据集、文本对齐(MFA)和训练方法已开源至Github,如果有需要用自己定制的数据集finetune或者重新训练的开发者,可以参考以下文档进行训练:
https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/examples/canton/tts3
关注PaddleSpeech
喜欢的同学可以点个 ⭐️star⭐️ 支持PaddleSpeech,PaddleSpeech传送门:https://github.com/PaddlePaddle/PaddleSpeech
🎁 学习过程中你遇到任何问题,可以加入PaddleSpeech的交流群进行讨论。