You need to enable JavaScript to run this app.
文档中心
豆包语音

豆包语音

复制全文
下载 pdf
语音合成大模型
双向流式语音合成(Android)
复制全文
下载 pdf
双向流式语音合成(Android)
基于 WebSocket 的双向流式 TTS 接口,支持文本流式输入、音频流式输出,低时延,适用于实时交互场景,覆盖多语种与多方言,以下为面向开发者的Android SDK接入说明。​
SDK版本​
Android: com.bytedance.speechengine:speechengine_tob: 0.0.15.0​
​
// Speech Engine​
implementation 'com.bytedance.speechengine:speechengine_tob:0.0.15.0'​
// Net okhttp:4.9.1为默认依赖的网络库版本,若有其它版本需要,可引用相应okhttp版本​
implementation("com.squareup.okhttp3:okhttp:4.9.1")​
​
示例demo​
主要参考BiTtsActivity​
​
​
SpeechDemoAndroid.zip
​
​
兼容性 ​
​
类别​
兼容范围​
系统​
最低支持Android 4.4 以上版本,API LEVEL 19​
架构​
armeabi-v7a,arm64-v8a​
网络​
支持移动数据与 WiFi 两种网络环境​
​
AndroidManifest.xml 文件 ​
​
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />​
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />​
<uses-permission android:name="android.permission.RECORD_AUDIO" />​
<uses-permission android:name="android.permission.INTERNET" />​
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />​
​
混淆规则 ​
​
-keep class com.bytedance.speech.speechengine.SpeechEngineImpl {*;}​
​
调用流程​
初始化环境依赖 ​
创建语音对话 SDK 引擎实例前调用,完成网络环境等相关依赖配置。APP 生命周期内仅需执行一次。​
​
SpeechEngineGenerator.PrepareEnvironment(getApplicationContext(), getApplication());​
​
创建引擎实例 ​
​
SpeechEngine engine = SpeechEngineGenerator.getInstance();​
engine.createEngine();​
​
参数配置 ​
必需配置​
​
//【必需配置】Engine Name​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_ENGINE_NAME_STRING,SpeechEngineDefines.BITTS_ENGINE);​
//【可选配置】本地日志文件路径,SDK会在该路径文件夹下生成名为 speech_sdk.log 的日志文件,开发时设置,线上关闭。​
engine.setOptionString(SpeechEngineDefines.PARAMS_KEY_DEBUG_PATH_STRING, "已存在的文件夹路径,或者空字符串");​
//【可选配置】日志级别,开发时设置为 TRACE(最低级别),线上设置 WARN;​
engine.setOptionString(SpeechEngineDefines.PARAMS_KEY_LOG_LEVEL_STRING, SpeechEngineDefines.LOG_LEVEL_TRACE);​
//【必需配置】鉴权相关,若采取新版控制台,则必需使用该配置。API Key 可以从 控制台>API Key管理 获取​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_API_KEY_STRING, "your-api-key");​
//【必需配置】鉴权相关:Appid。旧版控制台的鉴权方式,详见旧版控制台鉴权参考​
engine.setOptionString(SpeechEngineDefines.PARAMS_KEY_APP_ID_STRING, "APPID");​
//【必需配置】鉴权相关:Token。旧版控制台的鉴权方式,详见旧版控制台鉴权参考​
engine.setOptionString(SpeechEngineDefines.PARAMS_KEY_APP_TOKEN_STRING, "ACCESS TOKEN");​
//【必需配置】语音合成服务域名​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_TTS_ADDRESS_STRING, "wss://openspeech.bytedance.com");​
//【必需配置】语音合成服务Uri​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_TTS_URI_STRING, "/api/v3/tts/bidirection");​
//【必需配置】语音合成大模型服务Resource id。可选值:seed-tts-2.0:豆包语音合成大模型2.0,支持使用豆包语音合成模型2.0音色;seed-icl-2.0:豆包声音复刻大模型2.0,支持使用声音复刻接口克隆的音色,具体音色详见控制台>音色库​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_RESOURCE_ID_STRING, "RESOURCE ID");​
//【必需配置】语音合成服务StartSession时传入的音频相关参数,json字符串格式​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_START_ENGINE_PAYLOAD_STRING,startSessionPayload);​
​
可选配置​
​
//【可选配置】语音合成服务链接超时时间​
mSpeechEngine.setOptionInt(SpeechEngineDefines.PARAMS_KEY_TTS_CONN_TIMEOUT_INT,100000);​
//【可选配置】是否将合成出的音频保存到设备上,为 true 时需要正确配置 PARAMS_KEY_TTS_AUDIO_PATH_STRING 才会生效​
mSpeechEngine.setOptionBoolean(SpeechEngineDefines.PARAMS_KEY_TTS_ENABLE_DUMP_BOOL,true);​
//【可选配置】 TTS 播放音频文件保存目录,必须在合成之前创建好且 APP 具有访问权限,保存的音频文件名格式为 tts_{reqid}.wav, {reqid} 是本次合成的请求 id// PARAMS_KEY_TTS_ENABLE_DUMP_BOOL 配置为 true 的音频时为【必需配置】,否则为【可选配置】​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_TTS_AUDIO_PATH_STRING, mDebugPath);​
//【可选配置】语音合成服务请求的Header部分额外参数​
mSpeechEngine.setOptionString(SpeechEngineDefines.PARAMS_KEY_REQUEST_HEADERS_STRING,"{}");​
//【可选配置】是否使用内置播放器播放TTS音频​
mSpeechEngine.setOptionBoolean(SpeechEngineDefines.PARAMS_KEY_TTS_ENABLE_PLAYER_BOOL,true);​
//【可选配置】是否打开播放器的数据回调​
mSpeechEngine.setOptionBoolean(SpeechEngineDefines.PARAMS_KEY_ENABLE_PLAYER_AUDIO_CALLBACK_BOOL,true);​
​
初始化引擎实例 ​
初始化引擎对象并设置回调监听。​
​
// 初始化引擎实例int ret = engine.initEngine();​
if (ret != SpeechEngineDefines.ERR_NO_ERROR) {​
Log.e(SpeechDemoDefines.TAG, "初始化失败,返回值: " + ret);​
return;​
}​
engine.setContext(getApplicationContext());​
engine.setListener(this);​
​
发送指令 ​
语音对话 SDK 通过发送指令接口 sendDirective 触发各种操作,需要注意不建议在 SDK 的回调线程中调用该接口。​
启动引擎 ​
启动引擎的传参,请参考双向流式TTS的Event事件中上行事件 -> StartSession 的参数说明。​
​
// 注意这里先调用同步停止,避免SDK内部异步线程带来的问题​
engine.sendDirective(SpeechEngineDefines.DIRECTIVE_SYNC_STOP_ENGINE, "");​
// 启动BiTTS引擎int ret = engine.sendDirective(SpeechEngineDefines.DIRECTIVE_START_ENGINE, startSessionPayload);​
if (ret != SpeechEngineDefines.ERR_NO_ERROR) {​
Log.e(SpeechDemoDefines.TAG, "启动失败,返回值: " + ret);​
return;​
}​
​
startSessionPayload参数示例如下,包含了音色、音频生成参数等。​
​
"{\"user\":{\"uid\":\"YOURUID\"},\"req_params\":{\"speaker\":\"zh_female_vv_uranus_bigtts\",\"audio_params\":{\"loudness_rate\":50}}}"​
​
开始合成服务-StartSession​
双向流式TTS支持在一个链接中多次调用StartSession和FinishSession,每调用一次表示开始合成服务和结束合成服务,但必须在收到SessionFinished回调后才能重新StartSession( StartEngine -> [FinishSession -> StartSession](可循环调用) -> StopEngine)​
调用StartSession时data字段有如下2种设置方式:​
  • 传空字符串:表示使用SEDirectiveStartEngine时传入的 startSessionPayload参数来合成;​
  • 新传入json格式的sessionpayload参数:更新合成参数,按新参数来合成文本;​
​
int ret = 0;​
ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_EVENT_START_SESSION,"");​
//或者传入更新后的新参数​
//ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_EVENT_START_SESSION,startSessionPayload);​
if(ret!=0){​
Log.e(SpeechDemoDefines.TAG, "发送StartSession failed: " + ret);​
String message = "发送StartSession指令失败, " + ret;​
sendSynthesisDirectiveFailed(message);​
}​
​
结束合成服务-FinishSession​
如果没有文本需要合成了,或者需要强制结束时可以调用FinishSession让服务端基于已收到的文本完成音频合成并返回。​
注意:如果传输文本最后不包含标点符号,那么服务端会等待后续文本到来才会触发合成。超时4秒没有收到后续文本也会触发合成。如果期望服务端立马开始合成则需要调用FinishSession。​
​
int ret = 0;​
ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_EVENT_FINISH_SESSION, "");​
if(ret!=0){​
Log.e(SpeechDemoDefines.TAG, "发送FinishSession failed: " + ret);​
String message = "发送FinishSession指令失败, " + ret;​
sendSynthesisDirectiveFailed(message);​
}​
​
发送合成文本​
文本内容需要拼装车json格式的字符串传入。如果有其他参数可以透传给服务端。​
​
String result = "{\"req_params\":{\"text\":\"" + text + "\"}}";​
int ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_EVENT_TASK_REQUEST, result);​
if (ret != 0) {​
Log.e(SpeechDemoDefines.TAG, "Synthesis faile: " + ret);​
String message = "发送合成指令失败, " + ret;​
sendSynthesisDirectiveFailed(message);​
}​
​
可以调用多次DIRECTIVE_EVENT_TASK_REQUEST向服务端发送待合成的文本内容。服务端会切句逐个返回。如果需要立即返回音频内容,可以在发送DIRECTIVE_EVENT_TASK_REQUEST前后调用StartSession和FinishSession确保音频马上返回。​
取消合成服务-CancleSession​
如果要取消当前合成服务,期望服务端不再返回音频。则调用CancleSession​
​
int ret = 0;​
ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_EVENT_CANCLE_SESSION, "");​
if(ret!=0){​
Log.e(SpeechDemoDefines.TAG, "发送FinishSession failed: " + ret);​
String message = "发送FinishSession指令失败, " + ret;​
sendSynthesisDirectiveFailed(message);​
}​
​
暂停播放​
可以在播放音频时发送指令DIRECTIVE_PAUSE_PLAYER,暂停tts音频播放。​
​
int ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_PAUSE_PLAYER, "");​
Log.d(SpeechDemoDefines.TAG, "Pause playback status:" + ret);​
​
恢复播放​
可以在播放音频时发送指令DIRECTIVE_RESUME_PLAYER,恢复tts音频播放​
​
int ret = mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_RESUME_PLAYER, "");​
Log.d(SpeechDemoDefines.TAG, "Resume playback status:" + ret);​
​
  1. 停止引擎​
​
// 会等待回调函数执行完成,不可在回调线程中执行。​
mSpeechEngine.sendDirective(SpeechEngineDefines.DIRECTIVE_SYNC_STOP_ENGINE, "");​
​
回调接收返回数据​
启动引擎后,SDK会不断回调消息。回调的消息内容,请参考双向流式TTS的Event事件。​
​
@Override​
public void onSpeechMessage(int type, byte[] data, int len) {​
String stdData = "";​
stdData = new String(data);​
​
switch (type) {​
case SpeechEngineDefines.MESSAGE_TYPE_ENGINE_START:​
// Callback: 引擎启动成功回调​
Log.i(SpeechDemoDefines.TAG, "Callback: 引擎启动成功: data: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_ENGINE_STOP:​
// Callback: 引擎关闭回调​
Log.i(SpeechDemoDefines.TAG, "Callback: 引擎关闭: data: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_ENGINE_ERROR:​
// Callback: 错误信息回调​
Log.e(SpeechDemoDefines.TAG, "Callback: 错误信息: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_EVENT_TTS_SENTENCE_START:​
// Callback: 合成开始回调​
Log.e(SpeechDemoDefines.TAG, "Callback: TTS_SENTENCE_START: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_EVENT_TTS_SENTENCE_END:​
// Callback: 合成结束回调​
Log.e(SpeechDemoDefines.TAG, "Callback: TTS_SENTENCE_END: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_EVENT_TTS_RESPONSE:​
Log.e(SpeechDemoDefines.TAG, "Callback: TTS_RESPONSE: data len " + stdData.length());​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_EVENT_TTS_ENDED:​
Log.e(SpeechDemoDefines.TAG, "Callback: TTSEnded: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_PLAYER_AUDIO_DATA:​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_PLAYER_START_PLAY_AUDIO:​
// Callback: 播放开始回调​
Log.e(SpeechDemoDefines.TAG, "Callback: 播放开始: " + stdData);​
break;​
case SpeechEngineDefines.MESSAGE_TYPE_PLAYER_FINISH_PLAY_AUDIO:​
// Callback: 播放结束回调​
Log.e(SpeechDemoDefines.TAG, "Callback: 播放结束: " + stdData);​
break;​
default:​
break;​
}​
}​
​
  1. 销毁引擎实例​
当不再需要语音对话后,建议对引擎实例进行销毁,释放内存资源。(注:务必先调用StopEngine再destroyEngine)​
​
// 内部会执行SYNC_STOP,不可在回调线程中执行。​
engine.destroyEngine();​
engine = null;​
​
最近更新时间:2026.09.28 19:40:51
这个页面对您有帮助吗?
有用
有用
无用
无用