Skip to content

[recording] macOS 录音提示音与试听在多次听写后静音,重启后恢复 #934

Description

@chrisnch

现象

环境

  • OpenLess:1.3.16
  • macOS:26.6.1(25G76)
  • 设备:MacBook Pro(Mac16,5)
  • 芯片:Apple M4 Max
  • 系统架构:arm64
  • OpenLess 可执行文件架构:arm64
  • 「录音提示音」:已开启

复现步骤

  1. 启动 OpenLess。
  2. 进入「设置 → 录音与输入」,确认「录音提示音」已开启。
  3. 点击「试听」,此时提示音可以正常播放。
  4. 正常使用「录音快捷键」进行多次听写。
  5. 在大约 15 分钟内、听写不超过 10 次后,录音开始提示音停止播放。
  6. 再次进入「设置 → 录音与输入」并点击「试听」。
  7. 「试听」同样没有声音。
  8. 完全退出并重新启动 OpenLess。
  9. 「试听」和录音开始提示音恢复正常。

当前表现

  • 问题在当前环境可以稳定触发。
  • 通常在大约 15 分钟内、听写不超过 10 次后出现。
  • 问题发生时,「录音提示音」设置仍然显示为开启。
  • 问题发生时,录音快捷键的开始提示音和设置页的「试听」同时无声。
  • 完全退出并重新启动 OpenLess 后,声音恢复正常。

已核对的源码事实

在 v1.3.16 中:

  • 「试听」按钮调用 playRecordStartCue()。
  • AudioCueListener 在 capsule:state 进入 recording 状态时调用同一个 playRecordStartCue()。
  • 提示音使用 Web Audio API 合成。
  • 播放失败不会在界面显示错误。

相关文件:

  • openless-all/app/src/lib/audioCue.ts
  • openless-all/app/src/components/AudioCue.tsx
  • openless-all/app/src/pages/settings/RecordingInputSection.tsx

影响

  • 问题发生后,用户无法通过声音确认录音是否已经开始。
  • 设置页的「试听」功能同时失效。
  • 当前已确认的恢复方法是完全退出并重新启动 OpenLess。
  • 按目前的使用情况,问题会在约 15 分钟内、10 次以内的听写过程中稳定出现。

建议接受标准

  • 在 macOS 26.6.1、Apple M4 Max、arm64 环境复现并记录实际触发条件。
  • 连续运行至少 15 分钟并完成至少 10 次听写后,录音开始提示音仍能正常播放。
  • 完成上述操作后,设置页的「试听」仍能正常播放。
  • 声音恢复不需要完全退出并重新启动 OpenLess。
  • 为最终确认的触发条件增加回归验证。

TODO / 不确定项

  • 问题发生时的 OpenLess 日志:尚未收集。
  • 是否与特定录音提供商或麦克风设备有关:尚未确认。
  • 优先级由维护者根据复现与影响确认。

Activity

  1. H-Chris233 commented on Aug 9, 2026

    @H-Chris233
    Collaborator

    @appergb 你有Mac你来解决这个问题

  2. appergb commented on Aug 10, 2026

    @appergb
    Collaborator

    ok

  3. appergb commented on Aug 10, 2026

    @appergb
    Collaborator

    骗你的,其实我也有这个问题,修了几次都修不好。

  4. appergb commented on Aug 10, 2026

    @appergb
    Collaborator

    已完成根因定位与逻辑验证,正在继续集成测试。

    根因不是设置状态,也不只是 closed / suspended / interrupted。现有两轮恢复逻辑仍信任 AudioContext.state 等于 running;但 WebKit 存在状态仍为 running、currentTime 仍前进、实际输出已永久静音的退化态。OpenLess 的全局热键长期在后台或其他 App 中使用,正好会让这个长期复用的单例 context 命中该路径,因此开始提示音与设置页试听会一起静音,且之前按 state 重建的修复无法触发。

    修复策略:保留预热 context 供首次播放使用;一个 context 一旦排期过提示音,下一次播放就主动丢弃并新建,不再仅依赖 state 判断健康度。这样每次后续听写或试听都会从新的输出 context 开始,同时保留原有 resume、迟到丢弃和单次重试逻辑。

    逻辑验证已完成:

    • 新增 12 轮真实 playRecordStartCue / stopAudioCue 生命周期回归测试;旧逻辑稳定失败:期望 12 个 context,实际仅 1 个。
    • 应用修复后,同一测试验证 12 轮均排期成功,共 24 个 oscillator,且使用 12 个 context。
    • 原有 audioCue.test.ts 状态分类和恢复决策测试继续通过。

    接下来按计划执行完整前端测试、TypeScript/Vite 生产构建,并检查最终影响范围。

  5. appergb commented on Aug 10, 2026

    @appergb
    Collaborator

    集成验证结果更新:

    • npm run build 通过:TypeScript 与 Vite 生产构建成功。
    • 除 Rust 热键注入门禁外,其余 43/43 个前端与契约测试全部通过;其中包含新增 audioCueLifecycle.test.ts,验证 12 轮提示音共排期 24 个 oscillator、创建 12 个 context,并关闭被替换的 11 个旧 context,避免资源泄漏。
    • 原有 audioCue.test.ts 全部通过。
    • GitNexus 最终变更映射为 low risk,生产改动只落在 audioCue.ts;录音状态机、设置存储、IPC 与 Rust 代码均未修改。

    未完成项:完整 npm test 中的 scripts/check-hotkey-injection.mjs 会首次全量编译 Rust/Tauri,已在补齐 qwen-asr 子模块后重试,但本机仅剩约 2.2 GiB 空间,编译以 No space left on device 退出。该门禁与本次纯前端音频 context 生命周期改动无直接关系;失败发生在编译依赖阶段,未进入测试断言。

    真实 macOS 26.6.1 上连续 15 分钟及至少 10 次听写的听感验收仍需用包含此补丁的安装包执行。自动化逻辑与前端集成路径现已验证。

  6. H-Chris233 commented on Aug 23, 2026

    @H-Chris233
    Collaborator

    所以到底修好没 @appergb

  7. Longado commented on Sep 13, 2026

    @Longado
    Contributor

    @appergb 想确认一下这个还在跟吗?看 beta 上 audioCue.ts 自 8-10 之后没有相关改动,也没找到对应 PR。

    我这边是 macOS 26 / Apple M5,可以跑源码版做实机复现和长时间验证。如果你已经不在跟,我可以接手:沿用你 8-10 定位的根因(WebKit 下 AudioContext.state 仍为 running 但输出已静音),先按 issue 里的步骤复现,再按「排期过提示音的 context 下次播放即替换」的思路提 PR,署上你的分析。如果你手上已经有分支,也可以直接推上来,我帮忙在真机上测。

  8. H-Chris233 commented on Sep 14, 2026

    @H-Chris233
    Collaborator

    @appergb 想确认一下这个还在跟吗?看 beta 上 audioCue.ts 自 8-10 之后没有相关改动,也没找到对应 PR。

    我这边是 macOS 26 / Apple M5,可以跑源码版做实机复现和长时间验证。如果你已经不在跟,我可以接手:沿用你 8-10 定位的根因(WebKit 下 AudioContext.state 仍为 running 但输出已静音),先按 issue 里的步骤复现,再按「排期过提示音的 context 下次播放即替换」的思路提 PR,署上你的分析。如果你手上已经有分支,也可以直接推上来,我帮忙在真机上测。

    #1074
    ta好像确实在做呢,已经开PR了

  9. Longado commented on Sep 14, 2026

    @Longado
    Contributor

    好的

  10. appergb commented on Sep 26, 2026

    @appergb
    Collaborator

    已在 2.0 修复(#1074,随 v2.0.0-Beta.2-tauri 发布):Web Audio 上下文恢复加入超时/冻结时钟检测与有限重建,多次听写后录音提示音不再静音。1.3 稳定线不回填此修复。

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions