
功能 | AI 智能客服场景应用 |
实时音视频 | 流式传输技术可以确保语音和视频数据的连续性和稳定性,减少延迟和抖动,提供接近于真人客服通话的高质量体验。用户可以与智能客服系统进行更自然的对话,就像是在和真人客服交谈一样,这种互动体验可以显著提升用户满意度。 |
AI 实时对话 | 腾讯 AI 实时对话解决方案,支持客户灵活接入多家 AI 大模型服务,实现 AI 与用户之间的实时音视频互动,打造符合业务场景的 AI 实时对话能力。基于腾讯 RTC 全球低延迟传输,语音对话延迟低至1s,对话效果自然拟真,接入便捷,开箱即用。 |
语音转文字 STT | STT 模块实时捕获用户的语音流并将其转换为文本,随后发送给 LLM 进行处理。STT 模块依托 TRTC 超低延迟音频管线以及先进音频处理能力,AI 降噪和回声消除,即使在嘈杂环境中也能提供清晰、准确的转录。 |
大语言模型 LLM | LLM 技术使智能语音客服能够更好地理解对话的上下文,从而实现连贯的对话交流。LLM 可以捕捉对话中的语义和语境信息,识别用户意图,并将上一轮对话的内容与当前对话关联起来。 |
文字转语音 TTS | 支持接入第三方 TTS,通过在模型中引入个性化的训练数据或调整模型的参数,可以生成符合特定要求的语音输出。智能语音客服可以根据用户的偏好或特定场景的需求,提供不同的语音风格。 |



TRTCAppSceneAudioCall 或数字人视频客服:TRTCAppSceneVideoCall。// 开启麦克风采集,并设置当前场景为:语音模式(高噪声抑制能力、强弱网络抗性)mCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);
self.trtcCloud = [TRTCCloud sharedInstance];// 开启麦克风采集,并设置当前场景为:语音模式(高噪声抑制能力、强弱网络抗性)[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];
// 开启麦克风采集,并设置当前场景为:语音模式(高噪声抑制能力、强弱网络抗性)trtcCloud.startLocalAudio(TRTCAudioQuality.speech);
await trtc.startLocalAudio({ option: { profile: TRTC.TYPE.AUDIO_PROFILE_STANDARD }});
// 开启麦克风采集,设置当前场景为:语音模式// 具有高的噪声抑制能力,有强有弱的网络阻力ITRTCCloud* trtcCloud = CRTCWindowsApp::GetInstance()->trtc_cloud_;trtcCloud->startLocalAudio(TRTCAudioQualitySpeech);
// 开启麦克风采集,设置当前场景为:语音模式// 具有高的噪声抑制能力,有强有弱的网络阻力AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];[appDelegate.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];
STTConfig、LLMConfig、TTSConfig 中。STTConfig。{"Language": "zh","VadSilenceTime": 1000}
LLMConfig。字段 | 类型 | 必填 | 说明 |
LLMType | String | 是 | 大模型类型,只要是符合 OpenAI API 协议的大模型,都填写 openai。 |
Model | String | 是 | 具体的模型名称,例如 gpt-4o、deepseek-chat。 |
APIKey | String | 是 | 大模型的 APIKey。 |
APIUrl | String | 是 | 大模型的 APIUrl。 |
Streaming | Boolean | 否 | 是否流式,默认为 false,建议填 true。 |
SystemPrompt | String | 否 | 系统提示词。 |
Timeout | Float | 否 | 超时时间,取值范围 [1,50], 默认为 3 秒(单位:秒)。 |
History | Integer | 否 | 设置 LLM 的上下文轮次,默认值:0(不提供上下文管理),最大值:50(提供最近50轮的上下文管理)。 |
MaxTokens | Integer | 否 | 输出文本的最大 token 限制。 |
Temperature | Float | 否 | 采样温度。 |
TopP | Float | 否 | 采样的选择范围,控制输出 token 的多样性。 |
UserMessages | Object[] | 否 | 用户提示词。 |
MetaInfo | Object | 否 | 自定义参数,会放在请求的 body 中透传给大模型。 |
{"LLMType": "openai","Model": "gpt-4o","APIKey": "api-key","APIUrl": "https://api.openai.com/v1/chat/completions","Streaming": true,"SystemPrompt": "你是一个个人助手","Timeout": 3.0,"History": 5,"MetaInfo": {},"MaxTokens": 4096,"Temperature": 0.8,"TopP": 0.8,"UserMessages": [{"Role": "user","Content": "content"},{"Role": "assistant","Content": "content"}]}
TTSConfig。字段 | 类型 | 必填 | 说明 |
TTSType | String | 是 | 固定值:"flow"。 |
VoiceId | String | 是 | |
Model | String | 是 | TTS 模型版本。当前默认:flow_01_turbo。 |
Speed | Float | 否 | 语速。范围:[0.5,2.0]。默认值:1.0。 |
Volume | Float | 否 | 音量。范围:[0,10]。默认值:1.0。 |
Pitch | Integer | 否 | 音调调整。范围:[-12,12]。默认值:0。 |
Language | String | 否 | 语言 ID:zh(中文)、en(英文)、yue(粤语)。 |
{"TTSType": "flow","VoiceId": "v-female-R2s4N9qJ","Model": "flow_01_turbo","Speed": 1.0,"Volume": 1.0,"Pitch": 0,"Language": "zh"}
STTConfig、LLMConfig 和 TTSConfig 配置说明:RoomId 需要和客户端进房的 RoomId 保持一致,并且房间号类型(数字房间号、字符串房间号)也必须相同(即机器人和用户需要确保在同一个房间)。TargetUserId 需要和客户端用户进房使用的 UserId 一致。LLMConfig 和 TTSConfig 均为 JSON 字符串,需要正确配置才能成功发起 AI 实时对话。{"type": 10000, // 10000表示是下发的实时字幕"sender": "user_a", // 说话人的userid"receiver": [], // 接收者userid列表,该消息实际是在房间内广播"payload": {"text":"", // 语音识别出的文本"translation_text":"", // 翻译的文本"start_time":"00:00:01", // 这句话的开始时间"end_time":"00:00:02", // 这句话的结束时间"roundid": "xxxxx", // 唯一标识一轮对话"end": true // 如果为true,代表这是一句完整的话}}
{"type": 10001, // AI 机器人的状态"sender": "user_a", // 发送者userid,这里是机器人的id"receiver": [], // 接受者userid列表,该消息实际是在房间内广播"payload": {"roundid": "xxx", // 唯一标识一轮对话"timestamp": 123,"state": 1, // 1 聆听中 2 思考中 3 说话中 4 被打断}}
@Overridepublic void onRecvCustomCmdMsg(String userId, int cmdID, int seq, byte[] message) {String data = new String(message, StandardCharsets.UTF_8);try {JSONObject jsonData = new JSONObject(data);Log.i(TAG, String.format("receive custom msg from %s cmdId: %d seq: %d data: %s", userId, cmdID, seq, data));} catch (JSONException e) {Log.e(TAG, "onRecvCustomCmdMsg err");throw new RuntimeException(e);}}
func onRecvCustomCmdMsgUserId(_ userId: String, cmdID: Int, seq: UInt32, message: Data) {if cmdID == 1 {do {if let jsonObject = try JSONSerialization.jsonObject(with: message, options: []) as? [String: Any] {print("Dictionary: \\(jsonObject)")} else {print("The data is not a dictionary.")}} catch {print("Error parsing JSON: \\(error)")}}}
trtcClient.on(TRTC.EVENT.CUSTOM_MESSAGE, (event) => {let data = new TextDecoder().decode(event.data);let jsonData = JSON.parse(data);console.log(`receive custom msg from ${event.userId} cmdId: ${event.cmdId} seq: ${event.seq} data: ${data}`);if (jsonData.type == 10000 && jsonData.payload.end == false) {// 字幕中间状态} else if (jsonData.type == 10000 && jsonData.payload.end == true) {// 一句话说完了}});
void onRecvCustomCmdMsg(const char* userId, int cmdID, int seq,const uint8_t* message, uint32_t msgLen) {std::string data;if (message != nullptr && msgLen > 0) {data.assign(reinterpret_cast<const char*>(message), msgLen);}if (cmdID == 1) {try {auto j = nlohmann::json::parse(data);std::cout << "Dictionary: " << j.dump() << std::endl;} catch (const std::exception& e) {std::cerr << "Error parsing JSON: " << e.what() << std::endl;}return;}}
void onRecvCustomCmdMsg(String userId, int cmdID, int seq, String message) {if (cmdID == 1) {try {final decoded = json.decode(message);if (decoded is Map<String, dynamic>) {print('Dictionary: $decoded');} else {print('The data is not a dictionary. Raw: $decoded');}} catch (e) {print('Error parsing JSON: $e');}return;}}
type | 说明 |
20000 | 发送自定义的文本,跳过 ASR 过程,直接跟 AI Service 进行文字沟通。 |
20001 | 发送打断信令来进行打断。 |
{"type": 20000, // 端上发送自定义文本消息"sender": "user_a", // 发送者userid, 服务端会check该userid是否有效"receiver": ["user_bot"], // 接受者userid列表,只需要填写机器人userid,服务端会check该userid是否有效"payload": {"id": "uuid", // 消息id,可以使用uuid,排查问题使用"message": "xxx", // 消息内容"timestamp": 123 // 时间戳,排查问题使用}}
{"type": 20001, // 端上发送打断信令"sender": "user_a", // 发送者userid, 服务端会check该userid是否有效"receiver": ["user_bot"], // 接受者userid列表,只需要填写机器人userid,服务端会check该userid是否有效"payload": {"id": "uuid", // 消息id,可以使用uuid,排查问题使用"timestamp": 123 // 时间戳,排查问题使用}}
appkey、accesstoken、virtualmanProjectId。{"AvatarType" : "tencent", // 数字人类型,目前仅支持 tencent"Appkey" : "appkey", // 数智人服务的 appkey"AccessToken" : "accesstoken", // 数智人服务的 accesstoken"VirtualmanProjectId" : "virtualmanProjectId", // 数智人服务的 virtualmanProjectId"AvatarUserID" : "robot_xxxx", // TRTC 数字人用户 userID"DriverType": 1, // 数智人驱动方式(纯文本驱动)"AvatarUserSig" : "eJw1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // TRTC 数字人用户签名}
trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {// To play the video image, you need to place an HTMLElement in the DOM,// which can be a div tag, assuming its id is `${userId}_${streamType}`const view = `${userId}_${streamType}`;trtc.startRemoteVideo({ userId, streamType, view });});
onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。startRemoteView 来播放远端用户的视频画面。// 播放远端用户 robot_xxxx 的主流视频画面trtcCloud.startRemoteView("robot_xxxx", TRTCVideoStreamType.big, remoteViewId);
onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。startRemoteView 对远端视频画面进行播放。// 播放远端画面TXCloudVideoView cameraVideo = findViewById(R.id.txcvv_main_local);mCloud.startRemoteView("robot_xxxx", TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, cameraVideo); // 以高清大画面播放远端视频内容
onUserVideoAvailable(userId, YES) 通知时,表示该路画面已经有可播放的视频帧到达。startRemoteView 对远端视频画面进行播放。- (void)startRemoteView {// 播放远端画面AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];[appDelegate.trtcCloud startRemoteView:@"robot_xxxx" streamType:TRTCVideoStreamTypeBig view:self.remoteVideoView];}
{"type": "function","function": {"name": "transfer_to_agent","description": "当用户明确要求人工、或问题超出AI能力、涉及投诉退款纠纷时调用;仅闲聊抱怨不调用","parameters": {"type": "object","properties": {"reason": { "type": "string", "description": "转人工原因" },"department": { "type": "string", "enum": ["售后", "技术", "投诉"], "description": "目标技能组" },"urgency": { "type": "string", "enum": ["low", "high"], "description": "紧急程度" }},"required": ["reason"]}}}
LLMConfig 字段,把 STT 转写后的文本转发到外部 LLM 或智能体平台。因此“注入自定义知识库/实现 RAG”的本质就是在 LLM 这一环接入一个具备检索能力的后端或平台。TRTC 会自动在每个 LLM 请求中自动注入以下 HTTP 请求头,可用于业务后台做用户级的知识库路由、鉴权或日志记录等。请求头 | 说明 |
X-Task-Id | 当前 AI 会话的唯一任务标识符。 |
X-Request-Id | 请求标识符,同一请求重试时保持一致。 |
X-Sdk-App-Id | 你的 TRTC 应用的 SdkAppId。 |
X-User-Id | 当前会话中的用户 ID。 |
X-Room-Id | 当前 TRTC 会话的房间 ID。 |
X-Room-Id-Type | 房间 ID 类型。 "0" = 数字型,"1" = 字符串型。 |
/v1/chat/completions 接口,TRTC 把其当成普通 OpenAI 模型调用。业务接口内部完成“检索知识库 → 拼接上下文 → 调真实大模型 → 流式返回”,RAG 逻辑完全自主可控。LLMConfig 接入 TRTC Conversational AI。LLMConfig 接入 TRTC Conversational AI。LLMConfig 字段注入,可叠加使用。下面介绍 LLMConfig 中与上下文相关的三个字段,即三层记忆体系。字段 | 记忆层级 | 内容 | 精度 | 时间跨度 | 管理方 |
SystemPrompt | 长期记忆 | 基础人设 + 用户长期偏好的 LLM 摘要 | 中(摘要) | 长期 | 业务侧维护摘要并拼接 |
UserMessages | 短期记忆 | 最近 N 条外部历史消息记录原文 | 高(原文) | 短期 | 业务侧启动对话时注入 |
History | 通话内记忆 | 当前 TRTC 通话过程中的多轮对话轮次 | 高(原文) | 当次通话 | TRTC 自动管理,最大50轮 |
SystemPrompt 写入客服人设以及该用户的长期画像摘要,UserMessages 注入用户最近的咨询原文,History 让本次语音通话内多轮连贯。{"LLMType": "openai","Model": "gpt-5.5","APIKey": "<your_openai_api_key>","APIUrl": "https://api.openai.com/v1/chat/completions","Streaming": true,"SystemPrompt": "你是某电商平台的AI客服助手,负责订单查询、退换货、物流追踪与商品咨询,回答简洁友好。\\n\\n【用户长期记忆摘要】\\n- 用户昵称小明,黑卡会员,偏好简洁直接的回复\\n- 常购品类:数码3C,历史无退货纠纷\\n- 上次通话咨询过『蓝牙耳机右耳无声』,已建议重新配对","Timeout": 3.0,"History": 10,"UserMessages": [{ "Role": "user", "Content": "我上周买的耳机想退货" },{ "Role": "assistant", "Content": "好的,您的订单 NO.20260528001(蓝牙耳机)在7天无理由期内,可以为您办理退货。" },{ "Role": "user", "Content": "那退款多久到账?" },{ "Role": "assistant", "Content": "商品寄回签收后1-3个工作日原路退回到您的支付账户。" }]}
UserMessages 的短期咨询原文,以及 SystemPrompt 的长期摘要数据如何获取?UserMessages 条数越多,LLM 每次调用的 Token 消耗越大且耗时越长,需结合实际需求及成本合理配置。SystemPrompt 摘要建议控制在 300 Token 以内,避免过长挤占对话上下文窗口,影响 LLM 首 Token 时延。AgentConfig.InterruptSpeechDuration 和 STTConfig.VadSilenceTime 参数,从而调高或降低打断时延。建议同时打开远场人声抑制能力,以降低误打断的概率。STTConfig.VadLevel 设置为2或者3,有较好的远场人声抑制能力。参数 | 类型 | 描述 |
AgentConfig.InterruptSpeechDuration | Integer | InterruptMode 为0时使用,单位为毫秒,默认为500ms。表示服务端检测到持续 InterruptSpeechDuration 毫秒的人声则进行打断。 示例值:500 |
STTConfig.VadSilenceTime | Integer | 语音识别 VAD 的时间,范围为 [240, 2000],默认为1000,单位为 ms。更小的值会让语音识别分句更快。 示例值:1000 |
STTConfig.VadLevel | Integer | VAD 的远场人声抑制能力(不会对 ASR 识别效果造成影响),范围为 [0, 5],默认为0,表示不开启远场人声抑制能力。推荐设置为2,有较好的远场人声抑制能力。嘈杂的办公室环境下可以设置为3,更为嘈杂的环境下可以设置为4或5。注意较高的 VadLevel 可能会将单字当作噪声给过滤。 示例值:2 |
metainfo, AI 服务探测到 metainfo 后,通过 自定义消息 推送到客户端 SDK 上,完成 metainfo 的透传。chat.completion.chunk 对象时,同时返回 meta.info 的 chunk。{"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-xxxx", "system_fingerprint": "fp_xxxx", "choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}{"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-xxxx", "system_fingerprint": "fp_xxxx", "choices":[{"index":0,"delta":{"content":"Hello"},"logprobs":null,"finish_reason":null}]}// 增加如下自定义消息{"id":"chatcmpl-123","type":"meta.info","created":1694268190,"metainfo": {}}{"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-xxxx", "system_fingerprint": "fp_xxxx", "choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
metainfo 之后,通过 RTC Engine 的 自定义消息 进行下发。客户端可通过 SDK 回调中的 onRecvCustomCmdMsg 接口接收。{"type": 10002, // 自定义消息"sender": "user_a", // 发送者userid,这里是机器人的id"receiver": [], // 接受者userid列表,该消息实际是在房间内广播,"roundid": "xxxxxx","payload": {} // metainfo}
StartAIConversation 中的 RoomId 与客户端进房的 RoomId 一致,且房间号类型(RoomIdType)也一致。LLMConfig 和 TTSConfig 的 JSON 字符串格式是否正确。SecretId / SecretKey)有效,且完成 QcloudTRTCFullAccess 全读写访问权限授权。服务类别 | 错误码 | 错误描述 |
STT(ASR) | 30100 | 请求超时。 |
| 30102 | 内部错误。 |
LLM | 30200 | 请求 LLM 超时。 |
| 30201 | LLM 请求被频率限制。 |
| 30202 | LLM 服务返回失败。 |
TTS | 30300 | 请求 TTS 服务超时。 |
| 30301 | TTS 请求被频率限制。 |
| 30302 | TTS 服务返回失败。 |
llm error Timeout on reading data from socket ,一般是 LLM 请求超时了,可以将 LLMConfig 里的 Timeout 参数值适当调高(默认为3秒)。此外,当 LLM 的首包耗时超过3秒时,较高的对话延迟会影响 AI 对话的体验,如果没有特殊需求,建议优化一下 LLM 的首包耗时,请参见 对话延迟优化。AgentConfig.FilterOneWord 参数设置为 false (默认为 true 表示过滤掉用户只说了一个字的句子)。参数 | 类型 | 描述 |
FilterOneWord | Boolean | 是否过滤掉用户只说了一个字的句子,true 表示过滤,false 表示不过滤,默认值为 true。 示例值:true |
onError 回调中抛出,常见错误见下表:错误 | 错误码 | 错误描述 |
ERR_TRTC_USER_SIG_CHECK_FAILED | -100018 | UserSig 校验失败,检查签名是否正确或已过期。 |
ERR_TRTC_CONNECT_SERVER_TIMEOUT | -3308 | 请求进房超时,请检查是否断网或者是否开启 VPN。 |
ERR_TRTC_INVALID_SDK_APPID | -3317 | 进房参数 SDKAppID 错误,请检查 TRTCParams.sdkAppId 是否为空。 |
ERR_MIC_NOT_AUTHORIZED | -1317 | 麦克风设备未授权。 |
文档反馈