3、音频路由核心概念:音频源(AudioSource)、音频流类型(AudioAttributes)、音频设备(AudioDeviceInfo)、路由策略(RoutingStrategy)
在车载语音助手与 CarService 的音频路由协同中,理解四个核心概念是掌握路由逻辑的基础。它们共同构成了 Android 音频框架从“谁在发声”到“从哪播放”的完整决策链路。
核心关系速览: AudioSource 定义录音起点 → AudioAttributes 描述播放/录音的用途与行为 → AudioDeviceInfo 枚举可用硬件 → RoutingStrategy 决定最终路由路径。
3.1 音频源(AudioSource)—— 录音的起点
AudioSource 是 MediaRecorder 或 AudioRecord 在开始捕获音频时指定的枚举值,它告诉音频框架“这段音频来自哪个场景”。在车载环境中,不同的 AudioSource 直接影响麦克风阵列的选择和前处理算法(如回声消除、波束成形)。
| AudioSource 常量 | 值 | 车载典型用途 | 麦克风策略 |
|---|---|---|---|
MEDIA_RECORDER_SOURCE_DEFAULT |
0 | 通用录音(如 OTA 升级日志) | 主麦克风 |
MEDIA_RECORDER_SOURCE_MIC |
1 | 免提通话上行 | 主麦克风 + 降噪 |
MEDIA_RECORDER_SOURCE_VOICE_UPLINK |
2 | 通话上行专用 | 主麦克风 |
MEDIA_RECORDER_SOURCE_VOICE_DOWNLINK |
3 | 通话下行(远端语音) | 不涉及本地麦克风 |
MEDIA_RECORDER_SOURCE_VOICE_CALL |
4 | 完整通话双工 | 主麦克风 + 扬声器 |
MEDIA_RECORDER_SOURCE_CAMCORDER |
5 | DVR 录像音频 | 定向麦克风 |
MEDIA_RECORDER_SOURCE_VOICE_RECOGNITION |
6 | 语音助手唤醒/识别 | 多麦克风阵列 + AEC |
MEDIA_RECORDER_SOURCE_HOTWORD |
1999 | 低功耗唤醒词检测 | 专用低功耗麦克风 |
车载最佳实践: 语音助手应始终使用
VOICE_RECOGNITION 作为 AudioSource,以触发车载 DSP 的波束成形和回声消除。唤醒词检测则使用 HOTWORD 以降低功耗。
3.2 音频流类型(AudioAttributes)—— 播放的用途标签
AudioAttributes 是 Android 5.0 引入的替代方案,用于取代旧的 AudioStreamType。它通过 Usage 和 ContentType 两个维度描述音频流的用途和内容性质,是路由策略决策的关键输入。
// 语音助手 TTS 播放的典型 AudioAttributes 构建
AudioAttributes ttsAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANT) // 用途:语音助手
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) // 内容类型:语音
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) // 强制可听(绕过静音模式)
.build();
// 导航提示音的 AudioAttributes
AudioAttributes navAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build();
| Usage 常量 | 车载场景 | 路由倾向 |
|---|---|---|
USAGE_MEDIA |
音乐、视频 | 主扬声器 |
USAGE_VOICE_COMMUNICATION |
蓝牙电话 | 车载免提 |
USAGE_ASSISTANT |
语音助手 TTS | 主驾头枕扬声器 / 全车 |
USAGE_ALARM |
安全告警 | 高优先级、独立通道 |
USAGE_NOTIFICATION |
系统通知 | 按 zone 路由 |
USAGE_ASSISTANCE_NAVIGATION_GUIDANCE |
导航播报 | 主驾区域 |
3.3 音频设备(AudioDeviceInfo)—— 硬件抽象层
AudioDeviceInfo 是 Android 对物理音频设备的抽象描述,包含设备类型、地址、采样率、通道掩码等信息。在车载系统中,设备类型决定了路由的物理终点。
// 枚举所有音频输出设备
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
for (AudioDeviceInfo device : devices) {
Log.d("CarAudio", "设备: " + device.getProductName()
+ " 类型: " + device.getType()
+ " 地址: " + device.getAddress()
+ " 是否内置: " + device.isSink());
}
| 设备类型常量 | 值 | 车载硬件对应 |
|---|---|---|
TYPE_BUILTIN_SPEAKER |
2 | 车载主扬声器 |
TYPE_BLUETOOTH_A2DP |
8 | 蓝牙音乐 |
TYPE_BLUETOOTH_SCO |
7 | 蓝牙通话 |
TYPE_USB_DEVICE |
11 | USB 音频设备 |
TYPE_BUS |
23 | 车载内部总线(如 MOST、A2B) |
TYPE_HDMI |
9 | 后排娱乐 HDMI |
TYPE_DOCK |
13 | 扩展底座 |
注意: 在 CarService 中,AudioDeviceInfo 的
getAddress() 方法返回的字符串(如 "bus_device_1")是车载路由策略匹配设备的关键标识,而非产品名称。
3.4 路由策略(RoutingStrategy)—— 决策引擎
RoutingStrategy 是 CarService 中定义的一组规则,用于将 AudioAttributes 映射到具体的 AudioDeviceInfo。它不是一个单一的 Java 类,而是一套在 CarAudioService 和 CarVolumeGroupService 中实现的决策逻辑。
3.5 四种路由策略详解
| 策略类型 | 决策方式 | 配置位置 | 车载典型场景 |
|---|---|---|---|
| 动态路由 | 根据当前音频焦点、设备连接状态动态切换 | car_audio_configuration.xml 中的 <dynamicRouting> |
语音助手 TTS:有蓝牙通话时路由到 SCO,无通话时路由到扬声器 |
| 静态路由 | 固定映射到指定设备,不随上下文变化 | car_audio_configuration.xml 中的 <staticRouting> |
安全告警音始终路由到独立告警扬声器 |
| Zone 路由 | 按音频 Zone(主驾、副驾、后排)分配设备 | car_audio_configuration.xml 中的 <zoneRouting> |
导航播报仅路由到主驾头枕扬声器 |
| 默认路由 | 回退到 Android 原生 AudioPolicy 决策 | 系统默认 | 未在车载配置中显式定义的音频流 |
3.6 语音助手路由实战:从 AudioSource 到 AudioDevice
以语音助手“唤醒 → 识别 → TTS 播报”的完整流程为例,展示四个核心概念如何协同工作:
- 唤醒阶段: AudioSource =
HOTWORD→ 路由到低功耗麦克风 → 触发唤醒逻辑 - 识别阶段: AudioSource =
VOICE_RECOGNITION→ 路由到主麦克风阵列 → 启用 AEC 和波束成形 - TTS 播报阶段: AudioAttributes =
USAGE_ASSISTANT+CONTENT_TYPE_SPEECH→ RoutingStrategy 根据当前 Zone 配置 → 输出到 AudioDeviceInfo(主驾头枕扬声器) - 打断处理: 若导航播报正在播放,系统通过音频焦点机制暂停导航,确保语音助手 TTS 优先输出
架构要点: AudioSource 和 AudioAttributes 是应用层的“意图表达”,AudioDeviceInfo 是 HAL 层的“硬件抽象”,RoutingStrategy 是 CarService 层的“策略桥梁”。四者通过
car_audio_configuration.xml 中的 Zone 映射表完成最终绑定。