如何快速掌握WeNet:从零到一的端到端语音识别学习指南
目录
- 为什么选择 WeNet?
- 学习路径总览
- 为什么优先学习 AIShell 示例?
- 详细学习步骤
- 步骤 1:环境搭建
- 1.1 安装依赖
- 1.2 克隆 WeNet 仓库
- 1.3 硬件准备
- 步骤 2:运行 AIShell 示例
- 2.1 进入示例目录
- 2.2 逐阶段运行
- 2.3 各阶段详解
- 2.4 快速运行完整流程
- 2.5 使用预训练模型加速学习
- 步骤 3:掌握核心概念
- 步骤 4:实践与调试
- 4.1 使用预训练模型
- 4.2 修改配置
- 4.3 使用自定义数据
- 4.4 调试常见问题
- 步骤 5:深入代码与进阶
- 5.1 阅读关键代码
- 5.2 进阶实验
- 5.3 开发实际应用
- 学习时间规划
- 调试技巧与注意事项
- 资源与支持
- 总结
- 如何快速掌握WeNet:从零到一的端到端语音识别学习指南
- 为什么选择 WeNet?
- 学习路径总览
- 为什么优先学习 AIShell 示例?
- 详细学习步骤
- 步骤 1:环境搭建
- 1.1 安装依赖
- 1.2 克隆 WeNet 仓库
- 1.3 硬件准备
- 步骤 2:运行 AIShell 示例
- 2.1 进入示例目录
- 2.2 逐阶段运行
- 2.3 各阶段详解
- 2.4 快速运行完整流程
- 2.5 使用预训练模型加速学习
- 步骤 3:掌握核心概念
- 步骤 4:实践与调试
- 4.1 使用预训练模型
- 4.2 修改配置
- 4.3 使用自定义数据
- 4.4 调试常见问题
- 步骤 5:深入代码与进阶
- 5.1 阅读关键代码
- 5.2 进阶实验
- 5.3 开发实际应用
- 学习时间规划
- 调试技巧与注意事项
- 资源与支持
- 总结
- 如何快速掌握WeNet:从零到一的端到端语音识别学习指南
- 为什么选择 WeNet?
- 学习路径总览
- 为什么优先学习 AIShell 示例?
- 详细学习步骤
- 步骤 1:环境搭建
- 1.1 安装依赖
- 1.2 克隆 WeNet 仓库
- 1.3 硬件准备
- 步骤 2:运行 AIShell 示例
- 2.1 进入示例目录
- 2.2 逐阶段运行
- 2.3 各阶段详解
- 2.4 快速运行完整流程
- 2.5 使用预训练模型加速学习
- 步骤 3:掌握核心概念
- 步骤 4:实践与调试
- 4.1 使用预训练模型
- 4.2 修改配置
- 4.3 使用自定义数据
- 4.4 调试常见问题
- 步骤 5:深入代码与进阶
- 5.1 阅读关键代码
- 5.2 进阶实验
- 5.3 开发实际应用
- 学习时间规划
- 调试技巧与注意事项
- 资源与支持
- 总结
- 如何快速掌握WeNet:从零到一的端到端语音识别学习指南
- 为什么选择 WeNet?
- 学习路径总览
- 为什么优先学习 AIShell 示例?
- 详细学习步骤
- 步骤 1:环境搭建
- 1.1 安装依赖
- 1.2 克隆 WeNet 仓库
- 1.3 硬件准备
- 步骤 2:运行 AIShell 示例
- 2.1 进入示例目录
- 2.2 逐阶段运行
- 2.3 各阶段详解
- 2.4 快速运行完整流程
- 2.5 使用预训练模型加速学习
- 步骤 3:掌握核心概念
- 步骤 4:实践与调试
- 4.1 使用预训练模型
- 4.2 修改配置
- 4.3 使用自定义数据
- 4.4 调试常见问题
- 步骤 5:深入代码与进阶
- 5.1 阅读关键代码
- 5.2 进阶实验
- 5.3 开发实际应用
- 学习时间规划
- 调试技巧与注意事项
- 资源与支持
- 总结
WeNet 是一个开源的端到端语音识别框架,专注于生产优先(production-first),支持流式和非流式推理,广泛应用于工业级语音识别任务。如果你想快速掌握 WeNet,本文将为你提供一个系统化的学习路径,从环境搭建到运行示例,再到深入代码和实际应用,带你从零到一上手 WeNet。优先推荐学习 AIShell 示例,因为它数据规模小、流程清晰、适合初学者。本文将详细讲解学习步骤、核心概念、实践建议和调试技巧,帮助你高效掌握 WeNet。
为什么选择 WeNet?
WeNet(WeNet End-to-End Speech Recognition Toolkit)由 Mobvoi 和西北工业大学联合开发,旨在提供生产就绪的语音识别解决方案。它的核心优势包括:
- 统一架构:采用 Unified Two Pass (U2) 框架,同时支持流式和非流式推理,通过调整
chunk_size
平衡延迟和准确性。 - 高准确性:通过 CTC 和注意力机制联合训练,实现更高的识别准确率。
- 生产优化:支持 n-gram 语言模型(LM)、上下文偏置(context biasing)和大数据训练(UIO),适合工业级应用。
- 跨平台支持:支持 x86 服务器和 Android 设备推理,易于部署。
- 开源生态:提供丰富的预训练模型、Python 接口和详细文档,社区活跃。
无论你是语音识别初学者还是希望将 WeNet 应用于实际项目,本文将帮助你快速入门并掌握其核心功能。
学习路径总览
要快速掌握 WeNet,建议按照以下步骤逐步学习:
- 环境搭建:安装依赖、克隆仓库、准备硬件。
- 运行 AIShell 示例:通过运行 AIShell 示例(
example/aishell/s0/run.sh
)理解数据准备、训练、解码和模型导出的全流程。 - 掌握核心概念:学习 U2 框架、上下文偏置、语言模型(LM)和大数据训练(UIO)。
- 实践与调试:使用预训练模型、修改配置、尝试自定义数据。
- 深入代码与进阶:阅读关键代码,尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。
为什么优先学习 AIShell 示例?
WeNet 提供了多个数据集示例,包括 AIShell、LibriSpeech、Gigaspeech 和 WenetSpeech。推荐优先学习 AIShell 示例(example/aishell/s0/run.sh
),原因如下:
- 数据规模小:AIShell-1 数据集约 200 小时,下载和处理速度快,适合快速实验。
- 语言直观:如果熟悉中文,AIShell 的中文字符建模单元(char)更易理解,词典生成和解码结果直观。
- 流程完整:AIShell 示例涵盖了从数据下载到模型导出的全流程,逻辑清晰,适合初学者。
- 社区支持:AIShell 是 WeNet 最常用的示例,GitHub Issues 中相关问题和解答较多。
相比之下,LibriSpeech(约 1000 小时,英文,BPE 建模单元)数据规模较大,处理时间长,适合进阶学习;Gigaspeech 和 WenetSpeech(1 万小时)更适合研究大数据训练(UIO)。
详细学习步骤
步骤 1:环境搭建
1.1 安装依赖
WeNet 依赖 PyTorch、LibTorch 和其他工具,建议使用支持 GPU 的环境。以下是安装步骤:
-
安装 Python 包:
pip install git+https://github.com/wenet-e2e/wenet.git
或者开发安装:
git clone https://github.com/wenet-e2e/wenet.git cd wenet pip install -e .
-
安装 PyTorch:推荐版本 1.6.0 或更高,确保支持 DDP(分布式数据并行)和 NCCL(GPU 通信后端)。例如:
pip install torch==1.6.0
-
安装 LibTorch(运行时推理):如果需要 C++ 推理或语言模型支持,参考安装指南安装 LibTorch。
-
其他依赖:确保安装
torchaudio
(用于特征提取)、sentencepiece
(用于 BPE 建模)、Tensorboard(用于训练监控)等。
1.2 克隆 WeNet 仓库
git clone https://github.com/wenet-e2e/wenet.git
cd wenet
1.3 硬件准备
- GPU:至少 1 张 NVIDIA GPU(建议 8GB 显存以上,如 2080 Ti 或 V100)。
- 内存:建议 32GB 以上,处理大数据时可能需要更多。
- 存储:AIShell 数据约 10GB,预留足够空间(建议 50GB 以上)。
- 环境变量:设置 GPU 设备,例如:
export CUDA_VISIBLE_DEVICES="0,1"
步骤 2:运行 AIShell 示例
AIShell 示例(example/aishell/s0/run.sh
)是学习 WeNet 的最佳起点,涵盖了从数据准备到模型导出的全流程。以下是逐阶段运行的详细说明:
2.1 进入示例目录
cd example/aishell/s0
2.2 逐阶段运行
run.sh
分为 7 个阶段(-1 到 6),建议逐一运行以理解每个步骤:
bash run.sh --stage -1 --stop_stage -1 # 下载数据
bash run.sh --stage 0 --stop_stage 0 # 准备训练数据
bash run.sh --stage 1 --stop_stage 1 # 提取 CMVN 特征(可选)
bash run.sh --stage 2 --stop_stage 2 # 生成标签词典
bash run.sh --stage 3 --stop_stage 3 # 准备 WeNet 数据格式
bash run.sh --stage 4 --stop_stage 4 # 神经网络训练
bash run.sh --stage 5 --stop_stage 5 # 使用训练模型解码
bash run.sh --stage 6 --stop_stage 6 # 导出模型
2.3 各阶段详解
-
阶段 -1:下载数据
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
$data
路径(如/home/username/asr-data/aishell/
)。 - 注意:需设置绝对路径,确保网络稳定。如果已下载,可修改
run.sh
中的$data
变量,从阶段 0 开始。
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
-
阶段 0:准备训练数据
- 运行
local/aishell_data_prep.sh
,生成wav.scp
(音频路径)和text
(转录文本)文件。 - 示例
wav.scp
:BAC009S0002W0122 /export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav
- 示例
text
:BAC009S0002W0122 而对楼市成交抑制作用最大的限购
- 检查文件格式,确保音频路径有效,文本正确。
- 运行
-
阶段 1:提取 CMVN 特征(可选)
- 使用
tools/compute_cmvn_stats.py
提取全局 CMVN(倒谱均值和方差归一化)统计,用于归一化声学特征。 - 可设置
cmvn=false
跳过,使用原始 WAV 输入(通过 TorchAudio 即时提取特征)。
- 使用
-
阶段 2:生成标签词典
- 生成字符级词典(
units.txt
),映射中文字符到整数索引。 - 示例词典:
<blank> 0 <unk> 1 一 2 丁 3 ... <sos/eos> 4232
- 理解特殊符号:
<blank>
用于 CTC,<unk>
表示未知 token,<sos/eos>
用于注意力解码器。
- 生成字符级词典(
-
阶段 3:准备 WeNet 数据格式
- 生成 JSON 格式的
data.list
,包含key
(语音 ID)、wav
(音频路径)、txt
(转录文本)。 - 示例
data.list
:{"key": "BAC009S0002W0122", "wav": "/export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav", "txt": "而对楼市成交抑制作用最大的限购"}
- 生成 JSON 格式的
-
阶段 4:神经网络训练
- 训练 Conformer 模型,配置文件为
conf/train_conformer.yaml
。 - 使用多 GPU(DDP 模式,建议
dist_backend="nccl"
)。 - 监控训练损失:
tensorboard --logdir tensorboard/your_exp_name/ --port 12598 --bind_all
- 训练时间:8 张 2080 Ti 约 1 天(50 epoch)。单 GPU 可能需数天。
- 恢复训练:若中断,设置
checkpoint=exp/your_exp/$n.pt
,从第 n+1 epoch 继续。
- 训练 Conformer 模型,配置文件为
-
阶段 5:使用训练模型解码
- 使用
wenet/bin/recognize.py
进行推理,支持四种解码方法:ctc_greedy_search
、ctc_prefix_beam_search
、attention
、attention_rescoring
。 - 推荐
attention_rescoring
,结合 CTC 和注意力机制,效果最佳。 - 调整
beam_size
(默认 10,越大效果越好但计算成本高)和ctc_weight
(默认 0.5)。 - 检查 WER(字错误率,约为 5%):
python tools/compute-wer.py --char=1 --v=1 data/test/text test_dir/text
- 使用
-
阶段 6:导出模型
- 使用
wenet/bin/export_jit.py
导出 LibTorch 模型(final.zip
),用于 C++ 推理。 - 示例:
python wenet/bin/export_jit.py --config exp/train.yaml --checkpoint exp/avg_10.pt --output_file exp/final.zip
- 使用
2.4 快速运行完整流程
如果时间有限,可直接运行:
bash run.sh --stage -1 --stop_stage 6
但建议逐阶段运行,便于调试和理解。
2.5 使用预训练模型加速学习
如果不想从头训练,可下载 AIShell 的预训练 Conformer 模型(链接),直接跳到阶段 5 进行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/model.pt
步骤 3:掌握核心概念
在运行 AIShell 示例的同时,阅读以下文档,理解 WeNet 的核心功能:
-
U2 框架(参考
runtime_wenet.md
)- WeNet 采用 Unified Two Pass (U2) 框架,支持流式(有限延迟)和非流式(高准确性)推理。
- 关键参数:
chunk_size
控制流式推理的块大小,影响延迟和准确性。 - 解码方法:
attention_rescoring
结合 CTC 前缀束搜索和注意力解码器,效果最佳。 - 实践:尝试修改
decoding_chunk_size
(阶段 5),观察流式和非流式效果。
-
上下文偏置(参考
context_biasing.md
)- 通过上下文 FST 提升热词(如人名、专有名词)的识别率。
- 关键函数:
GetNextState
和 CTC 前缀束搜索的上下文扩展。 - 实践:在 AIShell 示例中添加自定义热词,修改
context_graph
配置。
-
语言模型(LM)(参考
lm_for_wenet.md
)- WeNet 支持 n-gram 语言模型和 WFST 解码,适用于生产环境。
- 运行 AIShell 示例的阶段 7,添加语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习如何准备词典、训练 n-gram 模型和构建 TLG 解码图。
-
大数据训练(UIO)(参考
uio_big_data_training_wenet.md
)- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
raw
和shard
模式。 raw
模式适合小数据集(如 AIShell),shard
模式支持压缩包格式,适合大数据(如 WenetSpeech)。- 实践:检查 AIShell 的
data.list
(raw
模式),了解shard
模式的 tar.gz 格式。
- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
-
预训练模型(参考
pretrained_models_wenet.md
)- WeNet 提供检查点模型(
.pt
,用于训练)和运行时模型(.zip
,用于推理)。 - AIShell 的 Conformer 模型支持中文,LibriSpeech 支持英文,均遵循数据集许可(如 CC BY 4.0)。
- WeNet 提供检查点模型(
-
Python 包(参考
python_package_wenet.md
)- WeNet 提供简洁的 Python 接口,快速进行推理:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 实践:编写 Python 脚本,加载 AIShell 预训练模型,测试单条音频。
- WeNet 提供简洁的 Python 接口,快速进行推理:
步骤 4:实践与调试
4.1 使用预训练模型
- 下载 AIShell 的预训练 Conformer 模型,直接运行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/aishell_u2pp_conformer_exp.tar.gz
- 检查解码结果(
test_dir/text
)和 WER(test_dir/wer
)。
4.2 修改配置
- 打开
conf/train_conformer.yaml
,调整以下参数:- 模型结构:
encoder_layers
(编码器层数)、hidden_units
(隐藏单元数)。 - 优化参数:
learning_rate
(学习率)、batch_size
。
- 模型结构:
- 在阶段 5 中调整解码参数:
--beam_size
:增大(例如 20)以提高准确性,观察计算成本。--ctc_weight
:调整 CTC 和注意力解码器的权重(默认 0.5)。
4.3 使用自定义数据
- 准备自定义音频(WAV 格式,16kHz 采样率)和转录文本,整理成
wav.scp
和text
:# wav.scp custom_001 /path/to/audio1.wav custom_002 /path/to/audio2.wav# text custom_001 你好这是一个测试 custom_002 语音识别很有趣
- 从阶段 1 开始运行:
bash run.sh --stage 1 --stop_stage 6
4.4 调试常见问题
- 数据下载慢:AIShell 数据约 10GB,需稳定网络。如失败,可手动下载并更新
$data
路径。 - 内存不足(OOM):
- 检查
CUDA_VISIBLE_DEVICES
,确保 GPU 分配正确。 - 减小
batch_size
或使用shard
模式(UIO)。
- 检查
- 训练速度慢:
- 增大 UIO 的
shuffle_buffer
(建议 1500)和prefetch
(建议 4)。 - 确保使用 NCCL 后端(
dist_backend="nccl"
)。
- 增大 UIO 的
- WER 偏高:
- 检查
data.list
和词典格式是否正确。 - 尝试模型平均(
average_checkpoint=true
)或增大beam_size
。
- 检查
- 社区求助:在 GitHub Issues 搜索或提问,描述问题并附上日志。
步骤 5:深入代码与进阶
5.1 阅读关键代码
- 模型实现:
wenet/transformer/asr_model.py
:U2 模型(编码器 + CTC + 注意力解码器)。wenet/transformer/encoder.py
:Conformer 编码器实现,重点关注forward_chunk
(流式推理)。
- 解码逻辑:
wenet/bin/recognize.py
:Python 解码脚本,理解四种解码方法。runtime/libtorch/decoder/torch_asr_model.cc
:C++ 运行时解码,集成语言模型。
- UIO 数据处理:
wenet/dataset/dataset.py
:实现raw
和shard
模式的数据加载。- 查看
shuffle_buffer
和prefetch
的作用。
5.2 进阶实验
- LibriSpeech 示例:
- 运行
example/librispeech/s0/run.sh
,学习 BPE 建模单元和英文语音识别。 - 注意 BPE 词典生成(
tools/spm_train
)和解码后处理(tools/spm_decode
)。
- 运行
- WenetSpeech 示例:
- 运行
example/wenetspeech/s0/run.sh
,实践 UIO 的shard
模式,处理 1 万小时大数据。 - 理解压缩包格式(
tar.gz
)和云存储支持。
- 运行
- 语言模型集成:
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习 WFST 解码图(TLG)的构建过程。
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
- 上下文偏置:
- 实现自定义热词(如公司名称),修改
context_graph
配置,运行解码测试。
- 实现自定义热词(如公司名称),修改
5.3 开发实际应用
- Python 应用:
- 使用 WeNet Python 包,开发简单语音识别脚本:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 使用 WeNet Python 包,开发简单语音识别脚本:
- C++ 推理:
- 使用导出的
final.zip
模型,在 x86 或 Android 运行时进行推理(参考runtime/libtorch
或runtime/android
)。
- 使用导出的
- 实时流式推理:
- 设置
decoding_chunk_size
(如 16),实现流式语音识别,适用于实时应用。
- 设置
学习时间规划
- 1-2 天:搭建环境,运行 AIShell 示例(阶段 -1 到 6),测试预训练模型,熟悉流程。
- 3-5 天:阅读 U2 框架、上下文偏置、语言模型文档,修改 AIShell 配置,尝试自定义数据。
- 1 周以上:深入代码,运行 LibriSpeech 或 WenetSpeech 示例,开发 Python 或 C++ 应用。
调试技巧与注意事项
- 数据问题:
- 确保音频为 WAV 格式,16kHz 采样率。
- 检查
wav.scp
和text
文件的格式,路径必须有效。
- 训练问题:
- 监控 Tensorboard 损失曲线,检查是否收敛。
- 若 OOM,尝试减小
batch_size
或使用shard
模式。
- 解码问题:
- WER 偏高时,检查词典和
data.list
,尝试attention_rescoring
模式。 - 增大
beam_size
或调整ctc_weight
优化结果。
- WER 偏高时,检查词典和
- 性能优化:
- 使用 UIO 的
shard
模式处理大数据,设置合理的shuffle_buffer
和prefetch
。 - 优先使用 NCCL 后端,提升多 GPU 训练效率。
- 使用 UIO 的
资源与支持
- 官方文档:https://wenet-e2e.github.io/wenet/
- GitHub 仓库:https://github.com/wenet-e2e/wenet
- 预训练模型:https://docs.qq.com/form/page/DZnRkVHlnUk5QaFdC
- 社区支持:在 GitHub Issues 搜索或提问,社区响应较快。
- 参考论文:
- U2 框架
- CTC 序列建模
总结
通过优先运行 AIShell 示例(example/aishell/s0/run.sh
),你可以在 1-2 天内掌握 WeNet 的核心流程,从数据准备到模型训练和推理。结合 U2 框架、上下文偏置、语言模型和 UIO 的学习,你可以逐步深入 WeNet 的功能和代码。进阶时可尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。无论你是语音识别新手还是资深开发者,WeNet 的生产优先设计和丰富文档都将为你提供强大的支持。快去克隆仓库,运行第一个示例,开启你的 WeNet 之旅吧!
当前时间:2025年7月11日,下午4:47(香港时间)
如何快速掌握WeNet:从零到一的端到端语音识别学习指南
WeNet 是一个开源的端到端语音识别框架,专注于生产优先(production-first),支持流式和非流式推理,广泛应用于工业级语音识别任务。如果你想快速掌握 WeNet,本文将为你提供一个系统化的学习路径,从环境搭建到运行示例,再到深入代码和实际应用,带你从零到一上手 WeNet。优先推荐学习 AIShell 示例,因为它数据规模小、流程清晰、适合初学者。本文将详细讲解学习步骤、核心概念、实践建议和调试技巧,帮助你高效掌握 WeNet。
为什么选择 WeNet?
WeNet(WeNet End-to-End Speech Recognition Toolkit)由 Mobvoi 和西北工业大学联合开发,旨在提供生产就绪的语音识别解决方案。它的核心优势包括:
- 统一架构:采用 Unified Two Pass (U2) 框架,同时支持流式和非流式推理,通过调整
chunk_size
平衡延迟和准确性。 - 高准确性:通过 CTC 和注意力机制联合训练,实现更高的识别准确率。
- 生产优化:支持 n-gram 语言模型(LM)、上下文偏置(context biasing)和大数据训练(UIO),适合工业级应用。
- 跨平台支持:支持 x86 服务器和 Android 设备推理,易于部署。
- 开源生态:提供丰富的预训练模型、Python 接口和详细文档,社区活跃。
无论你是语音识别初学者还是希望将 WeNet 应用于实际项目,本文将帮助你快速入门并掌握其核心功能。
学习路径总览
要快速掌握 WeNet,建议按照以下步骤逐步学习:
- 环境搭建:安装依赖、克隆仓库、准备硬件。
- 运行 AIShell 示例:通过运行 AIShell 示例(
example/aishell/s0/run.sh
)理解数据准备、训练、解码和模型导出的全流程。 - 掌握核心概念:学习 U2 框架、上下文偏置、语言模型(LM)和大数据训练(UIO)。
- 实践与调试:使用预训练模型、修改配置、尝试自定义数据。
- 深入代码与进阶:阅读关键代码,尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。
为什么优先学习 AIShell 示例?
WeNet 提供了多个数据集示例,包括 AIShell、LibriSpeech、Gigaspeech 和 WenetSpeech。推荐优先学习 AIShell 示例(example/aishell/s0/run.sh
),原因如下:
- 数据规模小:AIShell-1 数据集约 200 小时,下载和处理速度快,适合快速实验。
- 语言直观:如果熟悉中文,AIShell 的中文字符建模单元(char)更易理解,词典生成和解码结果直观。
- 流程完整:AIShell 示例涵盖了从数据下载到模型导出的全流程,逻辑清晰,适合初学者。
- 社区支持:AIShell 是 WeNet 最常用的示例,GitHub Issues 中相关问题和解答较多。
相比之下,LibriSpeech(约 1000 小时,英文,BPE 建模单元)数据规模较大,处理时间长,适合进阶学习;Gigaspeech 和 WenetSpeech(1 万小时)更适合研究大数据训练(UIO)。
详细学习步骤
步骤 1:环境搭建
1.1 安装依赖
WeNet 依赖 PyTorch、LibTorch 和其他工具,建议使用支持 GPU 的环境。以下是安装步骤:
-
安装 Python 包:
pip install git+https://github.com/wenet-e2e/wenet.git
或者开发安装:
git clone https://github.com/wenet-e2e/wenet.git cd wenet pip install -e .
-
安装 PyTorch:推荐版本 1.6.0 或更高,确保支持 DDP(分布式数据并行)和 NCCL(GPU 通信后端)。例如:
pip install torch==1.6.0
-
安装 LibTorch(运行时推理):如果需要 C++ 推理或语言模型支持,参考安装指南安装 LibTorch。
-
其他依赖:确保安装
torchaudio
(用于特征提取)、sentencepiece
(用于 BPE 建模)、Tensorboard(用于训练监控)等。
1.2 克隆 WeNet 仓库
git clone https://github.com/wenet-e2e/wenet.git
cd wenet
1.3 硬件准备
- GPU:至少 1 张 NVIDIA GPU(建议 8GB 显存以上,如 2080 Ti 或 V100)。
- 内存:建议 32GB 以上,处理大数据时可能需要更多。
- 存储:AIShell 数据约 10GB,预留足够空间(建议 50GB 以上)。
- 环境变量:设置 GPU 设备,例如:
export CUDA_VISIBLE_DEVICES="0,1"
步骤 2:运行 AIShell 示例
AIShell 示例(example/aishell/s0/run.sh
)是学习 WeNet 的最佳起点,涵盖了从数据准备到模型导出的全流程。以下是逐阶段运行的详细说明:
2.1 进入示例目录
cd example/aishell/s0
2.2 逐阶段运行
run.sh
分为 7 个阶段(-1 到 6),建议逐一运行以理解每个步骤:
bash run.sh --stage -1 --stop_stage -1 # 下载数据
bash run.sh --stage 0 --stop_stage 0 # 准备训练数据
bash run.sh --stage 1 --stop_stage 1 # 提取 CMVN 特征(可选)
bash run.sh --stage 2 --stop_stage 2 # 生成标签词典
bash run.sh --stage 3 --stop_stage 3 # 准备 WeNet 数据格式
bash run.sh --stage 4 --stop_stage 4 # 神经网络训练
bash run.sh --stage 5 --stop_stage 5 # 使用训练模型解码
bash run.sh --stage 6 --stop_stage 6 # 导出模型
2.3 各阶段详解
-
阶段 -1:下载数据
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
$data
路径(如/home/username/asr-data/aishell/
)。 - 注意:需设置绝对路径,确保网络稳定。如果已下载,可修改
run.sh
中的$data
变量,从阶段 0 开始。
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
-
阶段 0:准备训练数据
- 运行
local/aishell_data_prep.sh
,生成wav.scp
(音频路径)和text
(转录文本)文件。 - 示例
wav.scp
:BAC009S0002W0122 /export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav
- 示例
text
:BAC009S0002W0122 而对楼市成交抑制作用最大的限购
- 检查文件格式,确保音频路径有效,文本正确。
- 运行
-
阶段 1:提取 CMVN 特征(可选)
- 使用
tools/compute_cmvn_stats.py
提取全局 CMVN(倒谱均值和方差归一化)统计,用于归一化声学特征。 - 可设置
cmvn=false
跳过,使用原始 WAV 输入(通过 TorchAudio 即时提取特征)。
- 使用
-
阶段 2:生成标签词典
- 生成字符级词典(
units.txt
),映射中文字符到整数索引。 - 示例词典:
<blank> 0 <unk> 1 一 2 丁 3 ... <sos/eos> 4232
- 理解特殊符号:
<blank>
用于 CTC,<unk>
表示未知 token,<sos/eos>
用于注意力解码器。
- 生成字符级词典(
-
阶段 3:准备 WeNet 数据格式
- 生成 JSON 格式的
data.list
,包含key
(语音 ID)、wav
(音频路径)、txt
(转录文本)。 - 示例
data.list
:{"key": "BAC009S0002W0122", "wav": "/export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav", "txt": "而对楼市成交抑制作用最大的限购"}
- 生成 JSON 格式的
-
阶段 4:神经网络训练
- 训练 Conformer 模型,配置文件为
conf/train_conformer.yaml
。 - 使用多 GPU(DDP 模式,建议
dist_backend="nccl"
)。 - 监控训练损失:
tensorboard --logdir tensorboard/your_exp_name/ --port 12598 --bind_all
- 训练时间:8 张 2080 Ti 约 1 天(50 epoch)。单 GPU 可能需数天。
- 恢复训练:若中断,设置
checkpoint=exp/your_exp/$n.pt
,从第 n+1 epoch 继续。
- 训练 Conformer 模型,配置文件为
-
阶段 5:使用训练模型解码
- 使用
wenet/bin/recognize.py
进行推理,支持四种解码方法:ctc_greedy_search
、ctc_prefix_beam_search
、attention
、attention_rescoring
。 - 推荐
attention_rescoring
,结合 CTC 和注意力机制,效果最佳。 - 调整
beam_size
(默认 10,越大效果越好但计算成本高)和ctc_weight
(默认 0.5)。 - 检查 WER(字错误率,约为 5%):
python tools/compute-wer.py --char=1 --v=1 data/test/text test_dir/text
- 使用
-
阶段 6:导出模型
- 使用
wenet/bin/export_jit.py
导出 LibTorch 模型(final.zip
),用于 C++ 推理。 - 示例:
python wenet/bin/export_jit.py --config exp/train.yaml --checkpoint exp/avg_10.pt --output_file exp/final.zip
- 使用
2.4 快速运行完整流程
如果时间有限,可直接运行:
bash run.sh --stage -1 --stop_stage 6
但建议逐阶段运行,便于调试和理解。
2.5 使用预训练模型加速学习
如果不想从头训练,可下载 AIShell 的预训练 Conformer 模型(链接),直接跳到阶段 5 进行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/aishell_u2pp_conformer_exp.tar.gz
步骤 3:掌握核心概念
在运行 AIShell 示例的同时,阅读以下文档,理解 WeNet 的核心功能:
-
U2 框架
- WeNet 采用 Unified Two Pass (U2) 框架,支持流式(有限延迟)和非流式(高准确性)推理。
- 关键参数:
chunk_size
控制流式推理的块大小,影响延迟和准确性。 - 解码方法:
attention_rescoring
结合 CTC 前缀束搜索和注意力解码器,效果最佳。 - 实践:尝试修改
decoding_chunk_size
(阶段 5),观察流式和非流式效果。
-
上下文偏置
- 通过上下文 FST 提升热词(如人名、专有名词)的识别率。
- 关键函数:
GetNextState
和 CTC 前缀束搜索的上下文扩展。 - 实践:在 AIShell 示例中添加自定义热词,修改
context_graph
配置。
-
语言模型(LM)
- WeNet 支持 n-gram 语言模型和 WFST 解码,适用于生产环境。
- 运行 AIShell 示例的阶段 7,添加语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习如何准备词典、训练 n-gram 模型和构建 TLG 解码图。
-
大数据训练(UIO)
- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
raw
和shard
模式。 raw
模式适合小数据集(如 AIShell),shard
模式支持压缩包格式,适合大数据(如 WenetSpeech)。- 实践:检查 AIShell 的
data.list
(raw
模式),了解shard
模式的 tar.gz 格式。
- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
-
预训练模型
- WeNet 提供检查点模型(
.pt
,用于训练)和运行时模型(.zip
,用于推理)。 - AIShell 的 Conformer 模型支持中文,LibriSpeech 支持英文,均遵循数据集许可(如 CC BY 4.0)。
- WeNet 提供检查点模型(
-
Python 包
- WeNet 提供简洁的 Python 接口,快速进行推理:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 实践:编写 Python 脚本,加载 AIShell 预训练模型,测试单条音频。
- WeNet 提供简洁的 Python 接口,快速进行推理:
步骤 4:实践与调试
4.1 使用预训练模型
- 下载 AIShell 的预训练 Conformer 模型,直接运行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/aishell_u2pp_conformer_exp.tar.gz
- 检查解码结果(
test_dir/text
)和 WER(test_dir/wer
)。
4.2 修改配置
- 打开
conf/train_conformer.yaml
,调整以下参数:- 模型结构:
encoder_layers
(编码器层数)、hidden_units
(隐藏单元数)。 - 优化参数:
learning_rate
(学习率)、batch_size
。
- 模型结构:
- 在阶段 5 中调整解码参数:
--beam_size
:增大(例如 20)以提高准确性,观察计算成本。--ctc_weight
:调整 CTC 和注意力解码器的权重(默认 0.5)。
4.3 使用自定义数据
- 准备自定义音频(WAV 格式,16kHz 采样率)和转录文本,整理成
wav.scp
和text
:# wav.scp custom_001 /path/to/audio1.wav custom_002 /path/to/audio2.wav# text custom_001 你好这是一个测试 custom_002 语音识别很有趣
- 从阶段 1 开始运行:
bash run.sh --stage 1 --stop_stage 6
4.4 调试常见问题
- 数据下载慢:AIShell 数据约 10GB,需稳定网络。如失败,可手动下载并更新
$data
路径。 - 内存不足(OOM):
- 检查
CUDA_VISIBLE_DEVICES
,确保 GPU 分配正确。 - 减小
batch_size
或使用shard
模式(UIO)。
- 检查
- 训练速度慢:
- 增大 UIO 的
shuffle_buffer
(建议 1500)和prefetch
(建议 4)。 - 确保使用 NCCL 后端(
dist_backend="nccl"
)。
- 增大 UIO 的
- WER 偏高:
- 检查
data.list
和词典格式是否正确。 - 尝试模型平均(
average_checkpoint=true
)或增大beam_size
。
- 检查
- 社区求助:在 GitHub Issues 搜索或提问,描述问题并附上日志。
步骤 5:深入代码与进阶
5.1 阅读关键代码
- 模型实现:
wenet/transformer/asr_model.py
:U2 模型(编码器 + CTC + 注意力解码器)。wenet/transformer/encoder.py
:Conformer 编码器实现,重点关注forward_chunk
(流式推理)。
- 解码逻辑:
wenet/bin/recognize.py
:Python 解码脚本,理解四种解码方法。runtime/libtorch/decoder/torch_asr_model.cc
:C++ 运行时解码,集成语言模型。
- UIO 数据处理:
wenet/dataset/dataset.py
:实现raw
和shard
模式的数据加载。- 查看
shuffle_buffer
和prefetch
的作用。
5.2 进阶实验
- LibriSpeech 示例:
- 运行
example/librispeech/s0/run.sh
,学习 BPE 建模单元和英文语音识别。 - 注意 BPE 词典生成(
tools/spm_train
)和解码后处理(tools/spm_decode
)。
- 运行
- WenetSpeech 示例:
- 运行
example/wenetspeech/s0/run.sh
,实践 UIO 的shard
模式,处理 1 万小时大数据。 - 理解压缩包格式(
tar.gz
)和云存储支持。
- 运行
- 语言模型集成:
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习 WFST 解码图(TLG)的构建过程。
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
- 上下文偏置:
- 实现自定义热词(如公司名称),修改
context_graph
配置,运行解码测试。
- 实现自定义热词(如公司名称),修改
5.3 开发实际应用
- Python 应用:
- 使用 WeNet Python 包,开发简单语音识别脚本:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 使用 WeNet Python 包,开发简单语音识别脚本:
- C++ 推理:
- 使用导出的
final.zip
模型,在 x86 或 Android 运行时进行推理(参考runtime/libtorch
或runtime/android
)。
- 使用导出的
- 实时流式推理:
- 设置
decoding_chunk_size
(如 16),实现流式语音识别,适用于实时应用。
- 设置
学习时间规划
- 1-2 天:搭建环境,运行 AIShell 示例(阶段 -1 到 6),测试预训练模型,熟悉流程。
- 3-5 天:阅读 U2 框架、上下文偏置、语言模型文档,修改 AIShell 配置,尝试自定义数据。
- 1 周以上:深入代码,运行 LibriSpeech 或 WenetSpeech 示例,开发 Python 或 C++ 应用。
调试技巧与注意事项
- 数据问题:
- 确保音频为 WAV 格式,16kHz 采样率。
- 检查
wav.scp
和text
文件的格式,路径必须有效。
- 训练问题:
- 监控 Tensorboard 损失曲线,检查是否收敛。
- 若 OOM,尝试减小
batch_size
或使用shard
模式(UIO)。
- 解码问题:
- WER 偏高时,检查
data.list
和词典格式,尝试attention_rescoring
模式。 - 增大
beam_size
或调整ctc_weight
优化结果。
- WER 偏高时,检查
- 性能优化:
- 使用 UIO 的
shard
模式处理大数据,设置合理的shuffle_buffer
和prefetch
。 - 优先使用 NCCL 后端,提升多 GPU 训练效率。
- 使用 UIO 的
资源与支持
- 官方文档:https://wenet-e2e.github.io/wenet/
- GitHub 仓库:https://github.com/wenet-e2e/wenet
- 预训练模型:https://docs.qq.com/form/page/DZnRkVHlnUk5QaFdC
- 社区支持:在 GitHub Issues 搜索或提问,社区响应较快。
- 参考论文:
- U2 框架
- CTC 序列建模
总结
通过优先运行 AIShell 示例(example/aishell/s0/run.sh
),你可以在 1-2 天内掌握 WeNet 的核心流程,从数据准备到模型训练和推理。结合 U2 框架、上下文偏置、语言模型和 UIO 的学习,你可以逐步深入 WeNet 的功能和代码。进阶时可尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。无论你是语音识别新手还是资深开发者,WeNet 的生产优先设计和丰富文档都将为你提供强大的支持。快去克隆仓库,运行第一个示例,开启你的 WeNet 之旅吧!
当前时间:2025年7月11日,下午4:47(香港时间)
如何快速掌握WeNet:从零到一的端到端语音识别学习指南
WeNet 是一个开源的端到端语音识别框架,专注于生产优先(production-first),支持流式和非流式推理,广泛应用于工业级语音识别任务。如果你想快速掌握 WeNet,本文将为你提供一个系统化的学习路径,从环境搭建到运行示例,再到深入代码和实际应用,带你从零到一上手 WeNet。优先推荐学习 AIShell 示例,因为它数据规模小、流程清晰、适合初学者。本文将详细讲解学习步骤、核心概念、实践建议和调试技巧,帮助你高效掌握 WeNet。
为什么选择 WeNet?
WeNet(WeNet End-to-End Speech Recognition Toolkit)由 Mobvoi 和西北工业大学联合开发,旨在提供生产就绪的语音识别解决方案。它的核心优势包括:
- 统一架构:采用 Unified Two Pass (U2) 框架,同时支持流式和非流式推理,通过调整
chunk_size
平衡延迟和准确性。 - 高准确性:通过 CTC 和注意力机制联合训练,实现更高的识别准确率。
- 生产优化:支持 n-gram 语言模型(LM)、上下文偏置(context biasing)和大数据训练(UIO),适合工业级应用。
- 跨平台支持:支持 x86 服务器和 Android 设备推理,易于部署。
- 开源生态:提供丰富的预训练模型、Python 接口和详细文档,社区活跃。
无论你是语音识别初学者还是希望将 WeNet 应用于实际项目,本文将帮助你快速入门并掌握其核心功能。
学习路径总览
要快速掌握 WeNet,建议按照以下步骤逐步学习:
- 环境搭建:安装依赖、克隆仓库、准备硬件。
- 运行 AIShell 示例:通过运行 AIShell 示例(
example/aishell/s0/run.sh
)理解数据准备、训练、解码和模型导出的全流程。 - 掌握核心概念:学习 U2 框架、上下文偏置、语言模型(LM)和大数据训练(UIO)。
- 实践与调试:使用预训练模型、修改配置、尝试自定义数据。
- 深入代码与进阶:阅读关键代码,尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。
为什么优先学习 AIShell 示例?
WeNet 提供了多个数据集示例,包括 AIShell、LibriSpeech、Gigaspeech 和 WenetSpeech。推荐优先学习 AIShell 示例(example/aishell/s0/run.sh
),原因如下:
- 数据规模小:AIShell-1 数据集约 200 小时,下载和处理速度快,适合快速实验。
- 语言直观:如果熟悉中文,AIShell 的中文字符建模单元(char)更易理解,词典生成和解码结果直观。
- 流程完整:AIShell 示例涵盖了从数据下载到模型导出的全流程,逻辑清晰,适合初学者。
- 社区支持:AIShell 是 WeNet 最常用的示例,GitHub Issues 中相关问题和解答较多。
相比之下,LibriSpeech(约 1000 小时,英文,BPE 建模单元)数据规模较大,处理时间长,适合进阶学习;Gigaspeech 和 WenetSpeech(1 万小时)更适合研究大数据训练(UIO)。
详细学习步骤
步骤 1:环境搭建
1.1 安装依赖
WeNet 依赖 PyTorch、LibTorch 和其他工具,建议使用支持 GPU 的环境。以下是安装步骤:
-
安装 Python 包:
pip install git+https://github.com/wenet-e2e/wenet.git
或者开发安装:
git clone https://github.com/wenet-e2e/wenet.git cd wenet pip install -e .
-
安装 PyTorch:推荐版本 1.6.0 或更高,确保支持 DDP(分布式数据并行)和 NCCL(GPU 通信后端)。例如:
pip install torch==1.6.0
-
安装 LibTorch(运行时推理):如果需要 C++ 推理或语言模型支持,参考安装指南安装 LibTorch。
-
其他依赖:确保安装
torchaudio
(用于特征提取)、sentencepiece
(用于 BPE 建模)、Tensorboard(用于训练监控)等。
1.2 克隆 WeNet 仓库
git clone https://github.com/wenet-e2e/wenet.git
cd wenet
1.3 硬件准备
- GPU:至少 1 张 NVIDIA GPU(建议 8GB 显存以上,如 2080 Ti 或 V100)。
- 内存:建议 32GB 以上,处理大数据时可能需要更多。
- 存储:AIShell 数据约 10GB,预留足够空间(建议 50GB 以上)。
- 环境变量:设置 GPU 设备,例如:
export CUDA_VISIBLE_DEVICES="0,1"
步骤 2:运行 AIShell 示例
AIShell 示例(example/aishell/s0/run.sh
)是学习 WeNet 的最佳起点,涵盖了从数据准备到模型导出的全流程。以下是逐阶段运行的详细说明:
2.1 进入示例目录
cd example/aishell/s0
2.2 逐阶段运行
run.sh
分为 7 个阶段(-1 到 6),建议逐一运行以理解每个步骤:
bash run.sh --stage -1 --stop_stage -1 # 下载数据
bash run.sh --stage 0 --stop_stage 0 # 准备训练数据
bash run.sh --stage 1 --stop_stage 1 # 提取 CMVN 特征(可选)
bash run.sh --stage 2 --stop_stage 2 # 生成标签词典
bash run.sh --stage 3 --stop_stage 3 # 准备 WeNet 数据格式
bash run.sh --stage 4 --stop_stage 4 # 神经网络训练
bash run.sh --stage 5 --stop_stage 5 # 使用训练模型解码
bash run.sh --stage 6 --stop_stage 6 # 导出模型
2.3 各阶段详解
-
阶段 -1:下载数据
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
$data
路径(如/home/username/asr-data/aishell/
)。 - 注意:需设置绝对路径,确保网络稳定。如果已下载,可修改
run.sh
中的$data
变量,从阶段 0 开始。
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
-
阶段 0:准备训练数据
- 运行
local/aishell_data_prep.sh
,生成wav.scp
(音频路径)和text
(转录文本)文件。 - 示例
wav.scp
:BAC009S0002W0122 /export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav
- 示例
text
:BAC009S0002W0122 而对楼市成交抑制作用最大的限购
- 检查文件格式,确保音频路径有效,文本正确。
- 运行
-
阶段 1:提取 CMVN 特征(可选)
- 使用
tools/compute_cmvn_stats.py
提取全局 CMVN(倒谱均值和方差归一化)统计,用于归一化声学特征。 - 可设置
cmvn=false
跳过,使用原始 WAV 输入(通过 TorchAudio 即时提取特征)。
- 使用
-
阶段 2:生成标签词典
- 生成字符级词典(
units.txt
),映射中文字符到整数索引。 - 示例词典:
<blank> 0 <unk> 1 一 2 丁 3 ... <sos/eos> 4232
- 理解特殊符号:
<blank>
用于 CTC,<unk>
表示未知 token,<sos/eos>
用于注意力解码器。
- 生成字符级词典(
-
阶段 3:准备 WeNet 数据格式
- 生成 JSON 格式的
data.list
,包含key
(语音 ID)、wav
(音频路径)、txt
(转录文本)。 - 示例
data.list
:{"key": "BAC009S0002W0122", "wav": "/export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav", "txt": "而对楼市成交抑制作用最大的限购"}
- 生成 JSON 格式的
-
阶段 4:神经网络训练
- 训练 Conformer 模型,配置文件为
conf/train_conformer.yaml
。 - 使用多 GPU(DDP 模式,建议
dist_backend="nccl"
)。 - 监控训练损失:
tensorboard --logdir tensorboard/your_exp_name/ --port 12598 --bind_all
- 训练时间:8 张 2080 Ti 约 1 天(50 epoch)。单 GPU 可能需数天。
- 恢复训练:若中断,设置
checkpoint=exp/your_exp/$n.pt
,从第 n+1 epoch 继续。
- 训练 Conformer 模型,配置文件为
-
阶段 5:使用训练模型解码
- 使用
wenet/bin/recognize.py
进行推理,支持四种解码方法:ctc_greedy_search
、ctc_prefix_beam_search
、attention
、attention_rescoring
。 - 推荐
attention_rescoring
,结合 CTC 和注意力机制,效果最佳。 - 调整
beam_size
(默认 10,越大效果越好但计算成本高)和ctc_weight
(默认 0.5)。 - 检查 WER(字错误率,约为 5%):
python tools/compute-wer.py --char=1 --v=1 data/test/text test_dir/text
- 使用
-
阶段 6:导出模型
- 使用
wenet/bin/export_jit.py
导出 LibTorch 模型(final.zip
),用于 C++ 推理。 - 示例:
python wenet/bin/export_jit.py --config exp/train.yaml --checkpoint exp/avg_10.pt --output_file exp/final.zip
- 使用
2.4 快速运行完整流程
如果时间有限,可直接运行:
bash run.sh --stage -1 --stop_stage 6
但建议逐阶段运行,便于调试和理解。
2.5 使用预训练模型加速学习
如果不想从头训练,可下载 AIShell 的预训练 Conformer 模型(链接),直接跳到阶段 5 进行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/model.pt
步骤 3:掌握核心概念
在运行 AIShell 示例的同时,阅读以下文档,理解 WeNet 的核心功能:
-
U2 框架(参考
runtime_wenet.md
)- WeNet 采用 Unified Two Pass (U2) 框架,支持流式(有限延迟)和非流式(高准确性)推理。
- 关键参数:
chunk_size
控制流式推理的块大小,影响延迟和准确性。 - 解码方法:
attention_rescoring
结合 CTC 前缀束搜索和注意力解码器,效果最佳。 - 实践:尝试修改
decoding_chunk_size
(阶段 5),观察流式和非流式效果。
-
上下文偏置(参考
context_biasing.md
)- 通过上下文 FST 提升热词(如人名、专有名词)的识别率。
- 关键函数:
GetNextState
和 CTC 前缀束搜索的上下文扩展。 - 实践:在 AIShell 示例中添加自定义热词,修改
context_graph
配置。
-
语言模型(LM)(参考
lm_for_wenet.md
)- WeNet 支持 n-gram 语言模型和 WFST 解码,适用于生产环境。
- 运行 AIShell 示例的阶段 7,添加语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习如何准备词典、训练 n-gram 模型和构建 TLG 解码图。
-
大数据训练(UIO)(参考
uio_big_data_training_wenet.md
)- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
raw
和shard
模式。 raw
模式适合小数据集(如 AIShell),shard
模式支持压缩包格式,适合大数据(如 WenetSpeech)。- 实践:检查 AIShell 的
data.list
(raw
模式),了解shard
模式的 tar.gz 格式。
- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
-
预训练模型(参考
pretrained_models_wenet.md
)- WeNet 提供检查点模型(
.pt
,用于训练)和运行时模型(.zip
,用于推理)。 - AIShell 的 Conformer 模型支持中文,LibriSpeech 支持英文,均遵循数据集许可(如 CC BY 4.0)。
- WeNet 提供检查点模型(
-
Python 包(参考
python_package_wenet.md
)- WeNet 提供简洁的 Python 接口,快速进行推理:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 实践:编写 Python 脚本,加载 AIShell 预训练模型,测试单条音频。
- WeNet 提供简洁的 Python 接口,快速进行推理:
步骤 4:实践与调试
4.1 使用预训练模型
- 下载 AIShell 的预训练 Conformer 模型,直接运行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/aishell_u2pp_conformer_exp.tar.gz
- 检查解码结果(
test_dir/text
)和 WER(test_dir/wer
)。
4.2 修改配置
- 打开
conf/train_conformer.yaml
,调整以下参数:- 模型结构:
encoder_layers
(编码器层数)、hidden_units
(隐藏单元数)。 - 优化参数:
learning_rate
(学习率)、batch_size
。
- 模型结构:
- 在阶段 5 中调整解码参数:
--beam_size
:增大(例如 20)以提高准确性,观察计算成本。--ctc_weight
:调整 CTC 和注意力解码器的权重(默认 0.5)。
4.3 使用自定义数据
- 准备自定义音频(WAV 格式,16kHz 采样率)和转录文本,整理成
wav.scp
和text
:# wav.scp custom_001 /path/to/audio1.wav custom_002 /path/to/audio2.wav# text custom_001 你好这是一个测试 custom_002 语音识别很有趣
- 从阶段 1 开始运行:
bash run.sh --stage 1 --stop_stage 6
4.4 调试常见问题
- 数据下载慢:AIShell 数据约 10GB,需稳定网络。如失败,可手动下载并更新
$data
路径。 - 内存不足(OOM):
- 检查
CUDA_VISIBLE_DEVICES
,确保 GPU 分配正确。 - 减小
batch_size
或使用shard
模式(UIO)。
- 检查
- 训练速度慢:
- 增大 UIO 的
shuffle_buffer
(建议 1500)和prefetch
(建议 4)。 - 确保使用 NCCL 后端(
dist_backend="nccl"
)。
- 增大 UIO 的
- WER 偏高:
- 检查
data.list
和词典格式是否正确。 - 尝试模型平均(
average_checkpoint=true
)或增大beam_size
。
- 检查
- 社区求助:在 GitHub Issues 搜索或提问,描述问题并附上日志。
步骤 5:深入代码与进阶
5.1 阅读关键代码
- 模型实现:
wenet/transformer/asr_model.py
:U2 模型(编码器 + CTC + 注意力解码器)。wenet/transformer/encoder.py
:Conformer 编码器实现,重点关注forward_chunk
(流式推理)。
- 解码逻辑:
wenet/bin/recognize.py
:Python 解码脚本,理解四种解码方法。runtime/libtorch/decoder/torch_asr_model.cc
:C++ 运行时解码,集成语言模型。
- UIO 数据处理:
wenet/dataset/dataset.py
:实现raw
和shard
模式的数据加载。- 查看
shuffle_buffer
和prefetch
的作用。
5.2 进阶实验
- LibriSpeech 示例:
- 运行
example/librispeech/s0/run.sh
,学习 BPE 建模单元和英文语音识别。 - 注意 BPE 词典生成(
tools/spm_train
)和解码后处理(tools/spm_decode
)。
- 运行
- WenetSpeech 示例:
- 运行
example/wenetspeech/s0/run.sh
,实践 UIO 的shard
模式,处理 1 万小时大数据。 - 理解压缩包格式(
tar.gz
)和云存储支持。
- 运行
- 语言模型集成:
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习 WFST 解码图(TLG)的构建过程。
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
- 上下文偏置:
- 实现自定义热词(如公司名称),修改
context_graph
配置,运行解码测试。
- 实现自定义热词(如公司名称),修改
5.3 开发实际应用
- Python 应用:
- 使用 WeNet Python 包,开发简单语音识别脚本:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 使用 WeNet Python 包,开发简单语音识别脚本:
- C++ 推理:
- 使用导出的
final.zip
模型,在 x86 或 Android 运行时进行推理(参考runtime/libtorch
或runtime/android
)。
- 使用导出的
- 实时流式推理:
- 设置
decoding_chunk_size
(如 16),实现流式语音识别,适用于实时应用。
- 设置
学习时间规划
- 1-2 天:搭建环境,运行 AIShell 示例(阶段 -1 到 6),测试预训练模型,熟悉流程。
- 3-5 天:阅读 U2 框架、上下文偏置、语言模型文档,修改 AIShell 配置,尝试自定义数据。
- 1 周以上:深入代码,运行 LibriSpeech 或 WenetSpeech 示例,开发 Python 或 C++ 应用。
调试技巧与注意事项
- 数据问题:
- 确保音频为 WAV 格式,16kHz 采样率。
- 检查
wav.scp
和text
文件的格式,路径必须有效。
- 训练问题:
- 监控 Tensorboard 损失曲线,检查是否收敛。
- 若 OOM,尝试减小
batch_size
或使用shard
模式。
- 解码问题:
- WER 偏高时,检查词典和
data.list
,尝试attention_rescoring
模式。 - 增大
beam_size
或调整ctc_weight
优化结果。
- WER 偏高时,检查词典和
- 性能优化:
- 使用 UIO 的
shard
模式处理大数据,设置合理的shuffle_buffer
和prefetch
。 - 优先使用 NCCL 后端,提升多 GPU 训练效率。
- 使用 UIO 的
资源与支持
- 官方文档:https://wenet-e2e.github.io/wenet/
- GitHub 仓库:https://github.com/wenet-e2e/wenet
- 预训练模型:https://docs.qq.com/form/page/DZnRkVHlnUk5QaFdC
- 社区支持:在 GitHub Issues 搜索或提问,社区响应较快。
- 参考论文:
- U2 框架
- CTC 序列建模
总结
通过优先运行 AIShell 示例(example/aishell/s0/run.sh
),你可以在 1-2 天内掌握 WeNet 的核心流程,从数据准备到模型训练和推理。结合 U2 框架、上下文偏置、语言模型和 UIO 的学习,你可以逐步深入 WeNet 的功能和代码。进阶时可尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。无论你是语音识别新手还是资深开发者,WeNet 的生产优先设计和丰富文档都将为你提供强大的支持。快去克隆仓库,运行第一个示例,开启你的 WeNet 之旅吧!
当前时间:2025年7月11日,下午4:47(香港时间)
如何快速掌握WeNet:从零到一的端到端语音识别学习指南
WeNet 是一个开源的端到端语音识别框架,专注于生产优先(production-first),支持流式和非流式推理,广泛应用于工业级语音识别任务。如果你想快速掌握 WeNet,本文将为你提供一个系统化的学习路径,从环境搭建到运行示例,再到深入代码和实际应用,带你从零到一上手 WeNet。优先推荐学习 AIShell 示例,因为它数据规模小、流程清晰、适合初学者。本文将详细讲解学习步骤、核心概念、实践建议和调试技巧,帮助你高效掌握 WeNet。
为什么选择 WeNet?
WeNet(WeNet End-to-End Speech Recognition Toolkit)由 Mobvoi 和西北工业大学联合开发,旨在提供生产就绪的语音识别解决方案。它的核心优势包括:
- 统一架构:采用 Unified Two Pass (U2) 框架,同时支持流式和非流式推理,通过调整
chunk_size
平衡延迟和准确性。 - 高准确性:通过 CTC 和注意力机制联合训练,实现更高的识别准确率。
- 生产优化:支持 n-gram 语言模型(LM)、上下文偏置(context biasing)和大数据训练(UIO),适合工业级应用。
- 跨平台支持:支持 x86 服务器和 Android 设备推理,易于部署。
- 开源生态:提供丰富的预训练模型、Python 接口和详细文档,社区活跃。
无论你是语音识别初学者还是希望将 WeNet 应用于实际项目,本文将帮助你快速入门并掌握其核心功能。
学习路径总览
要快速掌握 WeNet,建议按照以下步骤逐步学习:
- 环境搭建:安装依赖、克隆仓库、准备硬件。
- 运行 AIShell 示例:通过运行 AIShell 示例(
example/aishell/s0/run.sh
)理解数据准备、训练、解码和模型导出的全流程。 - 掌握核心概念:学习 U2 框架、上下文偏置、语言模型(LM)和大数据训练(UIO)。
- 实践与调试:使用预训练模型、修改配置、尝试自定义数据。
- 深入代码与进阶:阅读关键代码,尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。
为什么优先学习 AIShell 示例?
WeNet 提供了多个数据集示例,包括 AIShell、LibriSpeech、Gigaspeech 和 WenetSpeech。推荐优先学习 AIShell 示例(example/aishell/s0/run.sh
),原因如下:
- 数据规模小:AIShell-1 数据集约 200 小时,下载和处理速度快,适合快速实验。
- 语言直观:如果熟悉中文,AIShell 的中文字符建模单元(char)更易理解,词典生成和解码结果直观。
- 流程完整:AIShell 示例涵盖了从数据下载到模型导出的全流程,逻辑清晰,适合初学者。
- 社区支持:AIShell 是 WeNet 最常用的示例,GitHub Issues 中相关问题和解答较多。
相比之下,LibriSpeech(约 1000 小时,英文,BPE 建模单元)数据规模较大,处理时间长,适合进阶学习;Gigaspeech 和 WenetSpeech(1 万小时)更适合研究大数据训练(UIO)。
详细学习步骤
步骤 1:环境搭建
1.1 安装依赖
WeNet 依赖 PyTorch、LibTorch 和其他工具,建议使用支持 GPU 的环境。以下是安装步骤:
-
安装 Python 包:
pip install git+https://github.com/wenet-e2e/wenet.git
或者开发安装:
git clone https://github.com/wenet-e2e/wenet.git cd wenet pip install -e .
-
安装 PyTorch:推荐版本 1.6.0 或更高,确保支持 DDP(分布式数据并行)和 NCCL(GPU 通信后端)。例如:
pip install torch==1.6.0
-
安装 LibTorch(运行时推理):如果需要 C++ 推理或语言模型支持,参考安装指南安装 LibTorch。
-
其他依赖:确保安装
torchaudio
(用于特征提取)、sentencepiece
(用于 BPE 建模)、Tensorboard(用于训练监控)等。
1.2 克隆 WeNet 仓库
git clone https://github.com/wenet-e2e/wenet.git
cd wenet
1.3 硬件准备
- GPU:至少 1 张 NVIDIA GPU(建议 8GB 显存以上,如 2080 Ti 或 V100)。
- 内存:建议 32GB 以上,处理大数据时可能需要更多。
- 存储:AIShell 数据约 10GB,预留足够空间(建议 50GB 以上)。
- 环境变量:设置 GPU 设备,例如:
export CUDA_VISIBLE_DEVICES="0,1"
步骤 2:运行 AIShell 示例
AIShell 示例(example/aishell/s0/run.sh
)是学习 WeNet 的最佳起点,涵盖了从数据准备到模型导出的全流程。以下是逐阶段运行的详细说明:
2.1 进入示例目录
cd example/aishell/s0
2.2 逐阶段运行
run.sh
分为 7 个阶段(-1 到 6),建议逐一运行以理解每个步骤:
bash run.sh --stage -1 --stop_stage -1 # 下载数据
bash run.sh --stage 0 --stop_stage 0 # 准备训练数据
bash run.sh --stage 1 --stop_stage 1 # 提取 CMVN 特征(可选)
bash run.sh --stage 2 --stop_stage 2 # 生成标签词典
bash run.sh --stage 3 --stop_stage 3 # 准备 WeNet 数据格式
bash run.sh --stage 4 --stop_stage 4 # 神经网络训练
bash run.sh --stage 5 --stop_stage 5 # 使用训练模型解码
bash run.sh --stage 6 --stop_stage 6 # 导出模型
2.3 各阶段详解
-
阶段 -1:下载数据
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
$data
路径(如/home/username/asr-data/aishell/
)。 - 注意:需设置绝对路径,确保网络稳定。如果已下载,可修改
run.sh
中的$data
变量,从阶段 0 开始。
- 下载 AIShell-1 数据集(约 10GB,200 小时),存储到
-
阶段 0:准备训练数据
- 运行
local/aishell_data_prep.sh
,生成wav.scp
(音频路径)和text
(转录文本)文件。 - 示例
wav.scp
:BAC009S0002W0122 /export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav
- 示例
text
:BAC009S0002W0122 而对楼市成交抑制作用最大的限购
- 检查文件格式,确保音频路径有效,文本正确。
- 运行
-
阶段 1:提取 CMVN 特征(可选)
- 使用
tools/compute_cmvn_stats.py
提取全局 CMVN(倒谱均值和方差归一化)统计,用于归一化声学特征。 - 可设置
cmvn=false
跳过,使用原始 WAV 输入(通过 TorchAudio 即时提取特征)。
- 使用
-
阶段 2:生成标签词典
- 生成字符级词典(
units.txt
),映射中文字符到整数索引。 - 示例词典:
<blank> 0 <unk> 1 一 2 丁 3 ... <sos/eos> 4232
- 理解特殊符号:
<blank>
用于 CTC,<unk>
表示未知 token,<sos/eos>
用于注意力解码器。
- 生成字符级词典(
-
阶段 3:准备 WeNet 数据格式
- 生成 JSON 格式的
data.list
,包含key
(语音 ID)、wav
(音频路径)、txt
(转录文本)。 - 示例
data.list
:{"key": "BAC009S0002W0122", "wav": "/export/data/asr-data/OpenSLR/33/data_aishell/wav/train/S0002/BAC009S0002W0122.wav", "txt": "而对楼市成交抑制作用最大的限购"}
- 生成 JSON 格式的
-
阶段 4:神经网络训练
- 训练 Conformer 模型,配置文件为
conf/train_conformer.yaml
。 - 使用多 GPU(DDP 模式,建议
dist_backend="nccl"
)。 - 监控训练损失:
tensorboard --logdir tensorboard/your_exp_name/ --port 12598 --bind_all
- 训练时间:8 张 2080 Ti 约 1 天(50 epoch)。单 GPU 可能需数天。
- 恢复训练:若中断,设置
checkpoint=exp/your_exp/$n.pt
,从第 n+1 epoch 继续。
- 训练 Conformer 模型,配置文件为
-
阶段 5:使用训练模型解码
- 使用
wenet/bin/recognize.py
进行推理,支持四种解码方法:ctc_greedy_search
、ctc_prefix_beam_search
、attention
、attention_rescoring
。 - 推荐
attention_rescoring
,结合 CTC 和注意力机制,效果最佳。 - 调整
beam_size
(默认 10,越大效果越好但计算成本高)和ctc_weight
(默认 0.5)。 - 检查 WER(字错误率,约为 5%):
python tools/compute-wer.py --char=1 --v=1 data/test/text test_dir/text
- 使用
-
阶段 6:导出模型
- 使用
wenet/bin/export_jit.py
导出 LibTorch 模型(final.zip
),用于 C++ 推理。 - 示例:
python wenet/bin/export_jit.py --config exp/train.yaml --checkpoint exp/avg_10.pt --output_file exp/final.zip
- 使用
2.4 快速运行完整流程
如果时间有限,可直接运行:
bash run.sh --stage -1 --stop_stage 6
但建议逐阶段运行,便于调试和理解。
2.5 使用预训练模型加速学习
如果不想从头训练,可下载 AIShell 的预训练 Conformer 模型(链接),直接跳到阶段 5 进行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/aishell_u2pp_conformer_exp.tar.gz
步骤 3:掌握核心概念
在运行 AIShell 示例的同时,阅读以下文档,理解 WeNet 的核心功能:
-
U2 框架
- WeNet 采用 Unified Two Pass (U2) 框架,支持流式(有限延迟)和非流式(高准确性)推理。
- 关键参数:
chunk_size
控制流式推理的块大小,影响延迟和准确性。 - 解码方法:
attention_rescoring
结合 CTC 前缀束搜索和注意力解码器,效果最佳。 - 实践:尝试修改
decoding_chunk_size
(阶段 5),观察流式和非流式效果。
-
上下文偏置
- 通过上下文 FST 提升热词(如人名、专有名词)的识别率。
- 关键函数:
GetNextState
和 CTC 前缀束搜索的上下文扩展。 - 实践:在 AIShell 示例中添加自定义热词,修改
context_graph
配置。
-
语言模型(LM)
- WeNet 支持 n-gram 语言模型和 WFST 解码,适用于生产环境。
- 运行 AIShell 示例的阶段 7,添加语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习如何准备词典、训练 n-gram 模型和构建 TLG 解码图。
-
大数据训练(UIO)
- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
raw
和shard
模式。 raw
模式适合小数据集(如 AIShell),shard
模式支持压缩包格式,适合大数据(如 WenetSpeech)。- 实践:检查 AIShell 的
data.list
(raw
模式),了解shard
模式的 tar.gz 格式。
- UIO(统一输入输出)支持大规模数据集(>5000 小时),分为
-
预训练模型
- WeNet 提供检查点模型(
.pt
,用于训练)和运行时模型(.zip
,用于推理)。 - AIShell 的 Conformer 模型支持中文,LibriSpeech 支持英文,均遵循数据集许可(如 CC BY 4.0)。
- WeNet 提供检查点模型(
-
Python 包
- WeNet 提供简洁的 Python 接口,快速进行推理:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 实践:编写 Python 脚本,加载 AIShell 预训练模型,测试单条音频。
- WeNet 提供简洁的 Python 接口,快速进行推理:
步骤 4:实践与调试
4.1 使用预训练模型
- 下载 AIShell 的预训练 Conformer 模型,直接运行解码:
bash run.sh --stage 5 --stop_stage 5 --checkpoint path/to/aishell_u2pp_conformer_exp.tar.gz
- 检查解码结果(
test_dir/text
)和 WER(test_dir/wer
)。
4.2 修改配置
- 打开
conf/train_conformer.yaml
,调整以下参数:- 模型结构:
encoder_layers
(编码器层数)、hidden_units
(隐藏单元数)。 - 优化参数:
learning_rate
(学习率)、batch_size
。
- 模型结构:
- 在阶段 5 中调整解码参数:
--beam_size
:增大(例如 20)以提高准确性,观察计算成本。--ctc_weight
:调整 CTC 和注意力解码器的权重(默认 0.5)。
4.3 使用自定义数据
- 准备自定义音频(WAV 格式,16kHz 采样率)和转录文本,整理成
wav.scp
和text
:# wav.scp custom_001 /path/to/audio1.wav custom_002 /path/to/audio2.wav# text custom_001 你好这是一个测试 custom_002 语音识别很有趣
- 从阶段 1 开始运行:
bash run.sh --stage 1 --stop_stage 6
4.4 调试常见问题
- 数据下载慢:AIShell 数据约 10GB,需稳定网络。如失败,可手动下载并更新
$data
路径。 - 内存不足(OOM):
- 检查
CUDA_VISIBLE_DEVICES
,确保 GPU 分配正确。 - 减小
batch_size
或使用shard
模式(UIO)。
- 检查
- 训练速度慢:
- 增大 UIO 的
shuffle_buffer
(建议 1500)和prefetch
(建议 4)。 - 确保使用 NCCL 后端(
dist_backend="nccl"
)。
- 增大 UIO 的
- WER 偏高:
- 检查
data.list
和词典格式是否正确。 - 尝试模型平均(
average_checkpoint=true
)或增大beam_size
。
- 检查
- 社区求助:在 GitHub Issues 搜索或提问,描述问题并附上日志。
步骤 5:深入代码与进阶
5.1 阅读关键代码
- 模型实现:
wenet/transformer/asr_model.py
:U2 模型(编码器 + CTC + 注意力解码器)。wenet/transformer/encoder.py
:Conformer 编码器实现,重点关注forward_chunk
(流式推理)。
- 解码逻辑:
wenet/bin/recognize.py
:Python 解码脚本,理解四种解码方法。runtime/libtorch/decoder/torch_asr_model.cc
:C++ 运行时解码,集成语言模型。
- UIO 数据处理:
wenet/dataset/dataset.py
:实现raw
和shard
模式的数据加载。- 查看
shuffle_buffer
和prefetch
的作用。
5.2 进阶实验
- LibriSpeech 示例:
- 运行
example/librispeech/s0/run.sh
,学习 BPE 建模单元和英文语音识别。 - 注意 BPE 词典生成(
tools/spm_train
)和解码后处理(tools/spm_decode
)。
- 运行
- WenetSpeech 示例:
- 运行
example/wenetspeech/s0/run.sh
,实践 UIO 的shard
模式,处理 1 万小时大数据。 - 理解压缩包格式(
tar.gz
)和云存储支持。
- 运行
- 语言模型集成:
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
bash run.sh --stage 7 --stop_stage 7
- 学习 WFST 解码图(TLG)的构建过程。
- 在 AIShell 示例中运行阶段 7,添加 n-gram 语言模型:
- 上下文偏置:
- 实现自定义热词(如公司名称),修改
context_graph
配置,运行解码测试。
- 实现自定义热词(如公司名称),修改
5.3 开发实际应用
- Python 应用:
- 使用 WeNet Python 包,开发简单语音识别脚本:
import wenet model = wenet.load_model('chinese') result = model.transcribe('audio.wav') print(result['text'])
- 使用 WeNet Python 包,开发简单语音识别脚本:
- C++ 推理:
- 使用导出的
final.zip
模型,在 x86 或 Android 运行时进行推理(参考runtime/libtorch
或runtime/android
)。
- 使用导出的
- 实时流式推理:
- 设置
decoding_chunk_size
(如 16),实现流式语音识别,适用于实时应用。
- 设置
学习时间规划
- 1-2 天:搭建环境,运行 AIShell 示例(阶段 -1 到 6),测试预训练模型,熟悉流程。
- 3-5 天:阅读 U2 框架、上下文偏置、语言模型文档,修改 AIShell 配置,尝试自定义数据。
- 1 周以上:深入代码,运行 LibriSpeech 或 WenetSpeech 示例,开发 Python 或 C++ 应用。
调试技巧与注意事项
- 数据问题:
- 确保音频为 WAV 格式,16kHz 采样率。
- 检查
wav.scp
和text
文件的格式,路径必须有效。
- 训练问题:
- 监控 Tensorboard 损失曲线,检查是否收敛。
- 若 OOM,尝试减小
batch_size
或使用shard
模式(UIO)。
- 解码问题:
- WER 偏高时,检查
data.list
和词典格式,尝试attention_rescoring
模式。 - 增大
beam_size
或调整ctc_weight
优化结果。
- WER 偏高时,检查
- 性能优化:
- 使用 UIO 的
shard
模式处理大数据,设置合理的shuffle_buffer
和prefetch
。 - 优先使用 NCCL 后端,提升多 GPU 训练效率。
- 使用 UIO 的
资源与支持
- 官方文档:https://wenet-e2e.github.io/wenet/
- GitHub 仓库:https://github.com/wenet-e2e/wenet
- 预训练模型:https://docs.qq.com/form/page/DZnRkVHlnUk5QaFdC
- 社区支持:在 GitHub Issues 搜索或提问,社区响应较快。
- 参考论文:
- U2 框架
- CTC 序列建模
总结
通过优先运行 AIShell 示例(example/aishell/s0/run.sh
),你可以在 1-2 天内掌握 WeNet 的核心流程,从数据准备到模型训练和推理。结合 U2 框架、上下文偏置、语言模型和 UIO 的学习,你可以逐步深入 WeNet 的功能和代码。进阶时可尝试 LibriSpeech 或 WenetSpeech 示例,开发实际应用。无论你是语音识别新手还是资深开发者,WeNet 的生产优先设计和丰富文档都将为你提供强大的支持。快去克隆仓库,运行第一个示例,开启你的 WeNet 之旅吧!