在Ubuntu 20.04上从零跑通Kaldi AISHELL-1中文语音识别保姆级避坑与完整流程第一次接触语音识别系统时面对复杂的工具链和晦涩的文档我花了整整两周时间才让第一个模型跑起来。现在回想起来那些踩过的坑和解决的问题都成了宝贵的经验。本文将带你用最短的时间、最少的弯路在Ubuntu 20.04系统上完整搭建基于Kaldi的中文语音识别系统。1. 环境准备与依赖安装在开始之前我们需要确保系统环境满足Kaldi的基本要求。Ubuntu 20.04是一个理想的选择因为它提供了稳定的软件包支持。必备依赖安装sudo apt update sudo apt install -y git wget make g sox libatlas-base-dev zlib1g-dev \ python3 python3-pip subversion libtool automake bzip2 unzip常见问题1如果你使用的是纯净的Ubuntu服务器版可能会缺少基本的开发工具。这时需要先安装build-essentialsudo apt install -y build-essentialPython环境配置pip3 install numpy pandas scipy matplotlib注意Kaldi对Python版本有一定要求建议使用Python 3.6-3.8版本避免使用最新的Python 3.9可能会遇到兼容性问题。2. Kaldi源码获取与编译Kaldi的编译过程可能会遇到各种问题特别是对于新手来说。以下是经过验证的可靠步骤git clone https://github.com/kaldi-asr/kaldi.git cd kaldi/tools make -j $(nproc)编译工具链时有几个关键点需要注意OpenFST问题如果编译失败尝试手动安装wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.7.9.tar.gz tar -xvzf openfst-1.7.9.tar.gz cd openfst-1.7.9 ./configure --enable-static --enable-shared --enable-far --enable-ngram-fsts make -j $(nproc) sudo make installCUB问题如果使用较新的GPU可能需要手动安装CUBwget https://github.com/NVIDIA/cub/archive/1.8.0.tar.gz tar -xvzf 1.8.0.tar.gz export CUB_PATH$PWD/cub-1.8.0完成工具链编译后继续编译主项目cd ../src ./configure --shared make depend -j $(nproc) make -j $(nproc)3. AISHELL-1数据集处理AISHELL-1是一个开源的中文语音数据集包含178小时的语音数据。处理这个数据集有几个关键步骤数据集目录结构data_aishell/ ├── wav/ # 原始音频文件 │ ├── train/ │ ├── dev/ │ └── test/ └── transcript/ # 文本标注解压音频文件for file in data_aishell/wav/*.tar.gz; do tar -xzf $file -C data_aishell/wav/ done准备Kaldi格式数据Kaldi需要特定的文件格式来组织数据主要包括文件类型描述示例格式wav.scp音频路径映射BAC009S0002W0140 /path/to/BAC009S0002W0140.wavtext音频对应文本BAC009S0002W0140 这是测试文本utt2spk说话人映射BAC009S0002W0140 S0002spk2utt说话人到音频的逆向映射S0002 BAC009S0002W0140生成这些文件的脚本示例# wav.scp find data_aishell/wav/train -name *.wav | awk -F/ {print $NF.$NF, $0} data/train/wav.scp # text python3 local/prepare_text.py data_aishell/transcript/aishell_transcript_v0.8.txt data/train/text # utt2spk awk {print $1, substr($1, 1, 11)} data/train/wav.scp data/train/utt2spk # spk2utt utils/utt2spk_to_spk2utt.pl data/train/utt2spk data/train/spk2utt4. 特征提取与数据增强Kaldi支持多种音频特征提取方法最常用的是MFCC梅尔频率倒谱系数。基础MFCC特征提取steps/make_mfcc.sh --nj 20 --cmd run.pl data/train exp/make_mfcc/train mfcc steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train mfcc数据增强技术速度扰动通过改变音频速度生成更多训练样本utils/data/perturb_data_dir_speed_3way.sh data/train data/train_sp音量扰动调整音频音量增加鲁棒性utils/data/perturb_data_dir_volume.sh data/train data/train_vol高分辨率MFCC特征 对于更复杂的模型可以使用40维的MFCC特征steps/make_mfcc.sh --nj 20 --mfcc-config conf/mfcc_hires.conf \ data/train exp/make_mfcc/train mfcc_hires5. 语言模型训练语言模型是语音识别系统的关键组成部分。我们可以使用SRILM工具训练n-gram语言模型。安装SRILMcd kaldi/tools ./install_srilm.sh训练3-gram语言模型ngram-count -order 3 -text data/local/lm/corpus.txt \ -lm data/local/lm/aishell.arpa转换为FST格式arpa2fst --disambig-symbol#0 \ --read-symbol-tabledata/lang/words.txt \ data/local/lm/aishell.arpa data/lang/G.fst6. 声学模型训练Kaldi支持多种声学模型从传统的GMM-HMM到现代的神经网络模型。6.1 GMM-HMM训练流程# 单音素训练 steps/train_mono.sh --nj 20 --cmd run.pl \ data/train data/lang exp/mono # 三音素训练 steps/align_si.sh --nj 20 --cmd run.pl \ data/train data/lang exp/mono exp/mono_ali steps/train_deltas.sh --cmd run.pl \ 2500 10000 data/train data/lang exp/mono_ali exp/tri16.2 TDNN模型训练更先进的时延神经网络(TDNN)模型可以提供更好的识别准确率。准备对齐数据steps/align_fmllr.sh --nj 20 --cmd run.pl \ data/train_sp data/lang exp/tri5a exp/tri5a_aliTDNN训练配置# 网络结构定义 cat EOF conf/network.xconfig input dim40 nameinput relu-batchnorm-layer nametdnn1 dim625 relu-batchnorm-layer nametdnn2 dim625 inputAppend(-1,0,1) relu-batchnorm-layer nametdnn3 dim625 inputAppend(-1,0,1) relu-batchnorm-layer nametdnn4 dim625 inputAppend(-3,0,3) relu-batchnorm-layer nametdnn5 dim625 inputAppend(-3,0,3) relu-batchnorm-layer nametdnn6 dim625 inputAppend(-3,0,3) output-layer nameoutput dimnum-leaves max-change1.5 EOF开始训练steps/nnet3/chain/train.py --stage-10 \ --cmdrun.pl \ --feat.cmvn-opts--norm-meansfalse --norm-varsfalse \ --chain.xent-regularize0.1 \ --chain.l2-regularize0.00005 \ --trainer.input-modelexp/chain/0.raw \ --trainer.num-epochs4 \ data/train_sp data/lang exp/tri5a_ali exp/chain7. 解码与评估训练完成后我们需要评估模型在实际数据上的表现。构建解码图utils/mkgraph.sh data/lang_test exp/chain exp/chain/graph解码测试集steps/nnet3/decode.sh --nj 10 --cmd run.pl \ exp/chain/graph data/test exp/chain/decode_test计算字错误率(CER)local/score.sh --cmd run.pl data/test exp/chain/graph exp/chain/decode_test优化技巧如果CER不理想可以尝试调整以下参数增加训练epoch数使用更大的神经网络增加数据增强的多样性优化语言模型8. 常见问题与解决方案在实际操作中你可能会遇到以下问题内存不足错误减少并行任务数将--nj参数调小增加swap空间sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfileCUDA out of memory减小batch size使用更小的模型添加--mem-opt选项特征提取失败检查音频采样率是否一致确保sox工具正确安装验证音频文件没有损坏解码结果不理想检查语言模型是否与领域匹配尝试不同的声学权重和语言权重确保训练数据足够且质量良好经过这些步骤你应该已经成功搭建了一个完整的中文语音识别系统。记得定期保存中间结果这样在遇到问题时可以快速恢复到上一个稳定状态。