跳到主要内容

AI 录音(TSAudioRecordInterface)

录音接口同时提供普通设备录音和 AI 录音。AI 录音可由 App 主动启动,也可响应设备主动请求,并通过统一模型返回实时转写、会话事件、运行时错误和最终报告。

获取接口与功能判断​

TSAIContext *context = [TSAIKit sharedInstance].activeContext;
id<TSAudioRecordInterface> audioRecord = context.audioRecord;
场景功能位
普通录音TSAIFeatureNormalAudioRecording
现场 AI 录音TSAIFeatureAIAudioRecording
通话 AI 录音TSAIFeatureCallAudioRecording

数据模型​

TSAIAudioRecordConfig​

属性类型说明
audioRouteConfigurationTSAIAudioRouteConfiguration *输入路由;输出必须为 None,nil 表示自动选路
recordingSceneTSAIAudioRecordSceneOnSite 现场录音或 Call 通话录音
languageTSAILanguage输入语言;Unknown 表示使用当前 App 语言
allowRecordingWhileOfflineBOOL是否允许离线开始并稍后同步
enableSpeakerDiarizationBOOL是否启用说话人分离

defaultConfig 默认使用现场录音、当前 App 语言,并关闭离线录音和说话人分离。

TSAIAudioRecordSessionResult​

type有效字段说明
Transcripttext、sentenceIndex、isSentenceFinal、speakerSegments实时转写结果
EventeventType、timestamp、evidence、details会话事件
Errorerror会话运行时错误
Finishtranscripts、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未知原因

结束原因与会话结果类型​

枚举枚举值与数值
TSAudioRecordStopReasonUnknown = 0、UserInitiated = 1、MaxDurationReached = 2、DeviceError = 3、StorageFull = 4、Disconnected = 5、Interrupted = 6
TSAIAudioRecordSessionResultTypeTranscript = 0、Event = 1、Error = 2、Finish = 3

表格中的短名称应加上对应枚举前缀,例如 TSAudioRecordStopReasonUserInitiated。

注意事项​

  1. 录音涉及隐私,必须在开始前取得用户授权并展示明确状态。
  2. TSAILanguageAuto 不适用于录音输入语言。
  3. 实时音频、转写和事件回调频率较高,不要在回调线程执行耗时操作。
  4. 页面退出时注销所有设备请求、语音数据、中断和状态监听。
  5. 网络离线时只有 Provider 确实支持离线录音且配置允许,任务才能继续。