news 2026/9/25 5:53:29

ESPnet 多语言 BABEL 语料库 ASR Recipe 实战指南:单语与多语言联合训练配置、数据流水线与结果复现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESPnet 多语言 BABEL 语料库 ASR Recipe 实战指南:单语与多语言联合训练配置、数据流水线与结果复现
  • 人工智能
  • 语音
  • 音频
  • 深度学习
  • NLP

【免费下载链接】espnet

End-to-End Speech Processing Toolkit

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

本文基于 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 中,节选如下:

编号语言编号语言
101Cantonese 粤语201Haitian 海地克里奥尔语
102Assamese 阿萨姆语202Swahili 斯瓦希里语
103Bengali 孟加拉语203Lao 老挝语
104Pashto 普什图语204Tamil 泰米尔语
105Turkish 土耳其语205Kurmanji 库尔曼吉语
106Tagalog 他加禄语206Zulu 祖鲁语
107Vietnamese 越南语207Tok Pisin 托克皮钦语
301Cebuano 宿务语304Lithuanian 立陶宛语
302Kazakh 哈萨克语305Guarani 瓜拉尼语
303Telugu 泰卢固语306Igbo 伊博语
307Amharic 阿姆哈拉语401Mongolian 蒙古语
402Javanese 爪哇语403Dholuo 卢奥语
404Georgian 格鲁吉亚语——

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之后还有两项收尾工作:

  1. 为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
  1. 从训练文本中抽取<...>形式的非语言符号(如<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: 1

LM 使用 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(词错误率)

datasetSntWrdCorrSubDelInsErrS.Err
decode_devdecode_asr_model_valid.loss.best66235584731.153.915.05.074.088.6
decode_eval_203decode_asr_model_valid.loss.best113549030330.053.916.15.375.389.3

CER(字符错误率)

datasetSntWrdCorrSubDelInsErrS.Err
decode_devdecode_asr_model_valid.loss.best662324234559.914.725.44.444.689.4
decode_eval_203decode_asr_model_valid.loss.best1135439147458.315.226.64.546.290.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 的完整操作清单

综合以上各环节,完整复现流程如下:

  1. 获取并放置语料:从 IARPA Babel Program 获取目标语言包,记录其在本地磁盘的绝对路径;
  2. 配置 db.sh:在 db.sh 中填写对应BABEL_<编号>变量(如BABEL_102=/path/to/102-assamese);
  3. 选择训练/测试语言:按需修改run.sh中的langs/recog,或直接通过命令行参数传入:
    cd egs2/babel/asr1 ./run.sh --langs "102 103" --recog "102 103"
  4. 数据准备阶段(setup_languages.sh+prepare_data.sh):脚本自动完成子集抽取、LLP/FLP 切换、语言前缀化与多语言合并,生成data/train、data/dev及各dev_<l>/eval_<l>测试集;
  5. 训练与解码(asr.sh):按train_asr.yaml训练 ASR 模型、按train_lm.yaml训练 LM,随后按decoder_asr.yaml解码各测试集;
  6. 结果查看:运行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

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

相关推荐

上一篇:如何快速开启开源之旅:与Pradumna Saraf共学的完整指南
下一篇:TradingAgents深度解析:5步构建你的AI金融交易智囊团

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 5:52:49

类“拼多多“《拼团交易平台系统》项目实战:从需求建模到设计模式拉满的营销系统设计

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总&#xff0c;旨在为大家提供一个清晰详细的学习教程&#xff0c;侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助&#xff0c;请给予支持(关注、…

作者头像 李华
网站建设 2026/9/25 5:52:05

PyCharm配置Git:让IDE成为默认编辑器,告别vim提交困扰

你会不会也这样&#xff1a;Git装好了&#xff0c;PyCharm也开着&#xff0c;一切看起来都齐了&#xff0c;结果第一次敲git commit&#xff0c;屏幕突然跳进一个黑底白字的 vim 窗口&#xff0c;满屏波浪号&#xff0c;鼠标还不好使&#xff0c;你压根不知道怎么输入提交信息&…

作者头像 李华
网站建设 2026/9/25 5:50:54

GEO信任断层:大模型采信机制下的企业权威构建难题

一、GEO与SEO的四个常见问题当用户向豆包提问“苏州有哪些靠谱的短视频系统服务商”&#xff0c;大模型给出的答案中引用了三家企业信息&#xff0c;其中两家是行业头部品牌&#xff0c;另一家却鲜有人知。这是否意味着&#xff0c;在生成式引擎优化时代&#xff0c;企业内容的…

作者头像 李华