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.6.3 流式合成
## 1. 前言 `流式合成`即使用特定发音人将合成文本进行分帧发送,常用于大模型流式输出的文本合成实现。现阶段支持流式合成方式的发音人类型有: - **`极速超拟人`** 在极速超拟人交互链路下,所有极速超拟人都免费开放开发者使用。各极速超拟人发音人见【[发音人列表](https://aiui-doc.xf-yun.com/project-1/doc-93/ "发音人列表")】说明。 - **`声音复刻`** 声音复刻能力需要先进行资源创建,具体接口调用详见【[声音复刻](https://aiui-doc.xf-yun.com/project-1/doc-801/ "声音复刻")】说明。 <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;">1、极速超拟人交互链路下,<b>普通发音人</b> 和 <b>超拟人发音人</b> 合成调用方式一样,调用方式见【<a href="https://aiui-doc.xf-yun.com/project-1/doc-23/">3.3.4 语音合成</a>】文档说明。</div> <div style="font-size: 14px; line-height: 1.5;">2、AIUI平台支持的发音人及分类详见【<a href="https://aiui-doc.xf-yun.com/project-1/doc-93/">3.8 发音人列表</a>】说明。</div> </div> </div> ## 2. 调用说明 ### 2.1 确认参数 **类型1**:使用极速超拟人发音人 - vcn:**x5_lingxiaoyue_flow** // 聆小玥 - scene:**IFLYTEK.tts** // 固定取值 **类型2**:使用声音复刻发音人 - vcn:**x5_clone** // 固定取值 - res_id:**fsdfwee234324** // 创建的资源id - scene:**IFLYTEK.tts** // 固定取值 ### 2.2 构建请求 <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;">1、背景说明:AIUI SDK进行流式合成时,当发送的文本内容为空,此请求SDK会忽略。</div> <div style="font-size: 14px; line-height: 1.5;">2、现象处理:使用大模型回复文本直接进行流式合成时,注意尾帧结果为空异常判断,为空时建议使用单个标点符号进行替换</div> </div> </div> - 请求代码示例(Android): **`特别说明`** :集成Android SDK做流式合成发送,还要在非首帧携带 cancel_last=false 参数,否则SDK内部出现合成打断。 ~~~ java /** * 流式合成。 * @param text 待合成文本 * @param cancel_last 是否合成打断(true:打断,false:不打断),该参数仅限 Android SDK使用 * @param vcn 发音人 (当使用声音时固定取值为 x5_clone ,并携带 res_id 参数) * @param data_status 流状态,首帧取值:0(开始),中间帧取值:1(继续),尾帧取值:2(结束) * @param tag 自定义标签(非必选) */ void startStreamTTS(String text, String vcn, int data_status, String tag) { try { // 在输入参数中设置tag,则对应结果中也将携带该tag,可用于关联输入输出 if(0 == data_status){ String params = "vcn=" + vcn + ",data_status=" + data_status + ",tag=" + tag; }else{ // Android sdk非首帧,流式合成携带不打断参数 String params = "cancel_last=false,vcn=" + vcn + ",data_status=" + data_status + ",tag=" + tag; } byte[] textData = text.getBytes("utf-8"); AIUIMessage ttsMessage = new AIUIMessage(AIUIConstant.CMD_TTS, AIUIConstant.START, 0, params, textData); mAIUIAgent.sendMessage(ttsMessage); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** * 一次完整示例。 */ void example() { // 待合成分段文本 String[] reqList = {"好嘞,","音量已经","调到一半","啦。"}; // 极速超拟人 String vcn = "x5_lingxiaoyue_flow"; // 声音复刻发音人 // String vcn = "x5_clone"; // String res_id = "fsdfwee234324"; int mode; String ttsText = null; for(int i=0 ; i < reqList.length ; i++){ if (i == 0) { // 首帧 mode = 0; }else if ( i == (reqList.length-1)) { // 尾帧 mode = 2; } else { // 中间帧 mode = 1; } // 合成文本 ttsText = reqList[i]; // 结束帧合成文本非空判断,使用任意标点替换一下 if(2==mode && ttsText.isEmpty()){ ttsText = "。"; } startStreamTTS(ttsText, vcn, mode, ""); } } ~~~ ## 3. 结果解析 AIUI SDK所有类型合成结果处理方式一致,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; } } }; ~~~
admin
2025年12月11日 14:58
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码