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 中实现的决策逻辑。

车载音频路由策略决策流程 AudioAttributes (Usage + ContentType) AudioSource (录音场景) 当前音频 Zone 配置 RoutingStrategy 决策引擎 CarAudioService + CarVolumeGroupService 动态路由 (Dynamic) 静态路由 (Static) Zone 路由 (Zone) AudioDeviceInfo (根据上下文切换) AudioDeviceInfo (固定映射) AudioDeviceInfo (按 Zone 分配) 策略选择依据:AudioAttributes.Usage → 车载配置的 Zone 映射表 → 当前音频焦点状态 → 物理设备可用性

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 播报”的完整流程为例,展示四个核心概念如何协同工作:

  1. 唤醒阶段: AudioSource = HOTWORD → 路由到低功耗麦克风 → 触发唤醒逻辑
  2. 识别阶段: AudioSource = VOICE_RECOGNITION → 路由到主麦克风阵列 → 启用 AEC 和波束成形
  3. TTS 播报阶段: AudioAttributes = USAGE_ASSISTANT + CONTENT_TYPE_SPEECH → RoutingStrategy 根据当前 Zone 配置 → 输出到 AudioDeviceInfo(主驾头枕扬声器)
  4. 打断处理: 若导航播报正在播放,系统通过音频焦点机制暂停导航,确保语音助手 TTS 优先输出
语音助手完整音频路由链路 ① 唤醒 AudioSource=HOTWORD 低功耗麦克风 ② 语音识别 AudioSource=VOICE_RECOGNITION 麦克风阵列 + AEC ③ TTS 播报 AudioAttributes=ASSISTANT ContentType=SPEECH ④ 路由决策 RoutingStrategy Zone 匹配 路由决策结果:AudioDeviceInfo 主驾 Zone → 头枕扬声器 (bus_device_1) | 副驾 Zone → 门扬声器 (bus_device_2) 若蓝牙通话激活 → 动态路由切换到 SCO 设备 关键协同点 ① AudioSource 决定录音前处理链路 ② AudioAttributes 决定播放路由策略 ③ 两者通过 CarService 的 Zone 配置解耦
架构要点: AudioSource 和 AudioAttributes 是应用层的“意图表达”,AudioDeviceInfo 是 HAL 层的“硬件抽象”,RoutingStrategy 是 CarService 层的“策略桥梁”。四者通过 car_audio_configuration.xml 中的 Zone 映射表完成最终绑定。