Dialog语音对话 SDK 是基于豆包端到端实时语音大模型,使用设备自身的录音机与播放器,提供低延迟、双向流式语音交互能力,可用于构建语音到语音的对话工具。
Android: com.bytedance.speechengine:speechengine_tob:0.0.7
iOS: pod 'SpeechEngineToB', '0.0.7'
该版本需要自行添加TTNet 依赖,否则Android 会崩溃,iOS 会编译报错。示例如下:
Android:
implementation 'com.bytedance.boringssl.so:boringssl-so:1.3.6' implementation('org.chromium.net:cronet:4.2.210.3-tob') { exclude group: 'com.bytedance.common', module: 'wschannel' } implementation 'com.bytedance.frameworks.baselib:ttnet:4.2.210.3-tob'
iOS:
pod 'TTNetworkManager', '4.2.210.20'
source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/volcengine/volcengine-specs.git' # TTNet pod 'TTNetworkManager', '{LATEST_VERSION}' # Speech pod 'SpeechEngineToB', '{LATEST_VERSION}'
类别 | 兼容范围 |
---|---|
系统 | 最低支持 iOS 12.0 |
架构 | armv7,arm64,x86_64 |
网络 | 支持移动数据与 WiFi 两种网络环境 |
创建语音对话 SDK 引擎实例前调用,完成网络环境等相关依赖配置。APP 生命周期内仅需执行一次。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return [SpeechEngine prepareEnvironment]; }
语音对话 SDK 通过如下方式获取相关实例。
//创建实例 self.engine = [[SpeechEngine alloc] init]; //添加引擎代理,需要实现回调方法 [self.engine createEngineWithDelegate:self];
其中 APPID 、TOKEN 获取方式参考 控制台使用FAQ-Q1 ,RESOURCE ID 设置为 volc.speech.dialog
。
//【必需配置】Engine Name [self.engine setStringParam:SE_DIALOG_ENGINE forKey:SE_PARAMS_KEY_ENGINE_NAME_STRING]; //【可选配置】本地日志文件路径,SDK会在该路径文件夹下生成名为 speech_sdk.log 的日志文件,开发时设置,线上关闭。 [self.engine setStringParam:@"已存在的文件夹路径,或者空字符串" forKey:SE_PARAMS_KEY_DEBUG_PATH_STRING]; //【可选配置】日志级别,开发时设置为 TRACE(最低级别),线上设置 WARN; [self.engine setStringParam:SE_LOG_LEVEL_TRACE forKey:SE_PARAMS_KEY_LOG_LEVEL_STRING]; //【必需配置】Authentication:Appid [self.engine setStringParam:@"APPID" forKey:SE_PARAMS_KEY_APP_ID_STRING]; //【必需配置】Authentication:AppKey [self.engine setStringParam:@"APPKEY" forKey:SE_PARAMS_KEY_APP_KEY_STRING]; //【必需配置】Authentication:Token [self.engine setStringParam:@"ACCESS TOKEN" forKey:SE_PARAMS_KEY_APP_TOKEN_STRING]; //【必需配置】对话服务资源信息ResourceId [self.engine setStringParam:@"RESOURCE ID" forKey:SE_PARAMS_KEY_RESOURCE_ID_STRING]; //【必需配置】User ID(用以辅助定位线上用户问题,如无法提供可提供固定字符串) [self.engine setStringParam:@"UID" forKey:SE_PARAMS_KEY_UID_STRING]; //【必需配置】对话服务域名 [self.engine setStringParam:@"wss://openspeech.bytedance.com" forKey:SE_PARAMS_KEY_DIALOG_ADDRESS_STRING]; //【必需配置】对话服务Uri [self.engine setStringParam:@"/api/v3/realtime/dialogue" forKey:SE_PARAMS_KEY_DIALOG_URI_STRING]; //【可选配置】启用录音机音频回调,开启后录音音频数据将通过SEDialogRecorderAudio消息回调,默认不启用 [self.engine setBoolParam:FALSE forKey:SE_PARAMS_KEY_DIALOG_ENABLE_RECORDER_AUDIO_CALLBACK_BOOL]; //【可选配置】启用播放器音频回调,开启后播放音频数据将通过SEDialogPlayerAudio消息回调,默认不启用 [self.engine setBoolParam:FALSE forKey:SE_PARAMS_KEY_DIALOG_ENABLE_PLAYER_AUDIO_CALLBACK_BOOL]; //【可选配置】录音文件保存路径,如不为空字符串,则SDK会将录音机音频保存到该路径下,文件格式为 .wav [self.engine setStringParam:@"已存在的文件夹路径,或者空字符串" forKey:SE_PARAMS_KEY_DIALOG_RECORDER_PATH_STRING]; //【可选配置】播放文件保存路径,如不为空字符串,则SDK会将播放器音频保存到该路径下,文件格式为 .wav [self.engine setStringParam:@"已存在的文件夹路径,或者空字符串" forKey:SE_PARAMS_KEY_DIALOG_PLAYER_PATH_STRING];
初始化引擎对象并设置回调监听。
// 初始化引擎实例 SEEngineErrorCode ret = [self.engine initEngine]; if (ret != SENoError) { NSLog(@"初始化失败,返回值: %d", ret); return; }
语音对话 SDK 通过发送指令接口 sendDirective
触发各种操作,需要注意不建议在 SDK 的回调线程中调用该接口。
启动引擎的传参,请参考端到端实时语音大模型API接入文档中 客户端事件 -> StartSession 的参数说明。
// 注意这里先调用同步停止,避免SDK内部异步线程带来的问题 [self.engine sendDirective:SEDirectiveSyncStopEngine]; // 启动Dialog引擎 SEEngineErrorCode ret = [self.engine sendDirective:SEDirectiveStartEngine data:"{\"dialog\":{\"bot_name\":\"豆包\"}}"]; if (ret != SENoError) { NSLog(@"Send directive say hello failed: %d", ret); return; }
播报开场白的传参,请参考端到端实时语音大模型API接入文档中 客户端事件 -> SayHello 的参数说明。
SEEngineErrorCode ret = [self.engine sendDirective:SEDirectiveDialogSayHello data:@"{\"content\": \"我是你的AI助手,请问有什么可以帮你。\"}"]; if (ret != SENoError) { NSLog(@"播报开场白失败,返回值: ", ret); return; }
仅开启SEDialogWorkModeDelegateChatTtsText
模式时可用:开启SEDialogWorkModeDelegateChatTtsText
模式后,每轮TTS回复都需要选择 自定义文本回复 或 默认文本回复 ,否则将不会进行TTS播报。
自定义文本回复:播报自定义的文本内容,会替换Dialog 助手自动回复的文本。
自定义文本回复的传参,请参考端到端实时语音大模型API接入文档中 客户端事件 -> ChatTTSText 的参数说明。
// 初始化前,设置参数开启 DIALOG_WORK_MODE_DELEGATE_CHAT_TTS_TEXT 模式 [self.engine setIntParam:SEDialogWorkModeDelegateChatTtsText forKey:SE_PARAMS_KEY_DIALOG_WORK_MODE_INT]; // ... 初始化引擎实例 ... // ... 启动引擎 ... // ... 接收到 SEDialogASREnded 事件。标志用户已经说完一句话,等待回复 ... // Directive:发送ChatTtsText指令以播放自定义回复文本,可以流式不断补充文本内容。首包需要包含start:true,end:false 。 NSString* chatTtsTextJson = @"{\"start\": true, \"content\": \"这里是自定义回复内容\", \"end\": false}"; SEEngineErrorCode ret = [self.engine sendDirective:SEDirectiveDialogChatTtsText data:chatTtsTextJson]; if (ret != SENoError) { NSLog(@"自定义TTS回复失败: %d", ret); return; } // Directive:发送ChatTtsText指令以播放自定义回复文本,可以流式不断补充文本内容。尾包需要包含start:false,end:true 。 chatTtsTextJson = @"{\"start\": false, \"content\": \"\", \"end\": true}"; ret = [self.engine sendDirective:SEDirectiveDialogChatTtsText data:chatTtsTextJson]; if (ret != SENoError) { NSLog(@"自定义TTS回复失败: %d", ret); return; }
仅开启SEDialogWorkModeDelegateChatTtsText
模式时可用:开启SEDialogWorkModeDelegateChatTtsText
模式后,每轮TTS回复都需要选择 自定义文本回复 或 默认文本回复 ,否则将不会进行TTS播报。
默认文本回复:播报Dialog 助手自动回复的文本。
默认文本回复的传参,使用空字符串即可。
// 初始化前,设置参数开启 DIALOG_WORK_MODE_DELEGATE_CHAT_TTS_TEXT 模式 [self.engine setIntParam:SEDialogWorkModeDelegateChatTtsText forKey:SE_PARAMS_KEY_DIALOG_WORK_MODE_INT]; // ... 初始化引擎实例 ... // ... 启动引擎 ... // ... 接收到 SEDialogASREnded 事件。标志用户已经说完一句话,等待回复 ... // Directive:发送ChatTtsTextAuto指令以播放Dialog自身的回复文本。 SEEngineErrorCode ret = [self.engine sendDirective:SEDirectiveDialogChatTtsTextAuto data:@""]; if (ret != SENoError) { NSLog(@"自定义TTS回复失败: %d", ret); return; }
// 会等待回调函数执行完成,不可在回调线程中执行。 [self.engine sendDirective:SEDirectiveSyncStopEngine];
启动引擎后,SDK会不断回调消息。其中Dialog类回调的消息内容,请参考端到端实时语音大模型API接入文档中 服务事件 说明。
- (void)onMessageWithType:(SEMessageType)type andData:(NSData *)data { NSLog(@"Message Type: %d.", type); NSString *strData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; switch (type) { case SEEngineStart: // Callback: 引擎启动成功回调 NSLog(@"Callback: 引擎启动成功: %@", strData); break; case SEEngineStop: // Callback: 引擎关闭回调,启动引擎成功后,此消息必定发生且为最后一个回调消息 NSLog(@"Callback: 引擎关闭: %@", strData); break; case SEEngineError: // Callback: 错误信息回调 NSLog(@"Callback: 错误信息: %d, data: %@", type, strData); break; case SEDialogASRInfo: // Callback: ASR语音识别开始,用户开始说话 NSLog(@"Callback: ASR 识别开始"); break; case SEDialogASRResponse: // Callback: ASR语音识别结果回调 NSLog(@"Callback: ASR 识别结果: %@", strData); break; case SEDialogASREnded: // Callback: ASR语音识别结束,用户停止说话 NSLog(@"Callback: ASR 识别结束"); break; case SEDialogChatResponse: // Callback: Chat对话内容回调 NSLog(@"Callback: Chat 回复内容: %@", strData); break; case SEDialogChatEnded: // Callback: Chat回复结束 NSLog(@"Callback: Chat 回复结束"); break; default: break; } }
当不再需要语音对话后,建议对引擎实例进行销毁,释放内存资源。
// 内部会执行SYNC_STOP,不可在回调线程中执行。 [self.engine destroyEngine]; self.engine = nil;
pod install --repo-update
:其中 APPID 、APPKEY、TOKEN 获取方式参考 控制台使用FAQ-Q1
RESOURCE ID 设置为 volc.speech.dialog
。