概述

Webhook是一种基于HTTP/HTTPS协议的回调机制,允许服务端主动推送数据。RTC回调通知服务器使用Webhook将相关事件回调给开发者服务器,以便开发者按需处理自己的业务逻辑。

image

使用方法

前提条件

使用流程

  1. 在控制台开通某个AppID的事件回调功能。

    登录RTC控制台,在左侧导航栏选择配置管理 > 事件通知 > 选中对应的AppID,进行回调设置页面。按需配置具体的事件。

image

  1. 触发回调事件。

    完成AppID应用事件通知配置之后,您可以通过服务端API,发起相关任务,比如开启录制、开启推流等操作来触发相应的回调事件产生。

  2. 接收回调事件。

    当回调事件产生之后,比如录制文件生成,若回调成功,您可以在您部署的回调接受服务器中查看具体的回调事件通知。

回调机制

  1. 您需要自行部署一个HTTP服务来接收回调消息,并在控制台中具体业务中配置回调URL。

  2. 当事件产生时,RTC回调通知服务器会向该URL发起HTTP POST请求,事件通知内容将通过HTTP Body送达。

  3. 您的HTTP服务对HTTP POST请求进行响应且HTTP状态码为200,即视为回调成功;若响应其他状态码或响应超时,则视为回调失败。

  4. 回调成功后,您配置的回调URL中将接收到相应的事件通知内容。

回调格式

回调消息以HTTP POST请求发送到您的服务器,请求Body格式为JSON。字符编码为UTF-8。

回调消息的请求Header 中包含以下字段:

字段

示例值

描述

Content-Type

application/json

固定值

trace-id

2401058********622012463d9

该字段用于排查问题使用

DingRTC-Signature

z5jbvxxx.1718877424.xx3e7691142ffe4342e13e25dc317695b17827e34ec248a5cc35d3a7e1e1cd44

RTC回调服务加密算法生成的加密值。详见验证签名

回调消息请求的Body中包含以下字段:

名称

类型

是否必须

示例值

描述

eventId

string

12343aed*********

事件ID

eventType

string

101

事件类型,RTC回调服务器有个eventType,具体类型见下文回调消息列表

notifyTime

long

1701056041128

通知时间戳,单位:毫秒

eventData

JSONObject

{"appId": "z7***u8v"}

回调消息具体内容,每种类型的事件不一样,具体见下文回调消息列表

重要
  • 您的服务器收到的通知顺序和事件发生的顺序不一定完全一致。

  • 为确保回调消息通知的可靠性,每次事件可能会有不止一次消息通知,您的服务器可能需要做消息幂等处理。

验证签名

RTC回调服务器在通知客户服务器时,为了校验本次请求的合法性,约定签名算法如下。

消息头中的 DingRTC-Signature 由三部分组成,用.拼接在一起。格式为AppId.TimeStamp.Signature,字段含义如下:

  • AppID: 应用ID。

  • TimeStamp:UTC时间戳(精确到秒)。

  • Signature:签名,由HTTP请求内容的原始字符串、时间戳、回调密钥计算得出,详细算法如下:

Signature=hexString(HmacSHA256(请求内容的原始字符串+TimeStamp,callbackSecret))

回调通知密钥请通过控制台获取。

验证签名时,您可以参考以下代码:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class SignUtil {

    public static final String HMAC_SHA_256 = "HmacSHA256";

    public static String hmacSha256(String message, String secret) {
        try {
            SecretKeySpec signingKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), HMAC_SHA_256);
            Mac mac = Mac.getInstance(HMAC_SHA_256);
            mac.init(signingKey);
            byte[] rawHmac = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
            return bytesToHex(rawHmac);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static String bytesToHex(byte[] bytes) {
        StringBuffer sb = new StringBuffer();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() < 2) {
                sb.append(0);
            }
            sb.append(hex);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String requestBody = "{\"eventData\":{\"channelId\":\"55\",\"timestamp\":1718877424674},\"eventId\":\"2133cc0c17188774246986428d0cb0\",\"eventType\":\"101\",\"notifyTime\":1718877424701}";
        String secret = "your callback secret";
        String signatureHeader = "z5jbvxxx.1718877424.150f2b8e107a0f4399671dcf2b1e3e2ac78252a26c9626abf4a29a77464a96c1";
        String appId = signatureHeader.split("\\.")[0];
        String timestamp = signatureHeader.split("\\.")[1];
        String signature = signatureHeader.split("\\.")[2];
        if (signature.equals(hmacSha256(requestBody + timestamp, secret))) {
            System.out.println("DingRTC-Signature is valid");
        } else {
            System.out.println("DingRTC-Signature is invalid");
        }
    }
}

# !-*- coding: utf-8 -*-
import hashlib
import hmac

request_body='{"eventData":{"channelId":"55","timestamp":1718877424674},"eventId":"2133cc0c17188774246986428d0cb0","eventType":"101","notifyTime":1718877424701}'
secret = 'your callback secret'
signature_header = 'z5jbvxxx.1718877424.150f2b8e107a0f4399671dcf2b1e3e2ac78252a26c9626abf4a29a77464a96c1'
appId = signature_header.split('.')[0]
timestamp = signature_header.split('.')[1]
signature = signature_header.split('.')[2]
sign_body = request_body + timestamp
if (signature == hmac.new(secret.encode('utf-8'), sign_body.encode('utf-8'), hashlib.sha256).hexdigest()):
    print("DingRTC-Signature is valid")
else:
    print("DingRTC-Signature is invalid")

回调消息列表

本文档的JSON示例省略了Body中eventIdnotifyTime

重要

回调内容可能会增加字段,或者调整字段顺序,请根据您使用的开发语言采用适当的解析方式。

验证事件

001 回调验证

该场景仅在控制台设置具体回调URL或者手动校验时触发。

{
  "eventType": "001",
  "eventData":{
    "appId": "12adxxxx2"
  }
}

频道事件

101 频道开始

{
  "eventType": "101",
  "eventData":{
    "channelId": "room**" 		// 频道id
    "timestamp": 1709696165584		// 发生时间(ms)
  }
}

102 频道结束

{
  "eventType": "102",
  "eventData":{
    "channelId": "room**" 		// 频道id
    "timestamp": 1709696165584		// 发生时间(ms)
  }
}

103 用户加入

{
  "eventType": "103",
  "eventData":{
    "channelId": "room**" 				// 频道id
    "user":{
      "userId":"123444" 
    }
    "timestamp": 1709696165584		                // 发生时间(ms)
  }
}

104 用户离开

{
  "eventType": "104",
  "eventData":{
    "channelId": "room**" 				// 频道id
    "reasonCode": 20003001,                             // 用户离开原因,详见状态码表格
    "user":{
      "userId":"123444" 
    }
    "timestamp": 1709696165584		                // 发生时间(ms)
  }
}

推流事件

1000 开始推流

{
    "eventType": "1000",
    "eventData": {
        "channelId": "room**",			// 频道id
        "liveState":{
          "code": 20000000,			// 状态码,详见状态码表格
        },  
        "taskId": "task-03061",			// 任务id
        "timestamp": 1709737037688	        // 发生时间(ms)
    }
}

1001 推流正常结束

{
    "eventType": "1001",
    "eventData": {
        "channelId": "room**",			// 频道id
        "liveState":{
          "code": 20000000,			// 状态码,详见状态码表格
        },
        "taskId": "task-03061",			// 任务id
        "timestamp": 1709737037688	        // 发生时间(ms)
    }
}

1002 推流异常

{
    "eventType": "1002",
    "eventData": {
        "channelId": "room**",			// 频道id
        "liveState":{
          "code": 50001001,			// 状态码,详见状态码表格
        }  
        "taskId": "task-03061",			// 任务id
        "timestamp": 1709737037688	        // 发生时间(ms)
    }
}

录制事件

2000 开始录制

{
    "eventType": "2000",
    "eventData": {
        "channelId": "room**",
        "recordState": {
            "bucket":"rtc*******",              // 录制文件存放bucket
            "vendor":1,                         // 对象存储供应商,见开启录制接口
            "region":1,                         // 对象存储region,见开启录制接口 
            "startTs":1709737037688,            // 录制开始时间戳,单位:毫秒(ms)
            "code": 20000000			
        },
        "taskId": "task-0422",
        "timestamp": 1709737037688
    }
}

2001 录制成功

{
    "eventType": "2001",
    "eventData": {
        "channelId": "room**",
        "recordState": {
            "bucket":"rtc*******",              // 录制文件存放bucket
            "vendor":1,                         // 对象存储供应商,见开启录制接口
            "region":1,                         // 对象存储region,见开启录制接口 
            "startTs":1709737037688,            // 录制开始时间戳,单位:毫秒(ms)
            "code": 20000000,			// 状态码,详见状态码表格
            "fileFailCount": 0,
            "fileInfo": [
                {
                    "fileDuration": 7859,  	// 录制文件时长,单位:毫秒(ms)
                    "fileSize": 216777,    	// 录制文件大小,单位:字节(Byte)
                    "filePath": "record/v980**/65e82ef000210**/1709737028486_1709737030532/1709737028486-1709737030532.mp4",// 录制文件存储路径
                    "status": 0,           	// 0表示成功, 其他表示失败
                    "timestamp": 1709737037679	// 录制文件生成的时间戳(ms)
                }
            ],
            "fileCount": 1			// 录制文件总数
        },
        "taskId": "task-03061",
        "timestamp": 1709737037688
    }
}

2002 录制失败

{
    "eventType": "2002",
    "eventData": {
        "channelId": "room**",
        "recordState": {
            "bucket":"rtc*******",              // 录制文件存放bucket
            "vendor":1,                         // 对象存储供应商,见开启录制接口
            "region":1,                         // 对象存储region,见开启录制接口 
            "startTs":1709737037688,            // 录制开始时间戳,单位:毫秒(ms)
            "reason": "WritePlaylist failed",
            "code": 50002001,													//状态码,见最后状态码表格
            "fileFailCount": 2,
            "fileInfo": [
                {
                    "reason": "write flv file fail",	// 失败原因
                    "status": 50002001,
                    "timestamp": 1709721091674
                },
                {
                    "reason": "WritePlaylist failed",
                    "fileDuration": 30437,
                    "fileSize": 123875456,
                    "filePath": "taskidtaskId-199-cid65e844**e000000001ac0000/playlist.m3u8",
                    "status": 50002001,
                    "timestamp": 1709721103666
                }
            ],
            "fileCount": 2
        },
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}

2010 录制服务状态变化

说明

该事件默认不会主动回调,请通过控制台或者OpenAPI 完成订阅。

{
    "eventType": "2010",
    "eventData": {
        "channelId": "room**",
        "recordState": {
            "bucket":"rtc*******",              // 录制文件存放bucket
            "vendor":1,                         // 对象存储供应商,见开启录制接口
            "region":1,                         // 对象存储region,见开启录制接口 
            "startTs":1709737037688,            // 录制开始时间戳,单位:毫秒(ms)
            "code": 20002002                    // 状态码,详见状态码表格
        },
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}

2011 录制音频流变化

说明

该事件默认不会主动回调,请通过控制台或者OpenAPI 完成订阅。

{
    "eventType": "2011",
    "eventData": {
        "channelId": "room**",
        "recordState": {
            "streamChangeInfo": {            // 流变化信息
                "streamType": 3,             // 流类型 1: 摄像头流 2:共享流 3: 音频合流 4: 视频合流
                "state": 1,                  // 录制收流状态 1: 正在接收 2: 未在接收
                "direction": 2,              // 流方向 1: 输入 2: 输出
                "timestamp": 1721112755076   // 状态变化Unix 毫秒时间戳
            }
        },
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}

2012 录制视频流变化

说明

该事件默认不会主动回调,请通过控制台或者OpenAPI 完成订阅。

{
    "eventType": "2012",
    "eventData": {
        "channelId": "room**",
        "recordState": {
            "streamChangeInfo": {            // 流变化信息
                "uid": "user1",              // 流方向为输出时,流属于合流,uid为空。否则为具体uid
                "streamType": 1,             // 流类型 1: 摄像头流 2:共享流 3: 音频合流 4: 视频合流
                "state": 1,                  // 录制收流状态 1: 正在接收 2: 未在接收
                "direction": 1,              // 流方向 1: 输入 2: 输出
                "timestamp": 1721112755076   // 状态变化Unix 毫秒时间戳
            }
        },
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}

纪要事件

3000 纪要开始

{
    "eventType": "3000",
    "eventData": {
        "channelId": "room**",
        "asrState": {
            "code": 20000000                    // 状态码,详见状态码表格
        },
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}

3001 纪要成功

{
    "eventType": "3001",
    "eventData": {        
        "asrState": {
            "transcriptionFilePath": "cloudNote/6pz38941/1234_1234/transcription_1734069823271.json",           // 转写结果
            "serviceInspectionFilePath": "cloudNote/6pz38941/1234_1234/serviceInspection_1734069824007.json",   // 服务质检结果
            "customPromptFilePath": "cloudNote/6pz38941/1234_1234/customPrompt_1734069824057.json",             // 自定义Prompt结果 
            "meetingAssistanceFilePath": "cloudNote/6pz38941/1234_1234/meetingAssistance_1734069823787.json",   // 要点提炼结果 
            "summarizationFilePath": "cloudNote/6pz38941/1234_1234/summarization_1734069823845.json",           // 摘要总结结果
            "textPolishFilePath": "cloudNote/6pz38941/1234_1234/textPolish_1734069823903.json",                 // 口语书面化结果
            "autoChaptersFilePath": "cloudNote/6pz38941/1234_1234/autoChapters_1734069823728.json",             // 自动章节结果
            "vendor": 1,                                                                                        // 对象存储提供方
            "region": 1,                                                                                        // 对象存储region
            "bucket": "rtc-qa-test"                                                                             // bucket 名称   
        },
        "channelId": "room**",
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}
说明

结果文件路径格式规则:cloudNote/{appId}/{channelId}_{taskId}/{biz}_{putTs}.json

转写结果示例和字段定义

{
    "TaskId":"10683ca4ad3f4f06bdf6e9dc*********",
    "Transcription":{
        "AudioInfo": {
            "Size": 670663,
            "Duration": 10394,
            "SampleRate": 48000,
            "Language": "cn"
        },
        "Paragraphs":[
            {
                "ParagraphId":"16987422100275*******",
                "SpeakerId":"1",
                "Words":[
                    {
                        "Id":10,
                        "SentenceId":1,
                        "Start":4970,
                        "End":5560,
                        "Text":"您好,"
                    },
                    {
                        "Id":20,
                        "SentenceId":1,
                        "Start":5730,
                        "End":6176,
                        "Text":"我是"
                    }
                ]
            }
        ]
        "AudioSegments": [
            [12130, 16994],
            [17000, 19720],
            [19940, 28649]
        ]
    }
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

Transcription

object

语音转写结果对象。

Transcription.Paragraphs

list[]

语音转写结构以段落形式组织的集合。

Transcription.Paragraphs[i].ParagraphId

string

段落级别id。

Transcription.Paragraphs[i].SpeakerId

string

发言人id。

Transcription.Paragraphs[i].Words

list[]

该段落包含的word信息。

Transcription.Paragraphs[i].Words[i].Id

int

word序号,通常无须关注。

Transcription.Paragraphs[i].Words[i].SentenceId

int

句子id,同属于一个SentenceId的word信息可以组装成一句话。

Transcription.Paragraphs[i].Words[i].Start

long

该word相对于音频起始时间的开始时间,相对时间戳,单位毫秒。

Transcription.Paragraphs[i].Words[i].End

long

该word相对于音频起始时间的结束时间,相对时间戳,单位毫秒。

Transcription.Paragraphs[i].Words[i].Text

string

word文本。

Transcription.AudioInfo

object

音频信息对象。

Transcription.AudioInfo.Size

long

音频大小,单位:字节。

Transcription.AudioInfo.Duration

long

音频时长,单位:毫秒。(实时语音转写时,该字段不表示实际音频时长)

Transcription.AudioInfo.SampleRate

int

音频采样率。

Transcription.AudioInfo.Language

string

音频语种。

Transcription.AudioSegments

list[][]

有效音频片断范围。

Transcription.AudioSegments[i][0]

int

有效音频片段的开始时间,单位为毫秒。

Transcription.AudioSegments[i][1]

int

有效音频片段的结束时间,单位为毫秒。

服务质检结果示例和字段定义

{
    "TaskId": "4ee872e72fd0490694f1cd615b6b6314",
    "ServiceInspection": [
        {
            "Title": "到店迎接-欢迎语",
            "Matched": true,
            "Remarks": "销售人员通过询问开启对话,表现出一定的迎接意图。",
            "MatchedSentenceIds": [

            ]
        },
        {
            "Title": "离店送别-客户留资",
            "Matched": true,
            "Remarks": "销售人员提出加钉钉的方式以便后续联系。",
            "MatchedSentenceIds": [

            ]
        },
        {
            "Title": "到店迎接-饮品提供",
            "Matched": false,
            "Remarks": "对话中未提及提供饮品的信息。",
            "MatchedSentenceIds": [

            ]
        }
    ]
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

ServiceInspection

list[]

服务质检结果的集合,含有0个、1个或多个服务质检结果信息。

ServiceInspection[i].Title

string

服务质检结果的名称,和入参的ServiceInspection.InspectionContents[i].Title对应。

ServiceInspection[i].Matched

boolean

本条服务质检项是否命中。

ServiceInspection[i].Remarks

string

大模型对本条质检项的分析。

ServiceInspection[i].MatchedSentenceIds

list[]

命中该质检项的原始对话,在原文中的句子id。

自定义Prompt结果示例和字段定义

{
  "TaskId": "c8b8f8cac1134675a8722ae3********",
  "CustomPrompt": [
    {
      "Name": "split-summary-demo",
      "Result": "这段对话主要围绕着钉钉的语音技术和相关的人工智能研究成果展开。发言人1(静常)来自钉钉,负责介绍钉钉的研究成果和未来展望;而发言人2则是来自西瓜视频的科普视频创作者,主要通过提问和观察来了解并分享钉钉的技术。\n\n发言人1首先提到,虽然预测未来科技存在很大风险,但他们仍然坚持这样做,旨在向公众传达对未来科技的看法与态度。他随后介绍了钉钉在全球的分布,并重点提到钉钉位于杭州的总部及研究院的重要性和规模。此外,静常还讨论了钉钉发布的关于未来十大科技的报告,表达了他们对人工智能前沿技术的研究兴趣,尤其是语音技术。\n\n在对语音技术的讨论中,静常提出了在多种环境中(如嘈杂环境、多人讨论会议等)语音识别面临的挑战,并探讨了目前的技术解决方案,例如通过机器学习将问题分类后转交给相应的人工服务。他还谈到了一个长期目标-实现AI参与会议,以提高会议效率和决策质量。\n\n发言人2则从外部观察者的角度出发,通过实际体验来感受和展示钉钉的语音技术支持下的各种应用场景,比如语音控制贩卖机、智能电视机等,并通过直观的例子说明语音技术在现实生活中的应用潜力和挑战。\n\n最后,两位发言人共同强调了让语音交互“无处不在”的目标,并探讨了基于此技术,如何更好地服务于人类社会,以及企业在持续发展中如何坚持以用户需求为中心的原则。\n\n总之,这次对话深入探讨了钉钉在语音技术及其他人工智能领域的研究进展和未来规划,同时也反映了这些技术在实际生活中的应用现状和潜在影响。",
      "Truncated": false
    },
    {
      "Name": "inspection-demo",
      "Result": "无",
      "Truncated": false
    }
  ]
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

CustomPrompt

list[]

自定义Prompt结果列表。

CustomPrompt.Name

string

与入参结构中的CustomPrompt.Contents[i].Name对应。

CustomPrompt.Result

string

大模型返回结果。

CustomPrompt.Truncated

boolean

是否发生了截断。

要点提炼结果示例和字段定义

{
    "TaskId":"8b78c180e034fe9097e9135s7ebba1fa",
    "MeetingAssistance":{
        "Keywords":[
            "钉钉",
            "阿里巴巴",   
            "语音"
        ],
        "KeySentences":[
            {
                "Id":1,
                "SentenceId":1,
                "Start":31680,
                "End":36582,
                "Text":"首先我介绍一下我们的工作和岗位的要求。"
            },
            {
                "Id":2,
                "SentenceId":45,
                "Start":1452950,
                "End":1462184,
                "Text":"主要做的是语音,来自语音实验室,主要做语音转文字和语音相关的云服务。"
            }
        ],
        "Actions":[
            {
                "Id":1,
                "SentenceId":8,
                "Start":39654,
                "End":52117,
                "Text":"确认PPT模板中的内容是否有问题"
            },
            {
                "Id":2,
                "SentenceId":18,
                "Start":84693,
                "End":86786,
                "Text":"关注钉钉试用情况和即将发布情况"
            }
        ],
        "Classifications":{
            "Interview":0.6549709,
            "Lecture":0.18346232,
            "Meeting":0.16156682
        }
    }
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

MeetingAssistance

object

要点提炼结果对象,可能包含0个或多个不同类型的结果。

MeetingAssistance.Keywords

list[]

关键词提取结果。

MeetingAssistance.KeySentences

list[]

关键句提取结果,也称为重点内容。

MeetingAssistance.KeySentences[i].Id

long

关键句序号。

MeetingAssistance.KeySentences[i].SentenceId

long

该关键句在原ASR转写中对应的句子Id。

MeetingAssistance.KeySentences[i].Start

long

相对于音频起始时间的开始时间,相对时间戳,单位毫秒。

MeetingAssistance.KeySentences[i].End

long

相对于音频起始时间的结束时间,相对时间戳,单位毫秒。

MeetingAssistance.KeySentences[i].Text

string

关键句信息。

MeetingAssistance.Actions

list[]

待办内容、待办摘要的集合。

MeetingAssistance.Actions[i].Id

long

待办序号。

MeetingAssistance.Actions[i].SentenceId

long

该关键句在原ASR转写中对应的句子Id。

MeetingAssistance.Actions[i].Start

long

相对于音频起始时间的开始时间,相对时间戳,单位毫秒。

MeetingAssistance.Actions[i].End

long

相对于音频起始时间的结束时间,相对时间戳,单位毫秒。

MeetingAssistance.Actions[i].Text

string

待办内容。

MeetingAssistance.Classifications

object

场景识别分类,目前只有3种场景分类。

MeetingAssistance.Classifications.Interview

float

面试场景置信度得分。

MeetingAssistance.Classifications.Lecture

float

演讲场景置信度得分。

MeetingAssistance.Classifications.Meeting

float

会议场景置信度得分。

摘要总结结果示例和字段定义

{
    "TaskId": "5a7343ad75e6493da121ce65*********",
    "Summarization": {
        "ParagraphSummary": "介绍了阿里巴巴钉钉音视频的工作和岗位要求。他提到钉钉纪要相关的云服务。另外,他还回答了其他问题以及多模态项目的介绍。",
        "ConversationalSummary": [
            {
                "SpeakerId": "1",
                "SpeakerName": "发言人1",
                "Summary": "介绍了阿里巴巴钉钉的工作和岗位要求,主要是语音的转文字和文字转语音相关的云服务。他还提到了钉钉的目标是一个接口的服务,在云上对外进行售卖,并介绍了纪要产品的功能,包括总结、关键词提取等多模态能力。该产品即将在月底发布,可供用户访问。"
            },
            {
                "SpeakerId": "2",
                "SpeakerName": "发言人2",
                "Summary": "他负责NLP方向的AI能力的生产和业务能力的对接。他介绍了公司的三个项目。他还提到了在批改中遇到的一些难点和解决方案,以及公司未来对多模态项目的尝试。"
            }
        ],
        "QuestionsAnsweringSummary": [
            {
                "Question": "请问钉钉音视频是什么样的部门?",
                "SentenceIdsOfQuestion": [
                    207,
                    208,
                    209,
                    210
                ],
                "Answer": "钉钉音视频是阿里巴巴集团钉钉下的一个事业部,主要负责音视频服务。",
                "SentenceIdsOfAnswer": [
                    207,
                    208,
                    209,
                    210
                ]
            }
        ],
        "MindMapSummary": [
            {
                "Title": "阿里巴巴钉钉语音技术与智能设备实地参观纪要",
                "Topic": [
                    {
                        "Title": "1. 钉钉介绍",
                        "Topic": [
                            {
                                "Title": "总部位于杭州,分设在全球多个地点",
                                "Topic": []
                            },
                            {
                                "Title": "主要研究领域及成果",
                                "Topic": [
                                    {
                                        "Title": "未来十大科技趋势预测",
                                        "Topic": []
                                    },
                                    {
                                        "Title": "持续进行高风险科研项目",
                                        "Topic": []
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        "Title": "2. 语音技术讨论",
                        "Topic": [
                            {
                                "Title": "实验室环境挑战",
                                "Topic": [
                                    {
                                        "Title": "强噪声、多人交谈、多种电器干扰",
                                        "Topic": []
                                    }
                                ]
                            },
                            {
                                "Title": "技术挑战",
                                "Topic": [
                                    {
                                        "Title": "目标说话人识别",
                                        "Topic": []
                                    },
                                    {
                                        "Title": "语意理解:同音异义词的情感区分",
                                        "Topic": []
                                    }
                                ]
                            },
                            {
                                "Title": "应用现状",
                                "Topic": [
                                    {
                                        "Title": "Call Center自动化应答",
                                        "Topic": []
                                    },
                                    {
                                        "Title": "会议场景中的语音识别优化",
                                        "Topic": []
                                    }
                                ]
                            },
                            {
                                "Title": "未来展望",
                                "Topic": [
                                    {
                                        "Title": "AI参与会议,提高决策质量",
                                        "Topic": []
                                    },
                                    {
                                        "Title": "语音技术在各领域的广泛应用",
                                        "Topic": []
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

Summarization

object

摘要结果对象,可能包含0个或多个不同摘要类型的结果。

Summarization.ParagraphSummary

string

全文摘要结果。

Summarization.ConversationalSummary

list[]

发言总结摘要结果列表。

Summarization.ConversationalSummary[i].SpeakerId

string

发言人id。

Summarization.ConversationalSummary[i].SpeakerName

string

发言人名字。

Summarization.ConversationalSummary[i].Summary

string

该发言人对应的总结。

Summarization.QuestionsAnsweringSummary

list[]

问答回顾摘要结果列表。

Summarization.QuestionsAnsweringSummary[i].Question

string

问题

Summarization.QuestionsAnsweringSummary[i].SentenceIdsOfQuestion

list[]

提炼出该问题对应的原语音转写的SentenceId列表。

Summarization.QuestionsAnsweringSummary[i].Answer

string

问题对应的答案。

Summarization.QuestionsAnsweringSummary[i].SentenceIdsOfAnswer

list[]

总结出该答案对应的原语音转写的SentenceId列表。

Summarization.MindMapSummary

list[]

思维导图结果列表。

Summarization.MindMapSummary[i].Title

string

思维导图单个节点的文本内容。

Summarization.MindMapSummary[i].Topic

list[]

思维导图单个节点的子节点列表。

口语书面化结果示例和字段定义

{
    "TaskId": "742efa3a71f7475fae81a060********",
    "TextPolish": [
        {
            "FormalParagraphText": "云栖大会作为中国产业界的盛会,成为数字时代共同讨论的场所。阿里巴巴通过青橙奖助力青年科学家追求科学先进性。阿里云在云计算和数字生态方面不断发展,努力成为全球先进的计算基础设施。同时,阿里巴巴也在不断追求技术先进性,包括自主可控的云操作系统、算法模型的训练等。阿里巴巴希望通过低代码环境让普通人也能享受数据的成果和创造。此外,在芯片领域,阿里巴巴也在努力突破核心技术。",
            "SentenceIds": [
                1,
                2
            ],
            "ParagraphId": "1708487265101500000",
            "Start": 30,
            "End": 9600
        },
        {
            "FormalParagraphText": "平头哥围绕云计算场景定义了倚天710芯片,并助力冬奥在云上举办。云计算为各行各业带来全新的生产管理方式,推动中国走向现代化。阿里巴巴致力于追求技术先进性,并为社会发展担当更大责任,努力使云计算成为可持续发展的绿色动力。",
            "SentenceIds": [
                3,
                4,
                5
            ],
            "ParagraphId": "1708487280411500000",
            "Start": 15340,
            "End": 17790
        }
    ]
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

TextPolish

list[]

口语书面化集合, 含有0个、1个或多个口语书面化信息。

TextPolish[i].FormalParagraphText

string

口语书面化的文本结果。

TextPolish[i].SentenceIds

list[]

口语书面化改写内容对应的SentenceId列表。

TextPolish[i].ParagraphId

string

文本结果的段落id,和语音转写结果中的段落id对应。

TextPolish[i].Start

long

文本结果在原音频中的开始时间,相对时间戳,单位为毫秒。

TextPolish[i].End

long

文本结果在原音频中的结束时间,相对时间戳,单位为毫秒。

自动章节结果示例和字段定义

{
    "TaskId":"05c45066fc6df96dg09bf8z4*********",
    "AutoChapters":[
        {
            "Id":1,
            "Start":1930,
            "End":283874,
            "Headline":"阿里巴巴云栖大会及技术责任",
            "Summary":"云栖大会作为中国产业界的盛会,成为数字时代共同讨论的场所。阿里巴巴通过青橙奖助力青年科学家追求科学先进性。阿里云在云计算和数字生态方面不断发展,努力成为全球先进的计算基础设施。同时,阿里巴巴也在不断追求技术先进性,包括自主可控的云操作系统、算法模型的训练等。阿里巴巴希望通过低代码环境让普通人也能享受数据的成果和创造。此外,在芯片领域,阿里巴巴也在努力突破核心技术。"
        },
        {
            "Id":2,
            "Start":284050,
            "End":452084,
            "Headline":"云计算:推动中国走向现代化",
            "Summary":"平头哥围绕云计算场景定义了倚天710芯片,并助力冬奥在云上举办。云计算为各行各业带来全新的生产管理方式,推动中国走向现代化。阿里巴巴致力于追求技术先进性,并为社会发展担当更大责任,努力使云计算成为可持续发展的绿色动力。"
        }
    ]
}

参数名

类型

说明

TaskId

string

纪要内部ID,可以通过该字段排查问题。

AutoChapters

list[]

章节速览集合, 含有0个、1个或多个章节速览信息。

AutoChapters[i].Id

int

该章节序号。

AutoChapters[i].Start

long

该章节相对于音频起始时间的开始时间,相对时间戳,单位毫秒。

AutoChapters[i].End

long

该章节相对于音频起始时间的结束时间,相对时间戳,单位毫秒。

AutoChapters[i].Headline

string

该章节的一句话标题。

AutoChapters[i].Summary

string

章节总结。

3002 纪要失败

{
    "eventType": "3000",
    "eventData": {
        "channelId": "room**",
        "asrState": {
            "code": 50004001                    // 状态码,详见状态码表格
        },
        "taskId": "taskId-199",
        "timestamp": 1709721103673
    }
}

状态码表格

类型

状态码

说明

公共

20000000

成功

50000000

服务器内部错误

推流

50001001

推流异常

录制

50002001

写入用户存储失败,

可能是网络问题

50002002

启动用户存储失败,

可能是入参AK/SK/Bucket/Region/Vendor输入错误

50002003

录制时间过短,没有生成录制文件

50002004

用户存储密钥错误

50002005

bucket不存在

50002006

访问用户存储被拒绝

20002001

没有开始云端录制

20002002

云端录制初始化完成

20002003

录制组件开始启动

20002004

录制组件启动完成

20002005

停止录制

20002006

上传组件已启动

20002007

已成功上传第一个文件

用户

20003001

客户端主动退会

20003002

客户端保活异常

20003003

用户被踢出

20003004

相同uid移除

20003005

未知原因退会

纪要

50004001

纪要服务器异常

50004002

纪要任务超过最大时间

30006001

用户ak/sk/bucket配置异常