- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
本文基于 ESPnet 仓库中egs2/babel/asr1的官方 BABEL Recipe(README.md),面向希望在低资源多语言语音识别场景下复用该配方(Recipe)的开发者。BABEL 语料库(IARPA Babel Program)包含数十种低资源语言的电话对话语音,本指南将带你掌握run.sh --langs/--recog的语言选择机制、多语言数据合并流水线(setup_languages.sh与prepare_data.sh)、LM + ASR 联合训练配置,以及如何对照仓库中记录的 WER/CER 基线结果验证复现。
BABEL Recipe 是什么:一条开箱即用的多语言 ASR 配方
在 ESPnet2 的 egs2 体系中,每个egs2/<语料库>/<任务>目录都是一条可独立运行的实验配方(Recipe)。egs2/babel/asr1是专门面向 IARPA BABEL 低资源语料库的语音识别配方,其核心价值在于:
- 一个目录、多个语言:BABEL 语料库按语言编号(Language Pack ID)划分,本配方为每个语言提供了独立的训练/开发/评估数据清单与词典(lexicon),并能在同一套流水线中把多种语言的数据合并起来进行联合训练;
- 低资源设定:默认支持 LimitedLP(约 10 小时)与 FullLP(完整语言包)两种训练数据规模,可通过
--FLP开关切换; - 与标准 ESPnet2 训练框架无缝衔接:底层调用
egs2/babel/asr1/asr.sh,复用 ESPnet2 统一的 ASR 训练、解码与打分流程。
关联文档README.md篇幅精炼,但给出了两条核心启动命令与一组可复现的基线结果。本文将以这两条命令为主线,结合配方内的脚本与配置文件,展开完整讲解。
快速上手:两条命令理解--langs与--recog
原文档的核心内容就是两条启动命令,它们揭示了本配方最重要的两个参数语义:
# 命令一:仅用 Assamese(102)训练,并仅在 102 上测试 ./run.sh --langs "102" --recog "102" # 命令二:用 Assamese(102)+ Bengali(103)联合训练,并在两者上分别测试 ./run.sh --langs "102 103" --recog "102 103"其中:
--langs:指定参与训练的语言编号列表。这些语言的训练集会被分别准备后合并成一个统一的data/train目录,供多语言联合训练使用;--recog:指定参与**识别(解码测试)**的语言编号列表。每个编号会展开为dev_<lang>与eval_<lang>两个测试集。
上述两个参数由run.sh通过--local_data_opts "--langs ${langs} --recog ${recog}"透传给本地数据准备脚本。若未显式指定,egs2/babel/asr1/run.sh中的默认值是:
langs="101 102 103 104 105 106 202 203 204 205 206 207 301 302 303 304 305 306 401 402 403" recog="107 201 307 404"即默认用 21 种语言训练、4 种语言(Vietnamese 107、Haitian 201、Amharic 307、Georgian 404)做测试。run.sh随后会按recog列表自动构造测试集:
test_sets="" for l in ${recog}; do test_sets="dev_${l} eval_${l} ${test_sets}" done语言编号与语料布局:lang_list.sh 与 db.sh 的对应关系
要正确运行本配方,首先必须理解语言编号(ID)与语料路径的映射。语言编号与语言名的对应关系定义在 local/lang_list.sh 中,节选如下:
| 编号 | 语言 | 编号 | 语言 |
|---|---|---|---|
| 101 | Cantonese 粤语 | 201 | Haitian 海地克里奥尔语 |
| 102 | Assamese 阿萨姆语 | 202 | Swahili 斯瓦希里语 |
| 103 | Bengali 孟加拉语 | 203 | Lao 老挝语 |
| 104 | Pashto 普什图语 | 204 | Tamil 泰米尔语 |
| 105 | Turkish 土耳其语 | 205 | Kurmanji 库尔曼吉语 |
| 106 | Tagalog 他加禄语 | 206 | Zulu 祖鲁语 |
| 107 | Vietnamese 越南语 | 207 | Tok Pisin 托克皮钦语 |
| 301 | Cebuano 宿务语 | 304 | Lithuanian 立陶宛语 |
| 302 | Kazakh 哈萨克语 | 305 | Guarani 瓜拉尼语 |
| 303 | Telugu 泰卢固语 | 306 | Igbo 伊博语 |
| 307 | Amharic 阿姆哈拉语 | 401 | Mongolian 蒙古语 |
| 402 | Javanese 爪哇语 | 403 | Dholuo 卢奥语 |
| 404 | Georgian 格鲁吉亚语 | — | — |
lang_list.sh为每个语言定义四类关键路径/清单变量,例如 102(Assamese):
train_data_dir_102=${BABEL_102}/release-current/conversational/training train_data_list_102=./conf/lists/102-assamese/train.LimitedLP.list # LimitedLP(约10h)训练清单 train_data_dir_102_FLP=${BABEL_102}/release-current/conversational/training train_data_list_102_FLP=./conf/lists/102-assamese/train.FullLP.list # FullLP 训练清单 dev10h_data_dir_102=${BABEL_102}/release-current/conversational/dev dev10h_data_list_102=./conf/lists/102-assamese/dev.list # dev10h 开发集清单 lexicon_file_102=${BABEL_102}/release-current/conversational/reference_materials/lexicon.sub-train.txt lexiconFlags_102="--romanized --oov <unk>" # 词典解析选项可以看出,FLP 与 LLP 的主要区别在于使用不同的训练清单文件(train.FullLP.listvstrain.LimitedLP.list),而不是不同的语料目录。每种语言具体的语音文件清单位于 conf/lists 下按语言名组织的子目录中。
路径中的BABEL_102等环境变量需要在 db.sh 中配置。db.sh为每个 BABEL 语言包定义了BABEL_<编号>变量(如BABEL_101=、BABEL_102=等),默认均为空,需要你填写本地语料实际路径;同时脚本内置了 CMU TIR 与 JHU CLSP 两个特定集群的自动填充逻辑,供内部环境使用。
数据检查逻辑在 local/data.sh 中,它会遍历langs与recog中的所有编号并检查对应变量是否已配置:
for l in ${langs} ${recog}; do if [ ! -e "${BABEL}_${l}" ]; then log "Fill the value of '${BABEL}_${l}' of db.sh" exit 1 fi done多语言数据准备流水线:setup_languages.sh 与 prepare_data.sh
本配方最具特色的部分是数据准备阶段,流程可概括为“逐语言准备 → 并行执行 → 前缀化 → 合并”四步,入口为 local/setup_languages.sh。
第 1 步:为每个语言建立独立工作目录
脚本先合并langs与recog得到all_langs,然后为每个语言编号创建data/<编号>/目录,并通过符号链接把local、utils、steps、conf等公共资源链接进去,同时拷贝cmd.sh、path.sh:
for l in ${all_langs}; do [ -d data/${l} ] || mkdir -p data/${l} cd data/${l} ln -sf ${cwd}/local . for f in ${cwd}/{utils,steps,conf}; do ln -sf `make_absolute.sh $f` . done cp ${cwd}/cmd.sh . cp ${cwd}/path.sh . ... done第 2 步:并行执行各语言的 prepare_data.sh
随后对每个语言并行调用local/prepare_data.sh --FLP ${FLP} <lang_id>(后台&+wait),其核心逻辑在 local/prepare_data.sh 中:
--FLP开关:FLP=true时使用_FLP后缀变量(FullLP),否则使用 LimitedLP(约 10 小时)清单;- 子集划分:通过
make_corpus_subset.sh从原始语料中抽出训练与 dev10h 子集,再用prepare_acoustic_training_data.pl(带--vocab词典与--fragmentMarkers断句标记)生成声学训练列表; - 内部开发集划分:从训练数据中切出 1/10 作为
train_dev; - 语言前缀化(关键设计):用
copy_data_dir.sh --spk-prefix "${l}_" --utt-prefix "${l}_"为所有说话人与句子 ID 加上语言编号前缀,避免不同语言共享同一说话人 ID 造成歧义:
./utils/copy_data_dir.sh --spk-prefix "${l}_" --utt-prefix "${l}_" \ data/train data/train_${l} ./utils/copy_data_dir.sh --spk-prefix "${l}_" --utt-prefix "${l}_" \ data/train_dev data/dev_${l} ./utils/copy_data_dir.sh --spk-prefix "${l}_" --utt-prefix "${l}_" \ data/dev10h.pem data/eval_${l}第 3 步:合并多语言训练/开发数据
setup_languages.sh最后把所有语言的训练目录合并为统一的data/train,把所有recog语言的开发目录合并为data/dev,并将每个语言的dev_<l>、eval_<l>以符号链接方式暴露到顶层:
./utils/combine_data.sh data/train ${train_dirs} ./utils/combine_data.sh data/dev ${dev_dirs} for l in ${recog}; do ln -s ${cwd}/data/${l}/data/eval_${l} ${cwd}/data/eval_${l} ln -s ${cwd}/data/${l}/data/dev_${l} ${cwd}/data/dev_${l} done第 4 步:后处理(data.sh)
local/data.sh 在调用setup_languages.sh之后还有两项收尾工作:
- 为
train/dev/recog_set的wav.scp统一追加sox 重采样到 16kHz的在线处理管道(BABEL 原始语音采样率可能非 16k):
sed -i.bak -e "s/$/ sox -R -t wav - -t wav - rate 16000 dither | /" data/${x}/wav.scp- 从训练文本中抽取
<...>形式的非语言符号(如<hes>、<noise>等标记)生成data/nlsym.txt(非语言符号表):
cut -f 2- data/${train_set}/text | tr " " "\n" | sort | uniq | grep "<" > data/nlsym.txt模型与训练配置:train_asr.yaml、train_lm.yaml 与 decode 参数
多语言联合训练仍使用 ESPnet2 标准的 ASR 训练流程(由egs2/babel/asr1/asr.sh驱动)。run.sh中关键开关为:--token_type char(字符级建模,规避低资源语言缺少分词器的问题)、--feats_type raw(直接使用波形/原始特征)、--use_lm true(启用外部语言模型)。
ASR 模型配置 conf/train_asr.yaml
# network architecture encoder: rnn encoder_conf: rnn_type: lstm bidirectional: True use_projection: True num_layers: 6 hidden_size: 320 output_size: 320 # decoder related decoder: rnn decoder_conf: rnn_type: lstm num_layers: 1 hidden_size: 320 sampling_probability: 0.0 # minibatch related batch_type: folded batch_size: 30 # optimization related optim: adadelta max_epoch: 100 patience: 4 scheduler: reducelronplateau scheduler_conf: mode: min factor: 0.5 patience: 1 # criterion val_scheduler_criterion: - valid - loss best_model_criterion: - - valid - acc - max keep_nbest_models: 1 init: xavier_uniform要点解读:
- 6 层双向 LSTM 编码器 + 1 层 LSTM 解码器,隐层 320 维,属于典型的中等规模 RNN 序列模型,适合低资源语料;
init: xavier_uniform:采用 Xavier 均匀分布初始化——README 中的基线模型名asr_lsm_torch14_xavier_init正是对该初始化策略的直接记录;optim: adadelta+reducelronplateau调度器:adadelta 无需手动学习率,配合按验证 loss 减半学习率的策略,对低资源训练友好;best_model_criterion按验证集 acc 最大选取最佳模型,keep_nbest_models: 1仅保留最优单模型。
语言模型配置 conf/train_lm.yaml
lm: seq_rnn lm_conf: nlayers: 2 unit: 650 optim: sgd # or adam batch_type: folded batch_size: 256 # batch size in LM training max_epoch: 20 # if the data size is large, we can reduce this patience: 3 best_model_criterion: - - valid - loss - min keep_nbest_models: 1LM 使用 2 层 650 单元的顺序 RNN,SGD 优化,训练文本来自data/train/text(--lm_train_text)。低资源场景下 LM 有助于缓解字符级建模带来的解码歧义。
解码配置 conf/decoder_asr.yaml
lm_weight: 1.0 beam_size: 20 penalty: 0.0 maxlenratio: 0.0 minlenratio: 0.0 ctc_weight: 0.3解码时使用 beam size 20 的集束搜索,ctc_weight: 0.3表示在注意力解码基础上以 0.3 的权重混合 CTC 打分(训练配置中虽未显式列出 ctc_weight,但解码默认启用 CTC 联合打分),lm_weight: 1.0融合外部语言模型。
任务调度配置 cmd.sh
配方通过cmd_backend变量选择任务后端,支持local(本机 run.pl)、stdout、sge(queue.pl)、pbs、slurm(slurm.pl)、ssh以及 JHU 专用后端,各后端通过train_cmd/cuda_cmd/decode_cmd映射。默认cmd_backend='local',适合单机调试;集群环境可切换到slurm并修改 conf/slurm.conf 的分区设置。
基线结果解读:README 中的 WER/CER 记录
原文档记录了一次以asr_lsm_torch14_xavier_init(PyTorch 1.4 + LSTM + Xavier 初始化)为配置的基线实验结果,环境信息如下:
- 日期:
Sun Mar 1 21:23:27 EST 2020 - Python:
3.7.6;PyTorch:1.4.0;ESPnet:0.6.0 - Git hash:
bd80c0522eab5c41baebfb903276938650575d80(commit 日期 2020-02-25)
WER(词错误率)
| dataset | Snt | Wrd | Corr | Sub | Del | Ins | Err | S.Err |
|---|---|---|---|---|---|---|---|---|
| decode_devdecode_asr_model_valid.loss.best | 6623 | 55847 | 31.1 | 53.9 | 15.0 | 5.0 | 74.0 | 88.6 |
| decode_eval_203decode_asr_model_valid.loss.best | 11354 | 90303 | 30.0 | 53.9 | 16.1 | 5.3 | 75.3 | 89.3 |
CER(字符错误率)
| dataset | Snt | Wrd | Corr | Sub | Del | Ins | Err | S.Err |
|---|---|---|---|---|---|---|---|---|
| decode_devdecode_asr_model_valid.loss.best | 6623 | 242345 | 59.9 | 14.7 | 25.4 | 4.4 | 44.6 | 89.4 |
| decode_eval_203decode_asr_model_valid.loss.best | 11354 | 391474 | 58.3 | 15.2 | 26.6 | 4.5 | 46.2 | 90.0 |
解读要点:
- 表头
decode_devdecode_asr_model_valid.loss.best表示解码目录按asr_model_valid.loss.best模型命名;eval_203即 Bengali 语言的评估集(注意 README 中解码结果对应语言与模型训练语言一致); - 该基线整体 CER 显著低于 WER(约 44–46% vs 74–75%),符合低资源电话对话语音的特点:大量虚词、口误与 等标记导致词级替换/删除率高,而字符级指标更能反映声学建模质量;
- 列含义:
Corr(正确率)、Sub(替换)、Del(删除)、Ins(插入)、Err(总错误率)、S.Err(句子错误率)。错误率计算公式为Err = Sub + Del + Ins。
该表由scripts/utils/show_asr_result.sh自动生成(README 中保留了生成注释),因此你在自己的实验目录exp/*/decode_*/score_wer/下运行同一脚本即可生成同格式结果,方便与基线对照。
从 0 到 1:复现 BABEL Recipe 的完整操作清单
综合以上各环节,完整复现流程如下:
- 获取并放置语料:从 IARPA Babel Program 获取目标语言包,记录其在本地磁盘的绝对路径;
- 配置 db.sh:在 db.sh 中填写对应
BABEL_<编号>变量(如BABEL_102=/path/to/102-assamese); - 选择训练/测试语言:按需修改
run.sh中的langs/recog,或直接通过命令行参数传入:cd egs2/babel/asr1 ./run.sh --langs "102 103" --recog "102 103" - 数据准备阶段(
setup_languages.sh+prepare_data.sh):脚本自动完成子集抽取、LLP/FLP 切换、语言前缀化与多语言合并,生成data/train、data/dev及各dev_<l>/eval_<l>测试集; - 训练与解码(
asr.sh):按train_asr.yaml训练 ASR 模型、按train_lm.yaml训练 LM,随后按decoder_asr.yaml解码各测试集; - 结果查看:运行
scripts/utils/show_asr_result.sh汇总 WER/CER,与 README 中基线对比。
需要特别说明的前提条件:
- 该配方依赖 IARPA Babel 授权语料,无法自动下载,
db.sh中路径必须人工配置; - README 记录的基线为 2020 年 ESPnet 0.6.0 / PyTorch 1.4 时代的实验结果;当前仓库代码已演进,实际复现指标可能因框架版本与随机种子而有所差异,应以本仓库当前代码重新训练得到的分数为准;
- 若语料包含非 16kHz 采样率,
data.sh会通过 sox 在线重采样,请确保环境中安装了sox。
延伸阅读
- 配方主脚本:egs2/babel/asr1/run.sh(语言选择与 asr.sh 调用入口)
- 数据准备:egs2/babel/asr1/local/setup_languages.sh、egs2/babel/asr1/local/prepare_data.sh、egs2/babel/asr1/local/data.sh
- 语言映射:egs2/babel/asr1/local/lang_list.sh;语料路径:egs2/babel/asr1/db.sh
- 配置文件:conf/train_asr.yaml、conf/train_lm.yaml、conf/decoder_asr.yaml
- 任务调度:egs2/babel/asr1/cmd.sh
- 结果汇总工具:scripts/utils/show_asr_result.sh
- 人工智能
- 语音
- 音频
- 深度学习
- NLP
【免费下载链接】espnet
End-to-End Speech Processing Toolkit
相关推荐
ESPnet OWSM v2 s2t1 Recipe 实战指南:多语言 ASR 的数据准备、训练与解码
ESPnet OWSM v2 s2t1 Recipe 实战指南:多语言 ASR 的数据准备、训练与解码 本篇以 ESPnet 仓库中 OWSM v2 的 s2t
人工智能语音音频深度学习NLPfairseq ML50 多语言数据流水线实战:从原始语料下载到 mBART50 训练数据构建
fairseq ML50 多语言数据流水线实战:从原始语料下载到 mBART50 训练数据构建 本指南聚焦于 fairseq 仓库中 examples/mult
人工智能深度学习预训练NLP语音ESPnet2 瑞士法语多音词语料 ASR 实战:Conformer 端到端语音识别 Recipe 与结果复盘
ESPnet2 瑞士法语多音词语料 ASR 实战:Conformer 端到端语音识别 Recipe 与结果复盘 本篇基于 ESPnet 仓库中 egs2/pol
人工智能语音音频深度学习NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考