直接回答
录音器仍处于活动状态,并不能证明音频框架正在把麦克风声音送给该 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。
发布结论只对所记录的配置和验收集有效;扩大适用范围需要更多记录。
实施流程
- 记录获准的采集状态. 记录用户开始操作、RECORD_AUDIO 授权、recorder/session、录音状态、可获得的路由和声明格式。将已知安静夹具和经同意的语音夹具分开;默认不保存私人音频。
- 固定 API 级别和信号可用性. 仅在 API 29+ 使用 AudioRecordingConfiguration.isClientSilenced。录音开始前调用 AudioRecord.registerAudioRecordingCallback。不要把 API 24 的 manager callback 类型或权限/read 状态替代成 per-Record 静音状态。
- 读取并关联配置. 启动后,在准确 API 能提供对应录音器配置时读取当前快照,并处理 silenced/unsilenced、路由或格式回调。每条更新关联到活动 AudioRecord session;没有快照或回调证据时标 unknown,而不是 false。
- 将静音和其他失败分类. true 表示 concurrent-capture policy 静音。false 并不证明有人说话。分别记录路由/格式变化、ERROR_DEAD_OBJECT、权限丢失、empty read、真实声学安静和识别无转录。
- 只在平台规则内复现. 用可见且经同意的测试应用和常规音频 API。需要并发采集时,让第二个获准测试应用正常参与,不绕过系统策略。记录状态变更,不假设所有 API 29 设备都发出相同回调序列。
- 展示有边界的用户恢复. 若当前 client 确认被系统静音,把策略静音标为最早已知边界,并提供产品支持的等待、停止或重试操作。不要声称用户听不清,也不要在 recorder 仍有效时自动重建。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 记录 API 级别,仅在支持时读取 isClientSilenced;缺少快照/回调时保持 unknown,不反推未静音。
- 每条 callback/configuration 都关联活动 AudioRecord session,并把静音、路由/格式变化、dead object、权限、read 结果和识别结果分成不同状态。
- 测试使用可见、获同意且遵守平台规则的采集夹具;不绕过 Android 优先级,也不记录其他应用身份或私人音频。
- 产品文案只在 API 明确报告时描述 framework silenced;不从权限/录音指示灯推断声学安静、人声可懂、Cove 行为或设备可靠性。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 并发策略静音 client | AudioRecordingConfiguration.isClientSilenced() 为 true | 框架报告返回给该 client 的音频正被静音;不会命名竞争应用,也不证明硬件损坏。 |
| 环境安静或无人说话 | flag 为 false/不可用且观察到安静输入 | 低振幅不是系统仲裁证据;还应独立评估采集路由和信号。 |
| 路由或格式改变 | 录音配置或设备回调报告输入路径改变 | 说明采集配置有变化;没有对应 flag 不要标成策略静音。 |
| 录音器失效或识别失败 | AudioRecord 错误或后续转录阶段结果 | 实例有效性和识别输出不同于一个活动 client 被系统策略静音。 |
需要避免的失败模式
- 把麦克风权限已允许、RECORDSTATE_RECORDING 或 read 有字节当作未被系统静音。
- 把安静房间、输入路由改变、DEAD_OBJECT 和 framework concurrent-capture policy 混成同一失败。
- 根据静音 flag 推断是哪一个应用抢占麦克风或用户说话不清楚。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Cove Voice 转写流程
- Android AudioRecordingConfiguration API:isClientSilenced 与 API 级别
- Android AudioRecord API:录音回调注册与生命周期
- Android AudioManager.AudioRecordingCallback API:API 24 observer
- Android audio input sharing:并发采集与系统静音策略
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
isClientSilenced 会告诉我哪个其他应用占用了麦克风吗?
不会。它只报告框架当前因并发采集策略静音了该 client 返回的音频,不识别其他应用、用途或精确优先级决策。
权限已允许且 RECORDSTATE_RECORDING 正常,就能证明没有系统静音吗?
不能。权限和 recorder 状态不同于 AudioRecordingConfiguration.isClientSilenced。API 29+ 应检查对应活动录音配置;更旧或不可读取的路径应保留未知,不从波形推断。
没有 callback 是否说明 client 未静音?
不能。callback 只报告配置变化;Android 文档要求在录音前注册,并描述事件发生在应用正在接收音频且状态改变时。可用时查询匹配配置,没有证据则标 unknown。
true flag 是否代表房间里很安静?
不代表。它表示音频框架报告并发采集策略正静音该 client。房间安静、路由不支持、缓冲格式错误、录音器失效或识别未命中都需要独立证据。