语音合成数据准备流程
数据准备是开发高质量文本转语音(TTS)系统的关键第一步。本文简要总结了从原始音频到最终训练数据集的转换流程,以及一些适合训练语音合成模型的开源语音数据库。
数据准备概述
TTS系统的训练需要大量高质量、结构化的语音数据。为了获得这样的数据集,我们需要一套完整的数据处理流程,包括音频归一化、说话人分离、分割和转录等步骤。
Emilia-Pipe 处理流程
Emilia-Pipe 是一个专为TTS数据准备设计的处理管道,包含以下关键步骤:
| 步骤 | 描述 |
|---|---|
| 归一化 | 对音频进行归一化处理,确保音量和质量的一致性 |
| 音源分离 | 将长音频处理成不含背景音乐(BGM)的纯语音 |
| 说话人分离 | 提取中等长度的单说话人语音数据 |
| 基于VAD的精细分割 | 将语音切分成3-30秒的单说话人片段 |
| ASR | 获取语音片段的文本转录 |
| 过滤 | 质量控制,获得最终处理后的数据集 |
Emilia预处理工具的源代码可在GitHub上获取:Amphion/preprocessors/Emilia
说话人分离
说话人分离(Speaker Diarization)是TTS数据准备中的关键步骤,用于识别"谁在何时说话"。这项技术对于从多人对话或播客等音频中提取单个说话人的语音片段至关重要。
更多关于说话人分离技术的详细信息可参见 Speaker Diarization 3.1
RTTM(Rich Transcription Time Marked)是语音处理中常用的标注格式,用于记录说话人转换信息。RTTM文件各列的含义如下:
| 列名 | 描述 |
|---|---|
| Type | 片段类型;应始终为 SPEAKER |
| File ID | 文件名;录音的基本名称(不含扩展名),例如 rec1_a |
| Channel ID | 通道ID(从1开始索引);应始终为1 |
| Turn Onset | 话轮开始时间(从录音开始的秒数) |
| Turn Duration | 话轮持续时间(秒) |
| Orthography Field | 应始终为 |
| Speaker Type | 应始终为 |
| Speaker Name | 说话人名称;在每个文件范围内应唯一 |
| Confidence Score | 系统置信度分数(概率);应始终为 |
| Signal Lookahead Time | 应始终为 |
实践中的效率
在实际生产环境中,使用GPU可以显著提高处理效率。根据测试,使用一块A800 GPU进行批量处理,一天可以处理约3000小时的音频数据。
中文开源语音数据
适合训练语音合成模型的中文开源语音数据。
| 数据名称 | 时长(小时) | 说话人数量 | 质量 |
|---|---|---|---|
| aidatatang_200zh | 200 | 600 | 中 |
| aishell1 | 180 | 400 | 中 |
| aishell3 | 85 | 218 | 中 |
| primewords | 99 | 296 | 中 |
| thchs30 | 34 | 40 | 中 |
| magicdata | 755 | 1080 | 中 |
| Emilia | 200,000+ | Emilia | 低 |
| WenetSpeech4TTS | 12,800 | N/A | 低 |
| CommonVoice | N/A | N/A | 低 |
多语言开源语音数据
适合训练语音合成模型的英语和多语言开源语音数据。
| 数据名称 | 时长(小时) | 说话人数量 | 质量 |
|---|---|---|---|
| LibriTTS-R | 585 | 2456 | 高 |
| Hi-Fi TTS | 291 | 10 | 极高 |
| LibriHeavy | 60000+ | 7000+ | 16kHz |
| MLS English | 44500 | 5490 | 16kHz |
| MLS German | 1966 | 176 | 16kHz |
| MLS Dutch | 1554 | 40 | 16kHz |
| MLS French | 1076 | 142 | 16kHz |
| MLS Spanish | 917 | 86 | 16kHz |
| MLS Italian | 247 | 65 | 16kHz |
| MLS Portuguese | 160 | 42 | 16kHz |
| MLS Polish | 103 | 11 | 16kHz |
使用 lhotse 处理语音数据
lhotse 是一个专为语音处理设计的数据管理框架,提供了处理音频数据的完整流程。其核心概念是基于清单(manifest)的数据表示:
数据表示
音频数据表示: 通过 RecordingSet/Recording 存储音频元数据,包括音频源(sources)、采样率(sampling_rate)、样本数(num_samples)、时长(duration)和通道ID(channel_ids)。
标注数据表示: 通过 SupervisionSet/SupervisionSegment 存储标注信息,包括开始时间(start)、持续时间(duration)、转录文本(transcript)、语言(language)、说话人(speaker)和性别(gender)。
数据处理流程
lhotse 使用 Cut 的概念作为音频片段的视图或指针,主要包括 MonoCut、MixedCut、PaddingCut 和 CutSet 类型。处理流程如下:
将清单加载为 CutSet,可以进行等长切割、多线程特征提取、末端填充,并为 PyTorch 生成 Sampler 和 DataLoader
特征提取支持多种提取器,如 PyTorch fbank & MFCC、torchaudio、librosa 等
特征归一化支持均值-方差归一化(CMVN)、全局归一化、逐样本归一化和滑动窗口归一化
并行处理
lhotse 支持多进程并行处理,示例代码如下:
from concurrent.futures import ProcessPoolExecutor
from lhotse import CutSet, Fbank, LilcomChunkyWriter
num_jobs = 8
with ProcessPoolExecutor(num_jobs) as ex:
cuts: CutSet = cuts.compute_and_store_features(
extractor=Fbank(),
storage=LilcomChunkyWriter('feats'),
executor=ex)PyTorch 集成
lhotse 与 PyTorch 无缝集成:
CutSet 可直接用作 Dataset,支持噪声填充、声学上下文填充和动态批量大小
提供多种采样器,如 SimpleCutSampler、BucketingSampler 和 CutPairsSampler,支持状态恢复和基于总语音时长的动态批量大小生成
批量I/O支持预计算模式(适用于慢速I/O)和即时特征提取模式(适用于数据增强)
命令行工具
lhotse 的命令行工具非常实用,包括 combine、copy、copy-feats 以及多种 cut 操作如 append、decompose、describe 等,简化了数据处理流程:
lhotse combine
lhotse copy
lhotse copy-feats
lhotse cut append
lhotse cut decompose
lhotse cut describe
lhotse cut export-to-webdataset
lhotse cut mix-by-recording-id
lhotse cut mix-sequential
lhotse cut pad
lhotse cut simplelhotse 为许多开源数据集提供了 prepare 函数,可以方便地下载和处理这些标准语音数据集。
总结
TTS数据准备是一个多步骤、复杂的过程,涉及音频处理、说话人分离和语音识别等多个技术领域。借助 Emilia-Pipe 等工具和完善的处理流程,我们可以将原始音频转化为高质量的TTS训练数据集,为构建自然流畅的语音合成系统奠定基础。
对于希望开发TTS系统的团队,建议在数据准备阶段投入足够的资源,因为数据质量直接决定了最终模型的性能。