You need to enable JavaScript to run this app.
文档中心
实时音视频

实时音视频

复制全文
下载 pdf
开发指南
获取 AI 状态
复制全文
下载 pdf
获取 AI 状态
支持通过回调机制来实时获取 AI 状态,如聆听中、思考中、说话中、被中断或发生错误。您可以将这些状态信息在客户端实时展示,或在服务端进行持久化存储与分析。​
  • 通过客户端实现:延迟更低、可靠性更高,适用于需要在终端(App、Web)实时展示 AI 状态的场景。​
  • 通过服务端实现:适用于需要将状态持久化存储、进行二次分析,或客户端不便处理实时二进制消息的场景。​
通过客户端实现​
实现方式​
  1. 在服务端开启回调:调用 StartVoiceChat 接口时,将 AgentConfig.EnableConversationStateCallback 设置为 true。​
  1. 在客户端监听回调消息:在客户端监听 RTC SDK 回调 onRoomBinaryMessageReceived(以 Android 端为例)。​
说明​
  • C 语言端接口名称为 on_message_received。​
  1. 解析消息:当 AI 状态发生变化时,客户端会通过上述回调收到二进制 message。解析该消息后,即可获取具体的状态信息。解析方式,参见下方的消息解析示例。​
消息解析示例​
message 的格式请参见二进制消息格式。您可以参考以下示例解析 message:​
​
TypeScript
Java
C++
Objective-C
C
​
​
import VERTC from '@volcengine/rtc';​
​
/**​
* @brief TLV 数据格式转换成字符串​
* @note TLV 数据格式​
* | magic number | length(big-endian) | value |​
* @param {ArrayBufferLike} tlvBuffer​
* @returns ​
*/​
function tlv2String(tlvBuffer: ArrayBufferLike) {​
const typeBuffer = new Uint8Array(tlvBuffer, 0, 4);​
const lengthBuffer = new Uint8Array(tlvBuffer, 4, 4);​
const valueBuffer = new Uint8Array(tlvBuffer, 8);​
​
let type = '';​
for (let i = 0; i < typeBuffer.length; i++) {​
type += String.fromCharCode(typeBuffer[i]);​
}​
​
const length =​
(lengthBuffer[0] << 24) | (lengthBuffer[1] << 16) | (lengthBuffer[2] << 8) | lengthBuffer[3];​
​
const value = new TextDecoder().decode(valueBuffer.subarray(0, length));​
​
return { type, value };​
};​
​
/**​
* @brief Room Message Handler​
*/​
function handleRoomBinaryMessageReceived(​
event: {​
userId: string;​
message: ArrayBuffer;​
},​
) {​
const { message } = event;​
const { type, value } = tlv2String(message);​
const data = JSON.parse(value);​
const { EventTime, RoundID, Stage, TaskId, UserID, ErrorInfo } = data || {};​
const { Code, Description } = Stage || {};​
// 对 type、data 进行业务处理​
console.log(type, EventTime, RoundID, TaskId, UserID, Code, Description);​
if (ErrorInfo) {​
const { Code, Reason } = ErrorInfo;​
console.log('Error Occurred:', Code, Reason);​
}​
// ...​
}​
​
/**​
* @brief 监听房间内二进制消息​
*/​
this.engine.on(VERTC.events.onRoomBinaryMessageReceived, handleRoomBinaryMessageReceived);​
​
​
通过服务端实现​
实现方式​
  1. 配置回调:调用 StartVoiceChat 接口时,通过以下参数配置回调服务器:​
  • ​
    "AgentConfig": {​
    "EnableConversationStateCallback": true, //必须设置为 true​
    ​
    // 1. 您的回调服务地址。系统会将状态消息 POST 到这里。需满足以下要求:​
    // - 必须为公网可访问的域名地址。若使用 HTTPS,请确保 SSL 证书合法且完整。​
    // - 请确保该 URL 指向的服务端能够正常处理无 Content-Type 的 POST 请求。​
    "ServerMessageURLForRTS": "https://your-server.com/example_domain/vertc/cstage",​
    ​
    // 2. 认证密钥。由您自定义,平台只是在回调中原样返回,供您在服务端做合法性校验。​
    "ServerMessageSignatureForRTS": "your_custom_secure_signature" ​
    }​
    ​
  1. 接收、校验并解析回调消息。​
  • 接收回调消息:当 AI 状态发生变化时,配置的 URL 会收到 HTTP POST 请求,请求体格式如下:​
  • ​
    {​
    "message": "Y29udgAAAKV7Cg...=",​
    "binary": true,​
    "signature": "your_custom_secure_signature"​
    }​
    ​
  • signature:平台原样回传的签名字符串,即您在 StartVoiceChat 中配置 AgentConfig.ServerMessageSignatureForRTS。​
  • 校验回调签名:将 signature 的值与 AgentConfig.ServerMessageSignatureForRTS 进行比对。​
  • 解析消息:签名校验通过后,对 message 进行 Base64 解码,再按照二进制消息格式解析状态信息。​
消息解析示例​
以下 Go 语言为例,展示如何解析消息。​
​
package main​
​
import (​
"encoding/base64"​
"encoding/binary"​
"encoding/json"​
"fmt"​
"github.com/gin-gonic/gin"​
)​
// --- 1. 需要您修改的配置 ---​
const (​
conversationStageHeader = "conv"​
exampleSignature = "your_custom_secure_signature" // 替换为您在 StartVoiceChat 中配置的真实密钥​
)​
​
type RtsMessage struct {​
Message string `json:"message"`​
Signature string `json:"signature"`​
}​
​
type Conv struct {​
TaskID string `json:"TaskId"`​
UserID string `json:"UserID"`​
RoundID int64 `json:"RoundID"` ​
EventTime int64 `json:"EventTime"`​
Stage StageInfo `json:"Stage"`​
}​
​
type StageInfo struct {​
Code stageCode `json:"Code"`​
Description string `json:"Description"`​
}​
type stageCode int​
​
const (​
_ stageCode = iota​
listening​
thinking​
answering​
interrupted​
answerFinish​
)​
​
var (​
stageListening = StageInfo{Code: listening, Description: "listening"}​
stageThinking = StageInfo{Code: thinking, Description: "thinking"}​
stageAnswering = StageInfo{Code: answering, Description: "answering"}​
stageInterrupted = StageInfo{Code: interrupted, Description: "interrupted"}​
stageAnswerFinish = StageInfo{Code: answerFinish, Description: "answerFinish"}​
)​
​
func HandleConversationStageMsg(c *gin.Context) {​
msg := &RtsMessage{}​
if err := c.BindJSON(&msg); err != nil {​
fmt.Printf("BindJson failed,err:%v\n", err)​
return​
}​
if msg.Signature != exampleSignature {​
fmt.Printf("Signature not match\n")​
return​
}​
​
conv, err := Unpack(msg.Message)​
if err != nil {​
fmt.Printf("Unpack failed,err:%v\n", err)​
return​
}​
​
fmt.Println(conv)​
​
//业务逻辑​
​
c.String(200, "ok")​
}​
​
func Unpack(msg string) (*Conv, error) {​
data, err := base64.StdEncoding.DecodeString(msg)​
if err != nil {​
return nil, fmt.Errorf("DecodeString failed,err:%v", err)​
}​
if len(data) < 8 {​
return nil, fmt.Errorf("Data invalid")​
}​
dataHeader := string(data[:4])​
if dataHeader != conversationStageHeader {​
return nil, fmt.Errorf("Header not match")​
}​
dataSize := binary.BigEndian.Uint32(data[4:8])​
if dataSize+8 != uint32(len(data)) {​
return nil, fmt.Errorf("Size not match")​
}​
​
subData := data[8:]​
conv := &Conv{}​
err = json.Unmarshal(subData, conv)​
if err != nil {​
return nil, fmt.Errorf("Unmarshal failed,err:%v\n", err)​
}​
return conv, nil​
}​
​
func main() {​
​
r := gin.Default()​
// --- 2. 需要您修改的配置 ---​
// 回调路径:这里的路径 ("/example_domain/vertc/cstage") 必须与您在 StartVoiceChat 中配置的 ServerMessageURLForRTS 的路径部分完全一致。​
// 例如,如果您的回调 URL 是 "https://my-service.com/api/rtc/status",​
// 那么这里的路径就必须是 "/api/rtc/status"。​
r.POST("/example_domain/vertc/cstage", HandleConversationStageMsg)​
r.Run()​
}​
​
解析结果示例:​
​
&{ChatTask01 Huoshan01 16 1765787330849 {1 listening}}​
​
附录​
二进制消息格式​
​​​
​
参数名​
类型​
描述​
magic number​
binary​
消息格式,固定为 conv。​
length​
binary​
消息长度,单位为 bytes。存放方式为大端序。​
conversation_status_message​
binary​
消息详细信息。具体参看conversation_status_message。​
​
conversation_status_message​
​
参数名​
类型​
描述​
TaskId​
String​
AI 对话任务 ID。​
UserID​
String​
说话人 UserId。​
RoundID​
Int64​
对话轮次。从 0 开始计数。​
EventTime​
Int64​
该事件在 RTC 服务器上发生的 Unix 时间戳 (ms)。​
Stage​
任务状态详细描述。​
ErrorInfo​
任务错误详细信息。仅当 Stage.Code 为 0 时,会返回该字段。​
​
Stage​
​
参数名​
类型​
描述​
Code​
Int​
状态码。​
  • 0:任务发生错误。​
  • 1:AI 聆听中。​
  • 2:AI 思考中。​
  • 3:AI 说话中。​
  • 4:AI 被打断。​
  • 5:AI 说话完成。​
Description​
String​
任务状态描述。​
​
ErrorInfo​
​
参数名​
类型​
描述​
Code​
Int​
错误状态码。详细定义,请参见错误码。​
Reason​
String​
错误详细原因。​
​
最近更新时间:2026.11.05 15:12:20
这个页面对您有帮助吗?
有用
有用
无用
无用