资讯动态

PaddleSpeech 的 Kaldi 兼容语音特征提取:python_kaldi_features 从原理到实战

发布时间:2026/9/25 5:56:04 来源:尧图企业网站定制
人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本篇围绕 python_kaldi_features 模块 展开介绍 PaddleSpeech 如何通过一个纯 Python 第三方模块在不依赖 Kaldi 编译产物的前提下复现compute-mfcc-feats与compute-fbank-feats两条经典特征提取流水线的数值结果。读完后你将理解 MFCC / Mel 滤波器组特征的完整计算链路、每个关键参数dither、preemph、povey 窗、ceplifter 等在源码中的落点以及该模块在 PaddleSpeech 音频变换、语音翻译前端中的真实调用方式与验证手段。一、模块定位为什么 PaddleSpeech 需要一个 Kaldi 兼容的特征库模块 README 开宗明义说明了两点事实该模块 fork 自 James Lyons 的开源项目python_speech_features一个用于 ASR 的 Python 特征提取库提供 fbank / mfcc 等特征PaddleSpeech 对其做了修改目标是产生与 Kaldi 的compute-mfcc-feats和compute-fbank-feats命令相同的结果并提醒使用者“先检查这两个 Kaldi 命令的默认参数”。这个目标非常重要语音识别、翻译等任务中训练数据的特征往往由 Kaldi 工具链离线提取如compute-fbank-feats --dither0 ark,t:fbank.ark而推理端如果换用另一套实现哪怕滤波器组边界、DCT 归一化方式有一点点差异都会造成特征分布偏移。PaddleSpeech 把这个 Python 实现放进 third_party/python_kaldi_features正是为了让 Python 侧可以直接生成“Kaldi 口径”的 MFCC / fbank 特征。从仓库结构看该模块由以下部分组成文件/目录作用python_speech_features/base.py核心特征接口mfcc、fbank、logfbank、hz2mel、mel2hz、get_filterbanks、lifter、deltapython_speech_features/sigproc.py基础信号处理分帧、预加重、去直流、dither、功率谱example.py与 Kaldi 命令对拍的示例脚本test/test_sigproc.py分帧逻辑的单元/性能测试setup.py打包配置包名为paddlespeech_featrequirements.txt依赖mock、scipy、numpysetup.py 中将其发布为paddlespeech_featversion 0.1.0PaddleSpeech 根目录的 setup.py 也把paddlespeech_feat列入了安装依赖setup.py 第 104 行docs/requirements.txt 同样依赖它——也就是说它是 PaddleSpeech 正式依赖链的一部分而不只是示例代码。二、Kaldi 的 compute-mfcc-feats 计算管线README 中给出了 Kaldi 侧compute-mfcc-feats的源码调用链源自 Kaldi 的src/featbin/Compute-mfcc-feats.cc它是理解本模块每个 Python 函数存在意义的“参照系”src/featbin/Compute-mfcc-feats.cc Mfcc mfcc(mfcc_opts) -- src/feat/Feature-mfcc.h struct MfccOptions MfccComputer() -- src/feat/Feature-mfcc.cc ComputeDctMatrix() -- src/matrix/Matrix-functions.cc ComputeLifterCoeffs() -- src/feat/Mel-computations.cc for each utterance: mfcc.ComputeFeatures() src/feat/Feature-common-inl.h OfflineFeatureTplF::ComputeFeatures() Compute() ExtractWindow() -- src/feat/Feature-window.cc ProcessWindow() Dither, remove_dc_offset, log_energy_pre_window, Preemphasize, window computer_.Compute() -- src/feat/Feature-mfcc.cc MfccComputer::Compute() const MelBanks mel_banks -- Mel-computations.cc srfft_ ComputerPowerSpectrum() mel_banks.Compute() mel_energies_.ApplyLog() dct, cepstral_lifter把这条链路对照 Python 实现可以一一映射Kaldi 步骤python_kaldi_features 对应实现Dither / remove_dc_offset / Preemphasize / windowProcessWindowsigproc.py 的framesig内部按 dither → 去直流 → 存原始帧 → 预加重 → 乘窗的顺序处理每帧能量log_energy_pre_window用于替换第 0 维 cepstralfbank中保存的raw_frames能量FFT / 功率谱srfft_ComputerPowerSpectrumsigproc.py 的powspecMelBanksMel-computations.ccbase.py 的get_filterbanks代码内注释直接指向kaldi/src/feat/Mel-computations.hApplyLogfbank输出前将 0 值替换为eps由logfbank/mfcc做numpy.logDCTComputeDctMatrixbase.py 第 30 行scipy.fftpack.dct(feat, type2, axis1, normortho)cepstral_lifterComputeLifterCoeffsbase.py 的lifter三、核心接口详解mfcc / fbank / logfbank 及其参数base.py 是特征接口的主体对外提供三个主函数和一组工具函数。下面把参数逐项整理以源码签名中的实际默认值为准。3.1mfccMFCC 特征对齐 Kaldi compute-mfcc-feats 默认参数mfcc 签名def mfcc(signal, samplerate16000, winlen0.025, winstep0.01, numcep13, nfilt23, nfft512, lowfreq20, highfreqNone, dither1.0, remove_dc_offsetTrue, preemph0.97, ceplifter22, useEnergyTrue, wintypepovey):参数默认值含义对应 Kaldi 默认口径samplerate16000音频采样率Hz—winlen/winstep0.025 / 0.01帧长 / 帧移秒即 25 ms / 10 ms--frame-length25、--frame-shift10numcep13输出 mel 倒谱系数个数--num-ceps13nfilt23Mel 滤波器个数compute-mfcc-feats默认--num-mel-bins23nfft512FFT 长度--nfft512lowfreq/highfreq20 /samplerate/2Mel 滤波器组最低/最高频率Hz--low-freq20highfreqNone时自动取samplerate/2dither1.0向每帧信号叠加的标准差为dither的高斯噪声0 表示关闭--dither1.0与 Kaldi 默认一致remove_dc_offsetTrue每帧减去自身均值--remove-dc-offsettruepreemph0.97预加重系数0 表示不预加重--pre-emphasis-coeff0.97ceplifter22倒谱提升系数0 表示不提升--cepstral-lifter22useEnergyTrue用整帧对数能量替换第 0 维倒谱系数--use-energytruewintypepovey分析窗类型povey或hammingKaldi 默认分析窗即 povey 窗mfcc 的实现主体 只有五行结构非常清晰feat, energy fbank(signal, samplerate, winlen, winstep, nfilt, nfft, lowfreq, highfreq, dither, remove_dc_offset, preemph, wintype) feat numpy.log(feat) feat dct(feat, type2, axis1, normortho)[:, :numcep] feat lifter(feat, ceplifter) if useEnergy: feat[:, 0] numpy.log(energy) # 第0维替换为帧能量对数这里有两处是与 Kaldi 数值对齐的关键细节DCT 归一化使用scipy.fftpack.dct的type2, normortho。Kaldi 的ComputeDctMatrix生成的正交 DCT 矩阵与之等价如果换成非正交实现MFCC 数值会整体偏差不一致。第 0 维替换useEnergyTrue时用未加窗的原始帧能量对数log_energy_pre_window替换 c0这正是--use-energytrue的语义。3.2fbank与logfbankMel 滤波器组能量fbank 签名 的默认值为nfilt40, lowfreq0, wintypehamming即保留了原库非 Kaldi的默认口径适合一般性的 log-mel 谱提取logfbank 在此基础上默认lowfreq64并返回numpy.log(feat)。fbank的核心计算frames, raw_frames sigproc.framesig(signal, winlen*samplerate, winstep*samplerate, dither, preemph, remove_dc_offset, wintype) pspec sigproc.powspec(frames, nfft) # 功率谱 energy numpy.sum(raw_frames**2, 1) # 每帧原始能量未加窗 energy numpy.where(energy 0, numpy.finfo(float).eps, energy) fb get_filterbanks(nfilt, nfft, samplerate, lowfreq, highfreq) feat numpy.dot(pspec, fb.T) # 滤波器组能量 feat numpy.where(feat 0, numpy.finfo(float).eps, feat) # 防止 log(0) return feat, energy注意 base.py 第 62 行 将 0 能量替换为浮点eps——这是取对数前的下界保护避免静音帧产生-inf。3.3 Mel 滤波器组get_filterbanks与频率换算get_filterbanks 生成nfilt × (nfft/21)的三角滤波器矩阵。其频率网格的构造方式与 Kaldi 的Mel-computations.h保持一致源码注释明确标注了对应文件mel_freq_delta (highmel - lowmel) / (nfilt 1) for j in range(nfilt): leftmel lowmel j * mel_freq_delta centermel lowmel (j 1) * mel_freq_delta rightmel lowmel (j 2) * mel_freq_delta即把 Mel 轴等分为nfilt1段第 j 个滤波器的左右边界取第 j、j2 段点中心取第 j1 段点逐 FFT 频点做三角加权。Mel 频率换算采用经典的双方向公式def hz2mel(hz): return 1127 * numpy.log(1 hz / 700.0) def mel2hz(mel): return 700 * (numpy.exp(mel / 1127.0) - 1)3.4 倒谱提升与 delta 特征lifter 实现 Kaldi 的 cepstral lifter对第 n 维系数乘以1 (L/2) * sin(π n / L)L 0时不做提升。delta 则提供 N 阶动态特征对序列做边缘填充后用arange(-N, N1)与前后 N 帧加权求和并除以2 * Σi²等价于 Kaldi 的 delta 计算口径PaddleSpeech 的翻译前端正是用它构造 d/delta/delta-delta 特征见第五节。四、信号预处理细节framesig 中的 Kaldi 顺序sigproc.py 的 framesig 复刻了 KaldiProcessWindow的处理顺序与窗口函数分帧numframes 1 (slen - frame_len) // frame_step只保留落在有效长度内的帧Kaldi 的snip-edgestrue行为并用round_half_up四舍五入到最近整数、0.5 向上取整把秒换算为样本数ditherdo_dither 向信号叠加N(0, dither²)高斯噪声去直流do_remove_dc_offset 减去每帧均值保存原始帧raw_frames供能量计算——对应 Kaldi 的log_energy_pre_window用加窗前信号预加重do_preemphasis 实现x[t] - coeff * x[t-1]首样本按(1-coeff)*x[0]处理乘分析窗wintypepovey时按 第 41-44 行 生成 povey 窗win[i] (0.5 - 0.5 * numpy.cos(2 * numpy.pi / (frame_len - 1) * i)) ** 0.85这正是 KaldiFeature-window.cc中 povey 窗的定义Hamming 窗的 0.85 次幂变形wintypehamming则退化为标准 Hamming 窗。分帧本身用 rolling_window 通过numpy.lib.stride_tricks.as_strided以零拷贝的滑动视图生成帧矩阵比原库的索引复制更快且可用stride_trickFalse回退到旧实现做对照。五、实战用 example.py 复现 Kaldi 命令结果example.py 是该模块的“对拍脚本”用同目录下的english.wav演示如何设置参数以对齐 Kaldi 输出from python_speech_features import mfcc, delta, logfbank import scipy.io.wavfile as wav (rate, sig) wav.read(english.wav) # 注意语音识别一般使用 nfilt40这里取 Kaldi compute-fbank-feats 的口径 fbank_feat logfbank(sig, nfilt23, lowfreq20, dither0, wintypepovey) # 得到维度 [110, 23] 的 fbank 系数 # 与 Kaldi 命令 compute-fbank-feats --dither0.0 的结果一致 mfcc_feat mfcc(sig, dither0, useEnergyTrue, wintypepovey) # 得到维度 [110, 13] 的 mfcc 系数 # 与 Kaldi 命令 compute-mfcc-feats --dither0.0 的结果一致使用方式与注意事项运行环境先安装依赖numpy、scipy见 requirements.txt在模块目录下pip install .安装paddlespeech_feat或直接python example.py查看注释中给出的两行示例输出值fbank 首行 12.2865, 12.6906, …mfcc 首行 17.1337, -23.3651, …。dither0 是关键dither默认 1.0 时会叠加随机噪声结果无法与 Kaldi 逐位对齐要复现确定性输出必须显式传dither0。对齐 fbank 需要显式覆盖默认值logfbank默认是nfilt40, lowfreq64, hamming原库口径要匹配 Kaldi 默认必须传nfilt23, lowfreq20, wintypepovey——而mfcc的签名默认值已经预先对齐了 Kaldi只需处理 dither。delta 在此导入可进一步把静态特征扩展为动态特征。六、PaddleSpeech 内部如何使用这个模块从源码结构看该模块被 PaddleSpeech 主链路以“Kaldi 口径特征来源”的身份复用音频变换层paddlespeech/audio/transform/spectrogram.py 直接from python_speech_features import logfbank并在同文件中与 paddlespeech/audio/compliance/kaldi.py 的 Kaldi 合规函数并存用于在paddlespeech.audio的 transform 管线中提供 Kaldi 口径的 log-mel 谱特征。语音翻译ST前端paddlespeech/s2t/frontend/featurizer/audio_featurizer.py 导入mfcc与delta为 s2t 任务提取 MFCC 及其动态特征而离线特征口径则依赖 Kaldi 工具例如 paddlespeech/cli/st/infer.py 中调用compute-fbank-feats --num-mel-bins80生成 80 维 fbank。一致性测试audio/tests/features/test_kaldi_feat.py 中的注释直接给出了对拍命令compute-fbank-feats --dither0 scp:$wav_scp ark,t:fbank_feat.ark即测试会把 Python 侧logfbank的输出与 Kaldi 命令产物--dither0保证确定性做数值比对从 CI 层面守护“与 Kaldi 一致”这一核心承诺。这套“训练/离线用 Kaldi 命令、推理/Python 侧用 paddlespeech_feat”的组合保证了同一模型两端看到相同分布的特征。七、分帧正确性的单元测试test/test_sigproc.py 从两个角度验证分帧实现test_frame_sig用 1000 万级长度、frame_len37, frame_step13的随机信号分别以stride_trickFalse/True跑 framesig断言两者输出形状与数值完全相等assert_array_equal并要求 stride 版本更快——既保证零拷贝优化没有改变数值也覆盖 dither/去直流/预加重/窗函数整条链路的复现性test_rolling验证 rolling_window 在window4, step3下产生预期的 3 帧滑窗。运行方式cd third_party/python_kaldi_features python -m unittest test.test_sigproc需先安装 numpy/scipy。八、快速上手清单与适用边界安装与调用cd third_party/python_kaldi_features pip install . # 安装为 paddlespeech_feat依赖 numpy/scipy python example.py # 复现 english.wav 的 fbank/mfcc 与 Kaldi 对拍参数选择速查要Kaldi 默认口径 MFCCmfcc(sig, dither0)签名默认值已对齐numcep13, nfilt23, lowfreq20, nfft512, pover 窗, ceplifter22, useEnergyTrue要Kaldi 默认口径 log-melfbanklogfbank(sig, nfilt23, lowfreq20, dither0, wintypepovey)要非 Kaldi 的常规 log-mel 谱直接使用logfbank默认参数40 个滤波器、lowfreq64、Hamming 窗需要确定性结果与 Kaldi 逐位比对、写特征文件时务必dither0。适用前提与限制输入信号为一维 numpy 数组N×1单声道highfreq超过samplerate/2时get_filterbanks会直接断言报错fbank对 0 能量帧以浮点eps兜底与 Kaldi 的 mel-floor 机制--mel-floor默认 1e-10在实现细节上不完全等同从源码结构看二者都只保证取对数前有一个下界极端静音帧下数值可能有微小差异需要严格对拍时以 test_kaldi_feat.py 的--dither0基准为准。总结来说python_kaldi_features 用不到 300 行 Python 代码完整复刻了 Kaldicompute-mfcc-feats的分帧、预处理、功率谱、Mel 滤波、DCT 与倒谱提升全链路并通过 example 脚本与仓库内测试与 Kaldi 命令产物对拍它是 PaddleSpeech 音频变换与翻译前端获取 Kaldi 口径特征的基础设施理解它的参数语义能让你在“离线 Kaldi 工具链”与“在线 Python 推理”之间自如切换而不损失特征一致性。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 语音特征提取实战解析 python_kaldi_features 的 MFCC、Fbank 实现与 Kaldi 对齐细节PaddleSpeech 语音特征提取实战解析 python_kaldi_features 的 MFCC、Fbank 实现与 Kaldi 对齐细节 本文以 P人工智能语音音频PaddleSpeech python_kaldi_features 深度解析与 Kaldi compute-mfcc-feats 结果一致的 Python 特征提取实现PaddleSpeech python_kaldi_features 深度解析与 Kaldi compute mfcc feats 结果一致的 Python人工智能语音音频PaddleSpeech 音频 Delta 特征提取add_deltas 模块原理与实战指南PaddleSpeech 音频 Delta 特征提取add_deltas 模块原理与实战指南 PaddleSpeech 在 paddlespeech/audi人工智能语音音频NLP媒体生成上一篇vue-grid-layout金融数据界面股票与市场数据网格下一篇5分钟搞定Aria2可视化下载YAAW-for-Chrome浏览器插件终极配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑