Skip to content

[bug] 修复“最后两个字丢失”问题#81

Open
kanbykanby wants to merge 1 commit intojoewongjc:mainfrom
kanbykanby:fix/recording-tail-truncation
Open

[bug] 修复“最后两个字丢失”问题#81
kanbykanby wants to merge 1 commit intojoewongjc:mainfrom
kanbykanby:fix/recording-tail-truncation

Conversation

@kanbykanby
Copy link
Copy Markdown

背景

当前语音输入在“说完最后一个字立即按快捷键停止”时,最后一两个字容易丢失。
实际体验上,这部分内容通常已经说出口,甚至已经进入音频链路,但因为 stop 时机过于激进、ASR/LLM 收尾路径过早截断,导致尾部文本没有进入
最终结果。

复现方法

当我们按下快捷键时可以开始输入,但说完话后立即按下快捷键会发现最后两个字被截断无法输入。

修复内容

本 PR 主要从三个层面修复录音结束时的尾字截断问题:

1. 修复音频采集 stop 时尾包丢失

AudioCaptureEngine.stop() 中,先同步排空 AVCapture 的 delegate 队列,再执行 flushRemaining()

这样可以避免:

  • 最后一小段音频还滞留在回调队列里
  • 上层已经进入 stop 流程
  • 尾音来不及进入 session 管线而被直接丢弃

2. 调整 stop 语义,给尾音和最终识别留出收敛窗口

RecognitionSession.stopRecording() 中:

  • 增加 stop 后的短尾窗(350ms
  • 先停止采集并 drain 音频发送管线
  • 再播放 stop 提示音

这样可以避免:

  • 用户刚说完就按停时,尚未浮出为 callback 的尾音被截断
  • stop 提示音在麦克风仍在采集时介入,污染尾部音频

3. 移除流式 ASR + LLM 模式下的“快速断开”快路径

此前在流式引擎 + LLM 模式下,如果已经拿到一版 early text,会直接跳过最终 ASR finalize 并断开连接。
这会导致 stop 后才补出来的最后几个字根本没有机会进入最终 transcript。

本 PR 改为:

  • stop 后始终等待 ASR 正常 endAudio/finalize
  • 等待事件流 drain
  • 如果最终 transcript 与 early LLM 输入不一致,则丢弃旧的 early LLM 结果,改用最终完整文本重新处理

这样能保证正确性优先,不再因为快路径牺牲尾字完整性。

测试

新增回归测试,验证 stop 过程中:

  • 尾包音频必须先送出
  • endAudio() 不能早于最后一块音频发送完成
  • stop 链路在有尾包时仍能正确完成收尾

已验证:

  • swift test --filter RecognitionSessionTests

影响

预期修复以下场景:

  • 快速说完后立即按停止键,最后一两个字被截断
  • 流式识别 + LLM 后处理模式下,stop 后尾字更容易丢失
  • stop 提示音对尾部识别造成干扰

说明

这次修改优先保证 stop 时的识别完整性,接受极小的收尾等待成本,以换取明显更稳定的尾字保留效果。

@joewongjc
Copy link
Copy Markdown
Owner

你用的啥模型?我之前修过这个,现在用火山的话基本话一说完直接按结束就行。

@kanbykanby
Copy link
Copy Markdown
Author

我用的火山的,我一直会丢最后两三个字,体验比较差。

@kanbykanby
Copy link
Copy Markdown
Author

可能因为我说完那一瞬间,我就按了停止键了。

@joewongjc
Copy link
Copy Markdown
Owner

怪了,明天查查,我就是说完马上按,很爽

@joewongjc
Copy link
Copy Markdown
Owner

joewongjc commented Mar 31, 2026

你是流式识别和 LLM 处理都有这个问题吗?按现在的逻辑看,应该只有 LLM 处理会有问题,流式识别是会等一下完整请求返回的。

@kanbykanby
Copy link
Copy Markdown
Author

我是用在语音识别之后,调用 LLM 那种润色模式。因为我喜欢 LLM 把我的那些嗯嗯啊啊去掉

@joewongjc
Copy link
Copy Markdown
Owner

那说得过去了,已经改掉了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants