AI 音频路由
TSAIContext.audioRouting 提供只读的路由发现、活动路由快照和变化监听。实际路由通过各业务配置的 audioRouteConfiguration 请求,由 AIKit 解析并管理生命周期。
路由配置
TSAIAudioRouteConfiguration *route =
[TSAIAudioRouteConfiguration configurationWithInputChannel:TSAIAudioInputChannelBuiltInMic
outputChannel:TSAIAudioOutputChannelBuiltInSpeaker
routeUnavailablePolicy:TSAIAudioRouteUnavailablePolicyFail];
TSAIInterpreterConfig *config = [TSAIInterpreterConfig defaultConfig];
config.audioRouteConfiguration = route;
defaultConfiguration 创建 Automatic / Automatic / UseAutomaticRoute,与未设置路由的兼容行为相同。路由是完整的输入输出组合;不能在显式组合不可用时只替换其中一侧。
TSAIAudioInputChannel | 说明 |
|---|---|
TSAIAudioInputChannelUnknown | 未知通道,不可用于启动 |
TSAIAudioInputChannelAutomatic | 由 AIKit 解析 |
TSAIAudioInputChannelBuiltInMic | 手机内置麦克风 PCM |
TSAIAudioInputChannelSCO | 蓝牙 HFP/SCO 麦克风 |
TSAIAudioInputChannelOpus | 设备 Opus 数据解码后的 PCM |
TSAIAudioOutputChannel | 说明 |
|---|---|
TSAIAudioOutputChannelUnknown | 未知通道,不可用于启动 |
TSAIAudioOutputChannelNone | 不合成且不播放音频 |
TSAIAudioOutputChannelAutomatic | 由 AIKit 解析 |
TSAIAudioOutputChannelBuiltInSpeaker | 手机内置扬声器 |
TSAIAudioOutputChannelSCO | 蓝牙 HFP/SCO 输出 |
TSAIAudioOutputChannelA2DP | 蓝牙 A2DP 输出 |
TSAIAudioOutputChannelOpus | 通过设备数据通道发送 PCM |
TSAIAudioRouteUnavailablePolicyFail 要求原组合完整可用,否则失败;TSAIAudioRouteUnavailablePolicyUseAutomaticRoute 允许 AIKit 重新选择另一条完整路由。
查询支持的完整路由
id<TSAIAudioRoutingInterface> routing = context.audioRouting;
NSArray<TSAIAudioRouteCapability *> *routes =
[routing audioRouteCapabilitiesForFeature:TSAIFeatureInterpretation];
for (TSAIAudioRouteCapability *route in routes) {
TSLog(@"input=%ld output=%ld available=%@",
(long)route.inputChannel,
(long)route.outputChannel,
route.isAvailable ? @"YES" : @"NO");
}
- (NSArray<TSAIAudioRouteCapability *> *)audioRouteCapabilitiesForFeature:
(TSAIFeatureOptions)feature;
必须传一个功能位。返回顺序稳定,每个能力对象包含 inputChannel、outputChannel、supportedFeatures、isAvailable、supportsFullDuplex、echoCancellationMode 和可选的 unavailableReason。
TSAIAudioEchoCancellationMode 的值为 TSAIAudioEchoCancellationModeUnknown、TSAIAudioEchoCancellationModeNone、TSAIAudioEchoCancellationModeSystem 和 TSAIAudioEchoCancellationModeDevice。
查询活动路由
TSAIAudioRouteSnapshot *snapshot =
[routing activeAudioRouteForFeature:TSAIFeatureInterpretation];
- (nullable TSAIAudioRouteSnapshot *)activeAudioRouteForFeature:
(TSAIFeatureOptions)feature;
空闲时返回 nil。快照包含 feature、requestedRoute、effectiveRoute 和 state,可用于展示“请求路由”和“实际路由”的差异。
TSAIAudioRouteState | 说明 |
|---|---|
TSAIAudioRouteStateUnknown | 未知 |
TSAIAudioRouteStateResolving | 正在解析 |
TSAIAudioRouteStateActivating | 正在激活 |
TSAIAudioRouteStateActive | 已激活 |
TSAIAudioRouteStateStopping | 正在停止 |
TSAIAudioRouteStateInterrupted | 已中断 |
TSAIAudioRouteStateFailed | 激活或运行失败 |
监听变化
[routing registerAudioRouteCapabilitiesDidChange:^(TSAIFeatureOptions features) {
TSLog(@"音频路由能力已变化: %lu", (unsigned long)features);
}];
[routing registerActiveAudioRouteDidChange:^(TSAIAudioRouteSnapshot *snapshot) {
TSLog(@"实际输出通道: %ld", (long)snapshot.effectiveRoute.outputChannel);
}];
- (void)registerAudioRouteCapabilitiesDidChange:
(nullable TSAIAudioRouteCapabilitiesDidChangeBlock)block;
- (void)registerActiveAudioRouteDidChange:
(nullable TSAIAudioRouteDidChangeBlock)block;
两个监听均在主线程回调,传 nil 注销。
模型构造方法
Provider 或平台桥实现层可使用 capabilityWithInputChannel:outputChannel:supportedFeatures:isAvailable:supportsFullDuplex:echoCancellationMode:unavailableReason: 创建 TSAIAudioRouteCapability,使用 snapshotWithFeature:requestedRoute:effectiveRoute:state: 创建 TSAIAudioRouteSnapshot。App 通常只读取 Context 返回的对象。
错误处理
TSAIErrorCodeAudioRouteUnavailable:没有满足请求或自动回退条件的完整路由。TSAIErrorCodeAudioRouteMismatch:业务用例、设备场景或已经占用的路由与请求不匹配。
注意事项
audioRouting可能为nil;使用前确认 Context 已激活且 Provider 支持路由发现。- 能力列表是查询时快照,蓝牙、AudioSession 或设备状态变化后应重新查询。
- 配置传入业务接口后会被复制并冻结,不要依赖后续修改原对象。
- 页面销毁或 Context 切换前注销两个监听。