AI 录音(TSAudioRecordInterface)
录音接口同时提供普通设备录音和 AI 录音。AI 录音可由 App 主动启动,也可响应设备主动请求,并通过统一模型返回实时转写、会话事件、运行时错误和最终报告。
获取接口与功能判断
TSAIContext *context = [TSAIKit sharedInstance].activeContext;
id<TSAudioRecordInterface> audioRecord = context.audioRecord;
| 场景 | 功能位 |
|---|---|
| 普通录音 | TSAIFeatureNormalAudioRecording |
| 现场 AI 录音 | TSAIFeatureAIAudioRecording |
| 通话 AI 录音 | TSAIFeatureCallAudioRecording |
数据模型
TSAIAudioRecordConfig
| 属性 | 类型 | 说明 |
|---|---|---|
audioRouteConfiguration | TSAIAudioRouteConfiguration * | 输入路由;输出必须为 None,nil 表示自动选路 |
recordingScene | TSAIAudioRecordScene | OnSite 现场录音或 Call 通话录音 |
language | TSAILanguage | 输入语言;Unknown 表示使用当前 App 语言 |
allowRecordingWhileOffline | BOOL | 是否允许离线开始并稍后同步 |
enableSpeakerDiarization | BOOL | 是否启用说话人分离 |
defaultConfig 默认使用现场录音、当前 App 语言,并关闭离线录音和说话人分离。
TSAIAudioRecordSessionResult
type | 有效字段 | 说明 |
|---|---|---|
Transcript | text、sentenceIndex、isSentenceFinal、speakerSegments | 实时转写结果 |
Event | eventType、timestamp、evidence、details | 会话事件 |
Error | error | 会话运行时错误 |
Finish | transcripts、sessionEvents、rawAudioFilePath | 会话最终报告 |
最终报告还包含 isStoppedByInterruption、isOfflineRecording 和 hadNetworkDisconnection。
转写结果还可读取 languageCode、sequence、requestId;事件结果可读取 timeSinceSessionStart。TSAIAudioRecordSpeakerSegment 包含 speakerId、startTimeMilliseconds、endTimeMilliseconds、associatedTranscriptSequence 和 text。
普通录音
最大录音时长
- (void)setNormalAudioRecordingMaximumDuration:(NSUInteger)maximumDuration
completion:(TSAICompletionBlock)completion;
- (void)getNormalAudioRecordingMaximumDuration:(nullable TSAudioRecordMaximumDurationResultBlock)completion;
最大时长单位为分钟,有效范围为 1~240。
开始和停止
- (void)startNormalAudioRecording:(TSAICompletionBlock)startCompletion
finishHandler:(nullable TSAudioRecordFinishHandler)finishHandler;
- (void)stopNormalAudioRecording:(TSAICompletionBlock)completion;
[audioRecord startNormalAudioRecording:^(BOOL success, NSError *error) {
if (!success) {
TSLog(@"普通录音启动失败: %@", error.localizedDescription);
}
} finishHandler:^(TSAudioRecordStopReason reason, NSError *error) {
TSLog(@"普通录音结束,原因: %lu", (unsigned long)reason);
}];
AI 录音
- (void)startAIAudioRecordingWithConfig:(nullable TSAIAudioRecordConfig *)config
startCompletion:(TSAICompletionBlock)startCompletion
didReceiveAudioData:(nullable TSAudioRecordDataReceivedBlock)didReceiveAudioData
didReceiveSessionResult:(nullable TSAIAudioRecordSessionResultHandler)didReceiveSessionResult
finishHandler:(nullable TSAudioRecordFinishHandler)finishHandler;
- (void)stopAIAudioRecording:(TSAICompletionBlock)completion;
TSAIAudioRecordConfig *config = [TSAIAudioRecordConfig defaultConfig];
config.language = TSAILanguageChineseSimplified;
config.enableSpeakerDiarization = YES;
[audioRecord startAIAudioRecordingWithConfig:config
startCompletion:^(BOOL success, NSError *error) {
if (!success) {
TSLog(@"AI 录音启动失败: %@", error.localizedDescription);
}
}
didReceiveAudioData:^(NSData *audioData) {
// 实时解码音频数据,避免在此执行阻塞 I/O
}
didReceiveSessionResult:^(TSAIAudioRecordSessionResult *result) {
if (result.type == TSAIAudioRecordSessionResultTypeTranscript) {
TSLog(@"实时转写: %@", result.text);
} else if (result.type == TSAIAudioRecordSessionResultTypeFinish) {
TSLog(@"AI 会话完成: %@", result.transcripts);
}
}
finishHandler:^(TSAudioRecordStopReason reason, NSError *error) {
TSLog(@"底层音频流结束: %lu", (unsigned long)reason);
}];
finishHandler 只表示底层音频流结束,不表示 ASR 或 AI 会话完成。AI 语义终态必须以 didReceiveSessionResult 的 Finish 结果为准。
设备主动录音
- (void)registerOnRequestStartAIAudioRecording:(nullable TSAIAudioRecordRequestStartBlock)block;
- (void)registerOnRequestStopAIAudioRecording:(nullable dispatch_block_t)block;
- (void)registerAIAudioRecordingDidInterrupt:(nullable TSAIAudioRecordInterruptBlock)block;
- (void)registerOnAIAudioRecordingVoiceDataReceived:(nullable TSAudioRecordVoiceDataReceivedBlock)block;
- (void)registerAIAudioRecordingStateDidChanged:(nullable TSAIAudioRecordStateBlock)block;
[audioRecord registerOnRequestStartAIAudioRecording:^(TSAIAudioRecordScene scene) {
TSAIAudioRecordConfig *config = [TSAIAudioRecordConfig defaultConfig];
config.recordingScene = scene;
// 请求已通过 AIKit 资格校验;准备本地录音,但此时不要打开页面。
}];
[audioRecord registerOnRequestStopAIAudioRecording:^{
[audioRecord stopAIAudioRecording:^(BOOL success, NSError *error) {
TSLog(@"响应设备停止录音: %@", success ? @"成功" : error.localizedDescription);
}];
}];
开始请求回调只会在精确启动资格通过后触发。调用 startAIAudioRecordingWithConfig:... 完成本地准备,并且仅在 startCompletion 成功、App 与设备均激活后打开录音页面。
设备请求处理完成后,可回报设备侧状态:
- (void)reportAIAudioRecordingStartSuccessWithScene:(TSAIAudioRecordScene)scene
completion:(nullable TSAICompletionBlock)completion;
- (void)reportAIAudioRecordingStoppedWithCompletion:(nullable TSAICompletionBlock)completion;
不要在未真正启动或停止录音时提前回报成功。
关键枚举
TSAIAudioRecordScene
| 枚举值 | 说明 |
|---|---|
TSAIAudioRecordSceneUnknown | 未知场景 |
TSAIAudioRecordSceneOnSite | 现场录音 |
TSAIAudioRecordSceneCall | 通话录音 |
TSAIAudioRecordState
| 枚举值 | 说明 |
|---|---|
TSAIAudioRecordStateIdle | 空闲 |
TSAIAudioRecordStateStarting | 启动中 |
TSAIAudioRecordStateRecording | 录音中 |
TSAIAudioRecordStateStopping | 停止中 |
TSAIAudioRecordStateInterrupted | 已中断 |
TSAIAudioRecordStateUnknown | 未知状态 |
TSAIAudioRecordInterruptReason
| 枚举值 | 说明 |
|---|---|
TSAIAudioRecordInterruptReasonLowBattery | 设备低电量 |
TSAIAudioRecordInterruptReasonIncomingCall | 来电中断 |
TSAIAudioRecordInterruptReasonOther | 其他中断 |
TSAIAudioRecordInterruptReasonUnknown | 未知原因 |
结束原因与会话结果类型
| 枚举 | 枚举值与数值 |
|---|---|
TSAudioRecordStopReason | Unknown = 0、UserInitiated = 1、MaxDurationReached = 2、DeviceError = 3、StorageFull = 4、Disconnected = 5、Interrupted = 6 |
TSAIAudioRecordSessionResultType | Transcript = 0、Event = 1、Error = 2、Finish = 3 |
表格中的短名称应加上对应枚举前缀,例如 TSAudioRecordStopReasonUserInitiated。
注意事项
- 录音涉及隐私,必须在开始前取得用户授权并展示明确状态。
TSAILanguageAuto不适用于录音输入语言。- 实时音频、转写和事件回调频率较高,不要在回调线程执行耗时操作。
- 页面退出时注销所有设备请求、语音数据、中断和状态监听。
- 网络离线时只有 Provider 确实支持离线录音且配置允许,任务才能继续。