本文主要介绍大模型摘要总结AI能力和实现方式。
摘要总结功能是基于通义千问大语言模型,从多维度提炼交流内容。
当前支持:全文摘要、发言总结、问答回顾、思维导图。
全文摘要:提炼出忠实于原文的摘要,全文摘要通过两三百字的篇幅将最重要的信息呈现在你的面前。快速了解记录内容与主旨。
发言总结:在会议中往往有多人的讨论。通过听悟能够区分不同发言人、帮您总结出每个人不同的观点。发言总结功能可以把“谁”“表达了什么”清晰的整理、呈现出来。
问答回顾:用以将原文中多人交互场景下,将问题和答案抽取、提炼为更精简的问答对,便于您快速了解会议中的关键问题及答案。
思维导图:根据音视频内容进行总结,并生成绘制思维导图所需的数据结构,您需要将结果传递给前端框架,渲染出思维导图图片。目前思维导图最多生成四个层级(树结构最大深度为四层)。
您可以一次性获取全部摘要结果,也可以按需获取其中1个或多个。
请求参数
参数名 | 类型 | 说明 |
SummarizationEnabled | boolean | 默认为false |
Summarization | list[] | 默认为空,您可按需添加需要处理的摘要类型;当前支持:
|
示例设置
{
"Input":{
...
},
"Parameters":{
"SummarizationEnabled":true,
"Summarization":{
"Types":[
"Paragraph",
"Conversational",
"QuestionsAnswering",
"MindMap"
]
}
}
}
代码示例
#!/usr/bin/env python
#coding=utf-8
import os
import json
import datetime
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.auth.credentials import AccessKeyCredential
def create_common_request(domain, version, protocolType, method, uri):
request = CommonRequest()
request.set_accept_format('json')
request.set_domain(domain)
request.set_version(version)
request.set_protocol_type(protocolType)
request.set_method(method)
request.set_uri_pattern(uri)
request.add_header('Content-Type', 'application/json')
return request
def init_parameters():
root = dict()
root['AppKey'] = '输入您在听悟管控台创建的Appkey'
# 基本请求参数
input = dict()
input['SourceLanguage'] = 'cn'
input['TaskKey'] = 'task' + datetime.datetime.now().strftime('%Y%m%d%H%M%S')
input['FileUrl'] = '输入待测试的音频url链接'
root['Input'] = input
# AI相关参数,按需设置即可
parameters = dict()
# 摘要控制相关,包括: 全文摘要、发言总结、问答回顾
parameters['SummarizationEnabled'] = True
summarization = dict()
summarization['Types'] = ['Paragraph', 'Conversational', 'QuestionsAnswering', 'MindMap']
parameters['Summarization'] = summarization
root['Parameters'] = parameters
return root
body = init_parameters()
print(body)
# TODO 请通过环境变量设置您的 AccessKeyId 和 AccessKeySecret
credentials = AccessKeyCredential(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
client = AcsClient(region_id='cn-beijing', credential=credentials)
request = create_common_request('tingwu.cn-beijing.aliyuncs.com', '2023-09-30', 'https', 'PUT', '/openapi/tingwu/v2/tasks')
request.add_query_param('type', 'offline')
request.set_content(json.dumps(body).encode('utf-8'))
response = client.do_action_with_exception(request)
print("response: \n" + json.dumps(json.loads(response), indent=4, ensure_ascii=False))
package com.alibaba.tingwu.client.demo.aitest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.Test;
/**
* @author tingwu2023
*/
public class SummarizationTest {
@Test
public void testSummarization() throws ClientException {
CommonRequest request = createCommonRequest("tingwu.cn-beijing.aliyuncs.com", "2023-09-30", ProtocolType.HTTPS, MethodType.PUT, "/openapi/tingwu/v2/tasks");
request.putQueryParameter("type", "offline");
JSONObject root = new JSONObject();
root.put("AppKey", "输入您在听悟管控台创建的Appkey");
JSONObject input = new JSONObject();
input.fluentPut("FileUrl", "输入待测试的音频url链接")
.fluentPut("SourceLanguage", "cn")
.fluentPut("TaskKey", "task" + System.currentTimeMillis());
root.put("Input", input);
JSONObject parameters = new JSONObject();
parameters.put("SummarizationEnabled", true);
JSONObject summarization = new JSONObject();
// 全文摘要、发言人总结摘要、问答摘要(问答回顾)
JSONArray types = new JSONArray()
.fluentAdd("Paragraph")
.fluentAdd("Conversational")
.fluentAdd("QuestionsAnswering")
.fluentAdd("MindMap");
summarization.put("Types", types);
parameters.put("Summarization", summarization);
root.put("Parameters", parameters);
System.out.println(root.toJSONString());
request.setHttpContent(root.toJSONString().getBytes(), "utf-8", FormatType.JSON);
// TODO 请通过环境变量设置您的AccessKeyId、AccessKeySecret
DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
}
public static CommonRequest createCommonRequest(String domain, String version, ProtocolType protocolType, MethodType method, String uri) {
// 创建API请求并设置参数
CommonRequest request = new CommonRequest();
request.setSysDomain(domain);
request.setSysVersion(version);
request.setSysProtocol(protocolType);
request.setSysMethod(method);
request.setSysUriPattern(uri);
request.setHttpContentType(FormatType.JSON);
return request;
}
}
示例输出
{
"Code":"0",
"Data":{
"TaskId":"5a7343ad75e64z3da121ce65********",
"TaskStatus":"COMPLETED",
"Result":{
"AutoChapters":"http://speech-swap-hangzhou.oss-cn-hangzhou.aliyuncs.com/tingwu/output/1503864348104017/5a7343ad75e6493da121ce653f9389eb/5a7343ad75e6493da121ce653f9389eb_AutoChapters_20231029224651.json?Expires=1698677343&OSSAccessKeyId=LTAI4G4u********j6oX8nt5S&Signature=********TYeZfkvr3mgEK%2Bseo1U%3D",
"Transcription":"http://speech-swap-hangzhou.oss-cn-hangzhou.aliyuncs.com/tingwu/output/1503864348104017/5a7343ad75e6493da121ce653f9389eb/5a7343ad75e6493da121ce653f9389eb_Transcription_20231029224625.json?Expires=1698677343&OSSAccessKeyId=LTAI4G*********j6oX8nt5S&Signature=Kliw%2Fp2xCKHpKR06********Y8%3D",
"Summarization":"http://speech-swap-hangzhou.oss-cn-hangzhou.aliyuncs.com/tingwu/output/1503864348104017/5a7343ad75e6493da121ce653f9389eb/5a7343ad75e6493da121ce653f9389eb_Summarization_20231029224656.json?Expires=1698677343&OSSAccessKeyId=LTAI4G*********j6oX8nt5S&Signature=rY5v4CbGjKnh0Nu*********Xhs%3D"
}
},
"Message":"success",
"RequestId":"4EEBD53F-BCC9-1A0E-B17E-C459********"
}
其中Summarization字段对应的即为摘要结果的http url下载链接。
协议解析
上述输出中的大模型摘要结果url中的内容为JSON格式的报文,示例如下所示。
{
"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 | 创建任务时生成的TaskId。 |
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)。
为什么我调用后没有生成摘要总结的结果,或结果为空?
一个可能是调用参数没有启用或设置不正确,请您仔细参考开发文档进行对比并正确设置。
一个可能是您设置的语言模型并不支持生成摘要信息,比如若音视频文件是日语,目前是不支持的。
另外一个可能是音视频文件的信息不够丰富,比如音视频文件转写后的ASR信息太少(可能是背景噪音过多或过差),导致模型无法生成章节信息。此时您可以更换一条涵盖有效信息更丰富的音视频文件进行测试。
还有就是您没有设置摘要类型,或设置了我们不支持的摘要类型,您可以参考本文介绍的类型正确设置。
为什么生成的摘要总结没有任何结果?
虽然摘要会产生多种类型的结果,但并不保证一定会生成结果,比如转写出的有效信息过少时。
如果没有问答摘要结果,可能是原始音视频中本身没有问答信息。
为什么我没有设置章节速览参数,在摘要结果里返回了章节速览的结果?
因为全文摘要的计算除了依赖原始音视频信息、ASR转写结果之外,还额外依赖章节标题信息,因此听悟会在用户开启全文摘要调用时,内部自动触发对章节速览功能的调用,并将结果返回给用户。