测试与发布证据

AudioRecord 客户端被 Android 采集策略静音的诊断

只诊断 concurrent capture policy 对当前 AudioRecord client 的系统静音信号、回调和会话关联;不重复通用无语音流水线、路由换设备或 DEAD_OBJECT 重建,也不声称 Cove 已接入。

审核状态: 内容已校验;中文稿供用户审核 · 2026-10-08 · Fact IDs: ANDROID-AUDIO-CLIENT-SILENCED-2026-10, ANDROID-AUDIO-01, COVE-ASR-02

直接回答

录音器仍处于活动状态,并不能证明音频框架正在把麦克风声音送给该 client。Android 会仲裁并发录音;当其他获准采集同时存在时,较低优先级 client 可能收到静音。API 29 及以上的 AudioRecordingConfiguration.isClientSilenced() 可以报告当前返回给 client 的音频是否正被并发采集策略静音。这是范围很窄的系统状态,不是语音检测器、路由标识、权限结果,也不会告诉你哪个其他采集获得了优先级。 AudioRecord.registerAudioRecordingCallback(executor, callback) 同样从 API 29 起提供,可接收包括系统静音/解除静音在内的采集配置变化。Android 的音频输入共享文档要求在 capture 启动前注册;回调只在应用正在接收音频且配置发生变化时发送。因此没有回调不能证明当前 client 未静音。准确 API 能提供对应录音器的当前配置时,启动后也应读取快照,并通过 AudioRecord session 关联,而不要按返回列表顺序随便挑一个系统录音配置。 不要把 callback 类的可用版本与 per-recorder 方法混为一谈。AudioManager.AudioRecordingCallback 类型和 manager 级活动采集观察从 API 24 起存在;AudioRecord 的 callback 注册重载与 isClientSilenced 则是 API 29。更早设备上不要用权限检查、RECORDSTATE_RECORDING、read 返回正数或波形幅度低来伪造新 flag。它们可以证明采集的其他状态,但不能证明系统并发采集静音状态。API 29 信号不可用时,应将该原因标为 unknown。 isClientSilenced 为 true 表示框架依并发采集策略静音,不表示房间安静、用户没说话、耳机断开、缓冲格式错误或录音器对象已失效。反过来,flag 为 false 也不能证明声学输入包含语音,或所选麦克风有效。安静波形夹具和经同意的语音夹具应与系统 flag 分开。不要仅凭零振幅样本证明 Android 静音了 client,也不要把非空 read 当作已获取人声的证明。 每次配置更新都要关联到当前应用拥有的 recorder session。记录 session ID、可获取时的 client audio session ID、callback 时间、配置快照、API实际提供的路由/格式字段和应用采集状态。旧录音器释放或重建后忽略其延迟事件。配置回调可能报告路由、预处理或格式变化,不只是静音;应按字段分类,不能把任何 callback 都解释成 muted。也不要记录其他应用身份或猜测哪个程序触发了系统决策。 把相邻错误信号分开。AudioRecord.ERROR_DEAD_OBJECT 表示该实例失效且需重建;路由事件表示输入路径变化;权限拒绝代表访问不可用;短读或零长度是 read 结果;recognizer 没有转录是更后面的阶段。如果 isClientSilenced 为 true,就标记为 framework silenced,不能把空转录呈现成用户没有说话。flag 为 false 或 unknown 时,再独立检查真实信号、路由、格式、分段和识别。 测试仅使用可见且获同意的受控采集场景,并通过常规平台 API。AudioRecord 启动前注册 callback;有匹配配置时采集其快照;分别运行已知安静输入和简短、经同意的人声夹具。若并发采集属于获准测试,用遵循平台规则的第二个受控测试应用,不绕过隐私控件或系统采集优先级。记录状态转变和未知,而不是声称每台设备静音方式都相同或启动时必有 callback。 本文是平台诊断方法,不表示 Cove 当前检查 isClientSilenced,也不表示用户能通过该 flag 识别优先级更高的采集来源。API只报告 client 一侧的策略状态。权限允许、录音指示灯或 AudioRecord 状态不等于输入清晰可懂。将采集证据、系统策略、路由和识别结果分别记录;没有测量记录时不主张音频准确率、设备支持或系统静音率。

AudioRecord 正在工作,但新语音笔记没有可用语音

用户可见的语音任务已经开始,read 也在继续,但应用没有可理解的转录。权限已允许且 recorder 看似活动。团队还未确认是房间安静、路由变化,还是 Android 并发采集策略静音了该 client。

决策

API 29+ 检查录音器的 AudioRecordingConfiguration 和回调状态,将其匹配到活动 recorder session,并把声学、路由、录音器和识别证据分开记录。

预期结果

支持团队能说明 Android 是否报告 framework silenced,或当前状态是否不可用;不责怪说话者、不识别其他应用,也不把结果归咎于模型。

需要收集的证据

只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:

  • ANDROID-AUDIO-CLIENT-SILENCED-2026-10:拟新增事实卡,记录 API 29+ isClientSilenced 和 capture configuration callback 的策略静音语义;待 Codex source/editorial review。
  • ANDROID-AUDIO-01:Android 采集文档定义麦克风 API 与采集边界;不说明当前 Cove 已检测系统静音。
  • COVE-ASR-02:Cove Voice 的 PCM 分段和转写占位状态事实;不证明它使用 AudioRecordingConfiguration。

发布结论只对所记录的配置和验收集有效;扩大适用范围需要更多记录。

实施流程

  1. 记录获准的采集状态. 记录用户开始操作、RECORD_AUDIO 授权、recorder/session、录音状态、可获得的路由和声明格式。将已知安静夹具和经同意的语音夹具分开;默认不保存私人音频。
  2. 固定 API 级别和信号可用性. 仅在 API 29+ 使用 AudioRecordingConfiguration.isClientSilenced。录音开始前调用 AudioRecord.registerAudioRecordingCallback。不要把 API 24 的 manager callback 类型或权限/read 状态替代成 per-Record 静音状态。
  3. 读取并关联配置. 启动后,在准确 API 能提供对应录音器配置时读取当前快照,并处理 silenced/unsilenced、路由或格式回调。每条更新关联到活动 AudioRecord session;没有快照或回调证据时标 unknown,而不是 false。
  4. 将静音和其他失败分类. true 表示 concurrent-capture policy 静音。false 并不证明有人说话。分别记录路由/格式变化、ERROR_DEAD_OBJECT、权限丢失、empty read、真实声学安静和识别无转录。
  5. 只在平台规则内复现. 用可见且经同意的测试应用和常规音频 API。需要并发采集时,让第二个获准测试应用正常参与,不绕过系统策略。记录状态变更,不假设所有 API 29 设备都发出相同回调序列。
  6. 展示有边界的用户恢复. 若当前 client 确认被系统静音,把策略静音标为最早已知边界,并提供产品支持的等待、停止或重试操作。不要声称用户听不清,也不要在 recorder 仍有效时自动重建。

让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。

验收标准

  • 记录 API 级别,仅在支持时读取 isClientSilenced;缺少快照/回调时保持 unknown,不反推未静音。
  • 每条 callback/configuration 都关联活动 AudioRecord session,并把静音、路由/格式变化、dead object、权限、read 结果和识别结果分成不同状态。
  • 测试使用可见、获同意且遵守平台规则的采集夹具;不绕过 Android 优先级,也不记录其他应用身份或私人音频。
  • 产品文案只在 API 明确报告时描述 framework silenced;不从权限/录音指示灯推断声学安静、人声可懂、Cove 行为或设备可靠性。

决策对照表

维度选择或证据解读方式
并发策略静音 clientAudioRecordingConfiguration.isClientSilenced() 为 true框架报告返回给该 client 的音频正被静音;不会命名竞争应用,也不证明硬件损坏。
环境安静或无人说话flag 为 false/不可用且观察到安静输入低振幅不是系统仲裁证据;还应独立评估采集路由和信号。
路由或格式改变录音配置或设备回调报告输入路径改变说明采集配置有变化;没有对应 flag 不要标成策略静音。
录音器失效或识别失败AudioRecord 错误或后续转录阶段结果实例有效性和识别输出不同于一个活动 client 被系统策略静音。

需要避免的失败模式

  • 把麦克风权限已允许、RECORDSTATE_RECORDING 或 read 有字节当作未被系统静音。
  • 把安静房间、输入路由改变、DEAD_OBJECT 和 framework concurrent-capture policy 混成同一失败。
  • 根据静音 flag 推断是哪一个应用抢占麦克风或用户说话不清楚。

还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。

最小复现记录

层级记录内容
设备厂商、型号、芯片、内存档位、操作系统版本
软件应用版本和 Git 提交号
模型系列、变体、版本、格式、文件长度、摘要、量化方式
运行时名称、版本、请求后端及实际后端证据
工作负载样例版本、输入摘要、提示词摘要、输出策略
结果完成、失败、取消、回退及保护隐私的诊断信息

发布检查表

  • ☐ 主要搜索问题已回答,且没有未经支持的数字。
  • ☐ 所有模型文件和运行时版本均已固定。
  • ☐ 代表性任务和失败处理策略均有说明。
  • ☐ 生命周期、取消、清理和回退均已测试。
  • ☐ 用户内容与网络边界均有说明。
  • ☐ 结论只适用于被记录的配置。
  • ☐ 新增测试结果时链接到原始方法或证据。

来源与相关证据

中文部署与排错专题见。奇连 AI 端侧专题。

常见问题

isClientSilenced 会告诉我哪个其他应用占用了麦克风吗?

不会。它只报告框架当前因并发采集策略静音了该 client 返回的音频,不识别其他应用、用途或精确优先级决策。

权限已允许且 RECORDSTATE_RECORDING 正常,就能证明没有系统静音吗?

不能。权限和 recorder 状态不同于 AudioRecordingConfiguration.isClientSilenced。API 29+ 应检查对应活动录音配置;更旧或不可读取的路径应保留未知,不从波形推断。

没有 callback 是否说明 client 未静音?

不能。callback 只报告配置变化;Android 文档要求在录音前注册,并描述事件发生在应用正在接收音频且状态改变时。可用时查询匹配配置,没有证据则标 unknown。

true flag 是否代表房间里很安静?

不代表。它表示音频框架报告并发采集策略正静音该 client。房间安静、路由不支持、缓冲格式错误、录音器失效或识别未命中都需要独立证据。