AIUI文档中心
AIUI文档导览
1. AIUI平台服务
1.1 AIUI平台介绍
1.2 AIUI应用介绍
1.3 AIUI服务链路介绍
1.4 AIUI平台能力概述
1.5 快速体验
2. AIUI应用配置
2.1 应用发布
2.2 语义精简协议介绍
2.3 基础配置
2.4 语义模型配置
2.5 回复角色配置
2.6 语音识别配置
2.7 结构化语义配置
2.8 星火大模型配置
2.9 语音合成配置
2.10 应用后处理配置
2.11 三方大模型配置
2.12 流畅全双工交互配置
2.13 表情标签配置
2.14 长时记忆配置
2.15 声纹识别配置
3. AIUI SDK开发
3.1 AIUI SDK接入流程
3.2 AIUI SDK基础信息
3.2.1 SDK接口说明
3.2.2 参数配置说明
3.2.3 消息事件说明
3.2.4 SDK状态说明
3.2.5 数据发送方式
3.2.6 回调解析说明
3.2.7 交互结果协议说明
3.3 AIUI SDK基础能力
3.3.1 流式识别
3.3.2 离线识别
3.3.3 语音唤醒
3.3.4 语音合成
3.3.5 用户个性化
3.3.6 自定义参数
3.4 传统语义链路接入
3.4.1 链路配置说明
3.4.2 个性化数据使用
3.5 通用大模型链路接入
3.5.1 链路配置说明
3.5.2 个性化数据使用
3.5.3 超拟人合成
3.5.4 声音复刻
3.6 极速超拟人链路接入
3.6.1 链路配置说明
3.6.2 个性化数据使用
3.6.3 流式合成
3.6.4 声音复刻
3.6.5 RTOS系统SDK接入
3.7 错误码列表
3.8 发音人列表
4. AIUI API开发
4.1 传统语义链路
4.1.1 交互API
4.1.2 用户个性化API
4.1.3 合成能力使用
4.2 通用大模型链路
4.2.1 服务鉴权
4.2.2 交互API
4.2.3 用户个性化API
4.2.4 声音复刻API
4.2.5 合成能力使用
4.3 极速超拟人链路
4.3.1 服务鉴权
4.3.2 交互API
4.3.3 用户个性化API
4.3.4 声音复刻API
4.3.5 合成能力使用
4.3.6 声纹管理API
5. 自定义业务
技能工作室概述
名词解析
技能
意图和语料
实体
动态实体
模糊匹配
填槽对话
技能设计规范
语音技能设计规范
开放技能接入审核规范
开放技能图标图片规范
技能开发
创建技能和意图
意图配置
技能测试
技能发布
技能后处理
技能导入导出
云函数APIv2.1
云函数APIv2.0
智能体开发
智能体对接
问答库开发
语句问答
关键词问答
文档问答
设备人设开发
技能协议
语义协议:重要字段和通用字段
技能后处理协议:标准请求
技能后处理协议:请求校验
技能后处理协议:Request_v2.1协议
技能后处理协议:Response_v2.1协议
技能资源限制
6. 硬件模组
RK3328 降噪板
RK3328降噪板白皮书
RK3328降噪板使用手册
RK3328降噪板规格书
RK3328降噪板协议手册
RK3328 AIUI评估板开发套件
RK3328评估板白皮书
RK3328评估板使用手册
RK3328评估板规格书
RK3328评估板开发手册
RK3588s 极简通用多模态开发套件
RK3588s 极简多模态套件白皮书
RK3588s 极简多模态套件使用手册
RK3588 AIUI多模态开发套件
RK3588一体机多模态产品规格书
RK3588多模态套件使用手册
视频传输协议
识别语义传输协议
音频传输协议
AIUI类型消息事件
ZG803 离线语音识别套件
ZG803 产品白皮书
USB声卡套件
USB声卡产品白皮书
USB声卡使用指南
AC7911B AIUI语音开发套件
AC7911B-产品白皮书
AC7911B-快速体验指南
AIUI评估板接入
集成方式
软件包说明
AIUIServiceKitSDK
串口SDK
评估板参数配置
调试升级
7. 常见问题处理
7.1 AIUI常见问题
7.2 评估板常见问题
7.3 动态实体常见问题
8. 联系方式
9. 服务条款
AIUI开放平台服务协议
AIUI开放平台隐私政策
小飞在家用户协议
小飞在家隐私政策
小飞在家开源软件使用许可
讯飞账号隐私政策
讯飞账号用户协议
讯飞带屏音箱用户协议
讯飞带屏音箱隐私政策
AIUI SDK隐私政策
AIUI SDK合规使用说明
本文档使用 MrDoc 发布
-
+
首页
3.3.4 语音合成
<div style="max-width: 100%; margin: 20px auto;"> <!-- 便签卡片容器 --> <div style="background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); overflow: hidden; font-family: 'Comic Sans MS', cursive, sans-serif;"> <!-- 便签头部 --> <div style="background-color: #F4F8FA; padding: 1px 10px; border-bottom: 1px solid #dee2e6; display: flex; justify-content: space-between; align-items: center;"> <div style="color: #0E42D2; font-weight: bold;font-size: 1.3rem;">概述</div> <div> </div> </div> <!-- 带横线的内容区域 --> <div style="padding: 25px; line-height: 29px; background-image: linear-gradient(transparent 26px, #dee2e6 27px, #dee2e6 27px, transparent 27px); background-size: 100% 28px; min-height: 100px; color: #333;"> <div>语音合成是以指定文本生成音频的能力。AIUI服务链路支持两种合成方案: <br><strong>- 全链路合成托管(语义后合成) <br>- 主动发送文本合成</strong></div> 如需了解AIUI平台支持的发音人列表,可以查看 <a href="https://aiui-doc.xf-yun.com/project-1/doc-93/ "发音人列表"" style="font-weight: 500;">发音人列表</a>详细了解。 <br><a href="#合成调用" style="color: #6f42c1; font-weight: 500;"> <strong>- 1.合成调用>>>点击跳转</strong></a> <a href="#结果解析" style="color: #6f42c1; font-weight: 500;margin-left: 40px;">    <strong>- 2.结果解析>>>点击跳转</strong></a> <a href="#播放处理" style="color: #6f42c1; font-weight: 500;margin-left: 40px;"> <br><strong>- 3.播放处理>>>点击跳转</strong></a> <a href="#过滤合成标记" style="color: #6f42c1; font-weight: 500;margin-left: 40px;">    <strong>- 4.过滤合成标记>>>点击跳转</strong></a> <div></div> </div> <!-- 便签底部 --> </div> </div> </div> <div id="集成说明"> </div> <div style="display: flex; align-items: flex-start; gap: 16px; padding: 16px; background: #fff5f6; border-radius: 5px; border-left: 4px solid #e83e8c; box-shadow: 0 4px 12px rgba(255, 215, 0, 0.08); margin-bottom: 16px; transition: transform 0.2s ease, box-shadow 0.2s ease;"> <div> <div style="font-weight: 600; margin-bottom: 4px;">温馨提示</div> <div style="font-size: 14px; line-height: 1.5;">语义后合成开启后会对所有交互请求的相关信息进行处理,无法指定相关对话做干预。如果开发者需要端侧结合业务处理结果做播报,建议关闭语义后合成,使用主动合成方式。</div> </div> </div> ## 1. 合成调用 ### 1.1. 语义后合成 语义后合成指的是在AIUI应用下开启语音合成,单次交互过程中,AIUI服务链路根据配置,将技能结果或应用后处理结果或大模型结果获取的文本内容送入合成引擎直接合成。 **使用方式**: AIUI应用下开启语音合成配置需要发音人后即可。详见语音合成配置或回复角色配置。 <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td style="text-align: center;"> <h2>语义后合成开关</h2> </td> </tr> <tr> <td style="overflow-x: auto; white-space: nowrap;"> <img src="/media/202508/2025-08-21_193828_0804510.10122284532328807.png" alt="Image 1" style="max-height: 300px;"> <img src="/media/202508/2025-08-21_193909_3135880.09802744953166231.png" alt="Image 3" style="max-height: 300px;"> </td> </tr> </table> ### 2.2. 主动合成 <div style="max-width: 100%; margin: 20px auto;"> <div style="background-color: #ffffff; border-radius: 5px; padding: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.05);border-top: 5px solid #e0e0e0;"> <h3 style="margin: 0 0 10px 0; color: #0969DA; font-size: 18px;">概述</h3> <p style="margin: 0; color: #666; font-size: 16px; line-height: 1.6;">主动合成是SDK端构建需要的合成文本后直接发送文本合成请求,根据使用合成合成引擎不同分为:</p> <a href="#在线主动合成" style="color: #6f42c1; font-weight: 500;"> -1. 在线主动合成>>>点击跳转   </a> <a href="#离线主动合成" style="color: #6f42c1; font-weight: 500;"> -2. 离线主动合成>>>点击跳转</a> </div> </div> #### 2.2.1. 在线主动合成 **发音人激活** 主动合成方式需要端侧在请求参数中指定发音人名称,故使用的发音人要先确认以激活授权。 AIUI平台提供很多免费发音人,详见【[发音人列表](https://aiui-doc.xf-yun.com/project-1/doc-93/ "发音人列表")】说明。免费发音人激活方式: - 登录到AIUI应用配置页面 - 开启语义后合成模块 - 选择需要的免费发音人,配置后即可激活发音人 - 激活发音人后按照业务需要是否保留语义后合成模块开关 **接口调用** <div style="display: flex; align-items: center; background-color: #fff3cd; border-left: 6px solid #ffc107; border-radius: 4px; padding: 12px 16px; gap: 8px;"> <div style="width: 30px; height: 30px; flex-shrink: 0;"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/> </svg> </div> <div style="flex: 1; line-height: 1.6;"> <h3 style="margin: 0 0 6px 0; font-weight: 600;">注意:</h3> <p style="margin: 0; font-size: 0.95rem;">一次请求最多合成2000字</p> </div> </div> ~~~ 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); ~~~ #### 2.2.2. 离线主动合成 #### 2.2.2.1. 获取SDK AIUI平台应用下下载的通用SDK开发包,默认仅支持在线语音交互能力【唤醒除外】,需要支持离线合成SDK,需要联系讯飞商务申请,申请方式有: - 方式1:邮件联系[技术支持](mailto:aiui_support@iflytek.com)说明需求,并提供有效信息 - 公司名称 - 联系人方式 - 产品需求描述 - AIUI应用appid信息 - 方式2:添加AIUI QQ交流群(575396706)联系讯飞技术同事咨询。 获取支持离线识别能力SDK后,AIUI输出的资源包中,一般包含两部分: - 开启了离线能力的SDK原始库 - 绑定appid的离线合成引擎资源(xtts_common.jet)、离线发音人资源(例如 xtts_xiaoxue.jet) #### 2.2.2.2. 参数配置 `aiui.cfg`中增加离线合成相关配置,多个发音人用 `; `分割。 ~~~ json "tts":{ // 使用xtts "ent": "xtts", // 离线引擎 "engine_type": "local", // 资源类型 "res_type": "assets", //配置发音人 "res_path": "xtts/xtts_common.jet;xtts/xtts_xiaoxue.jet" }, ~~~ <table> <tr> <td colspan="2" align="center"><b>模块名称</b></td> <td colspan="3" align="center"><b>模块说明</b></td> </tr> <tr> <td><b>模块名称</b></td> <td><b>模块说明</b></td> <td><b>参数名称</b></td> <td><b>是否必传</b></td> <td><b>参数和取值说明</b></td> </tr> <tr> <td rowspan="4"><b>tts</b></td> <td rowspan="4">合成参数</td> <td>ent</td> <td>是</td> <td><b>合成引擎类型</b><br>固定取值 xtts</td> </tr> <tr> <td>engine_type</td> <td>是</td> <td><b>合成服务类型</b><br>cloud:在线合成<br>local:离线合成</td> </tr> <tr> <td>res_type</td> <td>是</td> <td><b>离线合成资源加载方式</b><br>assets:assets资源路径(apk工程的assets文件)<br>path:path资源路径(sdcard文件) </td> </tr> <tr> <td>res_path</td> <td>是</td> <td><b>离线合成资源文件路径</b><br>先配置合成引擎资源,在配置合成发音人资源(可多个),每个资源用;隔开<br>例:xtts/xtts_common.jet;xtts/xiaoxue.jet;xtts/xiaofeng.jet</td> </tr> </table> #### 2.2.2.3. 接口调用 与在线主动合成调用方式一致,重点需要注意离线发音人资源名称取值不要弄错 <div style="display: flex; align-items: flex-start; gap: 16px; padding: 16px; background: #fff5f6; border-radius: 5px; border-left: 4px solid #e83e8c; box-shadow: 0 4px 12px rgba(255, 215, 0, 0.08); margin-bottom: 16px; transition: transform 0.2s ease, box-shadow 0.2s ease;"> <div> <div style="font-weight: 600; margin-bottom: 4px;">温馨提示</div> <div style="font-size: 14px; line-height: 1.5;">离线发音人资源名称在讯飞提供的资源文件中会表明,如 xtts_xiaoxue.jet 对应的发音人即 xiaoxue。</div> </div> </div> ~~~ java // 获取待合成文本 String ttsStr = "我是要合成的文本"; // 转为二进制数据 byte[] ttsData = ttsStr.getBytes("utf-8"); // 构建合成参数,一般包含发音人、语速、音调、音量 StringBuffer params = new StringBuffer(); // 离线发音人 params.append("vcn=xiaoxue"); //离线主动合成 AIUIMessage startTTS = new AIUIMessage(AIUIConstant.CMD_TTS,AIUIConstant.START, 0, params.toString(), ttsData); mAIUIAgent.sendMessage(startTTS); ~~~ ## 3. 结果解析 AIUI SDK在EVENT_RESULT回调抛出合成音频和缓存进度,默认合成音频格式为`16k 16bit pcm`,Android 示例如下: ~~~ 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; } } }; ~~~ ## 4. 播放处理 ### 4.1. 播放处理参数配置 AIUI SDK通过配置参数`tts`下的`play_mode`配置项来指定合成音频播报处理方式: - `sdk` 代表托管AIUI SDK调用系统播放器进行合成音频播报 - `user` 代表SDK不进行合成音频处理,开发者外部自行处理合成音频数据 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" } } ~~~ ### 4.2. 托管系统播报时播放状态 当配置播放模式`play_mode`取值为`sdk`时,`Android`端系统回调状态信息如下: ~~~ 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; } } }; ~~~ ## 5. 过滤合成标记 部分技能结果的回复语文本中包含`[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
2025年9月15日 11:19
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码