在线语音合成Android SDK文档
文档修订记录
| 文档版本号 | 修订日期 | 修订原因 |
|---|---|---|
| V1.0 | 2022.8.30 | 创建文档 |
| V1.1 | 2023.10.23 | 优化文档 |
概述
TTS模块主要是文字转语音的功能,目前支持返回音频链接、二进制音频流。
权限声明
网络权限 - 使用过程中,会有wss请求、网络状态检测
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
存储权限 - 使用过程中,会写入日志文件(debug)、保存音频文件,请在清单中指定以下内容。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- android10 以上需要额外添加-->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
在android10及以上需要在application标签下添加如下配置
<application android:requestLegacyExternalStorage="true">
配置文件
需要在 turing_config.json 中添加 tts 节点
{
"authorization": {
"apikey": "您的apikey",
"secret": "您的secret"
},
"ability": {
"tts": {
"tone": "huiting",
"format": "MP3_16_16",
"speed": 5,
"volume": 3,
"pitch": 5,
"arousal": 6
}
}
}
接口说明
public interface TuringTtsInterface {
/**
* TTS合成音频链接,使用全局配置文件Turing_config.json中的参数,需配置tts参数
*
* @param text 需要转语音的文字
* @param isAssignTts 是否使用配置文件中的tts参数
* @param listener 回调接口
* @return 你输入的字符串会被切割为SparseArray<String>
*/
SparseArray<String> actionTts(String text, boolean isAssignTts, TuringOSClientListener listener);
/**
* TTS合成音频链接
*
* @param text 需要转语音的文字
* @param listener 回调接口
* @param ttsRequestConfig tts请求参数,如设置为空,则使用Turing_config.json中的tts配置,如没有tts配置,则使用默认值
* @return 你输入的字符串会被切割为SparseArray<String>
*/
SparseArray<String> actionTts(String text, TtsRequestConfig ttsRequestConfig, TuringOSClientListener listener);
/**
* TTS合成并播放,使用全局配置文件Turing_config.json中的参数,需配置tts参数
*
* @param text 需要转语音的文字
* @param isAssignTts 是否指定tts参数 ,参数配置在Turing_config.json中
* @param listener 回调接口
* @param turingOSClientPlayListener 音频播放回调接口
* @return
*/
SparseArray<String> actionTtsPlay(String text, boolean isAssignTts, TuringOSClientListener listener,
TuringOSClientPlayListener turingOSClientPlayListener);
/**
* TTS合成并播放
*
* @param text 需要转语音的文字
* @param ttsRequestConfig tts请求参数,如设置为空,则使用Turing_config.json中的tts配置,如没有tts配置,则使用默认值
* @param listener 回调接口
* @param turingOSClientPlayListener 音频播放回调接口
* @return
*/
SparseArray<String> actionTtsPlay(String text, TtsRequestConfig ttsRequestConfig, TuringOSClientListener listener,
TuringOSClientPlayListener turingOSClientPlayListener);
/**
* TTS合成文件,使用全局配置文件Turing_config.json中的参数,需配置tts参数
*
* @param text 需要转语音的文字
* @param filePath 合成之后的文件的文件父路径
* @param isAssignTts 是否指定tts参数 ,参数配置在Turing_config.json中
* @param listener 回调接口
* @return
*/
public SparseArray<String> actionTtsToUri(String text,
String filePath,
boolean isAssignTts,
TuringOSClientListener listener);
/**
* TTS合成文件
*
* @param text 需要转语音的文字
* @param filePath 合成之后的文件的文件父路径
* @param ttsRequestConfig tts请求参数,如设置为空,则使用Turing_config.json中的tts配置,如没有tts配置,则使用默认值
* @param listener 回调接口,onSuccess中的extension参数是具体的tts路径
* @return
*/
public SparseArray<String> actionTtsToUri(String text,
String filePath,
TtsRequestConfig ttsRequestConfig,
TuringOSClientListener listener);
/**
* 停止播放
*/
boolean stopPlay();
/**
* 暂停播放
*/
boolean pausePlay();
/**
* 继续播放
*/
boolean resumePlay();
/**
* 是否正在播放
*/
boolean isPlaying();
/**
* 资源释放
*/
void release();
}
使用说明
功能描述
- tts合成时,如果文本大于500个字符,会将文本按最大500个字符分割成一个数组,分别将数组的每一条数据合成一个tts,接口返回的结果就是分割的文本数组
支持的所有方式:
- TTS合成并返回音频链接:输入目标文本,合成TTS链接,需要自行播放tts链接
- TTS合成并播放音频:输入目标文本,合成流式TTS,播放流式音频
- TTS合成本地音频文件:输入目标文本,合成本地TTS音频文件
接口类型:
- 类型一:全局使用turing_config中的配置参数,需要在 turing_config.json 中添加 tts节点,节点字段见《接入指南说明文档》配置文件参数说明。可使用TuringConfig.setConfigData设置全局配置参数,此参数在使用到配置文件的接口全局生效,适用于不频繁修改参数场景
- 类型二:不使用 turing_config.json 中的配置,使用入参带TtsRequestConfig 的接口,此参数仅调用时生效,适用于频繁修改参数场景。
实例化
val turingTts:TuringTtsInterface = TuringTts.getInstance(this)
一、TTS合成本地音频文件
方法一:TTS合成音频链接,使用全局配置文件Turing_config.json中的参数,需配置tts参数
val tts = TuringConfig.getInstance(this).configData.ability.tts
tts.speed = 10
turingTts.actionTts(text, true, object : TuringOSClientListener{
override fun onResult(
code: Int,
result: String?,
responBean: BaseResp?,
extension: String?
) {
if (responBean?.nlpResponse != null && responBean.nlpResponse
.results != null
) {
val resultsBeanList: List<BaseResp.NlpResponse.ResultsBean> =
responBean.getNlpResponse().getResults()
val valuesBean: BaseResp.NlpResponse.ResultsBean.ValuesBean =
resultsBeanList[0].getValues()
if (valuesBean != null) {
if (valuesBean.getTtsUrl() != null) {
val url: String = valuesBean.getTtsUrl().get(0)
if (!TextUtils.isEmpty(url)) {
addPlayUrl(url)
}
}
}
}
mUIHandler.postRunnable(Runnable {
result?.let {
resultList.add(it)
}
resultAdapter!!.updateList(resultList)
resultRecycleview.smoothScrollToPosition(resultList.size - 1)
})
}
override fun onError(code: Int, msg: String?) {
Log.e(TAG, "onError code: $code msg: $msg")
}
})
方法二:TTS合成音频链接,使用局部生效参数
val ttsConfig = TtsRequestConfig.Builder().speed(10).build()
turingTts.actionTts(text, ttsConfig, turingOSClientListener)
TuringOSClientListener接口的onResult方法说明,ttsUrl为合成目标文字的音频链接。
返回示例:
{
"code":200,
"globalId":"98412556156000000",
"message":"success",
"nlpResponse":{
"intent":{
"code":50101
},
"results":[
{
"groupType":0,
"resultType":"text",
"values":{
"ttsUrl":[
"http://turing-iot.oss-cn-beijing.aliyuncs.com/tts/tts-0b6c2dd6687a4c8cb73a3ca49ed9b3ca-ef856c768eb2495bafce0fd01eeade93.mp3"
],
"text":"北京今天天气怎么样?"
}
}
]
}
}
二、TTS合成并播放音频
- 该方式请求TTS后会在TuringOSClientListener中回调请求日志,并在TuringOSClientPlayListener中回调播放信息。
- 该方法时请求后直接播放音频,不需要单独的开启播放的操作。所针对一些合成并播放的场景可以使用该方式;
- 该方式不支持设置TtsRequestConfig的format参数。
方法一:TTS合成音频链接,使用全局配置文件Turing_config.json中的参数,需配置tts参数
val tts = TuringConfig.getInstance(this).configData.ability.tts
tts.speed = 10
turingTts.actionTtsPlay(text, true, object : TuringOSClientListener {
override fun onResult(
code: Int,
result: String?,
responBean: BaseResp?,
extension: String?
) {
if (responBean != null && responBean.nlpResponse != null && responBean.nlpResponse.results != null) {
val resultsBeanList = responBean.nlpResponse.results
val valuesBean = resultsBeanList[0].values
if (valuesBean != null) {
if (valuesBean.ttsUrl != null) {
val url = valuesBean.ttsUrl[0]
if (!TextUtils.isEmpty(url)) {
}
}
}
}
mUIHandler.postRunnable {
resultList.add(result!!)
resultAdapter!!.updateList(resultList)
resultRecycleview.smoothScrollToPosition(resultList.size - 1)
}
}
override fun onError(code: Int, msg: String) {
Log.e(TAG, "onError code: $code msg: $msg")
}
}, object : TuringOSClientPlayListener {
override fun onPlayStart(text: String?) {
Log.e(TAG, "onPlayStart text:")
}
override fun onPlayError(message: String?) {
Log.e(TAG, "onPlayError")
}
override fun onPlayComplete() {
Log.e(TAG, "onPlayComplete")
}
override fun onPlayPaused() {
Log.e(TAG, "onPlayPaused")
}
override fun onPlayResumed() {
Log.e(TAG, "onPlayResumed")
}
})
方法二:TTS合成音频链接,使用局部生效参数
val ttsConfig = TtsRequestConfig.Builder().speed(10).build()
turingTts.actionTtsPlay(text, ttsConfig, turingOSClientListener,turingOSClientPlayListener)
播放状态控制
停止播放:
turingTts.actionStopPlay();
暂停播放:
turingTts.actionPausePlay();
继续播放:
turingTts.actionResumePlay();
注意:以上播放控制的方法对语音聊天模块同样有效,所以尽可能明确设备正在处理播放的模块。
返回示例:
{
"code":200,
"globalId":"130611147397245001",
"message":"success",
"nlpResponse":{
"intent":{
"code":50101
},
"results":[
{
"groupType":0,
"resultType":"text",
"values":{
"ttsStreamId":"fb6b658e88194dbfab969f829348097f",
"text":"佩奇(Peppa Pig)(英文配音:海莉·博德,中文配音:陈奕雯) 佩奇是一只非常可爱的小猪,她和她的妈妈、爸爸以及弟弟乔治生活在一起。她和弟弟一样很喜欢恐龙,尤其是马门溪龙。 她最喜欢跳泥坑,"
}
}
]
}
}
使用该方式时语音合成成功会在onResult返回合成信息,若目标文字过长时,会分段返回结果,调用开始后直接播放音频。
三、TTS合成本地音频文件
- 该方式请求TTS后会在TuringOSClientListener的onResult中回调合成的文件路径,具体值为extension值。
- 该方式中TtsRequestConfig不应为空,并且需要设置format参数;
- 该方式需要传入合成文件的存储路径,例如:String filePath = “/storage/emulated/0/turingos/tts/”,合成结果为:/storage/emulated/0/turingos/tts/WAV_16_16_20200630172821.wav;
- 合成文件名规则:WAV_16_16_20200630172821.wav,格式+日期+对应格式的文件后缀,文件格式应为ttsRequestConfig中的format参数的值;
- 当目标文字过长时,从开始请求到合成完成回调结果需要一定的延时。
方法一:使用全局配置turing_config.json参数
turingTts.actionTtsToUri(text,"/sdcard/turingos/",true,object:TuringOSClientListener{
override fun onResult(
code: Int,
result: String?,
baseResp: BaseResp?,
extension: String?
) {
if (code==200&&extension!=null){
Log.d(TAG,"tts合成结束,path:$extension")
}
Log.d(TAG,"code:$code extension:$extension")
Log.d(TAG, "onResult result:$result")
}
override fun onError(code: Int, msg: String?) {
Log.d(TAG,"onError code:"+code)
}
})
方法二:使用TtsRequestConfig参数
val ttsRequestConfigBuilder = TtsRequestConfig.Builder();
ttsRequestConfigBuilder.pitch(pitch + 1)
.speed(speed + 1)
.volume(volume + 1)
.arousal(arousal + 1)
//需要指定tts合成的格式
.format("WAV_16_16")
.tone(voiveTone);
val ttsRequestConfig = ttsRequestConfigBuilder.build();
val path = SdkInitializer.getFilePath() + "tts/";
turingTts.actionTtsToUri(text, path, ttsRequestConfig, object:TuringOSClientListener{
override fun onResult(
code: Int,
result: String?,
baseResp: BaseResp?,
extension: String?
) {
if (code==200&&extension!=null){
Log.d(TAG,"tts合成结束,path:$extension")
}
Log.d(TAG,"code:$code extension:$extension")
Log.d(TAG, "onResult result:$result")
}
override fun onError(code: Int, msg: String?) {
Log.d(TAG,"onError code:"+code)
}
});
区分中英文配置
如果需要单独设置英文tts配置,可在配置文件中增加与tts同级的enTts对象,字段跟tts一致
方法一:使用全局配置文件Turing_config.json
在ability下,添加与tts字段同级别的enTts,参数与tts一致,如下:
{
"authorization": {
"apikey": "您的apikey",
"secret": "您的secret"
},
"ability": {
"tts": {
"tone": "huiting",
"format": "MP3_16_16",
"speed": 5,
"volume": 3,
"pitch": 5,
"arousal": 6
},
"enTts": {
"tone": "huiting",
"format": "MP3_16_16",
"speed": 5,
"volume": 3,
"pitch": 5,
"arousal": 6
}
}
}
方法二:使用TtsRequestConfig
en开头是英文参数,否则是中英混合参数,如需设置英文参数,还需设置setEnConfig(true),如下:
val ttsConfig = TtsRequestConfig.Builder().setEnConfig(true).enSpeed(10).enPitch(6).build()
参数说明
输入参数
TtsRequestConfig、tts
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| tone | String | No | - | 默认"小雪",2023年09月13日前创建的机器人,默认音色为zhiwa,其他音色请联系商务 |
| format | String | No | - | 输出格式,默认MP3_16_16,参见“format参数说明-item” |
| speed | Int | No | 1~9 | 语速设置,取值范围1~9,默认为5 |
| volume | Int | No | 1~9 | 音量设置,取值范围1~9,默认为5 |
| pitch | Int | No | 1~9 | 语调设置,取值范围1~9,默认为5 |
| arousal | Int | No | 1~9 | 语音波动,取值范围1~9,默认为5 |
| ext | Map |
No | tts#ext参数说明 | 附加参数 |
tts#ext参数说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| xunFeiTone | String | 使用讯飞音色必填 | 讯飞音色参数,使用此参数时,tts#tone需要设置为“xunfei” |
| bdVoice | String | 使用字节音色必填 | 参考字节文档【voice】 |
| bdVoiceType | String | 使用字节音色必填 | 参考字节文档【voice_type】 |
| bdStyleName | String | 非必填 | 参考字节文档【style_name】 |
tone参数说明
| 名称 | 说明 | 性别 |
|---|---|---|
| zhiwa | 图灵智娃 | 中英混合男童 |
| aq | 图灵阿Q | 中英混合女童 |
| huiting | 图灵慧听 | 中英混合成年女声 |
xunFeiTone参数说明
| 名称 | 说明 | 性别 |
|---|---|---|
| x3_xiaozhong | 小忠 | 中文男 |
| x3_xiaoguo | 小果 | 中文女 |
| x2_engam_ryan | Ryan | 英文男 |
| x2_engam_lindsay | lindsay | 英文女 |
format参数说明
| item | Model |
|---|---|
| AMR_NB | amr-8khz-16bit |
| MP3_16_16 | mp3-16khz-16kpbs |
| MP3_16_24 | mp3-16khz-24kpbs |
| MP3_16_64 | mp3-16khz-64kpbs |
| WAV_16_16 | wav-16khz-16bit |
| PCM_16_16 | pcm-16khz-16bit |
| PCM_8_16 | pcm-8khz-16bit |
| OPUS_16_16 | opus-16khz-16bit |
参数优先级说明
- TTS音色有特殊需求和定制,可以联系图灵商务;
- 当不设置TTS音色以及音量等参数时,默认使用图灵平台云端配置的默认参数;若设置参数与图灵平台云端配置参数不一致时,会导致合成音频无法播放。
- 另外每一次请求设置的参数只对该次有效,下一次请求如果不设置参数,将使用图灵平台云端配置的默认参数;
- 可以联系图灵技术支持通过云端配置音色音量等参数,请求时可以省略TtsRequestConfig参数。
回调接口
TuringOSClientListener
详细说明见《语音对话接入文档》
输出参数
BaseResp说明
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 请求响应Code,具体可参考Code说明 |
| message | String | 请求响应的消息描述 |
| nlpResponse | NlpResponse(Object) |
- 当code=200表示识别成功;
- 其他code表示识别异常,参考Code说明。
NlpResponse
| 参数 | 类型 | 说明 |
|---|---|---|
| intent | Intent(Object) | 语义理解结果的实体内容 |
| results | List(Object) | 语义理解结果的提示语和播放内容集合 |
NlpResponse-Intent
| 参数 | 类型 | 说明 |
|---|---|---|
| code | Intent(Object) | 此次请求命中的技能Code TT合成模块固定返回50101 |
NlpResponse-List-Results
| 参数 | 类型 | 说明 |
|---|---|---|
| groupType | int | 组类型(普通接入可忽略该参数): 0为独立输出; 大于0时可能包含同组相关内容 |
| resultType | String | 输出类型: 当 resultType=text 时:表示文本 TTS合成场景固定返回text |
| values | Values(Object) | 输出内容(必会包含 resultType 对应的 key, 其他会根据具体应用场景进行字段扩充) |
NlpResponse-List-Results-Values
| 参数 | 类型 | 说明 |
|---|---|---|
| ttsUrl | String[] | 文字合成语音的音频链接 |
| text | String | 合成目标,即输入的文字 |