TTS SDK 接入

最近更新时间:2025-09-17 18:34:21

我的收藏

获取 SDK 文件

TTS SDK 文件在线下提供给客户的文件压缩包中,以“virtualhuman_apaas_sdk”开头的 aar 文件。

获取密钥

1. 进入 数智人平台 > 场景应用 > 会话互动,创建项目。

2. 在获取密钥菜单中,单击“查看密钥”,即可获取 appKey , accessToken 和 virtualmanProjectId 。


VirtualHumanApaas 接口说明

初始化接口

java
swift
oc
VirtualHumanApaas vha = VirtualHumanApaas.getInstance();
VirtualHumanApaasParam vhap = new VirtualHumanApaasParam();
vhap.appKey = BuildConfig.ttsAppkey;
vhap.accessToken = BuildConfig.ttsAccessToken;
vhap.virtualmanProjectId = BuildConfig.ttsVirtualmanProjectId;
vha.init(vhap);
let vha = VirtualHumanApaas.shared
let vhap = VirtualHumanApaasParam(
appKey: APASS_APP_KEY,
accessToken: APASS_ACCESS_TOKEN,
virtualmanProjectId: APASS_PROJECT_ID
)
vha.initApaas(vhap)
vha.callbackDelegate = self
VirtualHumanApaas* vha = [VirtualHumanApaas shared];
VirtualHumanApaasParam* vhap = [[VirtualHumanApaasParam alloc] init];
vhap.appKey = APASS_APP_KEY;
vhap.accessToken = APASS_ACCESS_TOKEN;
vhap.virtualmanProjectId = APASS_PROJECT_ID;
[vha initApaas:vhap];
vha.callbackDelegate = self;

设置回调

java
swift
oc
// error回调
vha.setErrorCallback((code, message) -> {
Log.e(TAG, code + ", " + message);
});
// 数据回调
vha.setDataCallback((result) -> {
String type = result.getDriverRspType();
if (type.equals("SPEECH")) {
VirtualHumanApaas.Result.SpeechRsp speechRsp = result.speechRsp;
// controller是数智人控制器,这里是结合端渲染sdk的使用
if (controller != null) {
controller.appendAudioData(speechRsp.getAudio(), speechRsp.isFinal());
}
} else {
VirtualHumanApaas.Result.ReplyRsp replyRsp = result.replyRsp;
Log.i(TAG, replyRsp.getReplyDisplay());
}
});
extension DemoTTSViewController: CallbackDelegate {
nonisolated func onData(_ result: VirtualHumanApaas.Result) {
let driverRspType = result.driverRspType
if (driverRspType != "SPEECH") {
print("tts data: \\(result.replyRsp?.replyType ?? ""), \\(result.replyRsp?.replyDisplay ?? "")")
}
else {
let data = result.speechRsp?.audio ?? Data()
let isFinal = result.speechRsp?.isFinal ?? true
DispatchQueue.main.async { [weak self] in
if (self?.controller != nil) {
self?.controller!.appendAudioData(data, metaData: "", isFinal: isFinal)
}
}
}
}
nonisolated func onError(_ code: Int, _ message: String) {
print("==========")
print("\\(code): \\(message)")
}
}
- (void)onData:(Result*)result {
NSString* driverRspType = [result driverRspType];
if (![driverRspType isEqualToString:@"SPEECH"]) {
NSLog(@"tts data: %@, %@", [[result replyRsp] replyType], [[result replyRsp] replyDisplay]);
} else {
NSData* data = [[result speechRsp] audio] ?: [NSData data];
BOOL isFinal = [[result speechRsp] isFinal];
dispatch_async(dispatch_get_main_queue(), ^{
if (self.controller != nil) {
[self.controller appendAudioData:data metaData:@"" isFinal:isFinal];
}
});
}
}

- (void)onError:(int)code message:(NSString*)message {
NSLog(@"==========");
NSLog(@"%d: %@", code, message);
}

驱动接口

参数

参数名称
数据类型
必选
说明
reqId
String
单次请求唯一标识,长度为32的 UUID ,流式输入时要保证同一个流 reqId 一致
seq
Int
流式文本序号,从1开始
isFinal
Boolean
流式文本分片的结束标记(每一段流式文本结束必须传入结束标记)
text
String
文本内容
java
swift
oc
String reqId = UUID.randomUUID().toString().replace("-", "");
vha.sendTTS(reqId, 1, true, "这是一句话。");
let reqId = UUID().uuidString.replacingOccurrences(of: "-", with: "").lowercased()
let text = "你好"
vha.sendTTS(reqId: reqId, seq: 1, isFinal: true, text: text)
NSString* reqId = [[[NSUUID UUID] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""].lowercaseString;
NSString* text = @"你好";
[self.vha sendTTSWithReqId:reqId seq:1 isFinal:YES text:text];

对话接口

注意:
创建项目时,必须是对话项目,否则接口会返回错误。

参数

参数名称
数据类型
必选
说明
reqId
String
单次请求唯一标识,长度为32的 UUID
streamId
String
会话 ID,用于区分多轮会话,长度为32的 UUID(不包含‘-’)
text
String
文本内容
java
swift
oc
String reqId = UUID.randomUUID().toString().replace("-", "");
String text = "Hi~ 你好。";
String streamId = UUID.randomUUID().toString().replace("-", "");
vha.sendChat(reqId, streamId, text);
let reqId = UUID().uuidString.replacingOccurrences(of: "-", with: "").lowercased()
let streamId = UUID().uuidString.replacingOccurrences(of: "-", with: "").lowercased()
let text = "你好"
vha.sendChat(reqId: reqId, streamId: streamId, text: text)
NSString* reqId = [[[NSUUID UUID] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""].lowercaseString;
NSString* streamId = [[[NSUUID UUID] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""].lowercaseString;
NSString* text = @"你好";
[self.vha sendChatWithReqId:reqId streamId:streamId text:text];

停止中断

java
swift
oc
vha.stopTTS();
vha.stopTTS()
[vha stopTTS];

设置音色

注意:
无效的音色值,会引发接口错误。

参数

数据类型
必选
说明
String
音色资产 ID
java
swift
oc
vha.setTimbreKey("音色资产ID")
vha.setTimbreKey("音色值")
[vha setTimbreKey:@"音色值"];
音色资产 ID 获取方式:数智人平台 > 资产管理中心 > 声音资产 > 资产 ID

设置播放速度

参数

数据类型
必选
说明
Float
0.5f 到 2.0f 范围内
java
swift
oc
vha.setSpeed(0.5f);
vha.setSpeed(0.5)
[vha setSpeed:0.5f];


其他参数说明

VirtualHumanParam 参数说明

参数名称
数据类型
必选
说明
appKey
String
获取密钥里的参数
accessToken
String
获取密钥里的参数
virtualmanProjectId
String
获取密钥里的参数
disableTls
Boolean
是否​​禁用 TLS 协议,默认值 false
serverDomain
String
设置私有化域名, 默认公有云域名

VirtualHumanApaas 回调函数参数 Result 格式说明

参数名称
数据类型
说明
reqId
String
单次请求 ID,和入参一致
driverRspType
String
响应类型
REPLY:返回 ReplyRsp,对应会话信息
SPEECH:返回 SpeechRsp,对应音频信息
replyRsp
ReplyRsp
会话响应,当 driverRspType 为 REPLY 时返回
speechRsp
SpeechRsp
音频信息响应,当 driverRspType 为 SPEECH 时返回

ReplyRsp

参数名称
数据类型
说明
replyType
String
回复语类型。
cloudAiGpt:腾讯云大模型对话
yunxiaowei:云小微客服对话
cloudAiWaiting:首包超时等待话术
cloudAiTimeOut:超时未响应话术,会话结束
sensitive:输入文本或回复语中包含敏感内容时,返回的固定话术
input:InputText 为纯文本或流式文本时输入的内容
enhanceText:未配置对话服务时,匹配到话术管理的内容
cloudAiThought:腾讯云大模型思考过程内容
replyPro
String
播报内容,包含 SSML 标签
replyDisplay
String
展示内容,包含富文本标签
interactionType
String
特殊消息类型
interactionContent
String
特殊消息内容,用于下发弹窗、图片等非文本类的特殊消息
uninterrupt
Boolean
当前播报内容是否可打断
muted
Boolean
当前播报内容,是否关闭收音
seqNo
Int
子句序号,当 replyType 为 cloudAiGpt 时,正常回复语序号从1开始,其余固定话术从0开始
contentType
Int
回复语内容类型
0:未知
1:普通字符串
2:有序列表
3:无序列表
4:图片链接
5:http链接
6:表格
8:标题
9:SSML
ttsSupport
Boolean
当前子句是否播报
isFinal
Boolean
是否为最后一句
isHighLight
Boolean
是否需要高亮展示

SpeechRsp

参数名称
数据类型
说明
audio
Android:byte[]
iOS:Data/NSData
PCM 音频数据
isFinal
Boolean
整句结束标识
sampling
Int
采样率
seqNo
Int
子句序号
subtitleInfo
Array of [SubtitleInfo]
字幕信息

SubtitleInfo

参数名称
类型
描述
Word
String
对应单词
Start
String
起始时间点,单位为0.1us,该数值/10000为ms
End
String
结束时间点,单位为0.1us,该数值/10000为ms
PosStart
String
文本中的起始 unicode 位置,注意为左闭右开形式 [PosStart,PosEnd)
PosEnd
String
文本中的结束 unicode 位置,注意为左闭右开形式 [PosStart,PosEnd)

接入示例

Android

将数智人端渲染 SDK 的 aar 包引导到项目中,aar 包文件命名格式为:virtualhuman_tts_sdk_版本信息.aar。
由于使用了 OkHttp 库,所以需要在项目的 build.gradle(Module:app)文件中添加 OkHttp 的依赖。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
// 添加OkHttp的依赖
implementation("com.squareup.okhttp3:okhttp:4.9.0")
}
示例
VirtualHumanApaas vha = VirtualHumanApaas.getInstance();
VirtualHumanApaasParam vhap = new VirtualHumanApaasParam();
vhap.appKey = BuildConfig.ttsAppkey;
vhap.accessToken = BuildConfig.ttsAccessToken;
vhap.virtualmanProjectId = BuildConfig.ttsVirtualmanProjectId;
// error回调
vha.setErrorCallback((code, message) -> {
Log.e(TAG, code + ", " + message);
});
// 数据回调
vha.setDataCallback((result) -> {
String type = result.getDriverRspType();
if (type.equals("SPEECH")) {
VirtualHumanApaas.Result.SpeechRsp speechRsp = result.speechRsp;
// controller是数智人控制器,这里是结合端渲染sdk的使用
if (controller != null) {
controller.appendAudioData(speechRsp.getAudio(), speechRsp.isFinal());
}
} else {
VirtualHumanApaas.Result.ReplyRsp replyRsp = result.replyRsp;
Log.i(TAG, replyRsp.getReplyDisplay());
}
});
vha.init(vhap);

iOS

将 Framework 添加到工程中, 嵌入方式选择: Embed & Sign 。

并引入头文件:
在 Objective-C 中使用时,直接引入头文件, 在 Swift 中使用时, 需要在 xxxxx-Bridging-Header.h 文件中引入头文件。
#import <TencentVirtualHumanAPaasSDK/TencentVirtualHumanAPaasSDK-Swift.h>
示例
swift
oc
import UIKit
import TencentVirtualHumanAPaasSDK

class DemoTTSViewController: UIViewController {

let vha = VirtualHumanApaas.shared
override func viewDidLoad() {
super.viewDidLoad()
let vhap = VirtualHumanApaasParam(
appKey: APASS_APP_KEY,
accessToken: APASS_ACCESS_TOKEN,
virtualmanProjectId: APASS_PROJECT_ID
)
vha.initApaas(vhap)
vha.callbackDelegate = self
}
}

extension DemoTTSViewController: CallbackDelegate {
nonisolated func onData(_ result: VirtualHumanApaas.Result) {
// 处理回调数据
}
nonisolated func onError(_ code: Int, _ message: String) {
print("\\(code): \\(message)")
}
}
#import <UIKit/UIKit.h>
#import <TencentVirtualHumanAPaasSDK/TencentVirtualHumanAPaasSDK-Swift.h>

@interface DemoTTSViewController : UIViewController <CallbackDelegate>

@end

@implementation DemoTTSViewController

- (void)viewDidLoad {
[super viewDidLoad];
VirtualHumanApaas* vha = [VirtualHumanApaas shared];
VirtualHumanApaasParam* vhap = [[VirtualHumanApaasParam alloc] init];
vhap.appKey = APASS_APP_KEY;
vhap.accessToken = APASS_ACCESS_TOKEN;
vhap.virtualmanProjectId = APASS_PROJECT_ID;
[vha initApaas:vhap];
vha.callbackDelegate = self;
}

#pragma mark - CallbackDelegate

- (void)onData:(Result*)result {
// 处理回调数据
}

- (void)onError:(int)code message:(NSString*)message {
NSLog(@"%d: %@", code, message);
}

@end