跳到主要内容

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:业务用例、设备场景或已经占用的路由与请求不匹配。

注意事项​

  1. audioRouting 可能为 nil;使用前确认 Context 已激活且 Provider 支持路由发现。
  2. 能力列表是查询时快照,蓝牙、AudioSession 或设备状态变化后应重新查询。
  3. 配置传入业务接口后会被复制并冻结,不要依赖后续修改原对象。
  4. 页面销毁或 Context 切换前注销两个监听。