PPT抽取及摘要

本文主要介绍PPT抽取及摘要的AI能力和实现方式。PPT抽取及摘要是指提取视频中的PPT画面,并将每页PPT展示时所讲述的内容,提炼成摘要总结,便于快速回顾PPT及讲解内容。

功能说明

可提取视频文件中的PPT图片并总结对应演讲内容的摘要。

仅支持PPT在主要界面(投屏或周边有人物视频),不支持人物在PPT前走动或演讲。可通过通义听悟网站测试效果。点此测试

请求参数

参数名

类型

是否必填

说明

PptExtractionEnabled

boolean

默认为false

示例设置

{
    "Input":{
        ...
    },
    "Parameters":{
        ...
        "PptExtractionEnabled":true,
        ...
    }
}

代码示例

#!/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()
    # ppt抽取和ppt总结
    parameters['PptExtractionEnabled'] = True
    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.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 PptExtractionTest {

    @Test
    public void testPpt() 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("PptExtractionEnabled", true);
        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":"d9cea51c1fezg647af24e815********",
        "TaskStatus":"COMPLETED",
        "Result":{
            "PptExtraction":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/d9cea51c1fef4647af24e8154d6ae0c0/d9cea51c1fef4647af24e8154d6ae0c0_PptExtraction_20231030213209.json?Expires=1698759180&OSSAccessKeyId=LTAI4G4********j6oX8nt5S&Signature=4XY2*******Yra72pue4g1vetQ%3D",
            "Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/d9cea51c1fef4647af24e8154d6ae0c0/d9cea51c1fef4647af24e8154d6ae0c0_Transcription_20231030213158.json?Expires=1698759180&OSSAccessKeyId=LTAI4G4********j6oX8nt5S&Signature=hV4C*******1aMauJnlg8djxZCQ%3D"
        }
    },
    "Message":"success",
    "RequestId":"3c347cdc-7e54-456b-9db3-c23********"
}

其中PptExtraction字段对应的即为章节速览结果的http url下载链接。

协议解析

上述输出中的章节速览结果url中的内容为JSON格式的报文,示例如下所示。

{
    "TaskId":"d9cea51c1fef464zaf21e815*******",
    "PptExtraction":{
        "AvailableForSummary":true,
        "PdfPath":"https://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu/output/1738248129743478/61556f87f76a4ee285cb87629f8b0394/ppt_20231031110531/61556f87f76a4ee285cb87629f8b0394.pdf?Expires=1698731046&OSSAccessKeyId=TMP.3Kjg********j8rW8SRKjmSJYNMmWEWEALNc8Es2mK98ASLkvGAJwvzmUx9Y1eSxMmqWRrUYh6AD2PeaDh8mWHAHxjPRZ&Signature=URg%2BgSN******t2%2FUfiniGdYRGE%3D",
        "KeyFrameList":[
            {
                "Id":1,
                "Start":1160,
                "End":12320,
                "FileUrl":"https://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu/output/1738248129743478/61556f87f76a4ee285cb87629f8b0394/ppt_20231031110531/61556f87f76a4ee285cb87629f8b0394_001.png?Expires=1698730995&OSSAccessKeyId=TMP.3Kjg********j8rW8SRKjmSJYNMmWEWEALNc8Es2mK98ASLkvGAJwvzmUx9Y1eSxMmqWRrUYh6AD2PeaDh8mWHAHxjPRZ&Signature=aO******TxzY%2FQFo9glABLwmnnY%3D"
            },
            {
                "Id":2,
                "Start":14880,
                "End":50389,
                "FileUrl":"https://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu/output/1738248129743478/61556f87f76a4ee285cb87629f8b0394/ppt_20231031110531/61556f87f76a4ee285cb87629f8b0394_002.png?Expires=1698731023&OSSAccessKeyId=TMP.3Kjg********j8rW8SRKjmSJYNMmWEWEALNc8Es2mK98ASLkvGAJwvzmUx9Y1eSxMmqWRrUYh6AD2PeaDh8mWHAHxjPRZ&Signature=2N*******vM8dYfJYNaXG59HA%3D"
            }
        ]
    }
}

具体字段定义如下。

参数名

类型

说明

TaskId

string

创建任务时生成的TaskId。

PptExtraction

object

ppt抽取和总结对象, 如果不存在或为空,表示没有任何结果。

PptExtraction.AvailableForSummary

boolean

标识是否存在PPT总结文本。

为false表示没有PPT总结结果,为true表示至少有一条。

PptExtraction.KeyFrameList

list[]

ppt结果list,含ppt图片和总结文本。

PptExtraction.KeyFrameList[i].Id

long

序号。

PptExtraction.KeyFrameList[i].Start

long

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

PptExtraction.KeyFrameList[i].End

long

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

PptExtraction.KeyFrameList[i].FileUrl

string

生成的ppt图片结果,http下载链接。

PptExtraction.KeyFrameList[i].Summary

string

对应的ppt总结。

常见问题

PPT抽取及摘要功能在什么场景下可以调用?

  • 您可以在创建音视频文件离线转写时,直接设置;

  • 您也可以在离线转写结束后,再次发起重跑任务请求(必须基于同一个TaskId),生成章节信息。

  • 另外,不同于其他功能,由于该功能定位于从视频中抽取ppt画面及总结,因此其使用场景相对有限,比如:在实时会议场景下无法使用(该场景是实时音频流,无视频信息),在离线转写场景且原始文件非视频格式时也无法使用。

为什么我调用后没有生成PPT抽取结果,或为空?

  • 一个可能是调用参数没有启用或设置不正确,请您仔细参考开发文档进行对比并正确设置。

  • 另一个可能是在实时会议场景或离线转写场景且原始文件非视频格式时使用时,都无法抽取到PPT画面,进而无ppt抽取结果和总结结果。

  • 另外一个可能即使您是在离线转写场景且是视频文件,如果没有找到PPT画面内容则也是没有对应结果生成的。

为什么我返回了语音转写的结果?

  • 虽然在PPT抽取时并不依赖语音转写(ASR)内容,但进行PPT总结时,是需要结合ASR转写文本信息进行模型处理的。

为什么我的结果里,有的含有PPT抽取的图片和总结,而有的时候只有图片而没有总结?

  • 该功能本身是分两步执行的: 先从视频中抽取到PPT画面并保存成图片;再根据时间戳信息结合ASR文本提炼总结内容。因此即使抽取到了图片,但由于对应的ASR文本过短、过少,无法提炼出有效总结内容,此时该PPT图片对应的总结内容即为空。