用户反馈当前 X-ASR 版本偶尔会掉最后一两个字,例如实际说“技术总监让我问你一下”,识别成“技术总监让我问你”或类似结果,要求判断原因和解决方案。
/Users/ar/Library/Application Support/PrivateVoice Input/app.logprivatevoice.src/app.goprivatevoice.src/internal/audio/recorder.goprivatevoice.src/internal/engine/engine_darwin.go2.1.30 (20260613.2201)。x-asr-zh-en-960ms backend=x_asr_streaming。2026-06-14 19:54:47 Recognized: 技术总监让我问你一Recognized: 日志阶段已经缺少最后尾字,说明不是粘贴链路、剪贴板或上屏阶段丢字,而是 ASR 最终文本阶段已经掉尾。Finish() 中追加 1.5s 静音 padding:xasrTailPaddingSamples = 24000AcceptWaveform(..., xasrTailPadding) 后再 InputFinished()2609ms,实际采样 37600,约 2.35s,说明松键停止和音频缓冲之间仍可能遗漏最后约 100-300ms 的真实声音。问题更像是“松开热键后立刻停止录音导致最后尾音没被采进 buffer”,而不是单纯的 X-ASR flush 不充分。
已有的静音 padding 只能帮助模型处理已经捕获的音频;如果最后一个字的真实声音在松键瞬间还没有进入 pcmBuf,后续补静音无法恢复。
低风险方案:只针对 X-ASR 增加松键后的短尾采集保护。
ReleaseTailCaptureDelay() time.Duration。xasrStreamingEngine 返回 250-350ms,建议先用 300ms。stopRecordingLocked(false) 中,在真正 StopAndGetSamples() 前,如果当前引擎声明需要 tail capture,则保持 recorder 继续采集这段时间。0,不受影响。1.5s 静音 padding,它仍负责模型 flush。300ms 识别等待;如果用户立刻开始下一句话,可能多采到一点环境声或下一个字。4800 samples(300ms * 16kHz)。