别再被Kaldi劝退了!手把手教你用AISHELL-1数据集跑通第一个中文语音识别模型
从零搭建中文语音识别系统基于Kaldi与AISHELL-1的实战指南当你第一次打开Kaldi的官方文档时可能会被那些复杂的命令行和晦涩的术语吓退。但别担心这篇文章将带你用最直接的方式在Linux系统上基于AISHELL-1数据集搭建一个完整的中文语音识别系统。我们会从数据准备开始一步步完成特征提取、声学模型训练、语言模型构建最终实现语音到文字的转换。不同于其他教程的碎片化讲解这里提供的是一套完整的、可复现的解决方案。1. 环境准备与数据获取1.1 基础环境配置在开始之前确保你的系统满足以下要求操作系统Ubuntu 18.04或更高版本其他Linux发行版也可但可能需要调整部分命令硬件配置至少16GB内存100GB可用磁盘空间AISHELL-1数据集解压后约50GBGPU支持非必须但如果有NVIDIA显卡会大幅加速训练过程首先安装基础依赖项sudo apt-get update sudo apt-get install -y git wget sox gfortran libatlas-base-dev \ python3 python3-pip subversion libtool automake bzip2 unzip1.2 获取AISHELL-1数据集AISHELL-1是一个开源的中文语音数据集包含178小时的录音和对应文本标注。你可以通过以下步骤获取访问官网注册并申请下载权限下载完成后解压数据集mkdir -p data/aishell tar -xzf aishell-1.tar.gz -C data/aishell解压后的目录结构如下data/aishell/ ├── train/ # 训练集音频 ├── dev/ # 开发集音频 ├── test/ # 测试集音频 └── transcript/ # 所有音频的文本标注提示下载过程可能需要几小时建议使用screen或tmux保持会话2. Kaldi项目初始化2.1 创建项目结构标准的Kaldi项目需要特定的目录结构来组织脚本和数据mkdir -p aishell-1/{data,exp,local,conf} cd aishell-1 ln -s /path/to/kaldi/egs/wsj/s5/steps steps ln -s /path/to/kaldi/egs/wsj/s5/utils utils关键目录说明steps/Kaldi官方训练脚本utils/数据处理工具data/存放训练、测试数据exp/保存训练模型和日志conf/配置文件目录2.2 配置文件设置创建cmd.sh定义计算资源分配export train_cmdrun.pl --mem 4G export decode_cmdrun.pl --mem 8G export mkgraph_cmdrun.pl --mem 16G在path.sh中设置Kaldi根目录export KALDI_ROOT/path/to/kaldi [ -f $KALDI_ROOT/tools/env.sh ] . $KALDI_ROOT/tools/env.sh export PATH$PWD/utils:$KALDI_ROOT/tools/openfst/bin:$PATH3. 数据预处理流程3.1 音频与文本对齐Kaldi需要将音频文件与文本标注精确对应。我们首先创建必要的映射文件# 在data/train目录下生成 # wav.scp - 音频路径映射 # text - 音频对应的文本 # utt2spk - 说话人信息 # spk2utt - 反向索引 local/aishell_data_prep.sh data/aishell/wav/train data/aishell/transcript典型的wav.scp内容示例BAC009S0002W0140 /path/to/BAC009S0002W0140.wav BAC009S0002W0141 /path/to/BAC009S0002W0141.wav3.2 特征提取MFCC是语音识别中最常用的特征我们提取13维MFCC加上3维音高特征steps/make_mfcc_pitch.sh --nj 20 data/train exp/make_mfcc/train mfcc/train steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train mfcc/train注意--nj参数应根据CPU核心数调整太大可能导致内存不足4. 声学模型训练4.1 单音素GMM-HMM模型我们从最简单的单音素模型开始steps/train_mono.sh --nj 20 --cmd $train_cmd \ data/train data/lang exp/mono训练完成后可以在exp/mono目录下找到final.mdl模型文件。4.2 三音素GMM-HMM模型三音素模型考虑上下文信息能显著提升识别率# 对齐单音素模型 steps/align_si.sh --nj 20 --cmd $train_cmd \ data/train data/lang exp/mono exp/mono_ali # 训练三音素模型 steps/train_deltas.sh --cmd $train_cmd \ 2500 10000 data/train data/lang exp/mono_ali exp/tri14.3 进阶模型优化通过LDAMLLT和SAT技术进一步优化模型# LDAMLLT steps/train_lda_mllt.sh --cmd $train_cmd \ 2500 20000 data/train data/lang exp/tri1_ali exp/tri3a # SAT说话人自适应训练 steps/train_sat.sh --cmd $train_cmd \ 4000 100000 data/train data/lang exp/tri3a_ali exp/tri5a5. 语言模型构建5.1 训练n-gram语言模型使用SRILM工具训练3-gram语言模型ngram-count -order 3 -text data/train/text -lm data/local/lm/3gram.arpa5.2 构建解码图将语言模型转换为FST格式并与声学模型结合utils/format_lm.sh data/lang data/local/lm/3gram.arpa \ data/local/dict/lexicon.txt data/lang_test utils/mkgraph.sh data/lang_test exp/tri5a exp/tri5a/graph6. 解码与评估6.1 测试集解码使用训练好的模型对测试集进行识别steps/decode_fmllr.sh --nj 10 --cmd $decode_cmd \ exp/tri5a/graph data/test exp/tri5a/decode_test6.2 结果评估Kaldi会自动计算词错误率(WER)和字错误率(CER)cat exp/tri5a/decode_test/scoring_kaldi/best_wer典型的中文识别结果如下模型类型开发集CER测试集CER单音素GMM45.2%48.7%三音素GMM32.1%35.4%SAT-GMM14.3%16.8%7. 进阶TDNN神经网络模型7.1 数据准备为神经网络准备高分辨率特征utils/data/perturb_data_dir_speed_3way.sh data/train data/train_sp steps/make_mfcc_pitch.sh --nj 40 --mfcc-config conf/mfcc_hires.conf \ data/train_sp exp/make_hires/train_sp mfcc_hires/train_sp7.2 TDNN模型训练使用Kaldi的chain模型进行训练local/chain/run_tdnn.sh --stage -10 --train_stage -10 \ --data data/train_sp --lang data/lang \ --gmm exp/tri5a --nnet3_affix _aishell这个训练过程可能需要几个小时到几天不等取决于你的硬件配置。在4张NVIDIA 1080Ti显卡上通常需要约12小时完成训练。7.3 模型对比加入TDNN模型后的性能对比模型类型开发集CER测试集CERSAT-GMM14.3%16.8%TDNN-chain7.2%9.1%在实际项目中当遇到特定领域的语音识别需求时可以考虑以下优化方向数据增强添加噪声、改变语速等语言模型适配加入领域相关文本训练语言模型发音词典优化针对专业术语调整发音