获取 SDK 文件
TTS SDK 文件在线下提供给客户的文件压缩包中,以“virtualhuman_apaas_sdk”开头的 aar 文件。
获取密钥
1. 进入 数智人平台 > 场景应用 > 会话互动,创建项目。

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

VirtualHumanApaas 接口说明
初始化接口
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.sharedlet 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;
设置回调
// 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.driverRspTypeif (driverRspType != "SPEECH") {print("tts data: \\(result.replyRsp?.replyType ?? ""), \\(result.replyRsp?.replyDisplay ?? "")")}else {let data = result.speechRsp?.audio ?? Data()let isFinal = result.speechRsp?.isFinal ?? trueDispatchQueue.main.async { [weak self] inif (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 | 是 | 文本内容 |
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 | 是 | 文本内容 |
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];
停止中断
vha.stopTTS();
vha.stopTTS()
[vha stopTTS];
设置音色
注意:
无效的音色值,会引发接口错误。
参数
数据类型 | 必选 | 说明 |
String | 是 | 音色资产 ID |
vha.setTimbreKey("音色资产ID");
vha.setTimbreKey("音色值")
[vha setTimbreKey:@"音色值"];
设置播放速度
参数
数据类型 | 必选 | 说明 |
Float | 是 | 0.5f 到 2.0f 范围内 |
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>
示例
import UIKitimport TencentVirtualHumanAPaasSDKclass DemoTTSViewController: UIViewController {let vha = VirtualHumanApaas.sharedoverride 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