PaddleSpeech 基于 TAL_CSASR 中英混合教学语音数据集训练 U2(Conformer/Transformer)ASR 模型实战指南
2026/9/23 2:42:12 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

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 仓库中与本数据集直接相关的文件分为两部分:

  1. 数据集工具:dataset/tal_cs/tal_cs.py —— 负责把原始语料转换为训练所需的 Manifest 文件;
  2. 完整实验示例: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_setdev_settest_set三个子目录的根目录,--manifest_prefix指定输出前缀。脚本内部逻辑(见 tal_cs.py):

  • 依次处理train_setdev_settest_set,分别生成manifest.train.rawmanifest.dev.rawmanifest.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_ROOTPYTHONPATHBIN_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=80sample_rate=16000stride_ms=20window_ms=30bpemode=bpenbpe=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.modelbpe_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: 1

80 维 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.yamlconformerconf/chunk_conformer.yamlchunk_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_10

local/test.sh 会依次用四种解码方式评测,结果分别写入<ckpt_prefix>/<type>.rsl

解码方式batch_size特点
attention64(chunk 模式为 1)纯注意力自回归解码
ctc_greedy_search64(chunk 模式为 1)CTC 贪心搜索,速度最快
ctc_prefix_beam_search1CTC 前缀束搜索
attention_rescoring1CTC 束搜索 + 注意力重打分(精度最高)

脚本通过配置文件名是否匹配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
attention0.102786
ctc_greedy_search0.103538
ctc_prefix_beam_search0.103317
attention_rescoring0.084374

Chunk Conformer(流式,conf/chunk_conformer.yaml):同样 47.63M 参数。

解码方式MER
attention0.080488
ctc_greedy_search0.093244
ctc_prefix_beam_search0.093251
attention_rescoring0.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除外):

变量默认值含义
gpus0,1,2,3训练用 GPU 列表,置空表示仅用 CPU
stage/stop_stage0/50起始 / 结束阶段
conf_pathconf/conformer.yaml模型配置路径
decode_conf_pathconf/tuning/decode.yaml解码配置路径
avg_num10Top-k 平均个数(k=1 表示选最优单模型)
audio_filedata/demo_01_03.wavStage 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.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询