## 现象与使用场景 我希望在电脑播放视频时,同时使用 OpenLess 语音输入。目前遇到的问题是,视频中的人声也会混入识别结果。 我已经尝试了“录音时静音”,它确实会关闭系统声音,但这会打断观看体验,不符合我的需求。 希望增加一个可选设置,在系统声音继续正常播放的情况下,尽量抑制播放声音混入录音,让 ASR 主要识别我本人说的话。可以接受实际效果受设备和环境影响,不要求完全消除所有背景声音。 ## 现有功能的不足 - 关闭“录音时静音”可以同时播放和录音,但没有解决视频人声混入的问题。 - “轻量麦克风增强”目前明确不包含回声消除。 - 相关的 [#269](https://github.com/Open-Less/openless/issues/269) 关注录音期间暂停背景音频,本需求希望保留播放声音。 ## 建议接受标准 - [ ] 提供可选的回声消除或播放声音抑制功能,用户可以根据设备和实际效果开启或关闭。 - [ ] 启用时,系统音量和媒体播放保持原状。 - [ ] 在视频人声与本人讲话同时存在时,减少视频内容混入转写,并尽量保留本人讲话的完整性。 - [ ] 说明支持的平台、设备条件及效果限制。 ## 待确认信息 系统、OpenLess 版本、输入和输出设备待补充;目前尚未确认视频声音具体通过哪条音频路径进入录音。
Activity
HKLHaoBin commentedon Oct 17, 2026
先前没有实现回声抑制功能,原因有两点:第一,它的性能消耗比较大;第二,它需要的依赖更多,实现也更复杂。因此,为了那个 PR,我做了两点考虑:一是缩小它的职责范围,二是让 PR 更好维护、更好合并。所以最终没有做回声抑制。不过,既然你需要,我可以尝试为你开发一个。
chesha1 commentedon Oct 17, 2026
再提供一个信息,我在转到 OpenLess 之前用的竞品是闪电说,他们有这个功能。在看视频放着背景语音的时候,也可以实现语音输入,而且没有像现在的 OpenLess 一样把系统输出给关掉,也没有把背景说话的音识别出来,效果非常好,不知道他们是怎么实现的,可惜他们好像是闭源的
HKLHaoBin commentedon Oct 18, 2026
@chesha1 播放回声抑制功能已完成,PR 已提交:
#1228
请协助使用真实硬件测试 issue 中的场景:播放视频/背景语音时保持系统声音可听,同时进行语音输入,并确认背景人声不会被识别、自己的近端语音仍能正常识别。
已通过的构建与产物 Action:
请从对应 Action 页面下载产物进行测试,并反馈操作系统、音频设备/路由、播放内容、是否启用 Playback echo cancellation、测试结果及异常。该功能是 best effort,蓝牙、驱动、受保护内容、Linux ALSA 和输出路由限制可能会回退到普通麦克风录音。
chesha1 commentedon Oct 18, 2026
在Windows下试用没什么问题。在背景有视频人声播放的时候,大致还能正常使用
chesha1 commentedon Oct 18, 2026
等一下,好像出了点问题,现在特别容易出现这个,我找找日志
chesha1 commentedon Oct 18, 2026
@HKLHaoBin 使用本 issue 提供的回声消除开发测试包时,遇到了「原本可以正常使用,随后连续录音启动失败」的问题,想请你帮忙看一下。
测试包与设备
5519c6e2434eb276638485c56f1ea97c66f7b6f0,分支feat/issue-1223-echo-cancellation。2.0.2-Beta.1+build.20261017。原始日志没有记录版本号,版本对应关系来自我确认的开发包来源与构建信息。麦克风 (2- USB Audio Device),48000 Hz / 2 channels / F32。扬声器 (HECATE G1500 BAR),同样为48000 Hz / 2 channels / F32。日志里能确认的现象
原始日志时间带
Z,为 UTC;下表另列北京时间(UTC+8),日期均为 2026-10-18。文件还包含 10 月 17 日的历史记录;这里聚焦 10 月 18 日的故障段,不将所有历史记录都归属于同一测试包。stream error: A buffer underrun or overrun occurred.;再次启动前累计 15 次同类错误。=== OpenLess 启动 ===。phase=completed outcome=PasteSent,说明这段时间输入能够完成。全文件共 26 次
[recorder] stream error。这里统计的是日志事件次数;「19 次成功」以PasteSent完成事件计数,不代表验证了每次插入内容的准确性。重新启动后曾恢复一段时间,但尚无稳定复现步骤。两段关键原始日志
1. 最后一轮连续失败的开始(原文件第 8702–8712 行)
2. 后续没有出现回声参考流启动记录的一次失败(原文件第 8724–8731 行)
第二段只能证明该次日志中没有参考流启动记录,不能单凭它确认设置开关状态。失败链路首先出现在本地音频采集;
voice capture was cancelled是后续取消结果,不能作为最初错误原因。源码排查假设,请开发者确认
优先怀疑 CPAL 升级后,新增的缓冲异常通知被统一当作致命录音故障处理。 本次 PR 将 CPAL 从
0.15.3升到0.18.2;测试包提交中的 Cargo.toml 第 78–80 行 明确使用0.18.2。CPAL 0.18.2 更新记录也列出了新增的 WASAPI capture Xrun 通知。0.18.2的 WASAPI 采集路径在检测到AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY时通过错误回调发出ErrorKind::Xrun,随后仍会走到数据回调。也就是说,这个事件本身不等同于底层音频流已永久停止。CPAL 源码第 819–855 行accepting_audio为真时,将收到的流错误统一包装为RecorderError::EngineFailed,没有单独区分Xrun。recorder.rs 第 1804–1812 行RecordingEvent::Fatal,调用report_recording_fault。core_adapters.rs 第 2777–2794 行这条代码路径与「缓冲异常 → 流释放 → 录音取消」的日志顺序吻合,但尚不能证明缓冲异常最初由什么触发,也不能排除 USB 设备、驱动、系统调度或程序负载的影响。关闭回声消除也不会回退底层 CPAL 版本,因此仅切换该开关未必能隔离这类兼容问题。
另外有两点容易误判:
echo reference stream stopped对应的错误回调实际只执行log::warn!,没有在该回调中停止或销毁参考流。最后一次成功输入也出现过同样警告,因此不能把这条文案直接视为参考流已停止,更不能单独据此认定 AEC 导致录音失败。recorder.rs 第 1948–1950 行0.18.2已有device_position != 0的首包保护。虽然错误多发生在启动附近,现有证据不足以断言是「首包 discontinuity 被误报」的已知问题;仍需记录实际位置和标志验证。希望协助检查
Xrun单独分类,在确认数据回调仍正常时记录告警和计数,而不是立即取消整次录音;对持续断流、设备失效等情况保留恢复或失败处理。err.kind()、设备、采样格式、首次/最近数据回调时间及异常计数,帮助判断启动瞬间异常与持续无法采集的区别。完整原始日志与摘录
原始日志附件将由我随后手动上传到本 issue。已准备好
openless-1223-logs.zip,内含:openless-2026-10-18T09-56-30.log:完整原始日志源文件。openless-recording-failure-excerpt.log:关键日志摘录及原文件行号。完整日志为用户导出的源文件,大小 1,795,830 字节,SHA-256:
摘录仅用于快速定位,包含对应原文件行号;完整上下文请以原始日志为准。麻烦帮忙看一下上述错误处理方向是否合理,谢谢。
chesha1 commentedon Oct 18, 2026
openless-1223-logs.zip
HKLHaoBin commentedon Oct 18, 2026
请从以下 GitHub Actions 页面下载测试包,协助验证本 issue 的播放回声抑制场景。以下构建均已完成且成功,来自分支
feat/issue-1223-echo-cancellation、提交5519c6e2434eb276638485c56f1ea97c66f7b6f0:请优先使用 Windows 或 macOS 桌面端测试:
Playback echo cancellation,播放包含人声的视频或背景语音,并连续进行多次语音输入;反馈时请注明:操作系统、OpenLess 版本、输入设备、输出设备/音频路由、播放内容类型、AEC 开关状态、测试次数、识别效果和是否出现错误。若再次出现录音启动失败,请保留并上传完整应用日志,特别是最初的
[recorder] stream error,不要只提供后续的“录音已取消”提示。该功能目前是 best effort,蓝牙、驱动、受保护内容和部分输出路由可能回退为普通麦克风录音。HKLHaoBin commentedon Oct 18, 2026
这个产物并不负责解决问题,而是收集问题。所以报错是在预期范围内的。
chesha1 commentedon Oct 19, 2026
用这个新的构建产物,不知道为啥,现在我不能复现原来的报错了。你有什么建议能让这个错误更容易出现一点吗?
chesha1 commentedon Oct 19, 2026
@HKLHaoBin 补充更新:之前低频试用时暂时无法复现,继续使用和尝试后,现在又复现了原来的报错。
目前还不能确定是哪一步操作触发的,也没有整理出稳定的复现步骤,因此前面“暂时无法复现”的反馈不能视为问题已经消失。
这次的录音诊断事件和故障摘录已经整理成
openless-1223-repro-20261020.zip,我会随后在网页端手动上传,供进一步分析。该附件是诊断摘录,完整原始日志也已在本地保留。chesha1 commentedon Oct 19, 2026
openless-1223-repro-20261020.zip
HKLHaoBin commentedon Oct 20, 2026
@chesha1 感谢补充复现日志。我核对了这次附件:本次启动后有 17 次
PasteSent完成事件,随后连续 4 次出现主麦克风A buffer underrun or overrun occurred.,接着释放流并取消录音。暂时无法复现不能视为故障消失;目前也不能直接断言是 AEC 算法导致了这些缓冲异常。这次准备了一个新的诊断包,用于确认具体 CPAL 错误类别,以及错误之后是否仍有音频数据回调。它还不是修复版,原有错误处理行为保持不变,因此仍可能报错。
请使用本次新包,不要重复下载旧包
分支:
feat/issue-1223-echo-cancellation提交:
986526faa741061d0066cf1607c04cad6818f0a6以下 Actions 均已成功,并已核验产物存在且未过期:
-updater包。openless-macos-aarch64或openless-macos-x86_64。版本号仍可能显示为
2.0.2-Beta.1+build.20261017,不能仅凭版本号区分新旧包。请确认来自上述本次 Actions;新包运行后应能在日志中找到[DEBUG-ISSUE1223]。请你复现 bug
[DEBUG-ISSUE1223];如果没有,请反馈,不要把旧包日志当成本次诊断结果。[DEBUG-ISSUE1223]行,以及失败前后相关的 recorder/watchdog/取消/完成事件,保留原始时间和顺序;压缩上传到本 issue。完整原始日志请先在本地保留,不要清空。上传前请检查并去除转写正文、密钥等敏感内容。新探针为:
P1(AEC 请求与参考流建立结果)、P2(主麦克风错误类别/计数)、P3(参考流错误类别/计数)、P4(队列或 watchdog 故障)、P5(首次/错误后的下一次数据回调)。不是每次都会出现所有探针;请提供实际出现的全部事件,不用补造缺失行。尤其需要同一run_id下的P2与后续P5,才能判断 xrun 后数据是否仍在到达。收到这些证据后再验证针对性的修复。chesha1 commentedon Oct 20, 2026
@HKLHaoBin 已安装你上一条回复中的新诊断包,并再次触发了原来的录音失败。这次日志已确认出现
[DEBUG-ISSUE1223],也捕获到了你需要的同一run_id下 P2 → P5 记录。设备与诊断范围
麦克风 (2- USB Audio Device);参考输出:扬声器 (HECATE G1500 BAR);两者均为48000 Hz / 2 channels / F32。aec_requested=true、reference_available=true。本次没有 AEC 关闭对照。已捕获的结果
共 45 条
[DEBUG-ISSUE1223],覆盖 10 个run_id:P1=10、P2=5、P3=10、P5=20;没有 P4。5 次 P2 主麦克风错误均为
error_kind="xrun",且每次随后都有同一run_id、stream_role="microphone"的 P5:outcome="after_error"、callback_count=1、error_count=1、frames=480。之后均出现流释放及voice capture was cancelled。错误时间如下,日期均为 2026-10-20:
pid-21904-capture-1pid-21904-capture-2pid-21904-capture-3pid-6216-capture-6pid-6216-capture-7这段诊断记录期间另有 5 个
phase=completed outcome=PasteSent完成事件。这只是事件计数,不代表验证了每次转写的准确性,也不能把上述时间跨度视为连续测试时长。下面是 20:03:03 那次的关键原始行(中间有省略,完整诊断顺序见待上传附件;时间戳为 UTC):
这些记录确认了 xrun 错误之后仍有麦克风数据回调到达,随后本次录音被取消。目前仍不能仅凭这些记录确定最初是什么触发了 xrun,也没有据此认定 AEC 算法或音频驱动是根因。请看看这些 P2/P5 证据是否足以继续验证针对性的错误处理修复。
附件
已准备
openless-1223-debug-20261020.zip,我会随后在网页端手动上传到本 issue。压缩包包含:openless-1223-diagnostic-timeline.log:全部 45 条诊断标志,以及相关录音、取消、完成和热键触发记录,共 159 条,保留原始时间、顺序和源文件行号。manifest.json:统计范围、计数及 SHA-256,便于核对。附件仅含诊断摘录,已核对未包含转写正文或密钥。完整原始日志已在本地保留,不包含在该压缩包内。
chesha1 commentedon Oct 20, 2026
openless-1223-debug-20261020.zip
HKLHaoBin commentedon Oct 20, 2026
@chesha1 已核验你这次附件的 SHA-256 与 P2→P5 顺序。5 次主麦克风 xrun 后都仍有非空数据回调,证据足以支持一次针对性的修复验证:CPAL
Xrun不再立即上报为 Fatal 并取消录音,而是记录警告后继续接收音频。 设备失效等其他错误仍走原来的失败路径,无数据回调 watchdog 也保留原阈值;xrun 不会刷新其时间戳,因此不会用该改动掩盖真正断流。修复已通过 Review Bugbot,结论为 No bugs found。提交:
8005a171ec476ba26c7241cb4f809be5ff7a85b5,分支feat/issue-1223-echo-cancellation。新修复测试包(不是上一轮仅加日志的诊断包)
桌面端 Action 完整链接:
https://github.com/HKLHaoBin/openless/actions/runs/39467293641
Windows、macOS ARM/Intel 构建均已成功,以下安装包已上传且未过期:
请下载对应安装包 artifact,不要选仅包含签名或更新元数据的
-updater包。GitHub 下载 Actions 产物可能需要登录。Windows recorder 模块测试已通过;CI 中其他平台的 macOS checks 被标为 cancelled,整轮 CI 尚未全绿,我会继续查日志并补跑。这不影响上述桌面安装包已经构建成功,但尚不能宣称原设备问题已彻底解决。
请你用修复版复现 bug
outcome应为xrun_recoverable,并应有后续同run_id的 P5 数据回调,不再仅因这次 xrun 就立刻取消录音。还请确认能完成转写/输入、本人讲话是否完整、系统播放是否保持正常。[DEBUG-ISSUE1223]全部事件,以及附近的 recorder/watchdog/取消/完成事件和时间顺序,压缩后发到本 issue。若一直没再触发 xrun,请说明实际使用情况;这只能说明暂未复现,不等于已验证该恢复分支。HKLHaoBin commentedon Oct 20, 2026
@chesha1 补充自动验证结果:修复代码未变,后续提交
9d34723c1a128c869bfe7b20b8da9771161f362c仅增加 CI 手动选择 Intel macOS runner 的回退及契约测试,也经 Review Bugbot 审查无 Bug。复测请继续使用上一条评论提供的
8005a171修复包,该提交 Windows、macOS ARM/Intel 三种桌面包均已构建成功,产物仍未过期,且音频修复代码与最新提交一致:https://github.com/HKLHaoBin/openless/actions/runs/39467293641
Windows 安装包直达:https://github.com/HKLHaoBin/openless/actions/runs/39467293641/artifacts/12286184559
仍需原设备上的
xrun_recoverable→ 后续数据回调 → 正常完成录音/输入的日志验证,自动测试通过不等于已确认硬件症状消失。无需为本轮 CI 更新重复安装;复测和隐私检查要求沿用上一条评论。chesha1 commentedon Oct 22, 2026
经过两天的试用,这次的构建产物不会再出现录音报错的情况了,好像出现过一次,但那次只是悬浮窗有一个报错,没有影响正常使用