AIUI文档中心
AIUI平台说明
什么是AIUI
AIUI平台能力介绍
AIUI交互流程说明
AIUI快速入门
AIUI应用管理说明
应用接入和配置
应用后处理
敏感词
AIUI开发接入
AIUI接入概述
声学接入
交互接入
SDK接入
SDK介绍
参数配置
消息事件
交互状态
结果解析
WebSocketAPI接入
精简协议接入
常用功能
交互控制
语音唤醒
语音合成
用户个性化
自定义参数
离线命令词
翻译模式
流式识别
语义VAD
发音人列表
关键词过滤
情景模式
错误码
星火交互认知大模型说明
大模型概述
开发接入
SDK接入
API接入
大模型API服务鉴权
特色能力
超拟人合成
声音复刻
大模型功能
大模型错误码
软硬件产品接入
RK3328 降噪板
RK3328降噪板白皮书
RK3328降噪板使用手册
RK3328降噪板规格书
RK3328降噪板协议手册
RK3328 AIUI评估板开发套件
RK3328评估板白皮书
RK3328评估板使用手册
RK3328评估板规格书
RK3328评估板开发手册
RK3588 AIUI多模态开发套件
RK3588一体机多模态产品规格书
RK3588多模态套件使用手册
视频传输协议
串口通信协议
音频传输协议
ZG803 离线语音识别套件
ZG803 产品白皮书
USB声卡套件
USB声卡产品白皮书
USB声卡使用指南
AC7911 AIUI语音开发套件
AC7911-产品白皮书
AC7911-快速体验指南
AC7911-开发指南
AC7911-协议手册
AC7911-硬件参数
AIUI评估板接入
集成方式
软件包说明
AIUIServiceKitSDK
串口SDK
评估板参数配置
调试升级
技能工作室
技能概述
名词解析
技能
意图和语料
实体
动态实体
模糊匹配
填槽对话
技能设计规范
语音技能设计规范
开放技能接入审核规范
开放技能图标图片规范
技能开发
创建技能和意图
意图配置
技能测试
技能发布
技能后处理
技能导入导出
云函数APIv2.1
云函数APIv2.0
问答库开发
语句问答
关键词问答
文档问答
设备人设开发
技能协议
语义协议:重要字段和通用字段
技能后处理协议:标准请求
技能后处理协议:请求校验
技能后处理协议:Request_v2.1协议
技能后处理协议:Response_v2.1协议
技能资源限制
硬件设计参考
常见问题
AIUI常见问题
评估板常见问题
动态实体常见问题
联系方式
服务条款
AIUI开放平台服务协议
AIUI开放平台隐私政策
小飞在家用户协议
小飞在家隐私政策
小飞在家开源软件使用许可
讯飞账号隐私政策
讯飞账号用户协议
讯飞带屏音箱用户协议
讯飞带屏音箱隐私政策
AIUI SDK隐私政策
AIUI SDK合规使用说明
本文档使用 MrDoc 发布
-
+
首页
语音合成
## 发音人 ## [发音人列表](https://aiui-doc.xf-yun.com/project-1/doc-93/ "发音人列表") ## 合成分类 ## - [代码主动合成](https://aiui-doc.xf-yun.com/project-1/doc-23/#主动语音合成)(**推荐**):开发者主动调用合成接口。 - [语义后合成](https://aiui-doc.xf-yun.com/project-1/doc-23/#语义后合成):AIUI云端自动调用语音合成(取语义理解的answer字段的text值)。`开启后,所有技能回复都会自动合成,无法控制单个技能不合成` ## 主动合成 ## 免费发音人:小娟、聆小樱、聆小璇(在AIUI应用配置页面,开启语音合成能力并选择对应发音人进行保存来激活) ### 主动合成集成示例:在线TTS ### 注:一次请求最多合成2000字 ~~~ java // 获取待合成文本 String ttsStr = "我是要合成的文本"; // 转为二进制数据 byte[] ttsData = ttsStr.getBytes("utf-8"); // 构建合成参数,一般包含发音人、语速、音调、音量 StringBuffer params = new StringBuffer(); // 发音人,发音人列表:https://aiui-doc.xf-yun.com/project-1/doc-93/ params.append("vcn=x2_xiaojuan"); // 语速,取值范围[0,100] params.append(",speed=50"); // 音调,取值范围[0,100] params.append(",pitch=50"); // 音量,取值范围[0,100] params.append(",volume=50"); //开始合成 AIUIMessage startTTS = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.START, 0, params.toString(), ttsData); mAIUIAgent.sendMessage(startTTS); //取消合成 AIUIMessage cancelTTS = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.CANCEL, 0, params.toString(), ttsData); mAIUIAgent.sendMessage(cancelTTS); //暂停播放 AIUIMessage pauseTTS = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.PAUSE, 0, params.toString(), ttsData); mAIUIAgent.sendMessage(pauseTTS); //恢复播放 AIUIMessage resumeTTS = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.RESUME, 0, params.toString(), ttsData); mAIUIAgent.sendMessage(resumeTTS); ~~~ ### 主动合成集成示例:离线TTS ### 将合成发音人资源(联系商务)放到本地加载,修改aiui.cfg配置。合成接口与在线TTS一样。 #### 资源说明 - xtts_common.jet,离线tts通用配置 - xtts_xiaoxue.jet,发音人xiaoxue的资源文件 发音人文件放到 assets 目录下,aiui.cfg配置相对路径。多个发音人用 `; `分割。 #### 离线合成配置参考 aiui.cfg 配置: ~~~ json "tts":{ // 使用xtts "ent": "xtts", // 离线引擎 "engine_type": "local", // 资源类型 "res_type": "assets", //配置发音人 "res_path": "xtts/xtts_common.jet;xtts/xtts_xiaoxue.jet" }, ~~~ #### 离线发音人 联系讯飞确认 ## 语义后合成 ## AIUI平台打开语音合成开启。异常情况不会合成音频,如nlp语义理解未命中(rc=4)。 可在应用配置中开启: ![](/media/202212/2022-12-31_161927_6717350.7743681885128887.png) ### 音频结果解析 ### SDK在EVENT\_RESULT回调抛出合成音频和缓存进度,格式为16k 16bit pcm,解析示例: ~~~ java 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); //合成音频数据 /** * * dts:音频块进度信息,取值: * - 0(音频开始) * - 1(音频中间块,可出现多次) * - 2(音频结束) * - 3(独立音频,合成短文本时出现) * * 举例说明: * 常规合成dts顺序: * 0 1 1 1 ... 2 * 短文本合成dts顺序: * 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; } } }; ~~~ ## 播放模式 ## 1.SDK自动播放(默认) 2.使用第三方播放器 将aiui.cfg的play_mode配置为user(参考[TTS音频播放](https://aiui-doc.xf-yun.com/project-1/doc-23/#音频播放控制)),开发者在`EVENT_RESULT`事件中获取音频后自己播放(参考[音频结果解析](https://aiui-doc.xf-yun.com/project-1/doc-23/#音频结果解析))。 ## 音频播放控制 ## aiui.cfg配置示例: ~~~ json { "tts": { // 播放模式:sdk(sdk播放,默认,只支持安卓),user(开发者自己播放) "play_mode": "sdk", // 音频缓冲时长:缓冲音频大于buffer_time才播放,默认0ms "buffer_time": "0", // 音频类型,取值参考AudioManager类,默认值:3 "stream_type": "3", // 播放是否抢占焦点:1(抢占), 0(不抢占,默认) "audio_focus": "0" } } ~~~ ## 播放状态回调 ## 只支持Android,且播放模式为SDK: ~~~ java 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; } } }; ~~~ ## 其他 部分技能返回播报文本包含`[n1]`、`[k1]`等TTS发音辅助标识,可参考以下方法进行过滤消除。 ```java import java.util.regex.Matcher; import java.util.regex.Pattern; class TTSUtil { static String REPLACE_NULL = ""; static String REGEX_TTS_ASSIST_TAG = "\\[[a-z]\\d\\]"; public static void main(String[] args) { System.out.println(removeTTSAssistTag("The [a1] dog says meow.")); } public static String removeTTSAssistTag(String text){ Pattern regex = Pattern.compile(REGEX_TTS_ASSIST_TAG); Matcher input = regex.matcher(text); text = input.replaceAll(REPLACE_NULL); return text; } } ```
admin
2024年8月18日 19:37
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码