- 人工智能
- 语音
- 音频
【免费下载链接】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.
TAL_CSASR(TAL English Class Speech ASR)是面向中英混合语音识别场景的公开教学语料集,由 TAL(好未来)发布,包含 200+ 说话人、总计约 587 小时的英语课堂真实录音。本指南以 PaddleSpeech 仓库中的 dataset/tal_cs/README.md 数据集说明为主体,结合 dataset/tal_cs/tal_cs.py 数据处理脚本与 examples/tal_cs/asr1 完整训练示例,系统讲解从数据集理解、Manifest 生成、特征与词表构建,到 Conformer/Transformer(U2 架构)模型训练、Top-k 平均、多策略解码评测与单音频推理的完整闭环。读完本文,你将能够独立基于 TAL_CSASR 数据复现 PaddleSpeech 的 u2 中英混合 ASR 训练流水线,并理解其中每个环节的源码级实现细节。
一、TAL_CSASR 数据集概览
TAL_CSASR 是 TAL 发布的英语课堂音频数据集,音频内容为英语教师授课录音,其最显著的特点是中英混合语音:教师讲解中会自然穿插中文,属于典型的代码切换(Code-Switching)语音识别场景。
根据 dataset/tal_cs/README.md 官方说明,数据集关键规格如下:
| 项目 | 规格 |
|---|---|
| 总数据量 | 587H(train_set: 555.9H,dev_set: 8H,test_set: 23.6H) |
| 文件体积 | 63.36G |
| 采样率 | 16000 Hz |
| 采样位深 | 16 bit |
| 录音设备 | 麦克风 |
| 说话人数 | 200+(每条音频仅含单说话人) |
| 录音时间 | 2019 年 |
| 数据格式 | 音频:.wav;文本:.txt |
| 音频时长 | 1–60 秒 |
| 数据内容 | 英语教师授课音频 |
| 中英比例 | 中文字符与英文单词之比约 13:1 |
值得特别说明的是原文档中强调的两点:
- 句内与句间混合:该数据集同时包含"句内混合"(intra-sentence mixing,一句话内部中英夹杂)与"句间混合"(inter-sentence mixing,整句为中文、整句为英文交替出现)两种样本,这正是真实课堂场景的语言特点;
- 单说话人:每条音频只包含一个说话人,因此说话人信息可作为辅助特征(在 Manifest 中以
utt2spk字段记录),也便于后续做说话人相关分析。
说明:数据集需要从 TAL 官方数据集页面下载(对应代码中的
TALCS_corpus目录),仓库脚本并不内置下载逻辑,下载后需手动解压到指定目录,详见下文 Stage -1 的说明。
二、目录结构与 Manifest 生成机制
2.1 仓库中与 TAL_CSASR 相关的组成
PaddleSpeech 仓库中与本数据集直接相关的文件分为两部分:
- 数据集工具:dataset/tal_cs/tal_cs.py —— 负责把原始语料转换为训练所需的 Manifest 文件;
- 完整实验示例:examples/tal_cs/asr1 —— 包含数据处理、训练、评测、推理的整套脚本与配置。
其中asr1示例目录结构如下:
examples/tal_cs/asr1/ ├── path.sh # 环境变量(MAIN_ROOT、BIN_DIR 等) ├── run.sh # 流水线总入口(stage 0-51) ├── RESULTS.md # 已发布模型在测试集上的 MER 结果 ├── conf/ │ ├── conformer.yaml # 离线 Conformer 模型配置 │ ├── chunk_conformer.yaml# 流式(chunk)Conformer 配置 │ └── tuning/ │ ├── decode.yaml # 解码策略配置 │ └── chunk_decode.yaml └── local/ ├── data.sh # 数据处理(manifest/CMVN/vocab/SPM) ├── train.sh # 模型训练 ├── test.sh # 测试集评测 └── test_wav.sh # 单音频文件推理2.2 Manifest 的生成:tal_cs.py 源码解析
dataset/tal_cs/tal_cs.py 是数据接入的核心脚本。其输入是解压后的语料目录,结构约定为:
TALCS_corpus/ ├── train_set/ │ ├── wav/ # 音频文件(.wav) │ └── label.txt # 每行:音频ID + 转写文本 ├── dev_set/ │ └── ... └── test_set/ └── ...脚本通过命令行参数控制输入输出:
python dataset/tal_cs/tal_cs.py \ --target_dir <数据集目录> \ --manifest_prefix <Manifest 输出前缀>其中--target_dir指向包含train_set、dev_set、test_set三个子目录的根目录,--manifest_prefix指定输出前缀。脚本内部逻辑(见 tal_cs.py):
- 依次处理
train_set、dev_set、test_set,分别生成manifest.train.raw、manifest.dev.raw、manifest.test.raw; - 遍历每个子集下
wav目录,逐行读取label.txt,把每行按空白切分,第一列为音频文件名(不含扩展名),其余列为转写文本; - 使用
soundfile读取音频,duration = len(audio_data) / samplerate计算时长(秒); - 以
-连接音频 ID 的前两段作为说话人 ID(utt2spk = '-'.join(utt.split('-')[:2]))。
每条样本被序列化为一行 JSON,字段如下:
| 字段 | 含义 |
|---|---|
utt | 音频 ID(文件名去掉 .wav) |
utt2spk | 说话人 ID(由音频 ID 推导) |
feat | 音频文件的绝对路径 |
feat_shape | 音频时长(秒),形如[10.5] |
text | 转写文本(统一转为小写) |
同时脚本还会在 Manifest 同目录输出.meta统计文件(tal_cs.py),记录每个子集的utt数量、总时长(小时)、总字符数与字符速率,方便核对数据规模:
test_set.meta ---------- test: 1234 utts 23.6 h ... char ... char/sec ... sec/utt文本统一lower()处理是因为中英混合场景下英文大小写对识别无意义,可降低词表冗余。这一设计在 tal_cs.py 中体现。
三、环境准备与 Stage -1 数据接入
asr1示例通过run.sh组织整条流水线,全部阶段定义如下(源自 examples/tal_cs/asr1/README.md):
| Stage | 功能 |
|---|---|
| -1 | 检查语料是否存在,并调用 tal_cs.py 生成 raw Manifest |
| 0 | 计算训练集 CMVN(均值/方差归一化)、生成词表与 sentencepiece 模型 |
| 1 | 训练模型 |
| 2 | 对 top-k 模型参数做平均得到最终模型(k=1 即选最优单模型) |
| 3 | 在测试集上评测最终模型 |
| 4 | 使用最终模型对测试数据做 CTC 对齐(当前脚本中未启用) |
| 5 | 对单个音频文件进行推理 |
| 51 | 导出 JIT 模型(注释标记为 Not supported at now) |
先初始化环境变量(path.sh 定义了MAIN_ROOT、PYTHONPATH、BIN_DIR等):
source path.sh source ${MAIN_ROOT}/utils/parse_options.sh # 支持 --variable value 传参Stage -1 是数据接入的第一步(见 local/data.sh):脚本会检查${MAIN_ROOT}/dataset/tal_cs/TALCS_corpus目录是否存在,若不存在则提示先下载并解压数据集(原文档给出数据 md5 参考值4c879b3c9c05365fc9dee1fc68713afe),随后执行:
python ${MAIN_ROOT}/dataset/tal_cs/tal_cs.py \ --target_dir ${MAIN_ROOT}/dataset/tal_cs/TALCS_corpus/ \ --manifest_prefix data/四、Stage 0:特征统计、词表与子词模型构建
Stage 0 在 local/data.sh 中由三个步骤构成,对应的关键参数为:feat_dim=80、sample_rate=16000、stride_ms=20、window_ms=30、bpemode=bpe、nbpe=11297。
4.1 计算 CMVN 统计量
调用 utils/compute_mean_std.py 在训练集 raw Manifest 上统计 fbank 特征的均值与方差:
python3 ${MAIN_ROOT}/utils/compute_mean_std.py \ --manifest_path="data/manifest.train.raw" \ --num_samples=-1 \ --spectrum_type="fbank" \ --feat_dim=80 \ --delta_delta=false \ --sample_rate=16000 \ --stride_ms=20 \ --window_ms=30 \ --use_dB_normalization=False \ --num_workers=$(nproc) \ --output_path="data/mean_std.json"要点:
--num_samples=-1表示使用全部样本统计;- 输出
data/mean_std.json,供后续format_data.py做特征归一化,训练时 CMVN 不再实时计算。
4.2 构建词表与 sentencepiece 模型
调用 utils/build_vocab.py,以unit_type='spm'在训练集文本上训练 BPE 子词模型:
python3 ${MAIN_ROOT}/utils/build_vocab.py \ --unit_type 'spm' \ --count_threshold=0 \ --vocab_path="data/lang_char/vocab.txt" \ --manifest_paths="data/manifest.train.raw" \ --spm_mode=bpe \ --spm_vocab_size=11297 \ --spm_model_prefix=data/lang_char/bpe_bpe_11297 \ --spm_character_coverage=1产物:
data/lang_char/vocab.txt:最终词表(供模型vocab_filepath引用);data/lang_char/bpe_bpe_11297.model与bpe_bpe_11297.vocab:sentencepiece 模型及对应词表。
之所以采用 11297 规模的 BPE 子词而非纯汉字词表,正是因为 TAL_CSASR 中英混合文本同时包含汉字与英文单词,子词模型能有效控制词表规模并覆盖中英两种语言的形态学变化。
4.3 格式化 Manifest
调用 utils/format_data.py 把 raw Manifest 转换为带 token id 的训练格式(train/dev/test 并行处理):
python3 ${MAIN_ROOT}/utils/format_data.py \ --cmvn_path "data/mean_std.json" \ --unit_type "spm" \ --spm_model_prefix data/lang_char/bpe_bpe_11297 \ --vocab_path="data/lang_char/vocab.txt" \ --manifest_path="data/manifest.${sub}.raw" \ --output_path="data/manifest.${sub}"完成后data/目录结构与 asr1/README.md 中描述的一致:
data/ ├── dev_set.meta ├── lang_char/ │ ├── bpe_bpe_11297.model │ ├── bpe_bpe_11297.vocab │ └── vocab.txt ├── manifest.dev ├── manifest.dev.raw ├── manifest.test ├── manifest.test.raw ├── manifest.train ├── manifest.train.raw ├── mean_std.json ├── test_set.meta └── train_set.meta只执行数据处理时:
bash run.sh --stage 0 --stop_stage 0 # 或逐条手动执行 . ./path.sh bash ./local/data.sh五、模型配置解析:conformer.yaml
conf/conformer.yaml 是 U2 架构(混合 CTC/注意力,论文见 asr1 README 所引 u2)的完整配置,分为网络结构、数据、DataLoader、训练四部分。
5.1 编码器(Conformer)
encoder: conformer encoder_conf: output_size: 512 # attention 维度 attention_heads: 8 linear_units: 2048 # 前馈网络隐藏单元数 num_blocks: 12 # 编码器块数 dropout_rate: 0.1 positional_dropout_rate: 0.1 attention_dropout_rate: 0.0 input_layer: conv2d # 可选 conv2d / conv2d6 / conv2d8 normalize_before: True cnn_module_kernel: 15 use_cnn_module: True activation_type: 'swish' pos_enc_layer_type: 'rel_pos' selfattention_layer_type: 'rel_selfattn'关键设计:采用相对位置编码(rel_pos/rel_selfattn),使模型对音频时长泛化能力更强;cnn_module_kernel: 15的卷积模块用于建模局部上下文;normalize_before: True表示 Pre-Norm 结构,训练更稳定。
5.2 解码器与混合 CTC/Attention
decoder: transformer decoder_conf: attention_heads: 8 linear_units: 2048 num_blocks: 6 dropout_rate: 0.1 positional_dropout_rate: 0.1 self_attention_dropout_rate: 0.0 src_attention_dropout_rate: 0.0 model_conf: ctc_weight: 0.3 # CTC 损失权重(0~1) lsm_weight: 0.1 # 标签平滑 length_normalized_loss: false init_type: 'kaiming_uniform' # 注意:需配合收敛性验证ctc_weight: 0.3意味着最终损失为0.3 * CTC + 0.7 * Attention CE,这是 U2 架构的核心——训练阶段联合优化 CTC 与注意力,解码阶段则可切换多种策略(见第七节)。
5.3 数据与 DataLoader
train_manifest: data/manifest.train dev_manifest: data/manifest.dev test_manifest: data/manifest.test vocab_filepath: data/lang_char/vocab.txt spm_model_prefix: 'data/lang_char/bpe_bpe_11297' unit_type: 'spm' preprocess_config: conf/preprocess.yaml feat_dim: 80 stride_ms: 20.0 window_ms: 30.0 sortagrad: 0 # -1: 全部 epoch 按长度排序;0: 关闭;其他: 指定 epoch 开启 batch_size: 5 maxlen_in: 512 # 输入长度超过该值则自动调小 batch maxlen_out: 150 # 输出长度超过该值则自动调小 batch batch_count: auto num_workers: 2 subsampling_factor: 1 num_encs: 180 维 fbank 特征、20ms 帧移、30ms 窗长与 Stage 0 数据处理参数保持一致。
5.4 训练超参
n_epoch: 100 accum_grad: 4 # 梯度累积步数 global_grad_clip: 5.0 optim: adam optim_conf: lr: 0.002 weight_decay: 1.0e-6 scheduler: warmuplr scheduler_conf: warmup_steps: 25000 lr_decay: 1.0 log_interval: 100 checkpoint: kbest_n: 50 # 按验证集指标保留 top-50 latest_n: 5 # 同时保留最近 5 个100 个 epoch、25000 步 warmup、学习率 0.002 配合accum_grad: 4(等效 batch size 放大 4 倍),是 RESULTS.md 中"Epoch 100、3 张 V100-32G"训练配置的复现基础。
六、Stage 1-2:模型训练与 Top-k 平均
6.1 训练入口
run.sh中 Stage 1 调用 local/train.sh:
CUDA_VISIBLE_DEVICES=${gpus} ./local/train.sh ${conf_path} ${ckpt} ${ips}train.sh的关键逻辑(见 local/train.sh):
ngpu=0时单进程 CPU 训练:python3 -u ${BIN_DIR}/train.py --ngpu 0 ...;- 多卡时使用
python3 -m paddle.distributed.launch --gpus=${CUDA_VISIBLE_DEVICES}拉起分布式训练,可传--ips指定多机地址; - 设置
FLAGS_allocator_strategy=naive_best_fit以避免显存耗尽时训练挂起; - 支持
--seed(默认 0 不启用,开启时同时置FLAGS_cudnn_deterministic=True,但注释提示 seed 可能影响收敛)。
实际执行:
# 训练(多卡) bash run.sh --stage 1 --stop_stage 1 --gpus 0,1,2,3 # 或仅用 CPU 手动执行 . ./path.sh bash ./local/data.sh CUDA_VISIBLE_DEVICES= ./local/train.sh conf/conformer.yaml conformer训练产物统一输出到exp/conformer/目录(--output exp/${ckpt_name}),checkpoint 前缀由配置文件名推导:ckpt=$(basename ${conf_path} | awk -F'.' '{print $1}'),即conf/conformer.yaml→conformer,conf/chunk_conformer.yaml→chunk_conformer。
6.2 Top-k 模型平均
每个 epoch 结束都会保存 checkpoint(按kbest_n: 50/latest_n: 5策略),Stage 2 用 utils/avg.sh 对验证集上最优的 k 个模型做参数平均:
avg.sh best exp/conformer/checkpoints 10其中avg_num=10对应最终模型exp/conformer/checkpoints/avg_10。参数平均是 ESPnet 系工作流的标准技巧,能有效平滑训练后期震荡、提升测试集泛化性能。
七、Stage 3:测试集评测与四种解码策略
7.1 评测入口
CUDA_VISIBLE_DEVICES=0 ./local/test.sh ${conf_path} ${decode_conf_path} exp/conformer/checkpoints/avg_10local/test.sh 会依次用四种解码方式评测,结果分别写入<ckpt_prefix>/<type>.rsl:
| 解码方式 | batch_size | 特点 |
|---|---|---|
attention | 64(chunk 模式为 1) | 纯注意力自回归解码 |
ctc_greedy_search | 64(chunk 模式为 1) | CTC 贪心搜索,速度最快 |
ctc_prefix_beam_search | 1 | CTC 前缀束搜索 |
attention_rescoring | 1 | CTC 束搜索 + 注意力重打分(精度最高) |
脚本通过配置文件名是否匹配chunk_*.yaml自动开启chunk_mode,流式解码强制batch_size=1。
python3 -u ${BIN_DIR}/test.py \ --ngpu ${ngpu} \ --config ${config_path} \ --decode_cfg ${decode_config_path} \ --result_file ${output_dir}/${type}.rsl \ --checkpoint_path ${ckpt_prefix} \ --opts decode.decoding_method ${type} \ --opts decode.decode_batch_size ${batch_size}7.2 已发布模型的评测结果
RESULTS.md 记录了离线与流式两个版本在 test_set 上的 MER(混合错误率,中英混合场景的评测指标)结果:
Conformer(离线,conf/conformer.yaml):训练 100 epoch,3×V100-32G,top-10 平均,参数量 47.63M。
| 解码方式 | MER |
|---|---|
| attention | 0.102786 |
| ctc_greedy_search | 0.103538 |
| ctc_prefix_beam_search | 0.103317 |
| attention_rescoring | 0.084374 |
Chunk Conformer(流式,conf/chunk_conformer.yaml):同样 47.63M 参数。
| 解码方式 | MER |
|---|---|
| attention | 0.080488 |
| ctc_greedy_search | 0.093244 |
| ctc_prefix_beam_search | 0.093251 |
| attention_rescoring | 0.079193 |
可以看出attention_rescoring(CTC 束搜索 + 注意力重打分)在两种架构下均取得最低 MER,这也是 U2 架构推荐的默认解码策略;而流式 chunk_conformer 在 attention_rescoring 下甚至优于离线版本(0.079193 vs 0.084374),说明流式推理在该任务上无损甚至更优。
八、Stage 5:单音频文件推理
8.1 使用自训模型推理
单音频推理由 local/test_wav.sh 承接(run.sh 中对应 Stage 5):
CUDA_VISIBLE_DEVICES=0 ./local/test_wav.sh \ conf/conformer.yaml \ conf/tuning/decode.yaml \ exp/conformer/checkpoints/avg_10 \ data/demo_01_03.wav前提条件:待推理音频采样率必须为 16K(与训练特征一致),否则需先重采样。
8.2 使用预训练模型
也可以直接下载官方预训练模型(模型清单见 docs/source/released_model.md):
wget https://paddlespeech.cdn.bcebos.com/s2t/tal_cs/asr1/asr1_conformer_talcs_ckpt_1.4.0.model.tar.gz tar xzvf asr1_conformer_talcs_ckpt_1.4.0.model.tar.gz source path.sh # 若尚未处理数据并生成 Manifest,先执行以下两步 bash local/data.sh --stage -1 --stop_stage -1 bash local/data.sh --stage 2 --stop_stage 2 CUDA_VISIBLE_DEVICES= ./local/test.sh conf/conformer.yaml conf/tuning/decode.yaml exp/conformer/checkpoints/avg_10下载演示音频后即可推理:
wget -nc https://paddlespeech.cdn.bcebos.com/datasets/single_wav/zh/demo_01_03.wav -P data/ CUDA_VISIBLE_DEVICES= ./local/test_wav.sh \ conf/conformer.yaml \ conf/tuning/decode.yaml \ exp/conformer/checkpoints/avg_10 \ data/demo_01_03.wav九、完整流水线速查
把 run.sh 中的stage/stop_stage组合使用即可灵活控制执行范围:
# 端到端:数据处理 → 训练 → 平均 → 评测 bash run.sh --stage 0 --stop_stage 3 # 只训练(在已处理数据基础上) bash run.sh --stage 1 --stop_stage 1 --gpus 0,1,2,3 # 训练 + 平均 + 评测 bash run.sh --stage 1 --stop_stage 3 --avg_num 10常用局部变量(均可通过--variable value覆盖,ckpt除外):
| 变量 | 默认值 | 含义 |
|---|---|---|
gpus | 0,1,2,3 | 训练用 GPU 列表,置空表示仅用 CPU |
stage/stop_stage | 0/50 | 起始 / 结束阶段 |
conf_path | conf/conformer.yaml | 模型配置路径 |
decode_conf_path | conf/tuning/decode.yaml | 解码配置路径 |
avg_num | 10 | Top-k 平均个数(k=1 表示选最优单模型) |
audio_file | data/demo_01_03.wav | Stage 5 单文件推理路径 |
ckpt | 由 conf_path 文件名推导 | checkpoint 前缀,如conformer |
例如同时指定 GPU 与平均个数:
bash run.sh --gpus 0,1 --avg_num 10十、总结与适用场景
TAL_CSASR 是 PaddleSpeech 仓库中面向中英混合(代码切换)语音识别的典型基准:587 小时真实课堂录音、200+ 说话人、句内/句间混合样本,配合仓库内完整的 u2(Conformer/Transformer)示例脚本,形成了从数据接入(tal_cs.py)→ 特征/词表构建(data.sh)→ 训练(train.sh)→ 评测(test.sh)的端到端可复现闭环。
从 RESULTS.md 可见,离线与流式 Conformer 在该数据集上 MER 均低于 0.11,attention_rescoring解码可进一步将离线模型 MER 压至约 0.084、流式模型至约 0.079。对于需要落地中英混合课堂、会议等场景的开发者,可直接复用本示例的流水线与配置作为起点;若需进一步优化,可从词表规模(nbpe)、CTC 权重(ctc_weight)、warmup 步数以及流式 chunk 配置等方向入手,并结合 docs/source/released_model.md 中的预训练模型做迁移学习。
- 人工智能
- 语音
- 音频
【免费下载链接】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.
相关推荐
fairseq Speech Synthesis 实战:基于 LJSpeech 数据集训练 Transformer 与 FastSpeech 2 语音合成模型
fairseq Speech Synthesis 实战:基于 LJSpeech 数据集训练 Transformer 与 FastSpeech 2 语音合成模型
人工智能深度学习预训练NLP语音PaddleSpeech U2/U2-Kaldi 语音识别模型训练入口与训练流程深度解析
PaddleSpeech U2/U2 Kaldi 语音识别模型训练入口与训练流程深度解析 导读 本文以 PaddleSpeech 中 paddlespeech.
人工智能语音音频NLP媒体生成PaddleSpeech SpeechX 实战:U2/U2++/DeepSpeech2 模型的 C++ 流式 ASR 部署指南
PaddleSpeech SpeechX 实战:U2/U2++/DeepSpeech2 模型的 C++ 流式 ASR 部署指南 SpeechX 是 Paddle
人工智能语音音频NLP媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考