★★★ 本文源自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的交流群进行讨论。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐