- 人工智能
- 语音
- 音频
- NLP
- 媒体生成
【免费下载链接】PaddleSpeech
Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.
AISHELL-3 是飞桨 PaddleSpeech 仓库中用于训练多说话人中文 TTS(Text-to-Speech)系统的旗舰语料之一,本文以其在仓库中的官方说明(dataset/aishell3/README.md)为核心骨架,结合examples/aishell3下的完整可运行示例,系统讲解该语料的规模与结构、在仓库中的示例全景,以及基于它完成 FastSpeech2 多说话人语音合成、Parallel WaveGAN 声码器合成和声线克隆的完整实战流程。读完本文,你将掌握如何在 PaddleSpeech 中基于 AISHELL-3 完成从数据预处理、模型训练到端到端合成的全套操作,并能直接迁移到 VCTK 等其他多说话人语料上。
AISHELL-3 语料简介
AISHELL-3(官方代号 AISHELL-3)是一个大规模、高保真的多说话人中文普通话语音库,专为训练多说话人文本到语音(TTS)系统而设计。根据仓库内 dataset/aishell3/README.md 的官方描述,其核心规格如下:
- 时长规模:约85 小时的情绪中性录音;
- 说话人规模:218 位母语为中文普通话的说话人,共计88035 条话语(utterances);
- 说话人属性标注:语料中显式标注并提供了说话人的性别、年龄段、籍贯口音等辅助属性,这是训练多说话人 TTS 时选择与刻画说话人特征的重要依据;
- 转写文本:与录音配套提供了汉字级(character-level)与拼音级(pinyin-level)两种粒度的转写文本;
- 标注质量:经过专业语音标注与对音调、韵律的严格质检,字与声调的转写准确率超过 98%;
- 使用许可:该数据库在未经许可的情况下免费用于学术研究,不可用于商业用途。
从语料设计上不难看出,AISHELL-3 的 218 位说话人、汉字+拼音双粒度转写以及说话人属性标注,恰好覆盖了多说话人 TTS 训练所需的三个关键要素:多说话人音色多样性(供模型学习 speaker embedding)、音素级标注(供时长/音高建模)、韵律与声调信息(供中文声调建模)。这也是它在 PaddleSpeech 中被多个 TTS 与声线克隆示例同时选用的根本原因。
AISHELL-3 在 PaddleSpeech 仓库中的示例全景
AISHELL-3 在整个 PaddleSpeech 仓库中并非孤立存在,examples/aishell3目录下聚合了围绕该语料的一整套声学模型(acoustic model)、声码器(vocoder)与声线克隆(voice cloning)示例。仓库根目录下的 examples/aishell3/README.md 给出了完整的清单:
| 示例目录 | 对应模型 | 用途 |
|---|---|---|
tts0 | Tacotron2 | 自回归声学模型,语音合成 |
tts1 | TransformerTTS | 基于 Transformer 的声学模型 |
tts2 | SpeedySpeech | 非自回归快速声学模型 |
tts3 | FastSpeech2 | 非自回归并行声学模型(多说话人) |
voc0 | WaveFlow | 流式声码器 |
voc1 | Parallel WaveGAN | GAN 声码器(推荐搭配 FastSpeech2) |
voc2 | MelGAN | GAN 声码器 |
voc3 | MultiBand MelGAN | 多频带 GAN 声码器 |
vc0 | Tacotron2 + GE2E | 声线克隆 |
vc1 | FastSpeech2 + GE2E | 声线克隆 |
vc2 | FastSpeech2 + ECAPA-TDNN | 声线克隆 |
ernie_sat | ERNIE-SAT | 基于 ERNIE 的语音-文本联合模型 |
其中tts3(FastSpeech2 + AISHELL-3)是文档描述最完整、链路最全的示例,本文以其为主线展开。
实战主线:用 FastSpeech2 训练 AISHELL-3 多说话人 TTS
以下所有步骤均以 examples/aishell3/tts3/README.md 为蓝本,并对照仓库中的脚本实现逐一展开。
1. 数据下载与目录约定
AISHELL-3 需要从官方渠道下载并解压。按示例约定,解压到~/datasets后,语料目录为~/datasets/data_aishell3。该目录下是原始音频与转写文件,后续所有预处理均以此为输入。
2. 获取 MFA 对齐结果(时长标注)
FastSpeech2 属于非自回归模型,训练时需要音素级时长标注(duration)。PaddleSpeech 使用蒙特利尔强制对齐工具(MFA)为 AISHELL-3 生成时长:
- 可直接下载官方提供的对齐结果
aishell3_alignment_tone.tar.gz(带声调版本),解压后得到aishell3_alignment_tone目录; - 也可参考仓库中的 examples/other/mfa 示例自行训练 MFA 模型。
3. 一键运行与阶段控制
示例根目录提供了run.sh一键脚本(examples/aishell3/tts3/run.sh),默认执行完整链路:
source path.sh配置环境;- 预处理数据集;
- 训练模型;
- 从
metadata.jsonl合成波形; - 从文本文件端到端合成波形。
脚本通过stage/stop-stage参数精确控制执行范围,例如仅执行预处理:
./run.sh --stage 0 --stop-stage 0run.sh内部还串联了更多高级阶段:stage 4 为静态图推理(inference)、stage 5 为 Paddle2ONNX 导出、stage 6 为 ONNX Runtime 推理、stage 7/8 为 Paddle-Lite 导出与预测,覆盖了从训练到移动端部署的完整链路。脚本通过utils/parse_options.sh解析参数,因此也可以直接修改脚本头部的gpus、conf_path、train_output_path、ckpt_name等变量来定制实验。
path.sh(examples/aishell3/tts3/path.sh)负责环境初始化:将仓库根目录与utils加入PATH,将仓库根目录加入PYTHONPATH,并定义BIN_DIR=paddlespeech/t2s/exps/fastspeech2指向 FastSpeech2 的 Python 入口目录;同时设置LC_ALL=C与PYTHONIOENCODING=UTF-8,避免中文语料在管道传输时出现编码错误。
4. 数据预处理与 dump 目录结构
预处理脚本为./local/preprocess.sh(examples/aishell3/tts3/local/preprocess.sh),调用形式:
./local/preprocess.sh ${conf_path}其内部按 4 个阶段执行:
- 生成 durations.txt:调用
utils/gen_duration_from_textgrid.py,从 MFA 的 TextGrid 对齐结果中解析出每个音素的时长; - 特征提取:调用
paddlespeech/t2s/exps/fastspeech2/preprocess.py,指定--dataset=aishell3、--rootdir=~/datasets/data_aishell3/、--dumpdir=dump、--dur-file=durations.txt、--config以及--num-cpu=20、--cut-sil=True(切除静音)等参数,抽取 speech(线性谱)、pitch(基频)与 energy(能量)特征; - 统计量计算:分别对
speech、pitch、energy三个字段调用utils/compute_statistics.py,从训练集 raw 特征计算均值与标准差; - 归一化与 ID 映射:对 train / dev / test 三部分分别调用
normalize.py,使用训练集统计量进行归一化,并将音素、说话人映射为整数 ID(phone_id_map.txt、speaker_id_map.txt)。
预处理完成后生成dump目录,结构如下:
dump ├── dev │ ├── norm │ └── raw ├── phone_id_map.txt ├── speaker_id_map.txt ├── test │ ├── norm │ └── raw └── train ├── energy_stats.npy ├── norm ├── pitch_stats.npy ├── raw └── speech_stats.npy要点解读:
- 数据集被划分为
train、dev、test三部分,每部分含raw(原始特征)与norm(归一化特征)两个子目录; - 归一化所需的均值/标准差统计量存放于
dump/train/*_stats.npy,且dev/test 必须复用 train 的统计量,以保证特征分布一致; - 每个子目录下还有一个
metadata.jsonl,以类表格形式逐条记录 utterances 的 phones、text_lengths、speech_lengths、durations、speech/pitch/energy 特征路径、speaker 以及 id,是后续训练与合成的数据索引。
5. 关键配置:conf/default.yaml 参数全解
FastSpeech2 的核心训练配置位于 examples/aishell3/tts3/conf/default.yaml,其中与本语料强相关的关键参数如下:
特征提取设置(AISHELL-3 为 24kHz 采样率,与 CSMSC 等 16kHz 语料明显不同):
| 参数 | 默认值 | 含义 |
|---|---|---|
fs | 24000 | 采样率 |
n_fft | 2048 | FFT 大小(采样点) |
n_shift | 300 | 帧移(采样点),约 12.5ms |
win_length | 1200 | 窗长(采样点),约 50ms |
window | "hann" | 窗函数 |
fmin/fmax | 80 / 7600 | Mel 滤波器组的最低/最高频率 |
n_mels | 80 | Mel 通道数 |
f0min/f0max | 80 / 400 | 基频提取的上下限(Hz),用于 pitch 特征 |
模型结构设置(多说话人相关):
| 参数 | 默认值 | 含义 |
|---|---|---|
adim/aheads | 384 / 2 | 注意力维度 / 注意力头数 |
elayers/eunits | 4 / 1536 | 编码器层数 / FFN 单元数 |
dlayers/dunits | 4 / 1536 | 解码器层数 / FFN 单元数 |
duration_predictor_layers/chans/kernel_size | 2 / 256 / 3 | 时长预测器层数 / 通道数 / 卷积核 |
postnet_layers/filts/chans | 5 / 5 / 256 | PostNet 层数 / 卷积核 / 通道数 |
pitch_predictor_layers/chans/kernel_size | 5 / 256 / 5 | 音高预测器层数 / 通道数 / 卷积核 |
energy_predictor_layers/chans/kernel_size | 2 / 256 / 3 | 能量预测器层数 / 通道数 / 卷积核 |
spk_embed_dim | 256 | 说话人嵌入维度(多说话人模型核心参数) |
spk_embed_integration_type | "concat" | 说话人嵌入与编码器输出的融合方式(拼接) |
训练设置:batch_size: 64、max_epoch: 200、num_snapshots: 5,优化器为 Adam(learning_rate: 0.001),seed: 10086固定随机种子保证可复现。其中spk_embed_dim与spk_embed_integration_type正是 AISHELL-3 多说话人建模的关键:模型为每个说话人学习一个 256 维嵌入,并在编码器输出上拼接融合,从而让同一套声学参数适配 218 位说话人。
6. 模型训练
训练由./local/train.sh调用paddlespeech/t2s/exps/fastspeech2/train.py完成:
CUDA_VISIBLE_DEVICES=${gpus} ./local/train.sh ${conf_path} ${train_output_path}train.py的完整参数说明如下:
usage: train.py [-h] [--config CONFIG] [--train-metadata TRAIN_METADATA] [--dev-metadata DEV_METADATA] [--output-dir OUTPUT_DIR] [--ngpu NGPU] [--phones-dict PHONES_DICT] [--speaker-dict SPEAKER_DICT] [--voice-cloning VOICE_CLONING] optional arguments: --config CONFIG fastspeech2 config file(YAML 格式,覆盖默认配置) --train-metadata TRAIN_METADATA 训练数据(dump/train/norm/metadata.jsonl) --dev-metadata DEV_METADATA 验证数据(dump/dev/norm/metadata.jsonl) --output-dir OUTPUT_DIR 实验输出目录,checkpoints 保存在其 checkpoints/ 子目录 --ngpu NGPU GPU 数量,ngpu=0 时使用 CPU --phones-dict PHONES_DICT 音素词表文件 --speaker-dict SPEAKER_DICT 说话人 ID 映射文件(多说话人模型必需) --voice-cloning VOICE_CLONING 是否训练声线克隆模型其中--config指向conf/default.yaml用于覆盖默认参数;--train-metadata与--dev-metadata应使用dump目录中train、dev的norm子目录下的metadata.jsonl;训练完成的快照统一保存于--output-dir的checkpoints/目录中,run.sh中默认使用的ckpt_name=snapshot_iter_482.pdz即来源于此。
7. 语音合成:从特征索引与从文本两种模式
示例提供两种合成入口,均以声学模型 + 声码器(vocoder)串联的方式生成最终波形:
模式一:从metadata.jsonl合成(./local/synthesize.sh)
CUDA_VISIBLE_DEVICES=${gpus} ./local/synthesize.sh ${conf_path} ${train_output_path} ${ckpt_name} 0其内部调用synthesize.py,读取归一化后的 test 元数据,逐条重建语音。命令行最后一个数字控制声码器:0使用Parallel WaveGAN(pwgan),1使用HiFiGAN。
模式二:从文本文件端到端合成(./local/synthesize_e2e.sh)
CUDA_VISIBLE_DEVICES=${gpus} ./local/synthesize_e2e.sh ${conf_path} ${train_output_path} ${ckpt_name} 0其内部调用synthesize_e2e.py,输入为'utt_id sentence'格式的文本文件,直接完成"文本 → 音素 → 声学特征 → 波形"的全流程。从 examples/aishell3/tts3/local/synthesize_e2e.sh 可以看到,声学模型固定为--am=fastspeech2_aishell3、--voc=pwgan_aishell3(或hifigan_aishell3),并通过--spk_id=0指定合成的目标说话人——这正是多说话人模型在实际使用中切换音色的入口。
synthesize.py的关键参数:
--am {speedyspeech_csmsc,fastspeech2_csmsc,fastspeech2_ljspeech, fastspeech2_aishell3,fastspeech2_vctk,tacotron2_csmsc, tacotron2_ljspeech,tacotron2_aishell3} # 声学模型类型,格式 {model}_{dataset} --am_config / --am_ckpt / --am_stat # 声学模型配置、权重、谱归一化统计量 --phones_dict / --tones_dict / --speaker_dict # 音素/声调/说话人词表 --voc {pwgan_csmsc,pwgan_ljspeech,pwgan_aishell3,pwgan_vctk, mb_melgan_csmsc,wavernn_csmsc,hifigan_csmsc,hifigan_ljspeech, hifigan_aishell3,hifigan_vctk,style_melgan_csmsc} # 声码器类型 --voc_config / --voc_ckpt / --voc_stat # 声码器配置、权重、归一化统计量 --ngpu / --test_metadata / --output_dirsynthesize_e2e.py额外提供--lang(zh或en)、--spk_id(多说话人模型指定说话人)、--text(待合成文本文件)与--inference_dir(推理模型保存目录)等参数。
8. 预训练模型快速上手
仓库为 AISHELL-3 提供了多形态的预训练 FastSpeech2 模型(详见 examples/aishell3/tts3/README.md):
- 动态图模型:
fastspeech2_aishell3_ckpt_1.1.0.zip与fastspeech2_conformer_aishell3_ckpt_0.2.0.zip(FastSpeech2-Conformer 变体); - 静态图模型:
fastspeech2_aishell3_static_1.1.0.zip; - PIR 静态图模型:
fastspeech2_aishell3_static_pir_1.1.0.zip(需设置FLAGS_enable_pir_api=1,且仅支持 paddlepaddle>=3.0.0b2); - ONNX 模型:
fastspeech2_aishell3_onnx_1.1.0.zip; - Paddle-Lite 模型:
fastspeech2_aishell3_pdlite_1.3.0.zip。
FastSpeech2 检查点解压后包含 7 个文件:
fastspeech2_aishell3_ckpt_1.1.0 ├── default.yaml # 训练 fastspeech2 的默认配置 ├── energy_stats.npy # 能量归一化统计量 ├── phone_id_map.txt # 音素词表 ├── pitch_stats.npy # 基频归一化统计量 ├── snapshot_iter_96400.pdz # 模型参数与优化器状态 ├── speaker_id_map.txt # 说话人 ID 映射(多说话人模型) └── speech_stats.npy # 谱归一化统计量配合 Parallel WaveGAN 声码器(pwg_aishell3_ckpt_0.5.zip,内含default.yaml、feats_stats.npy、snapshot_iter_1000000.pdz),可直接对仓库内置的测试句子文件paddlespeech/t2s/assets/sentences.txt做零训练推理:
source path.sh FLAGS_allocator_strategy=naive_best_fit \ FLAGS_fraction_of_gpu_memory_to_use=0.01 \ python3 ${BIN_DIR}/../synthesize_e2e.py \ --am=fastspeech2_aishell3 \ --am_config=fastspeech2_aishell3_ckpt_1.1.0/default.yaml \ --am_ckpt=fastspeech2_aishell3_ckpt_1.1.0/snapshot_iter_96400.pdz \ --am_stat=fastspeech2_aishell3_ckpt_1.1.0/speech_stats.npy \ --voc=pwgan_aishell3 \ --voc_config=pwg_aishell3_ckpt_0.5/default.yaml \ --voc_ckpt=pwg_aishell3_ckpt_0.5/snapshot_iter_1000000.pdz \ --voc_stat=pwg_aishell3_ckpt_0.5/feats_stats.npy \ --lang=zh \ --text=${BIN_DIR}/../../assets/sentences.txt \ --output_dir=exp/default/test_e2e \ --phones_dict=fastspeech2_aishell3_ckpt_1.1.0/phone_id_map.txt \ --speaker_dict=fastspeech2_aishell3_ckpt_1.1.0/speaker_id_map.txt \ --spk_id=0 \ --inference_dir=exp/default/inference其中FLAGS_allocator_strategy=naive_best_fit与FLAGS_fraction_of_gpu_memory_to_use=0.01用于降低推理时的显存占用。
进阶玩法:基于 AISHELL-3 的声线克隆
AISHELL-3 的 218 位说话人特性,使其成为声线克隆(voice cloning)任务的理想训练语料。examples/aishell3下提供了三个声线克隆示例(examples/aishell3/vc1/README.md):
- vc0:Tacotron2 + GE2E;
- vc1:FastSpeech2 + GE2E;
- vc2:FastSpeech2 + ECAPA-TDNN。
以 vc1 为例,其技术路线分为三步:
- 说话人编码器(Speaker Encoder):使用说话人验证(Speaker Verification)任务训练 GE2E 编码器(参考
examples/other/ge2e)。由于该任务不需要转写文本,可引入比 AISHELL-3 更丰富的数据集; - 合成器(Synthesizer):用训练好的说话人编码器为 AISHELL-3 中每个句子生成说话人嵌入(speaker embedding),该嵌入作为 FastSpeech2 的额外输入,与编码器输出拼接融合——这与
default.yaml中spk_embed_dim: 256、spk_embed_integration_type: concat的设置完全对应; - 声码器(Vocoder):使用 Parallel WaveGAN(参考
examples/aishell3/voc1)重建波形。
因此,AISHELL-3 训练出的 FastSpeech2 模型在推理阶段可以替换说话人嵌入来合成全新音色,这正是"多说话人 TTS + 声线克隆"一脉相承的落地方式。
小结
从仓库证据看,AISHELL-3 在 PaddleSpeech 中的价值链条非常完整:数据集(85 小时 / 218 说话人 / 88035 条话语 / 汉字+拼音转写)→ 数据预处理(MFA 时长 + 特征提取 + 归一化)→ 多说话人声学模型(FastSpeech2,含 256 维 speaker embedding)→ 声码器(Parallel WaveGAN / HiFiGAN)→ 推理部署(动态图 / 静态图 / ONNX / Paddle-Lite),并横向延伸到声线克隆(GE2E / ECAPA-TDNN)与语音-文本联合模型(ERNIE-SAT)等高级任务。如果你正在寻找一个开箱即用、规模适中的中文多说话人 TTS 语料,AISHELL-3 与examples/aishell3的这套脚本就是最直接的起点;其流程同样可平移到 VCTK 等其它多说话人语料,只需相应更换数据集路径、配置中的采样率与统计量即可。
- 人工智能
- 语音
- 音频
- NLP
- 媒体生成
【免费下载链接】PaddleSpeech
Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.
相关推荐
多说话人语音合成:GPT-SoVITS模型混合技术与实现
多说话人语音合成:GPT SoVITS模型混合技术与实现 在语音合成领域,单一说话人模型已难以满足多样化的应用需求。多说话人语音合成技术通过混合不同模型的优势,
语音音频人工智能大模型微调模型推理服务本地部署mlx-audio MOSS-TTS 实战指南:8B 多码本 TTS 的音色克隆、多说话人对话与流式合成
mlx audio MOSS TTS 实战指南:8B 多码本 TTS 的音色克隆、多说话人对话与流式合成 本篇基于 mlx audio 仓库中 MOSS TTS
人工智能语音音频本地部署媒体生成mlx-audio 中 Fish Speech(Fish-Audio S2 Pro)双自回归 TTS 实战:声音克隆、多说话人与长文本合成
mlx audio 中 Fish Speech(Fish Audio S2 Pro)双自回归 TTS 实战:声音克隆、多说话人与长文本合成 mlx audio
人工智能语音音频本地部署媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考