# 概览
AIUI目前支持的语音合成方式:调用AIUI接口,使用云端语音合成(云端TTS),云端下发音频流到客户端进行播放。此方式又分为主动语音合成与语义后合成。
主动语音合成与语义后合成的区别:
主动语音合成:即客户端发送文本给云端,云端返回合成音频给客户端。开发者通过AIUIAgent主动发送
CMD_TTS
消息给AIUI,云端会下发该文本对应的音频,客户端再进行播放;语义后合成:即与AIUI交互的过程中,云端会将语义结果中answer内容对应的合成音频下发到客户端。开发者只需要在云端设置中勾选合成音频下发功能,并设置好发音人,语言等参数,在交互过程中,云端会在得到语义结果后将tts合成音频下发到客户端,客户端能直接将结果进行播报,其中合成的音频内容为语义结果answer字段的text值。
# 主动语音合成
主动语音合成支持在线(TTS)与离线(XTTS)两种能力,默认使用云端合成能力。
# 云端TTS集成示例
开发者使用AIUIAgent发送CMD_TTS消息,arg1字段为具体操作,params字段为合成参数,data字段为待合成的文本数据(文本数据最大支持8192字节,超过部分字节不会被合成),示例:
String ttsStr = "我是要合成的文本"; //得到待合成文本
byte[] ttsData = ttsStr.getBytes("utf-8"); //转为二进制数据
StringBuffer params = new StringBuffer(); //构建合成参数
params.append("vcn=xiaoyan"); //合成发音人
params.append(",speed=50"); //合成速度
params.append(",pitch=50"); //合成音调
params.append(",volume=50"); //合成音量
//开始合成
AIUIMessage startTts = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.START, 0, params.toString(), ttsData);
mAIUIAgent.sendMessage(startTts);
注:sdk默认会播放云端下发的TTS音频,若不需要sdk直接播报,则需要在配置文件中配置tts参数,将play_mode配置为user,具体请参考云端TTS音频播放,开发者在EVENT_RESULT
事件中可以获取到下发的音频数据,由开发者自己进行播报,具体请参考音频结果解析。
arg1取值说明:
类型 | 取值 | 含义 | 参数 |
START | 1 | 开始合成 | 合成发音人,语速语调等 |
CANCEL | 2 | 取消合成 | 无 |
PAUSE | 3 | 暂停播放 | 无 |
RESUME | 4 | 恢复播放 | 无 |
合成参数示例:
String params = "vcn=xiaoyan,speed=50,pitch=50,volume=50"
参数字段说明:
名称 | 含义 |
vcn | 发音人,如xiaoyan。支持发音人请参考发音人列表 |
speed | 语速,0-100 |
pitch | 语调,0-100 |
volume | 音量,0-100 |
ent | 引擎,默认aisound,如果需要较好的效果,可设置成xtts |
# 支持的发音人
发音人(vcn=) | 引擎(ent=) | 名称 | 语言 | 音色 |
qige | x | 讯飞小哥哥 | 普通话 | 成年男声 |
dangdang | x | 讯飞小姐姐 | 普通话 | 成年女声 |
qige | x2 | 讯飞七哥 | 普通话 | 成年男声 |
chaoge | x2 | 讯飞超哥 | 普通话 | 成年男声 |
wanshu | x2 | 讯飞万叔 | 普通话 | 成年男声 |
xiaoxi | x2 | 讯飞水哥 | 普通话 | 成年男声 |
pengfei | x2 | 讯飞小鹏 | 普通话 | 成年男声 |
xiaofeng | x2 | 讯飞晓峰 | 普通话 | 成年男声 |
xiaozhang | x2 | 讯飞刚哥 | 普通话 | 成年男声 |
yifeng | x2 | 讯飞一峰 | 普通话 | 成年男声 |
yuanye | x2 | 讯飞易阳泽(原野) | 普通话 | 成年男声 |
dahuilang | x2 | 讯飞康铭(大灰狼) | 普通话 | 成年男声 |
xiaohou | x2 | 逍遥子 | 普通话 | 成年男声 |
guange | x2 | 管哥 | 普通话 | 成年男声 |
mingge | x2 | 明哥 | 普通话 | 成年男声 |
tiange | x2 | 天哥 | 普通话 | 成年男声 |
xiaozhong | x2 | 小忠 | 普通话 | 成年男声 |
xiaowan | x2 | 讯飞小婉 | 普通话 | 成年女声 |
qianxue | x2 | 讯飞千雪 | 普通话 | 成年女声 |
xiaoguo | x2 | 讯飞小果 | 普通话 | 成年女声 |
yezi | x2 | 讯飞小露 | 普通话 | 成年女声 |
yifei | x2 | 讯飞一菲 | 普通话 | 成年女声 |
xiaomo | x2 | 讯飞小莫 | 普通话 | 成年女声 |
xiaoya | x2 | 讯飞小雅 | 普通话 | 成年女声 |
xiaolan | x2 | 讯飞小兰 | 普通话 | 成年女声 |
xiaoxue | x2 | 讯飞小雪 | 普通话 | 成年女声 |
xiaojuan | x2 | 讯飞小娟 | 普通话 | 成年女声 |
xiaoyuan | x2 | 讯飞小媛 | 普通话 | 成年女声 |
chongchong | x2 | 讯飞虫虫 | 普通话 | 成年女声 |
xiaoshi_cts | x2 | 讯飞小师 | 普通话 | 成年女声 |
qianqian | x2 | 讯飞倩倩 | 普通话 | 成年女声 |
qianxue2 | x2 | 讯飞千雪-情感 | 普通话 | 成年女声 |
xiaoding | x2 | 讯飞小丁 | 普通话 | 成年女声 |
xiaoxuan | x2 | 讯飞晓璇 | 普通话 | 成年女声 |
yiping | x2 | 讯飞一萍 | 普通话 | 成年女声 |
chunchun | x2 | 讯飞春春 | 普通话 | 成年女声 |
dangdang | x2 | 讯飞当当 | 普通话 | 成年女声 |
xiaoai_novel | x2 | 讯飞诺诺 | 普通话 | 成年女声 |
nannan | x2 | 讯飞楠楠 | 普通话 | 男童声 |
xiaoxin | x2 | 讯飞萌小新 | 普通话 | 男童声 |
ningning | x2 | 讯飞宁宁 | 普通话 | 男童声 |
xiaofang | x2 | 讯飞芳芳 | 普通话 | 女童声 |
xiaowanzi | x2 | 讯飞小桃丸 | 普通话 | 女童声 |
xiaofei | x2 | 讯飞小肥 | 安徽合肥话 | 成年男声 |
xiaoqian | x2 | 讯飞晓倩 | 东北话 | 成年女声 |
xiaokun | x2 | 讯飞小坤 | 河南话 | 成年男声 |
xiaowang | x2 | 讯飞小王 | 湖北话 | 成年男声 |
xiaoqiang | x2 | 讯飞小强 | 湖南话 | 成年男声 |
xiaodong | x2 | 讯飞小东 | 山东话 | 成年女声 |
xiaoying | x2 | 讯飞小莹 | 陕西话 | 成年女声 |
xiaorong | x2 | 讯飞小蓉 | 四川话 | 成年女声 |
xiaoyue | x2 | 小月 | 粤语 | 成年女声 |
sgron_dkar | x2 | 达娃 | 藏语 | 成年女声 |
xiaobao | x2 | 讯飞小包 | 内蒙古方言 | 成年男声 |
john | x2 | John | 英语 | 成年男声 |
catherine | x2 | 凯瑟琳 | 英语 | 成年女声 |
mohamed | x2 | mohamed | 阿拉伯语 | 成年女声 |
natali | x2 | natali | 波兰语 | 成年女声 |
christiane | x2 | christiane | 德语 | 成年女声 |
keshu | x2 | keshu | 俄语 | 成年女声 |
mariane | x2 | 玛丽安 | 法语 | 成年女声 |
annakz | x2 | annakz | 哈萨克语(西里尔) | 成年女声 |
miya | x2 | miya | 韩语 | 成年女声 |
malayrole | x2 | malayrole | 马来语 | 成年女声 |
zhongcun | x2 | zhongcun | 日语 | 成年女声 |
suparut | x2 | suparut | 泰语 | 成年女声 |
felisa | x2 | felisa | 西班牙语 | 成年女声 |
lrina | x2 | lrina | 意大利语 | 成年女声 |
abha | x2 | 艾伯哈 | 印地语 | 成年女声 |
# 离线TTS集成示例
XTTS需要将合成发音人资源放到本地进行加载(如需离线发音人资源请联系商务进行授权),然后在aiui.cfg 配置文件中修改合成引擎参数。调用方式与云端TTS相似,同样使用AIUIAgent发送CMD_TTS消息。
离线TTS资源包与授权需线下联系我们获取。
# 资源说明
- xtts_common.jet
离线tts基础资源包
- xtts_xiaoxue.jet
xiaoxue发音人资源包
离线合成发音人资源文件支持放到工程中的 assets 目录下,在配置时以 assets 资源类型指明在 assets 下的 相对路径,存在多个发音人资源时,使用 ; 分割。
具体配置可以参考下面配置文件中的资源类型和资源路径的配置。
# 配置文件
aiui.cfg 中使用离线语音合成配置:
"tts":{
"ent": "xtts", // 使用xtts
"engine_type": "local", // 离线引擎
"res_type": "assets", // 资源类型
"res_path": "xtts/xtts_common.jet;xtts/xtts_xiaoxue.jet",
"voice_name": "xiaoxue" // 指定合成发音人
},
注:sdk默认会播放云端下发的TTS音频,若不需要sdk直接播报,则需要在配置文件中配置tts参数,将play_mode配置为user,具体请参考云端TTS音频播放,开发者在EVENT_RESULT
事件中可以获取到下发的音频数据,由开发者自己进行播报,具体请参考音频结果解析。
# TTS代码示例
String ttsStr = "我是要合成的文本"; //得到待合成文本
byte[] ttsData = ttsStr.getBytes("utf-8"); //转为二进制数据
StringBuffer params = new StringBuffer(); //构建合成参数
params.append("vcn=xiaoyan"); //合成发音人
params.append(",speed=50"); //合成速度
params.append(",pitch=50"); //合成音调
params.append(",volume=50"); //合成音量
//开始合成
AIUIMessage startTts = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.START, 0, params.toString(), ttsData);
mAIUIAgent.sendMessage(startTts);
# 支持的发音人
发音人名称 | vcn取值 | 方言 |
凯瑟琳 | catherine | 英语 |
小雪 | xiaoxue | 普通话 |
# 语义后合成
在平台配置勾选交互音频下发功能后,设置好发音人,语言等参数,云端在得到语义结果后即调tts得到音频下发到客户端,开发者只需要解析对应的事件即可获得该音频数据。
注:有正常语义结果才有合成音频下发,如nlp语义结果rc字段为4则无音频下发。
# 音频结果解析
SDK接收到云端下发的音频后,会通过EVENT_RESULT抛出合成音频和缓存进度,音频数据编码格式为pcm,解析音频数据请参考以下示例:
private AIUIListener mAIUIListener = new AIUIListener() {
@Override
public void onEvent(AIUIEvent event) {
case AIUIConstant.EVENT_RESULT: {
try {
JSONObject bizParamJson = new JSONObject(event.info);
JSONObject data = bizParamJson.getJSONArray("data").getJSONObject(0);
JSONObject params = data.getJSONObject("params");
JSONObject content = data.getJSONArray("content").getJSONObject(0);
String sub = params.optString("sub");
if ("tts".equals(sub)) {
if (content.has("cnt_id")) {
String sid = event.data.getString("sid");
String cnt_id = content.getString("cnt_id");
byte[] audio = event.data.getByteArray(cnt_id); //合成音频数据
/**
*
* 音频块位置状态信息,取值:
* - 0(合成音频开始块)
* - 1(合成音频中间块,可出现多次)
* - 2(合成音频结束块)
* - 3(合成音频独立块,在短合成文本时出现)
*
* 举例说明:
* 一个正常语音合成可能对应的块顺序如下:
* 0 1 1 1 ... 2
* 一个短的语音合成可能对应的块顺序如下:
* 3
**/
int dts = content.getInt("dts");
int frameId = content.getInt("frame_id");// 音频段id,取值:1,2,3,...
int percent = event.data.getInt("percent"); //合成进度
boolean isCancel = "1".equals(content.getString("cancel")); //合成过程中是否被取消
}
}
} catch (Throwable e) {
e.printStackTrace();
}
} break;
default:
break;
}
}
};
# 音频播放控制
在aiui.cfg中配置tts字段即可,示例如下:
{
"tts": {
"play_mode": "sdk", // 播放模式,取值:sdk(内部播放,默认),user(外部自行播放)
"buffer_time": "0", // 音频缓冲时长,当缓冲音频大于该值时才开始播放,默认值:0ms
"stream_type": "3", // 播放音频流类型,取值参考AudioManager类,默认值:3
"audio_focus": "0" // 播放音频时是否抢占焦点,取值:1, 0(默认值)
}
}
若play_mode
设置为sdk,则云端下发的音频,sdk会自动播放(暂只支持Android系统),若设置为user,则由开发者在EVENT_RESULT中解析sub为tts
的事件,具体解析请参考tts结果解析。
当使用sdk自动播放时,sdk会抛出EVENT_TTS事件反馈合成进度等信息,示例如下:
private AIUIListener mAIUIListener = new AIUIListener() {
@Override
public void onEvent(AIUIEvent event) {
case AIUIConstant.EVENT_TTS: {
switch (event.arg1) {
case AIUIConstant.TTS_SPEAK_BEGIN:
showTip("开始播放");
break;
case AIUIConstant.TTS_SPEAK_PROGRESS:
showTip("缓冲进度为" + mTtsBufferProgress +
", 播放进度为" + event.data.getInt("percent")); // 播放进度
break;
case AIUIConstant.TTS_SPEAK_PAUSED:
showTip("暂停播放");
break;
case AIUIConstant.TTS_SPEAK_RESUMED:
showTip("恢复播放");
break;
case AIUIConstant.TTS_SPEAK_COMPLETED:
showTip("播放完成");
break;
default:
break;
}
} break;
default:
break;
}
}
};