ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从 16 万个采样点到 80 维梅尔矩阵:FunASR 数据预处理中 SOND 模型前端是怎么做的

从 16 万个采样点到 80 维梅尔矩阵:FunASR 数据预处理中 SOND 模型前端是怎么做的 从 16 万个采样点到 80 维梅尔矩阵FunASR 数据预处理中 SOND 模型前端是怎么做的【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR同一段 10 秒语音原始波形有 160,000 个采样点而 SOND 前端最终喂给网络的只有一张约 1000×80 的矩阵。FunASR 数据预处理对 SOND 模型来说就是这条链路重采样、归一化、谱变换、增强、统计校准一段都不许少。下面按音频真实经过的顺序拆开讲顺带把训练和推理两套模式的差异说清楚。清单文件、16kHz 和音量数据进场前的三道关卡wav.scp 清单一行一句话说清谁在哪FunASR 用 Kaldi 风格的列表文件管理数据data/list/下就是样例utt_001 /path/to/speech_001.wav utt_002 /path/to/speech_002.wav左边是 utt_id右边是路径。训练框架按行取音频utt_id 用来对齐文本和标签。重采样一行sr16000解决所有采样率问题44.1kHz 的会议录音、8kHz 的电话音频进来必须先对齐到 16kHz。工具脚本里这一步就是这么一行# 参考 funasr/datasets/audio_datasets/scp2jsonl.py waveform, _ librosa.load(line, sr16000)sr16000让 librosa 顺手完成重采样。不做这步后面所有多少毫秒 多少个采样点的换算全部作废。峰值归一化把不同设备拉进同一电平麦克风增益、说话人距离这些差异会直接写进振幅里。峰值归一化把振幅压到 [-1, 1]# 参考 docs 示例funasr/utils 工具风格 peak waveform.abs().max() if peak 1e-8: waveform waveform / peak四行代码但省掉了大量同一段话换台录音设备识别率就变的返工。25ms、10ms、80 维ASR 梅尔频谱提取的参数都是怎么选的先给全链路一张图窗口参数不是随手拍的# 参考 funasr/frontends/wav_frontend.py class WavFrontend(nn.Module): def __init__(self, fs16000, windowhamming, n_mels80, frame_length25, frame_shift10, ...): ...frame_length25和frame_shift10单位是毫秒。25ms 的窗在 16kHz 下是 400 个点刚好装下几十毫秒的语音基音周期10ms 的帧移意味着相邻帧重叠约 60%帧与帧之间不会断片。FFT 侧另一套默认值# 参考 funasr/frontends/default.py self.stft Stft(n_fft512, hop_length128, windowhann, ...) self.logmel LogMel(fsfs, n_fftn_fft, n_melsn_mels, ...)512 是 2 的幂FFT 快hop 128 对 512 又是约 50% 重叠。两套配置殊途同归都在分辨率和帧数之间取中间值。STFT 到 80 维梅尔滤波器组在干什么STFT 之后每条帧是 257 条线性频率轴512 点 FFT直接进网络又宽又冗余。80 维梅尔滤波器组把它压成 80 维 log-Mel 特征按人耳低频细、高频粗的感知特性重新分箱——这是全链路里唯一值得用比喻形容的一步。对 SOND 这种要判断谁在说的任务80 维保留了足够分辨率又不会让序列太长。顺带一提wav_frontend.py里那行waveform * (1 15)把 [-1, 1] 的浮点波形放大回 16bit PCM 量级Kaldi 风格的 fbank 能量计算按这个标度来别当 bug 删掉它。CMVN让每句话的分布长得像谱特征做完还有一步统计校准数学形式很朴素# 参考 funasr/frontends/wav_frontend.py def apply_cmvn(inputs, cmvn): means cmvn[0:1, :dim] vars cmvn[1:2, :dim] inputs means.to(device) inputs * vars.to(device) return inputs减均值、乘方差倒数一句话的整条特征被拉进统一分布。全局统计量存在 Kaldi 格式的.cmvn文件里训练前算好、推理时直接套用不想维护文件时也可以用 utterance 级在线统计代替。重叠语音VAD 管静音PSE 管谁在说SOND 前端并不做显式的重叠段分割重叠段原样进模型。VAD 作为上游模块把静音切掉模型内部靠 PSEPower-Set Encoding把哪些说话人在活动压成单个整数标签训练时还会随机打乱说话人顺序逼模型不依赖固定编号。SpecAugment 什么时候该关掉以及训练/推理的工程化封装训练 vs 推理同一个模型两种姿态SpecAugment 在 FunASR 里是独立模块挂在模型上只工作在训练态# 参考 funasr/models/specaug/specaug.py class SpecAug(nn.Module): def __init__(self, apply_time_warpTrue, time_warp_window5, freq_mask_width_range(0, 20), num_freq_mask2, apply_time_maskTrue, num_time_mask2, ...): ... def forward(self, x, x_lengthsNone): x, x_lengths self.time_warp(x, x_lengths) x, x_lengths self.freq_mask(x, x_lengths) x, x_lengths self.time_mask(x, x_lengths)时间扭曲模拟语速变化频率掩码随机糊掉 (0, 20) 宽的频带时间掩码糊掉随机帧段。训练时全开等于给数据换皮推理时一律关闭否则同一段音频两次结果对不上。WavFrontend一个类管两种模式前端全部封装成WavFrontend通过frontend_classes注册表按名字配置。离线训练走forward批内逐条提特征再 pad 对齐流式推理用WavFrontendOnline带 cache 逐帧增量出特征cache 里留着波形尾部和特征拼接上下文保证出帧节奏不断。远场场景该先动哪个参数答案是 CMVN。远场数据的信道衰减写在电平里用远场数据重算全局统计量比调掩码宽度有效得多。三条能直接落地的建议训练时保持 SpecAugment 全开推理时全关。这是稳定性底线没有商量余地。数据入口统一 16kHz在scp2jsonl.py这类工具脚本阶段重采样完成别指望运行时兜底。远场 / 噪声场景优先用对应数据重算.cmvn全局统计再考虑 SpecAugment 参数。关键源码与文档路径离线前端25ms/10ms 窗口、CMVN 加载与应用funasr/frontends/wav_frontend.pySTFT LogMel 流水线funasr/frontends/default.py三类增强与默认宽度funasr/models/specaug/specaug.pyPSE 标签与说话人打乱funasr/models/sond/e2e_diar_sond.py音频清单与长度统计工具funasr/datasets/audio_datasets/【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表