# 概览

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();
				}
			} breakdefault:
				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;
		}
	}
};