语音合成
语音合成TTS模块
TTS模块主要是文字转语音的功能,目前支持返回音频链接、直接播放、合成文件。
直接播放和合成文件为2.0.10.1新增功能。
TTS参数说明
TTS请求参数
TtsRequestConfig为TTS请求参数,具体说明如下:
| 参数 | 类型 | 是否必须 | 取值范围 | 默认值 | 说明 |
|---|---|---|---|---|---|
| pitch | int | N | 1-9 | 5 | 音高 |
| volume | int | N | 1-9 | 5 | 音量 |
| arousal | int | N | 1-9 | 5 | 语音波动 |
| speed | int | N | 1-9 | 5 | 语速 |
| format | String | N | MP3_16_16 | - | 暂不支持设置 |
| tone | String | N | - | zhiwa | 参见“tone参数说明” |
| ext | Map | N | - | - | 扩展字段,快速扩展功能实现 |
tone参数说明
| 名称 | 说明 | 性别 |
|---|---|---|
| zhiwa | 图灵智娃 | 中英混合男童 |
| aq | 图灵阿Q | 中英混合女童 |
| huiting | 图灵慧听 | 中英混合成年女声 |
format参数说明
| Value | 描述 |
|---|---|
| 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(目前暂时不支持) |
参数优先级说明
-
TTS音色有特殊需求和定制,可以联系图灵商务;
-
当不设置TTS音色以及音量等参数时,默认使用图灵平台云端配置的默认参数;另外每一次请求设置的参数只对该次有效,下一次请求如果不设置参数,将使用图灵平台云端配置的默认参数;
- 可以联系图灵技术支持通过云端配置音色音量等参数,请求时可以省略TtsRequestConfig参数。
TTS请求结果
TuringOSClientListener
该接口为TTS请求结果回调接口(同其他模块的TuringOSClientListener),具体如下:
public interface TuringOSClientListener {
/**
*
* 请求结果返回
*
* @param code 具体参考code说明
* @param result 返回的json字符串
* @param isLast Asr识别结果;last : 是否是最终结果
* @param baseResp 返回的json字符串转换的Java对象
*@param extension 扩展参数
*/
void onResult(int code, String result, BaseResp baseResp, String extension);
/**
* 请求发生错误的信息
*
* @param code
* @param msg
*/
void onError(int code, String msg);
}
参数说明
- code:具体参考code说明;
- result :返回的json字符串;
- baseResp :返回的json字符串转换的Java对象,具体参考TTS输出说明;
- extension :扩展参数,当调用TTS文件合成的方式时,该值为合成的TTS文件路径。
TTS播放状态
TuringOSClientPlayListener
当使用TTS合成并播放的这种方式时,可以使用该接口监听播放状态。
public interface TuringOSClientPlayListener {
/**
* TTS开始播放,聊天场景种会返回即将开始播放的内容(可能是文字,也可能是音频的url)
*/
void onPlayStart(String text);
/**
* TTS播放错误
*/
void onPlayError(String message);
/**
* TTS播放完成
*/
void onPlayComplete();
/**
* TTS播放暂停
*/
void onPlayPaused();
/**
* TTS继续播放
*/
void onPlayResumed();
}
- onPlayStart(String text):在TTS合成场景中,onPlayStart(String text)中的text始终为空,不需要关注,为字段主要服务于语音聊天模块多种音频播放的场景,具体可参看语音对话模块。
字符切割方法
//对用户输入的字符串长度进行切割,保证每一次请求的文字长度合法
public static SparseArray<String> split(String text)
//调用
SparseArray<String> textList = turingOSClient.SparseArray(text);
TTS合成调用
TTS合成支持三种方式:
- 文字合成音频链接,请求返回音频播放链接;
- 文字转语音直接播放;
- 文字合成音频文件。
一、TTS合成音频链接
-
该方式请求TTS后返回音频的播放链接,需要开发者自行播放音频。
-
如果输入的文字字符长度大于100时,会在内部进行切割,所以需要注意返回的SparseArray
值,返回的音频链接会按照返回的值进行分段返回。
方法说明
/**
*
* @param text 需要转语音的文字
* @param listener TuringOSClientListener
* @return 你输入的字符串会被切割为SparseArray<String>
*/
public SparseArray<String> actionTts(String text, TuringOSClientListener listener)
/**
*
* @param text 需要转语音的文字
* @param ttsRequestConfig TtsRequestConfig tts参数
* @param listener TuringOSClientListener
* @return 你输入的字符串会被切割为SparseArray<String>
*/
public SparseArray<String> actionTts(String text, TtsRequestConfig ttsRequestConfig, final TuringOSClientListener listener)
调用示例
//无tts参数
//返回的语音MP3地址会按照该textList对应的文字顺序返回
SparseArray<String> textList = turingOSClient.actionTts(text, listener);
//有tts参数
TtsRequestConfig.Builder ttsRequestConfigBuilder = new TtsRequestConfig.Builder();
ttsRequestConfigBuilder.pitch(pitch)
.speed(speed)
.volume(volume)
.arousal(arousal)
.tone("zhiwa");
TtsRequestConfig ttsRequestConfig = ttsRequestConfigBuilder.build();
//返回的语音MP3地址会按照该textList对应的文字顺序返回
SparseArray<String> textList turingOSClient.actionTts(text, ttsRequestConfig, listener);
TTS音频链接输出
具体看TuringOSClientListener接口的onResult方法说明,ttsUrl为合成目标文字的音频链接。
json返回示例如下:
{
"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输出说明
BaseResp说明
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 请求响应Code,具体可参考Code说明 |
| message | String | 请求响应的消息描述 |
| nlpResponse | NlpResponse(Object) |
- 当code=200表示识别成功;
- 其他code表示识别异常,参考Code说明。
NlpResponse
| 参数 | 类型 | 说明 |
|---|---|---|
| intent | Intent(Object) | 语义理解结果的实体内容 |
| results | List |
语义理解结果的提示语和播放内容集合 |
NlpResponse-Intent
| 参数 | 类型 | 说明 |
|---|---|---|
| code | Intent(Object) | 此次请求命中的技能Code TT合成模块固定返回50101 |
NlpResponse-List
| 参数 | 类型 | 说明 |
|---|---|---|
| groupType | int | 组类型(普通接入可忽略该参数): 0为独立输出; 大于0时可能包含同组相关内容 |
| resultType | String | 输出类型: 当 resultType=text 时:表示文本 TTS合成场景固定返回text |
| values | Values(Object) | 输出内容(必会包含 resultType 对应的 key, 其他会根据具体应用场景进行字段扩充) |
NlpResponse-List
| 参数 | 类型 | 说明 |
|---|---|---|
| ttsUrl | String[] | 文字合成语音的音频链接 |
| text | String | 合成目标,即输入的文字 |
TTS MP3链接播放
SDK内部集成了MP3播放器池TtsPlayerPool,开发者可根据自身业务逻辑选择使用内部或者自行实现播放器。
TtsPlayerPool使用介绍
TtsPlayerPool:TtsPlayerPool主要用于播放mp3 List的播放池,内部实现了预加载和备用播放器。
使用方式一
需要传入所有mp3播放地址之后,才能调用start开始播放,具体使用示例如下:
//第一步:创建播放池
//textList为client.SparseArray(text)切割的结果
TtsPlayerPool ttsPlayerPool = TtsPlayerPool.create(textList.size());
//播放状态
ttsPlayerPool.setCallback(new MyTtsCalkBack());
//第二步:依次将MP3播放地址传入,
ttsPlayerPool.addPlayUrl(url);
//第三步:开始播放,需要将所有待播放的的url list完整的传入之后再开始播放
ttsPlayerPool.start();
//停止播放
ttsPlayerPool.stop();
使用方式二
一边往播放池加入播放链接,一边播放,不用等到所有的播放List准备完毕再调用播放,具体使用示例如下:
//第一步:创建播放池
//textList为client.SparseArray(text)切割的结果
TtsPlayerPool ttsPlayerPool = TtsPlayerPool.create(textList.size());
//播放状态
ttsPlayerPool.setCallback(new MyTtsCalkBack());
//第二步:依次将MP3播放地址传入
ttsPlayerPool.addPlayUrlAndStart(url);
//停止播放
ttsPlayerPool.stop();
- 如果调用stop之后再次调用addPlayUrlAndStart则会再次进入播放状态,所以可以在停止的时候将ttsPlayerPool置空,清除addPlayUrlAndStart的触发条件。
TtsPlayerPool特殊说明
- TtsPlayerPool.create传入的大小要与最终加入的播放链接List的大小一致,否则播放状态onPlayComplete将不会回调
二、TTS合成并播放
- 该方式请求TTS后会在TuringOSClientListener中回调请求日志,并在TuringOSClientPlayListener中回调播放信息。
- 该方法时请求后直接播放音频,不需要单独的开启播放的操作。所针对一些合成并播放的场景可以使用该方式;
- 该方式不支持设置TtsRequestConfig的format参数。
方法说明:
/**
*
* @param text 合成的目标文字
* @param ttsRequestConfig 可以为null,使用默认值
* @param listener TuringOSClientListener
* @param turingOSClientPlayListener TuringOSClientPlayListener
* @return
*/
public SparseArray<String> actionTtsPlay(String text,
TtsRequestConfig ttsRequestConfig,
TuringOSClientListener listener,
TuringOSClientPlayListener turingOSClientPlayListener);
TtsRequestConfig为TTS合成参数,可以为null,也可以根据需要指定参数值。
播放状态控制
停止播放:
client.actionStopPlay();
暂停播放:
client.actionPausePlay();
继续播放:
client.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参数的值;
- 当目标文字过长时,从开始请求到合成完成回调结果需要一定的延时。
方法说明:
/**
*
* @param text 合成目标文字
* @param filePath 合成之后的文件的文件父路径
* @param ttsRequestConfig
* @param listener
* @return
*/
public SparseArray<String> actionTtsToUri(String text,
String filePath,
TtsRequestConfig ttsRequestConfig,
TuringOSClientListener listener);
//示例
TtsRequestConfig.Builder ttsRequestConfigBuilder = new TtsRequestConfig.Builder();
ttsRequestConfigBuilder.pitch(pitch + 1)
.speed(speed + 1)
.volume(volume + 1)
.arousal(arousal + 1)
//需要指定tts合成的格式
.format("WAV_16_16")
.tone(voiveTone);
TtsRequestConfig ttsRequestConfig = ttsRequestConfigBuilder.build();
String path = SdkInitializer.getFilePath() + "tts/";
client.actionTtsToUri(text, path, ttsRequestConfig, listener);