用 FunASR 1.1 的 paraformer-streaming 接麦克风做实时字幕,前端每 600ms 送一个 chunk,识别结果被切成碎片,「今天下午三点」被拆成「今天」「下午」「三点」三条。把 chunk_size 从默认值改成 [0,10,5] 后延迟变大但断句还是碎,试过关掉 ITN 也没有改善。
一开始怀疑是「VAD 的尾部静音阈值太短,短停顿被判成句尾」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。chunk_size 与前端切片长度不匹配,模型每次都在句中断开。少数情况下是流式解码缓存没开,每包都当成新句子开始。
还有一种情况,前端按时长切片而不是按语音活动切片。
动手时先把 chunk_size 与发送间隔对齐
python -c "print('chunk_size=[0,10,5] 对应 600ms 一包')"
随后开启流式缓存并打印中间结果
python -c "from funasr import AutoModel;m=AutoModel(model='paraformer-zh-streaming');print(m.generate(input='chunk.wav',cache={},is_final=False,chunk_size=[0,10,5]))"
再往下把 VAD 尾部静音阈值调长再试
ffmpeg -i mic.wav -af silencedetect=noise=-35dB:d=0.8 -f null -
末了用同一段离线音频验证断句是否正常
python -c "print('offline mode compare')"
恢复的判定其实很直接。实时字幕按语义成句,单条字幕不再被拆成三段,端到端延迟稳定在 800ms 以内,离线结果与流式结果一致。
补一句。流式识别的断句是 chunk 边界决定的,前端切片节奏必须和后端 chunk_size 对齐,把切片做小只会得到更多碎片而不是更低延迟。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
