1.360AI浏览器将增加500万字长文本阅读
2.魔搭社区:发起ModelScope-Sora开源计划
3.胡润百富:超一半新增财富来自AI
4.Suno-v3音乐生成模型发布,快速生成歌曲
5.OpenAI:"数字语音助手"和"语音引擎"商标申请
6.首个千亿参数多模态金融大模型发布
7.元神进化在北京成立
本文将介绍语音合成TTS、语音合成模型Sambert,包括其模型结构,以及如何定制微调Sambert模型。
什么是语音合成 TTS ?
语音合成(Text-to-Speech, TTS)
是指将输入文字合成为对应语音信号的功能,即赋予计算机“说”的能力,是人机交互中重要的一环。现代语音合成在2016年随着WaveNet
的出现步入了深度学习合成时代,此时语音合成的效果已经表现出了比拟真人的水准。
一个语音合成系统
通常由两部分组成,分别是语言分析
部分和声学系统
部分,也被称为前端部分和后端部分。
-
语言分析:根据输入的文字信息进行分析,生成对应的 语言学特征
(梅尔频谱),想好该怎么读; -
声学系统:根据语音分析部分提供的语音学特征,生成对应的音频,实现 发声
的功能,其中声学系统部分直接影响了合成语音的自然度
和真实感
。
如人类通过大脑传递神经信号驱动肺部和声带发出声音一样,计算机对输入的文本,先后经过语言分析和声学系统,最终合成语音信号。
在语音合成领域,类似FastSpeech的Parallel模型是目前的主流,它针对基频(pitch)
、能量(energy)
和时长(duration)
三种韵律表征分别建模。但是该类模型普遍存在一些效果和性能上的问题
,例如:独立建模时长、基频、能量,忽视了其内在联系;完全非自回归的网络结构,无法满足工业级实时合成需求
;帧级别基频和能量预测不稳定
。
今天我们所了解的SAMBERT
,是一种基于Parallel结构
的改良版
TTS模型,优点如下:
-
Backbone采用 Self-Attention-Mechanism(SAM)
,提升模型建模能力。 -
Encoder部分采用 BERT
进行初始化,引入更多文本信息,提升合成韵律。 -
Variance Adaptor对 音素级别
的韵律(基频、能量、时长)轮廓进行粗粒度的预测,再通过decoder进行帧级别
细粒度的建模;并在时长预测时考虑到其与基频、能量的关联信息,结合自回归结构,进一步提升韵律自然度. -
Decoder部分采用 PNCA AR-Decoder
,自然支持流式合成。
目前ModelScope社区已经上线了13个基于Sambert的语音合成模型,其中男女声发音人模型各4个,多发音人模型5个,整体MOS评分在4.5分左右,达到了接近真实录音的水平,模型支持中文
、英式英文、美式英文、中英混
几类语言,适用于客服、电销、朗读、视频配音等多种场景。
推理代码示例
from scipy.io.wavfile import write
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
text = '我的第一个待合成文本是这样发音的'
model_id = 'speech_tts/speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k'
sambert_hifigan_tts = pipeline(task=Tasks.text_to_speech, model=model_id, model_revision='v1.0.0')
output = sambert_hifigan_tts(input=text)
pcm = output[OutputKeys.OUTPUT_PCM]
write('output.wav', 16000, pcm)
如何训练一个定制语音合成模型 ?
本次实验使用开源的语音合成模型训练框架KAN-TTS,modelscope提供的中文多人预训练模型,开发者基于此语音合成训练框架及预训练模型,即可在小规模数据集上定制自己的语音合成模型,这里我们将使用AISHELL-3开源语音合成数据集,演示如何训练一个定制化语音合成模型。
一、环境搭建
源码下载
git clone https://github.com/alibaba-damo-academy/KAN-TTS.git && cd KAN-TTS
创建虚拟环境(目前只兼容Linux_x86系统):
# 防止使用pip安装时出现网络问题,建议切换国内pip源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 创建虚拟环境
conda env create -f environment.yaml
# 激活虚拟环境
conda activate maas
二、准备数据
目前KAN-TTS支持两种类型的数据格式:阿里标准格式
和通用格式
其中阿里标准格式数据如下:
通用格式数据如下:
-
wav文件夹:存放 音频文件
-
prosody文件夹:.txt文件对应的是音频文件的 文本标注
-
interval文件夹: 音素时长标注
,存放的是音素级别的时间戳标注,通常情况下通用格式数据不会携带时间戳标注,这是两种格式的区别。
快速开始 可以直接从ModelScope下载阿里标准格式的AISHELL-3开源语音合成数据集
# 解压数据
unzip aishell3.zip
解压后得到如下结构文件夹:
AISHELL-3包含200多个发音人录音,每个发音人数据量在20~30分钟
,这里我们选择其中的一个发音人
进行数据处理,以SSB0009为例(开发者也可自行选择其他发音人),训练一个16k采样率
的语音合成模型。
由于原始音频采样率为44k,我们先对音频做重采样,这里需要用到该数据集的元数据仓库脚本
# 拉取元数据仓库,并做重采样处理
git clone https://www.modelscope.cn/datasets/speech_tts/AISHELL-3.git
./AISHELL-3/aishell_resample.sh aishell3 aishell3_16k 16000
下面选择适合数据采样率的配置文件进行特征提取操作,以16k采样率为例 kantts/configs/audio_config_16k.yaml
# 特征提取
python kantts/preprocess/data_process.py --voice_input_dir aishell3_16k/SSB0009 --voice_output_dir training_stage/SSB0009_feats --audio_config kantts/configs/audio_config_16k.yaml --speaker SSB0009
其中 --speaker 代表该数据集对应发音人的名称,用户可以随意命名。
特征提取完毕后你会在training_stage/SSB0009_feats目录下得到如下结构的文件:
至此数据准备工作就算完成了。
拉取预训练模型
ModelScope中文多人语音合成模型是达摩院语音实验室在100小时精标多人数据集上训练产出的预训练模型,以此为basemodel做sft微调。
# 安装git-lfs
# 克隆预训练模型
git clone -b pretrain http://www.modelscope.cn/speech_tts/speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k.git
在 basemodel_16k 目录下即为 checkpoints.
微调声学模型 SAM-BERT
KAN-TTS的训练脚本是可配置的,使用预训练模型的 sambert/config.yaml 作为训练配置文件。
根据在数据准备阶段对数据集做的命名,修改配置文件中的 speaker_list 配置项:
# 将speaker_list其中一个发音人替换为aishell3发音人
linguistic_unit:
cleaners: english_cleaners
lfeat_type_list: sy,tone,syllable_flag,word_segment,emo_category,speaker_category
speaker_list: SSB0009,F74,FBYN,FRXL,M7,xiaoyu
以及train_max_steps配置项,我们希望在basemodel 980k的基础上,继续微调120k
# 将train_max_steps改为1100100
...
train_max_steps: 1100100
...
完成上述必要的配置项修改后,就可以训练声学模型了:
# 训练声学模型
CUDA_VISIBLE_DEVICES=0 python kantts/bin/train_sambert.py --model_config speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/sambert/config.yaml --resume_path speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/sambert/ckpt/checkpoint_980000.pth --root_dir training_stage/SSB0009_feats --stage_dir training_stage/SSB0009_sambert_ckpt
训练完成后声学模型输出目录如下:
微调声码器模型
后端模块中声码器采用HIFI-GAN, 基于GAN的方式利用判别器(Discriminator)来指导声码器(即生成器Generator)的训练,相较于经典的自回归式逐样本点CE训练, 训练方式更加自然,在生成效率和效果上具有明显的优势。其系统结构如图所示:
在HIFI-GAN开源工作的基础上,我们针对16k, 48k采样率
下的模型结构进行了调优设计,并提供了基于因果卷积的低时延流式生成
和chunk流式生成
机制,可与声学模型配合支持CPU、GPU
等硬件条件下的实时流式合成
。
与声学模型类似,声码器的训练脚本也是可配置的,使用预训练模型目录下的hifigan/config.yaml作为训练配置文件。我们希望在 basemodel 2000k steps 的基础上再微调100k steps,但不保留state,修改 hifigan/config.yaml
配置项train_max_steps
。
-
声学模型和声码器的微调
并没有依赖
关系,两者可同时进行
# 将train_max_steps改为100100
...
train_max_steps: 100100
...
训练命令:
# 训练声码器
CUDA_VISIBLE_DEVICES=0 python kantts/bin/train_hifigan.py --model_config speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/hifigan/config.yaml --resume_path speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/basemodel_16k/hifigan/ckpt/checkpoint_2000000.pth --root_dir training_stage/SSB0009_feats --stage_dir training_stage/SSB0009_hifigan_ckpt
声码器需要的微调时间较长,根据GPU型号不同在12~20小时。训练完成后,声码器模型输出目录如下:
体验微调模型效果
在声学模型和声码器微调完毕后,就可以使用产出的模型文件来合成语音了。
准备要合成的文本写入一个文件test.txt,每句话按行分隔。使用utf-8编码,整体长度建议不超过30字
运行以下命令进行合成:
# 运行合成语音
CUDA_VISIBLE_DEVICES=0 python kantts/bin/text_to_wav.py --txt test.txt --output_dir res/SSB0009_syn --res_zip speech_sambert-hifigan_tts_zh-cn_multisp_pretrain_16k/resource.zip --am_ckpt training_stage/SSB0009_sambert_ckpt/ckpt/checkpoint_1100000.pth --voc_ckpt training_stage/SSB0009_hifigan_ckpt/ckpt/checkpoint_2100000.pth --speaker SSB0009
完成后在res/SSB0009_syn/res_wavs文件夹下就可以获得合成结果
评估结果
使用MOS(Mean Opinion Score)来评估合成声音的自然度,评分从1(不好)到5(非常好),每提高0.5分表示更高的自然度。随机选择20个samples,然后每个sample交给至少10个人进行打分。作为对比,使用真人录音的sample通过上述统计方式进行打分。
应用场景
语音合成技术目前被广泛应用在各种领域,例如智能设备语音助手、音视频媒体创作、辅助阅读等,具体到我们的日常使用场景,虚拟主播
、数字人
、手机、可穿戴设备、智能音箱、电话客服、有声电子书、各种各样的短视频配音等等,语音合成技术的身影随处可见。随着语音合成技术的不断发展,其合成结果也越来越逼真,也许有一天你无法分辨正在和你交谈的是人类还是计算机。
引用
-
https://modelscope.cn/docs/sambert
关于我
欢迎关注,一起进步一起成长
原文始发于微信公众号(小贾探AI):TTS文本合成语音|Sambert微调