AI 同声传译(TSAIInterpreterInterface)
同声传译通过设备麦克风建立 ASR → 翻译 → 可选 TTS 的长会话管线。协议层提供单向翻译;需要双向对话时,App 应停止当前会话并交换语言后重新启动。
前提条件
TSAIContext *context = [TSAIKit sharedInstance].activeContext;
if (![context supportsAIFeatures:TSAIFeatureInterpretation]) {
return;
}
id<TSAIInterpreterInterface> interpreter = context.interpreter;
设备必须已连接并允许使用麦克风音频,App 还需完成录音权限授权。
TSAIInterpreterConfig
| 属性 | 类型 | 说明 |
|---|---|---|
audioRouteConfiguration | TSAIAudioRouteConfiguration * | 本次会话的完整音频路由;显式值优先于旧版播放字段 |
sourceLanguage | TSAILanguage | 源语言,可使用 TSAILanguageAuto |
targetLanguage | TSAILanguage | 目标语言,必须是具体语言 |
enableVoiceOutput | BOOL | 是否生成译文 TTS 音频 |
autoPlayVoice | BOOL | 是否由 SDK 播放译文音频 |
preferSpeakerOutput | BOOL | SDK 播放时是否优先手机扬声器 |
speakerId | NSString * | TTS 发音人标识 |
defaultConfig 默认开启语音输出、自动播放和扬声器优先。调用前必须设置源语言和目标语言。
内容、事件与报告
| 模型 | 主要属性 | 说明 |
|---|---|---|
TSAIInterpreterContent | contentType、utteranceIndex、language | 流式内容类型和语句序号 |
TSAIInterpreterContent | text、isTextFinal | 原文或译文累积文本 |
TSAIInterpreterContent | audioChunk、audioFormat、isAudioFinal | 译文 TTS 增量音频 |
TSAIInterpreterEvent | eventType、timestamp、detectedLanguage | VAD、播放、语言检测和错误事件 |
TSAIInterpreterUtterance | index、startTime、originalText、translatedText、源/目标语言 | 一条稳定语句记录 |
TSAIInterpreterReport | 配置回显、startTime、endTime、duration、endReason、rawAudioFilePath、utterances | 可直接持久化的完整会话档案 |
TSAIInterpreterContentType
| 枚举值 | 内容语义 |
|---|---|
TSAIInterpreterContentTypeOriginalText | ASR 原文,text 为累积值 |
TSAIInterpreterContentTypeTranslatedText | 翻译文本,text 为累积值 |
TSAIInterpreterContentTypeAudioChunk | TTS 音频,audioChunk 为增量值 |
同一个 utteranceIndex 的原文、译文和音频属于同一句话。
事件、状态与结束原因
TSAIInterpreterEventType | 数值 | 说明 |
|---|---|---|
Unknown | -1 | 未知事件 |
SessionStarted | 1 | 会话已启动 |
UtteranceStarted / UtteranceEnded | 2 / 3 | 语句开始/结束 |
LanguageDetected | 4 | 已检测源语言 |
TranslationPlaybackStarted / TranslationPlaybackEnded | 5 / 6 | 译文音频开始/结束播放 |
NetworkError | 7 | 网络异常 |
BleDisconnected | 8 | BLE 设备断连 |
| 枚举 | 枚举值与数值 |
|---|---|
TSAIInterpreterState | Idle = 0、Started = 1、Processing = 2、Ended = 3、Failure = 255 |
TSAIInterpreterEndReason | Unknown = -1、UserStop = 1、Interrupted = 2、Error = 3 |
表格中的短名称应加上对应枚举前缀,例如 TSAIInterpreterEventTypeSessionStarted。
启动会话
- (NSString *)startInterpretationWithConfig:(TSAIInterpreterConfig *)config
onContent:(nullable TSAIInterpreterContentBlock)onContent
onEvent:(nullable TSAIInterpreterEventBlock)onEvent
completion:(nullable TSAIInterpreterCompletionBlock)completion;
TSAIInterpreterConfig *config = [TSAIInterpreterConfig defaultConfig];
config.sourceLanguage = TSAILanguageChineseSimplified;
config.targetLanguage = TSAILanguageEnglishUS;
config.enableVoiceOutput = YES;
config.autoPlayVoice = YES;
NSString *taskId = [interpreter startInterpretationWithConfig:config
onContent:^(TSAIInterpreterContent *content) {
switch (content.contentType) {
case TSAIInterpreterContentTypeOriginalText:
TSLog(@"原文: %@", content.text);
break;
case TSAIInterpreterContentTypeTranslatedText:
TSLog(@"译文: %@", content.text);
break;
default:
break;
}
}
onEvent:^(TSAIInterpreterEvent *event) {
TSLog(@"同传事件: %ld", (long)event.eventType);
}
completion:^(TSAIInterpreterReport *report, NSError *error) {
if (error) {
TSLog(@"同传失败: %@", error.localizedDescription);
return;
}
TSLog(@"同传结束,共 %lu 句", (unsigned long)report.utterances.count);
}];
当 autoPlayVoice 为 YES 时,SDK 已负责音频播放,App 不得再次播放 AudioChunk;设为 NO 时,App 才需要自行缓存并播放增量音频。
停止与状态监听
- (void)stopInterpretationWithTaskId:(NSString *)taskId;
- (void)registerAIInterpreterStateDidChanged:(nullable TSAIInterpreterStateBlock)stateBlock;
[interpreter registerAIInterpreterStateDidChanged:^(TSAIInterpreterState state) {
TSLog(@"同传状态: %ld", (long)state);
}];
// 用户结束会话
[interpreter stopInterpretationWithTaskId:taskId];
同传只提供 stop,不提供 cancel。停止会关闭麦克风流、冲刷最后一段缓冲音频,并通过原 completion 返回最终报告。设备 PCM 播放会等待 DeviceBridge 的真实终态;Bridge 无响应时以超时错误结束。播放链路收尾失败时可能同时返回有效 Report 和 error,此时仍可保存 Report。
设备发起语音翻译
TSAIDeviceVoiceTranslationConfig *config =
[TSAIDeviceVoiceTranslationConfig defaultConfig];
config.audioRouteConfiguration = [TSAIAudioRouteConfiguration defaultConfiguration];
config.fallbackSourceLanguage = TSAILanguageChineseSimplified;
config.fallbackTargetLanguage = TSAILanguageEnglishUS;
NSString *taskId = [interpreter startDeviceVoiceTranslationWithConfig:config
completion:^(BOOL success, NSError *error) {
if (!success) {
TSLog(@"设备语音翻译配置失败: %@", error.localizedDescription);
}
}];
// [interpreter stopDeviceVoiceTranslationWithTaskId:taskId];
兜底语言只在设备语音包未携带语种时生效;Unknown 表示禁用对应兜底。
注意事项
- 会话中不能修改语言;需要切换时停止后重建配置。
sourceLanguage可以为Auto,targetLanguage必须为具体语言。completion返回的 Report 包含全部稳定 utterance,可直接用于翻译历史。- 页面退出时注销状态监听,并停止仍在运行的会话。
- App 自行播放译文时不保证具备 SDK 托管播放链路的 AEC 效果。