AI 转录/翻译 2.0 回调事件

最近更新时间:2026-04-03 09:55:13

我的收藏
本文针对 TRTC 后台接入 AI 转录/翻译 2.0 的回调事件进行具体说明。

配置信息

实时音视频 TRTC 控制台支持自助配置回调信息,选择 AI 转录 2.0 回调,配置完成后即可接收事件回调通知。详细操作指引请参见 回调配置
注意:
您需要提前准备以下信息:
必要项:接收回调通知的 HTTP / HTTPS 服务器地址。
可选项:计算签名的 密钥 key,由您自定义一个最大32个字符的 key,以大小写字母及数字组成。

超时重试

事件回调服务器在发送消息通知后,5秒内没有收到您的服务器的响应,即认为通知失败。首次通知失败后会立即重试,后续失败会以10秒的间隔继续重试,直到消息存续时间超过1分钟,不再重试。

事件回调消息格式

事件回调消息以 HTTP / HTTPS POST 请求发送给您的服务器,其中:
字符编码格式:UTF-8。
请求:body 格式为 JSON。
应答:HTTP STATUS CODE = 200,服务端忽略应答包具体内容,为了协议友好,建议客户应答内容携带 JSON: {"code":0}。
包体示例:下述为“启动 AI 转录与翻译 2.0”事件的包体示例。
{
"EventGroupId": 14,
"EventType": 1401,
"CallbackTs": 1687770730166,
"EventInfo": {
"EventMsTs": 1622186275757,
"TaskId": "xxx",
"RoomId": "1234",
"RoomIdType": 0,
"RobotId": "trtc_partner_test_1",
"Payload": {
"Status": 0
}
}
}

参数说明

回调消息参数
事件回调消息的 header 中包含以下字段:
字段名
含义
Content-Type
application/json。
Sign
签名值。
SdkAppId
创建应用时控制台分配的 SdkAppId。
事件回调消息的 body 中包含以下字段:
字段名
类型
含义
EventGroupId
Number
事件组 ID,转录事件组事件固定为14。
EventType
Number
回调通知的事件类型。
CallbackTs
Number
事件回调服务器向您的服务器发出回调请求的 Unix 时间戳,单位为毫秒。
EventInfo
JSON Object
事件信息。

事件组 ID

字段名
含义
EVENT_GROUP_CLOUD_TRANSCRIPTION
14
转录事件组。

事件类型

字段名
含义
EVENT_TYPE_CLOUD_TRANSCRIPTION_START
1401
转录开始状态回调。
EVENT_TYPE_CLOUD_TRANSCRIPTION_STOP
1402
转录任务结束状态回调。
EVENT_TYPE_CLOUD_TRANSCRIPTION_ASR_MSG
1403
回调转录 ASR 的完整句子。
EVENT_TYPE_CLOUD_TRANSCRIPTION_TRANSLATE_MSG
1404
回调转录翻译的完整句子。

EVENT_TYPE_CLOUD_TRANSCRIPTION_START

字段名
类型
含义
EventMsTs
Number
事件发生的 Unix 时间戳,单位为毫秒。
TaskId
String
任务 ID。
RoomId
String
TRTC 的房间 ID。
RoomIdType
Integer
0:表示数字房间号。
1:表示字符串房间号。
RobotId
String
机器人 ID。
Payload.Status
Number
0:启动转录任务。
1:启动转录任务失败。
{
"EventGroupId": 14,
"EventType": 1401,
"CallbackTs": 1687770730166,
"EventInfo": {
"EventMsTs": 1622186275757,
"TaskId": "xxx",
"RoomId": "1234",
"RoomIdType": 0,
"RobotId": "trtc_partner_test_1",
"Payload": {
"Status": 0
}
}
}

EVENT_TYPE_CLOUD_TRANSCRIPTION_STOP

字段名
类型
含义
EventMsTs
Number
事件发生的 Unix 时间戳,单位为毫秒。
TaskId
String
任务 ID。
RoomId
String
TRTC 的房间 ID。
RoomIdType
Integer
0:表示数字房间号。
1:表示字符串房间号。
RobotId
String
机器人 ID。
Payload.LeaveCode
Integer
0:转录模块正常调用停止转录退出。
1:转录机器人被客户踢出房间。
2:客户解散房间。
3:服务器将转录机器人踢出。
4:服务器解散房间。
99:代表房间内除了转录机器人没有其他用户流,超过指定时间退出。
101:同一用户重复进入相同房间导致机器人退出。
{
"EventGroupId": 14,
"EventType": 1402,
"CallbackTs": 1687770730166,
"EventInfo": {
"EventMsTs": 1622186275757,
"TaskId": "xxx",
"RoomId": "1234",
"RoomIdType": 0,
"RobotId": "trtc_partner_test_1",
"Payload": {
"LeaveCode": 0
}
}
}

EVENT_TYPE_CLOUD_TRANSCRIPTION_ASR_MSG

字段名
类型
含义
EventMsTs
Number
事件发生的 Unix 时间戳,单位为毫秒。
TaskId
String
任务 ID。
RoomId
String
TRTC 的房间 ID。
RoomIdType
Integer
0:表示数字房间号。
1:表示字符串房间号。
RobotId
String
机器人 ID。
Payload
JSON Object
为 JSON 对象:
{
"UserId": "Trtc_User_0",
"Text": "xxxx",
"StartTimeMs": 108,
"EndTimeMs": 10568,
"RoundId": "40c9e724-3268-4b66-a9ff-41ed44d8edb6",
"StartUtcMs": 1761568438912,
"EndUtcMs": 1761568449372
}
{
"EventGroupId": 14,
"EventType": 1403,
"CallbackTs": 1687770730166,
"EventInfo": {
"EventMsTs": 1761568449890,
"TaskId": "xxx",
"RoomId": "1234",
"RoomIdType": 0,
"RobotId": "trtc_partner_test_1",
"Payload": {
"UserId": "Trtc_User_0",
"Text": "Oh yeah? What's the ultimate predator? What's the ultimate predator? What's the enemy you harbor in your own heart? Who hates you? That's the ultimate predator.",
"StartTimeMs": 108,
"EndTimeMs": 10568,
"RoundId": "40c9e724-3268-4b66-a9ff-41ed44d8edb6",
"StartUtcMs": 1761568438912,
"EndUtcMs": 1761568449372
}
}
}

EVENT_TYPE_CLOUD_TRANSCRIPTION_TRANSLATE_MSG

字段名
类型
含义
EventMsTs
Number
事件发生的 Unix 时间戳,单位为毫秒。
TaskId
String
任务 ID。
RoomId
String
TRTC 的房间 ID。
RoomIdType
Integer
0:表示数字房间号。
1:表示字符串房间号。
RobotId
String
机器人 ID。
Payload
JSON Object
为 JSON 对象:
{
"UserId": "Trtc_User_0",
"Text": "Presume, was exactly the same way. ",
"TranslateMsg": [
{
"Language": "fr",
"Text": "Je suppose, c'était exactement la même chose. "
},
{
"Language": "zh",
"Text": "大概也是一模一样的。"
}
],
"StartTimeMs": 108,
"EndTimeMs": 10568,
"RoundId": "40c9e724-3268-4b66-a9ff-41ed44d8edb6",
"StartUtcMs": 1761568438912,
"EndUtcMs": 1761568449372
}

{
"EventGroupId": 14,
"EventType": 1404,
"CallbackTs": 1687770730166,
"EventInfo": {
"EventMsTs": 1761568449890,
"TaskId": "xxx",
"RoomId": "1234",
"RoomIdType": 0,
"RobotId": "trtc_partner_test_1",
"Payload": {
"UserId": "Trtc_User_0",
"Text": "presume, was exactly the same way. ",
"TranslateMsg": [
{
"Language": "fr",
"Text": "Je suppose, c'était exactement la même chose."
},
{
"Language": "zh",
"Text": "大概也是一模一样的。"
}
],
"StartTimeMs": 108,
"EndTimeMs": 10568,
"RoundId": "40c9e724-3268-4b66-a9ff-41ed44d8edb6",
"StartUtcMs": 1761568438912,
"EndUtcMs": 1761568449372
}
}
}

计算签名

签名由 HMAC SHA256 加密算法计算得出,您的事件回调接收服务器收到回调消息后,通过同样的方式计算出签名,相同则说明是腾讯云的实时音视频的事件回调,没有被伪造。签名的计算如下所示:
//签名 Sign 计算公式中 key 为计算签名 Sign 用的加密密钥。
Sign = base64(hmacsha256(key, body)
注意:
body 为您收到回调请求的原始包体,不要做任何转化,示例如下:
body="{\\n\\t\\"EventGroupId\\":\\t1,\\n\\t\\"EventType\\":\\t103,\\n\\t\\"CallbackTs\\":\\t1615554923704,\\n\\t\\"EventInfo\\":\\t{\\n\\t\\t\\"RoomId\\":\\t12345,\\n\\t\\t\\"EventTs\\":\\t1608441737,\\n\\t\\t\\"UserId\\":\\t\\"test\\",\\n\\t\\t\\"UniqueId\\":\\t1615554922656,\\n\\t\\t\\"Role\\":\\t20,\\n\\t\\t\\"Reason\\":\\t1\\n\\t}\\n}"

签名校验示例

Java
Python
PHP
Golang
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
//# 功能:第三方回调sign校验
//# 参数:
//# key:控制台配置的密钥key
//# body:腾讯云回调返回的body体
//# sign:腾讯云回调返回的签名值sign
//# 返回值:
//# Status:OK 表示校验通过,FAIL 表示校验失败,具体原因参考Info
//# Info:成功/失败信息

public class checkSign {
public static String getResultSign(String key, String body) throws Exception {
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
hmacSha256.init(secret_key);
return Base64.getEncoder().encodeToString(hmacSha256.doFinal(body.getBytes()));
}
public static void main(String[] args) throws Exception {
String key = "123654";
String body = "{\\n" + "\\t\\"EventGroupId\\":\\t2,\\n" + "\\t\\"EventType\\":\\t204,\\n" + "\\t\\"CallbackTs\\":\\t1664209748188,\\n" + "\\t\\"EventInfo\\":\\t{\\n" + "\\t\\t\\"RoomId\\":\\t8489,\\n" + "\\t\\t\\"EventTs\\":\\t1664209748,\\n" + "\\t\\t\\"EventMsTs\\":\\t1664209748180,\\n" + "\\t\\t\\"UserId\\":\\t\\"user_85034614\\",\\n" + "\\t\\t\\"Reason\\":\\t0\\n" + "\\t}\\n" + "}";
String Sign = "kkoFeO3Oh2ZHnjtg8tEAQhtXK16/KI05W3BQff8IvGA=";
String resultSign = getResultSign(key, body);

if (resultSign.equals(Sign)) {
System.out.println("{'Status': 'OK', 'Info': '校验通过'}");
} else {
System.out.println("{'Status': 'FAIL', 'Info': '校验失败'}");
}
}
}
# -*- coding: utf8 -*-
import hmac
import base64
from hashlib import sha256

# 功能:第三方回调sign校验
# 参数:
# key:控制台配置的密钥key
# body:腾讯云回调返回的body体
# sign:腾讯云回调返回的签名值sign
# 返回值:
# Status:OK 表示校验通过,FAIL 表示校验失败,具体原因参考Info
# Info:成功/失败信息

def checkSign(key, body, sign):
temp_dict = {}
computSign = base64.b64encode(hmac.new(key.encode('utf-8'), body.encode('utf-8'), digestmod=sha256).digest()).decode('utf-8')
print(computSign)
if computSign == sign:
temp_dict['Status'] = 'OK'
temp_dict['Info'] = '校验通过'
return temp_dict
else:
temp_dict['Status'] = 'FAIL'
temp_dict['Info'] = '校验失败'
return temp_dict

if __name__ == '__main__':
key = '123654'
body = "{\\n" + "\\t\\"EventGroupId\\":\\t2,\\n" + "\\t\\"EventType\\":\\t204,\\n" + "\\t\\"CallbackTs\\":\\t1664209748188,\\n" + "\\t\\"EventInfo\\":\\t{\\n" + "\\t\\t\\"RoomId\\":\\t8489,\\n" + "\\t\\t\\"EventTs\\":\\t1664209748,\\n" + "\\t\\t\\"EventMsTs\\":\\t1664209748180,\\n" + "\\t\\t\\"UserId\\":\\t\\"user_85034614\\",\\n" + "\\t\\t\\"Reason\\":\\t0\\n" + "\\t}\\n" + "}"
sign = 'kkoFeO3Oh2ZHnjtg8tEAQhtXK16/KI05W3BQff8IvGA='
result = checkSign(key, body, sign)
print(result)

<?php

class TlsEventSig {
private $key = false;
private $body = false;
public function __construct( $key, $body ) {
$this->key = $key;
$this->body = $body;
}

private function __hmacsha256() {
$hash = hash_hmac( 'sha256', $this->body, $this->key, true );
return base64_encode( $hash);
}
public function genEventSig() {
return $this->__hmacsha256();
}
}

$key="789";
$data="{\\n\\t\\"EventGroupId\\":\\t1,\\n\\t\\"EventType\\":\\t101,\\n\\t\\"CallbackTs\\":\\t1608086882372,\\n\\t\\"EventInfo\\":\\t{\\n\\t\\t\\"RoomId\\":\\t20222,\\n\\t\\t\\"EventTs\\":\\t1608086882,\\n\\t\\t\\"UserId\\":\\t\\"222222_phone\\"\\n\\t}\\n}";

$api = new TlsEventSig($key, $data);
echo $api->genEventSig();
package main
import "fmt"
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
)

func main () {
var data = "{\\n\\t\\"EventGroupId\\":\\t1,\\n\\t\\"EventType\\":\\t101,\\n\\t\\"CallbackTs\\":\\t1608086882372,\\n\\t\\"EventInfo\\":\\t{\\n\\t\\t\\"RoomId\\":\\t20222,\\n\\t\\t\\"EventTs\\":\\t1608086882,\\n\\t\\t\\"UserId\\":\\t\\"222222_phone\\"\\n\\t}\\n}"
var key = "789"

//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
fmt.Println(hmacsha256(data,key))
}

func hmacsha256(data string, key string) string {
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(data))
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}