现象
- 触发条件:完成一次语音听写并启用 LLM 润色。问题为偶发,尚无稳定复现步骤。
- 当前表现:最终插入文本中偶尔出现两段相邻、语义和字面都高度相似但并非完全相同的内容,相当于同一句话被润色输出两次。
- 预期表现:单次口述中的同一语义只输出一次;若模型产生疑似相邻近似重复,至少应留下可关联的诊断指标,并允许采用保守的告警或可选去重策略。
一条脱敏运行证据(仅代表该样本)
2026-08-27 的一条本机历史候选显示:
- 未被纠正规则改动的 ASR/raw 长度为 55 字,内部未检测到重复;ASR 为
openai-compatible / large-v3。
- 单次润色后的
finalText 长度为 150 字;其中相邻两段归一化长度为 21 / 27,普通 Levenshtein 相似度为 0.7407,扣除长度差后的相似度为 0.9524;LLM 为 custom / glmcn/glm-5.2。
- 同一时间窗仅观察到 1 次 Whisper 转写、1 次 polish dispatch、1 次 LLM POST(HTTP 200)、1 条 history 记录,且
insertStatus=inserted。
- 因此,该样本中的重复最早可观察于润色后的
finalText;运行证据不支持把它归因于该次 ASR、双触发或最终回填。该结论不应外推为所有近似重复问题的通用根因。
为保护隐私,本 issue 不包含转写片段、文本哈希、session ID、日志文件或本机路径。
与既有 issue 的区别
相关源码机制(固定到当前 beta HEAD)
另有一个独立潜在风险:qwen_realtime.rs 会直接 push 每个 completed segment,随后 join_segments 仅处理空格/标点拼接,没有按 item/sentence ID 或重叠内容去重。但本候选没有使用 Qwen realtime,因此它不能作为本次样本的根因。
影响
- 重复内容会被作为正常润色结果保存并插入,用户需要手工删除。
- 因两段并非完全一致,简单的精确去重无法识别;激进的模糊去重又可能误删用户有意重复。
- 当前阶段日志不足以把责任进一步定位到模型原始响应或客户端响应处理边界。
建议接受标准
TODO / 不确定项
- 需要新的脱敏观测字段才能确认本样本中重复是否已存在于完整模型响应。
- 近似重复的分段方式、最小长度、相似度阈值及默认行为仍需产品/维护者确认。
现象
一条脱敏运行证据(仅代表该样本)
2026-08-27 的一条本机历史候选显示:
openai-compatible / large-v3。finalText长度为 150 字;其中相邻两段归一化长度为 21 / 27,普通 Levenshtein 相似度为 0.7407,扣除长度差后的相似度为 0.9524;LLM 为custom / glmcn/glm-5.2。insertStatus=inserted。finalText;运行证据不支持把它归因于该次 ASR、双触发或最终回填。该结论不应外推为所有近似重复问题的通用根因。为保护隐私,本 issue 不包含转写片段、文本哈希、session ID、日志文件或本机路径。
与既有 issue 的区别
openai-compatible / large-v3。相关源码机制(固定到当前
betaHEAD)types.rs区分raw_transcript、未处理 ASR 的可选asr_transcript与final_text;coordinator/dictation.rs将润色结果写入final_text后落一条 history。coordinator/dictation.rs在互斥分支中选择流式或一次性润色入口。本样本的运行记录同样只显示一次 polish dispatch。polish/output_cleaning.rs的clean_polish_output只剥离 thinking、Markdown 围栏、已知前缀并 trim,没有相邻近似去重逻辑。polish.rs把 HTTP body 日志预览限制为 200 bytes;成功响应路径也只记录该预览(L750-L764)。现有日志无法对齐完整的模型 assistant 文本与清洗后文本,所以仍不能用该样本直接证明重复已经存在于模型原始响应,还是出现在响应提取/清洗边界内。coordinator_state.rs只允许Listening -> Processing一次;对应测试验证第二次进入会返回None(L467-L480)。insertion.rsL59-L73);实现中写剪贴板后仅调用一次simulate_paste(L297-L318)。另有一个独立潜在风险:
qwen_realtime.rs会直接push每个 completed segment,随后join_segments仅处理空格/标点拼接,没有按 item/sentence ID 或重叠内容去重。但本候选没有使用 Qwen realtime,因此它不能作为本次样本的根因。影响
建议接受标准
TODO / 不确定项