日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

音視頻文件離線轉(zhuǎn)寫

更新時(shí)間:
重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。

本文介紹音視頻文件記錄接入流程。

說明

如果您需要咨詢更多產(chǎn)品技術(shù)問題,歡迎搜索釘釘群號(hào)78410012058,加入通義聽悟咨詢?nèi)郝?lián)系我們。

音視頻文件轉(zhuǎn)寫是針對(duì)已經(jīng)錄制完成的錄音文件或視頻文件,進(jìn)行離線處理(包含語音識(shí)別、翻譯、要點(diǎn)提煉、摘要總結(jié)、PPT提取及摘要等功能)的服務(wù)。

離線轉(zhuǎn)寫是非實(shí)時(shí)業(yè)務(wù)場(chǎng)景,且提交待處理的文件是提交基于HTTP或HTTPS可訪問的文件URL地址,不支持提交本地文件或其他比如FTP協(xié)議類的文件地址。

使用須知

  • 支持單軌或雙軌的mp3、wav、m4a、wma、aac、ogg、amr、flac、aiff格式的音頻文件和mp4、wmv、m4v、flv、rmvb、dat、mov、mkv、webm、avi、mpeg、3gp、ogg格式的視頻文件。

  • 文件大小不超過6GB。

  • 音頻時(shí)長(zhǎng)不超過6小時(shí)。

  • 音頻采樣率8K/16K/24K/48K。

  • 需要識(shí)別的音視頻文件必須支持可通過公網(wǎng)形式的url訪問和下載。

  • 提交的音視頻文件URL的訪問權(quán)限需要設(shè)置為公開,URL中只能使用域名不能使用IP地址、不可包含空格,請(qǐng)盡量避免使用中文。

    • 推薦使用阿里云OSS:如果OSS中文件訪問權(quán)限為公開,可參見使用文件URL分享文件,獲取文件訪問鏈接;如果OSS中文件訪問權(quán)限為私有,可參見使用文件URL分享文件,通過SDK生成有有效時(shí)間的訪問鏈接。

    • 您也可以把錄音文件存放在自行搭建的文件服務(wù)器,提供文件下載。請(qǐng)保證HTTP的響應(yīng)頭(Header)中Content-Length的長(zhǎng)度值和Body中數(shù)據(jù)的真實(shí)長(zhǎng)度一致,否則會(huì)導(dǎo)致下載失敗。

    • 因離線任務(wù)存在排隊(duì)情況,為保障3小時(shí)內(nèi)完成,因此您若設(shè)置了帶有效期限制的訪問url,請(qǐng)?jiān)O(shè)置有效期不低于3小時(shí),以避免過期而無法下載音視頻文件進(jìn)行處理。

  • 支持的調(diào)用方式:輪詢方式和回調(diào)方式,您可以任選其一即可。

  • 支持設(shè)置多種語言識(shí)別:中文、英文、粵語、中英自由說(長(zhǎng)段中英混)、日語、韓語,詳見 音視頻文件服務(wù)參數(shù)表

  • 對(duì)于API維度的QPS(Queries Per Second)限制如下:

重要
  • 提交音視頻文件離線轉(zhuǎn)寫任務(wù)后,任務(wù)在3小時(shí)內(nèi)完成并返回識(shí)別文本和大模型結(jié)果(如有)。但一次性上傳大規(guī)模數(shù)據(jù)(半小時(shí)內(nèi)上傳超過500小時(shí)時(shí)長(zhǎng)的錄音)的除外。

  • 如有大規(guī)模離線文件處理需求的用戶,請(qǐng)聯(lián)系售前專家另行溝通。

警告

超過QPS之后則可能報(bào)錯(cuò):Throttling.User : Request was denied due to user flow control.。建議查詢接口的輪詢間隔適當(dāng)延長(zhǎng),不宜過短。

交互流程

用戶客戶端與服務(wù)端的交互流程如圖所示:

image

接入步驟

用戶客戶端提交錄音文件識(shí)別請(qǐng)求。

正常情況下,服務(wù)端返回該請(qǐng)求任務(wù)的TaskId,用于后續(xù)查詢識(shí)別結(jié)果。

如果調(diào)用出錯(cuò),響應(yīng)報(bào)文中會(huì)給出相關(guān)錯(cuò)誤信息,以及RequestId,您可自行據(jù)此排查調(diào)用參數(shù),也可以將響應(yīng)報(bào)文通過工單形式提交給我們做進(jìn)一步排查。

基于上一步提交任務(wù)后返回的TaskId來查詢處理結(jié)果。

如通過此方式輪詢查詢結(jié)果,注意輪詢頻率不要過高,以便被限流。比如您可以按每1分鐘或每5分鐘的頻率持續(xù)查詢。

使用回調(diào)通知的方式來獲取結(jié)果,不同于主動(dòng)輪詢,您可以在提交任務(wù)后,等待服務(wù)端處理完成時(shí)主動(dòng)地通知您任務(wù)狀態(tài)。

當(dāng)前我們支持通過HTTP或MQ的形式將任務(wù)處理狀態(tài)通知到您。

您可以在任務(wù)完成后,補(bǔ)充新的參數(shù),觸發(fā)新的算法處理,刷新任務(wù)結(jié)果。

前提條件

AccessKey環(huán)境變量設(shè)置

需要使用您的AccessKey的Id和secret替換如下命令中的YOUR_ACCESS_KEY_ID和YOUR_ACCESS_KEY_SECRET。

export ALIBABA_CLOUD_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID &&
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=YOUR_ACCESS_KEY_SECRET

提交音視頻離線轉(zhuǎn)寫任務(wù)

請(qǐng)求參數(shù)

名稱

參數(shù)

類型

默認(rèn)值

說明

任務(wù)類型

type

string

-

必選,任務(wù)類型:

  • offline:表示離線任務(wù),比如離線轉(zhuǎn)寫

操作項(xiàng)

operation

string

start

操作項(xiàng)

  • start:表示任務(wù)的創(chuàng)建,也是默認(rèn)值。

AppKey

body.AppKey

string

-

必選,請(qǐng)?jiān)O(shè)置為您在管控臺(tái)上創(chuàng)建的AppKey。

基本請(qǐng)求信息

(Input)

body.Input.FileUrl

string

-

必選,音視頻文件下載地址,支持http或https形式的地址。

body.Input.SourceLanguage

string

-

必選根據(jù)音視頻中的語種類別來配置對(duì)應(yīng)的參數(shù)。

  • 若已知語音中的語種,如實(shí)選擇中文(cn), 英語(en), 粵語(yue), 日語(ja)、韓語(ko),推薦使用此方式。

  • 若未知語音中涉及的語種,可傳入自動(dòng)語種識(shí)別(auto),語種算法檢測(cè)后,系統(tǒng)自動(dòng)切換模型進(jìn)行語音識(shí)別,此功能僅在離線轉(zhuǎn)寫任務(wù)下可用。

  • 若語音中的語種非單語種,涉及多個(gè)語種,可傳入(multilingual),識(shí)別出對(duì)應(yīng)語種的文字。結(jié)合Input.LanguageHints一起使用。

body.Input.LanguageHints

list[string]

null

指定多語言模型時(shí)需語音識(shí)別出文字的語種列表

當(dāng)語音中涉及多個(gè)語種的語音均需識(shí)別出文字時(shí),此參數(shù)用于限制語種類別,且僅當(dāng)Input.SourceLanguage='multilingual'時(shí)配置生效。

body.Input.TaskKey

string

null

用戶自行設(shè)置的自定義標(biāo)識(shí)。

body.Input.ProgressiveCallbacksEnabled

boolean

false

是否開啟回調(diào)功能。

當(dāng)需要開啟回調(diào)功能時(shí),您需要在控制臺(tái)配置好回調(diào)類型和地址,并在創(chuàng)建任務(wù)時(shí)將該參數(shù)置為true。

轉(zhuǎn)碼(Transcoding)

body.Parameters.Transcoding.TargetAudioFormat

string

null

當(dāng)前只支持設(shè)置mp3轉(zhuǎn)換。

body.Parameters.Transcoding.TargetVideoFormat

string

null

當(dāng)前只支持設(shè)置mp4轉(zhuǎn)換;僅在原文件為視頻格式設(shè)置才有意義。

語音識(shí)別

(Transcription)

body.Parameters.Transcription.DiarizationEnabled

boolean

false

是否在語音識(shí)別過程中開啟說話人分離功能。

body.Parameters.Transcription.Diarization.SpeakerCount

int

-

  • 開啟說話人分離功能時(shí),設(shè)置的說話人數(shù)。

  • 不設(shè)置:不使用說話人角色區(qū)分。 0:說話人角色區(qū)分結(jié)果為不定人數(shù)。 2:說話人角色區(qū)分結(jié)果為2人。

當(dāng)有此參數(shù)時(shí),使用此參數(shù)輔助指定的人數(shù),最終分軌人數(shù)以真實(shí)分類人數(shù)為準(zhǔn)。

body.Parameters.Transcription.PhraseId

String

-

熱詞詞表ID。

翻譯

(Translation)

body.Parameters.TranslationEnabled

boolean

false

是否開啟翻譯功能。

body.Parameters.Translation.TargetLanguages

list[string]

-

如果開啟翻譯,需要設(shè)置目標(biāo)翻譯語言。

支持設(shè)置中文(cn)、 英語(en)、日語(ja)、韓語(ko)、德語(de)、法語(fr)、俄語(ru)。

章節(jié)速覽

body.Parameters.AutoChaptersEnabled

boolean

false

章節(jié)速覽功能,包括:議程標(biāo)題和議程摘要。

要點(diǎn)提煉

(MeetingAssistance)

body.Parameters.MeetingAssistanceEnabled

boolean

false

要點(diǎn)提煉功能,包括:關(guān)鍵詞、重點(diǎn)內(nèi)容、待辦、場(chǎng)景識(shí)別。

body.Parameters.MeetingAssistance.Types

list[string]

-

如果開啟要點(diǎn)提煉功能,您可以設(shè)置1個(gè)或者多個(gè)對(duì)應(yīng)的類型:

  • Actions : 待辦事項(xiàng)

  • KeyInformation : 關(guān)鍵信息(含關(guān)鍵詞和重點(diǎn)內(nèi)容)

注意:若您只打開了功能開關(guān),但沒有添加任何算法類型,則該功能模型處理所有算法模型。

摘要總結(jié)

(Summarization)

body.Parameters.SummarizationEnabled

boolean

false

是否開啟摘要總結(jié)功能。

body.Parameters.Summarization.Types

list[string]

-

如果開啟摘要總結(jié)功能,需要設(shè)置摘要類型。支持設(shè)置1個(gè)或多個(gè)。

  • Paragraph(全文摘要)

  • Conversational(發(fā)言總結(jié))

  • QuestionsAnswering(問答回顧)

  • MindMap(思維導(dǎo)圖)

PPT提取及摘要

body.Parameters.PptExtractionEnabled

boolean

false

是否開啟PPT功能,包含PPT抽取、PPT摘要。

注:僅支持PPT在主要界面(投屏或周邊有人物視頻),不支持人物在PPT前走動(dòng)或演講。

可通過通義聽悟網(wǎng)站測(cè)試效果。點(diǎn)此測(cè)試

口語書面化

body.Parameters.TextPolishEnabled

boolean

false

是否開啟口語書面化功能。

服務(wù)質(zhì)檢

body.Parameters.ServiceInspectionEnabled

boolean

false

是否開啟服務(wù)質(zhì)檢功能。

body.Parameters.ServiceInspection

object

-

參考服務(wù)質(zhì)檢參數(shù)對(duì)象對(duì)服務(wù)過程中的對(duì)話進(jìn)行質(zhì)量檢測(cè),支持自定義多個(gè)質(zhì)檢維度,輔助客戶提升服務(wù)水平。

自定義Prompt

body.Parameters.CustomPromptEnabled

boolean

false

是否開啟自定義prompt功能。

body.Parameters.CustomPrompt

object

-

參考自定義prompt參數(shù)對(duì)象由客戶自主定義大模型提示詞,引導(dǎo)大模型完成客戶定義的各類任務(wù)。

示例代碼

#!/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():
    body = dict()
    body['AppKey'] = '輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey'

    # 基本請(qǐng)求參數(shù)
    input = dict()
    input['SourceLanguage'] = 'cn'
    input['TaskKey'] = 'task' + datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    input['FileUrl'] = '輸入待測(cè)試的音頻url鏈接'
    body['Input'] = input

    # AI相關(guān)參數(shù),按需設(shè)置即可
    parameters = dict()

    # 音視頻轉(zhuǎn)換相關(guān)
    transcoding = dict()
    # 將原音視頻文件轉(zhuǎn)成mp3文件,用以后續(xù)瀏覽器播放
    # transcoding['TargetAudioFormat'] = 'mp3'
    # transcoding['SpectrumEnabled'] = False
    # parameters['Transcoding'] = transcoding

    # 語音識(shí)別控制相關(guān)
    transcription = dict()
    # 角色分離 : 可選
    transcription['DiarizationEnabled'] = True
    diarization = dict()
    diarization['SpeakerCount'] = 2
    transcription['Diarization'] = diarization
    parameters['Transcription'] = transcription

    # 文本翻譯控制相關(guān) : 可選
    parameters['TranslationEnabled'] = True
    translation = dict()
    translation['TargetLanguages'] = ['en'] # 假設(shè)翻譯成英文
    parameters['Translation'] = translation

    # 章節(jié)速覽相關(guān) : 可選,包括: 標(biāo)題、議程摘要
    parameters['AutoChaptersEnabled'] = True

    # 智能紀(jì)要相關(guān) : 可選,包括: 待辦、關(guān)鍵信息(關(guān)鍵詞、重點(diǎn)內(nèi)容、場(chǎng)景識(shí)別)
    parameters['MeetingAssistanceEnabled'] = True
    meetingAssistance = dict()
    meetingAssistance['Types'] = ['Actions', 'KeyInformation']
    parameters['MeetingAssistance'] = meetingAssistance

    # 摘要控制相關(guān) : 可選,包括: 全文摘要、發(fā)言人總結(jié)摘要、問答摘要(問答回顧)
    parameters['SummarizationEnabled'] = True
    summarization = dict()
    summarization['Types'] = ['Paragraph', 'Conversational', 'QuestionsAnswering', 'MindMap']
    parameters['Summarization'] = summarization

    # ppt抽取和ppt總結(jié) : 可選
    parameters['PptExtractionEnabled'] = True
    
    # 口語書面化 : 可選
    parameters['TextPolishEnabled'] = True

    body['Parameters'] = parameters
    return body

body = init_parameters()
print(body)

# TODO  請(qǐng)通過環(huán)境變量設(shè)置您的 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.offlinetask;

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
 * @desc 演示了通過OpenAPI 創(chuàng)建音視頻文件的離線轉(zhuǎn)寫任務(wù) 的調(diào)用方式。
 */
public class SubmitFiletransTaskTest {

    @Test
    public void summitTask() 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", "輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey");

        String path = "輸入待測(cè)試的音頻url鏈接";
        JSONObject input = new JSONObject();
        input.fluentPut("FileUrl", path)
                .fluentPut("SourceLanguage", "cn")
                .fluentPut("TaskKey", "task" + System.currentTimeMillis());
        root.put("Input", input);

        JSONObject parameters = initRequestParameters();
        root.put("Parameters", parameters);

        System.out.println(root.toJSONString());
        request.setHttpContent(root.toJSONString().getBytes(), "utf-8", FormatType.JSON);

        // TODO 請(qǐng)通過環(huán)境變量設(shè)置您的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());
        JSONObject body = JSONObject.parseObject(response.getData());
        JSONObject data = (JSONObject) body.get("Data");
        System.out.println("TaskId = " + data.getString("TaskId"));
    }

    public static JSONObject initRequestParameters() {
        JSONObject parameters = new JSONObject();

        // 音視頻轉(zhuǎn)換: 可選
        JSONObject transcoding = new JSONObject();
        transcoding.put("TargetAudioFormat", "mp3");
        transcoding.put("SpectrumEnabled", false);
        parameters.put("Transcoding", transcoding);

        // 語音識(shí)別
        JSONObject transcription = new JSONObject();
        transcription.put("DiarizationEnabled", true);
        JSONObject speaker_count = new JSONObject();
        speaker_count.put("SpeakerCount", 2);
        transcription.put("Diarization", speaker_count);
        parameters.put("Transcription", transcription);

        // 翻譯: 可選
        JSONObject translation = new JSONObject();
        JSONArray langArry = new JSONArray();
        langArry.add("en");
        translation.put("TargetLanguages", langArry);
        parameters.put("Translation", translation);
        parameters.put("TranslationEnabled", true);

        // 章節(jié)速覽: 可選
        parameters.put("AutoChaptersEnabled", true);

        // 智能紀(jì)要: 可選
        parameters.put("MeetingAssistanceEnabled", true);
        JSONObject meetingAssistance = new JSONObject();
        JSONArray mTypes = new JSONArray().fluentAdd("Actions").fluentAdd("KeyInformation");
        meetingAssistance.put("Types", mTypes);
        parameters.put("MeetingAssistance", meetingAssistance);
      
        // 摘要相關(guān): 可選
        parameters.put("SummarizationEnabled", true);
        JSONObject summarization = new JSONObject();
        JSONArray sTypes = new JSONArray().fluentAdd("Paragraph").fluentAdd("Conversational").fluentAdd("QuestionsAnswering").fluentAdd("MindMap");
        summarization.put("Types", sTypes);
        parameters.put("Summarization", summarization);

        // PPT抽取: 可選
        parameters.put("PptExtractionEnabled", true);
      
      	// 口語書面化: 可選
        parameters.put("TextPolishEnabled", true);

        return parameters;
    }
  
    public static CommonRequest createCommonRequest(String domain, String version, ProtocolType protocolType, MethodType method, String uri) {
        // 創(chuàng)建API請(qǐng)求并設(shè)置參數(shù)
        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;
    }
}
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)

type TranscodeingParam struct {
	TargetAudioFormat     string `json:"TargetAudioFormat,omitempty"`
	TargetVideoFormat     string `json:"TargetVideoFormat,omitempty"`
	VideoThumbnailEnabled bool   `json:"VideoThumbnailEnabled,omitempty"`
	SpectrumEnabled       bool   `json:"SpectrumEnabled,omitempty"`
}

type DiarizationParam struct {
	SpeakerCount *int `json:"SpeakerCount,omitempty"`
}

type TranscriptionParam struct {
	AudioEventDetectionEnabled bool              `json:"AudioEventDetectionEnabled,omitempty"`
	DiarizationEnabled         bool              `json:"DiarizationEnabled,omitempty"`
	Diarization                *DiarizationParam `json:"Diarization,omitempty"`
}

type TranslationParam struct {
	TargetLanguages []string `json:"TargetLanguages,omitempty"`
}

type SummarizationParam struct {
	Types []string `json:"Types,omitempty"`
}

type ExtraParamerters struct {
	Transcoding              *TranscodeingParam  `json:"Transcoding,omitempty"`
	Transcription            *TranscriptionParam `json:"Transcription,omitempty"`
	TranslationEnabled       bool                `json:"TranslationEnabled,omitempty"`
	Translation              *TranslationParam   `json:"Translation,omitempty"`
	AutoChaptersEnabled      bool                `json:"AutoChaptersEnabled,omitempty"`
	MeetingAssistanceEnabled bool                `json:"MeetingAssistanceEnabled,omitempty"`
	SummarizationEnabled     bool                `json:"SummarizationEnabled,omitempty"`
	Summarization            *SummarizationParam `json:"Summarization,omitempty"`
	TextPolishEnabled        bool                `json:"TextPolishEnabled,omitempty"`
}

type InputParam struct {
	SourceLanguage string `json:"SourceLanguage"`
	FileUrl        string `json:"FileUrl,omitempty"`
	TaskKey        string `json:"TaskKey,omitempty"`
	Format         string `json:"Format,omitempty"`
	SampleRate     int    `json:"SampleRate,omitempty"`
}

type TaskBodyParam struct {
	Appkey      string            `json:"AppKey"`
	Input       InputParam        `json:"Input"`
	Paramerters *ExtraParamerters `json:"Parameters,omitempty"`
}

type GetTaskInfoResponse struct {
	RequestId string `json:"RequestId"`
	Code      string `json:"Code"`
	Message   string `json:"Message"`
	Data      struct {
		TaskId     string `json:"TaskId"`
		TaskKey    string `json:"TaskKey"`
		TaskStatus string `json:"TaskStatus"`
	} `json:"Data"`
}

func init_request_param_offline() *ExtraParamerters {
	param := new(ExtraParamerters)
	param.Transcoding = new(TranscodeingParam)
	transcription := new(TranscriptionParam)
	transcription.Diarization = new(DiarizationParam)
	transcription.Diarization.SpeakerCount = new(int)
        *transcription.Diarization.SpeakerCount = 0
	transcription.DiarizationEnabled = true
	param.Transcription = transcription

	param.TranslationEnabled = false
	param.AutoChaptersEnabled = false
	param.MeetingAssistanceEnabled = false
	param.SummarizationEnabled = true

	summarization := new(SummarizationParam)
	summarization.Types = []string{
		"Paragraph",
		"Conversational",
		"QuestionsAnswering",
                "MindMap",
	}
	param.Summarization = summarization
	param.TextPolishEnabled = false

	return param
}

func test_submit_offline_task() {
	akkey := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
	aksecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
	client, err := sdk.NewClientWithAccessKey("cn-beijing", akkey, aksecret)
	if err != nil {
		log.Default().Fatalln(err)
		return
	}

	request := requests.NewCommonRequest()
	request.Method = "PUT"
	request.Domain = "tingwu.cn-beijing.aliyuncs.com"
	request.Version = "2023-09-30"
	request.SetContentType("application/json")
	request.PathPattern = "/openapi/tingwu/v2/tasks"
	request.QueryParams["type"] = "offline"

	param := new(TaskBodyParam)
	param.Appkey = "輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey"
	param.Input.SourceLanguage = "cn"
	param.Input.FileUrl = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example.wav"
	param.Input.TaskKey = "task_" + fmt.Sprint(time.Now().Unix())

	param.Paramerters = init_request_param_offline()
        b, _ := json.Marshal(param)
	log.Default().Print("request body:\n", string(b))
	request.SetContent(b)
	request.SetScheme("https")

	response, err := client.ProcessCommonRequest(request)
	if err != nil {
		log.Default().Fatalln(err)
		return
	}

	log.Default().Print("response body:\n", string(response.GetHttpContentBytes()))
}

func main() {
	test_submit_offline_task()
}
#include <cstdlib>
#include <string>
#include <alibabacloud/core/AlibabaCloud.h>
#include <alibabacloud/core/CommonRequest.h>
#include <alibabacloud/core/CommonClient.h>
#include <alibabacloud/core/CommonResponse.h>
#include "jsoncpp/json.h"
/**
 * @author tingwu2023
 * @desc 演示了通過OpenAPI 創(chuàng)建音視頻文件的離線轉(zhuǎn)寫任務(wù) 的調(diào)用方式。
 */
int main( int argc, char** argv ) {
    AlibabaCloud::InitializeSdk();
    AlibabaCloud::ClientConfiguration configuration( "cn-beijing" );
    // specify timeout when create client.
    configuration.setConnectTimeout(1500);
    configuration.setReadTimeout(4000);
    // Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
    AlibabaCloud::Credentials credential( getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") );
    AlibabaCloud::CommonClient client( credential, configuration );

    AlibabaCloud::CommonRequest request(AlibabaCloud::CommonRequest::RequestPattern::RoaPattern);
    request.setHttpMethod(AlibabaCloud::HttpRequest::Method::Put);
    request.setDomain("tingwu.cn-beijing.aliyuncs.com");
    request.setVersion("2023-09-30");
    request.setResourcePath("/openapi/tingwu/v2/tasks");
    request.setHeaderParameter("Content-Type", "application/json");
    request.setQueryParameter("type", "offline");

    Json::Value root;
    root["Appkey"] = "輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey";

    Json::Value input;
    input["FileUrl"] = "輸入待測(cè)試的音頻url鏈接";
    input["SourceLanguage"] = "cn";
    input["TaskKey"] = "輸入您為該次請(qǐng)求自定義的標(biāo)識(shí)";
    root["Input"] = input;

    Json::Value parameters;
    // 音視頻文件轉(zhuǎn)換 通常來說,不需要設(shè)置此參數(shù)
    // Json::Value transcoding;
    // transcoding["TargetAudioFormat"] = "mp3";
    // parameters["Transcoding"] = transcoding;

    // 語音轉(zhuǎn)寫: 以下是開啟說話人分離功能(角色分離),若您不需要,則無須設(shè)置
    Json::Value transcription;
    transcription["DiarizationEnabled"] = true;
    Json::Value speakerCount;
    speakerCount["SpeakerCount"] = 2;
    transcription["Diarization"] = speakerCount;
    parameters["Transcription"] = transcription;

    // 翻譯: 可選
    Json::Value translation;
    Json::Value langauges;
    langauges.append("en");
    translation["TargetLanguages"] = langauges;
    parameters["Translation"] = translation;
    parameters["TranslationEnabled"] = true;

    // 章節(jié)速覽: 可選
    parameters["AutoChaptersEnabled"] = true;

    // 智能紀(jì)要: 可選,包括: 待辦、關(guān)鍵信息(關(guān)鍵詞、重點(diǎn)內(nèi)容、場(chǎng)景識(shí)別)
    parameters["MeetingAssistanceEnabled"] = true;
    Json::Value meetingAssistance;
    Json::Value meetingAssistanceTypeList;
    meetingAssistanceTypeList.append("Actions");
    meetingAssistanceTypeList.append("KeyInformation");
    meetingAssistance["Types"] = meetingAssistanceTypeList;
    parameters["MeetingAssistanceTypeList"] = meetingAssistanceTypeList;

    // 摘要相關(guān): 可選, 以下設(shè)置將3種摘要類型都啟用了,您可以按需增刪
    parameters["SummarizationEnabled"] = true;
    Json::Value summarization;
    Json::Value summarizationTypeList;
    summarizationTypeList.append("Paragraph");
    summarizationTypeList.append("Conversational");
    summarizationTypeList.append("QuestionsAnswering");
    summarizationTypeList.append("MindMap");
    summarization["Types"] = summarizationTypeList;
    parameters["Summarization"] = summarization;

    // PPT抽取: 可選, 建議僅當(dāng)是視頻文件時(shí)且視頻中有ppt相關(guān)視頻畫面時(shí)開啟
    //parameters["PptExtractionEnabled"] = true;
  	
  	// 口語書面化: 可選
  	parameters["TextPolishEnabled"] = true;

    root["Parameters"] = parameters;

    Json::FastWriter writer;
    std::string body = writer.write(root);
    printf("input json: [%s]\n", body.c_str());
    request.setContent(body.c_str(), body.size());
      
    auto response = client.commonResponse(request);
    if (response.isSuccess()) {
        printf("request success.\n");
        printf("result: %s\n", response.result().payload().c_str());
    } else {
        printf("error: %s\n", response.error().errorMessage().c_str());
        printf("request id: %s\n", response.error().requestId().c_str());
    }
      
    AlibabaCloud::ShutdownSdk();
    return 0;
} 

示例輸出

當(dāng)任務(wù)仍在運(yùn)行中時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3vc4b45d898fcadb*********",
        "TaskKey":"task16988********",
        "TaskStatus":"ONGOING"
    },
    "Message":"success",
    "RequestId":"2001dc2a-9b46-4a2f-9822-b140********"
}

協(xié)議解析

具體字段定義如下。

參數(shù)名

類型

說明

TaskId

string

創(chuàng)建任務(wù)時(shí)生成的TaskId,用于查詢?nèi)蝿?wù)狀態(tài)、結(jié)果以及排查問題時(shí)使用。

TaskStatus

string

任務(wù)狀態(tài)

TaskKey

string

您創(chuàng)建任務(wù)時(shí)設(shè)置的TaskKey

RequestId

string

RequestId用于排查問題使用。

在您提交音視頻離線轉(zhuǎn)寫任務(wù)之后,任務(wù)即處于運(yùn)行狀態(tài)。

查詢?nèi)蝿?wù)狀態(tài)和結(jié)果

  • 查詢?nèi)蝿?wù)時(shí),您需要將“提交任務(wù)”時(shí)返回的TaskId作為輸入,發(fā)起查詢請(qǐng)求,根據(jù)返回的狀態(tài)判斷任務(wù)是否已完成。

請(qǐng)求參數(shù)

參數(shù)名

類型

是否必填

說明

TaskId

string

您提交任務(wù)時(shí)返回的TaskId信息

示例代碼

#!/usr/bin/env python
#coding=utf-8

import os
import json
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

# TODO  請(qǐng)通過環(huán)境變量設(shè)置您的 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)

uri = '/openapi/tingwu/v2/tasks' + '/' + '請(qǐng)輸入您提交任務(wù)時(shí)返回的TaskId'
request = create_common_request('tingwu.cn-beijing.aliyuncs.com', '2023-09-30', 'https', 'GET', uri)

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.common;

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.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.Test;

/**
 * @author tingwu2023
 * @desc 演示了通過OpenAPI 根據(jù)TaskId查詢?nèi)蝿?wù)狀態(tài)和結(jié)果 的調(diào)用方式。
 */
public class GetTaskInfoTest {
    @Test
    public void getTaskInfo() throws ClientException {
        String taskId = "請(qǐng)輸入創(chuàng)建任務(wù)(含離線轉(zhuǎn)寫、實(shí)時(shí)會(huì)議)的TaskId";
        String queryUrl = String.format("/openapi/tingwu/v2/tasks" + "/%s", taskId);

        CommonRequest request = createCommonRequest("tingwu.cn-beijing.aliyuncs.com", "2023-09-30", ProtocolType.HTTPS, MethodType.GET, queryUrl);
        // TODO 請(qǐng)通過環(huán)境變量設(shè)置您的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) {
        // 創(chuàng)建API請(qǐng)求并設(shè)置參數(shù)
        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;
    }
}
package main

import (
	"encoding/json"
	"log"
	"os"

	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)

type GetTaskInfoResponse struct {
	RequestId string `json:"RequestId"`
	Code      string `json:"Code"`
	Message   string `json:"Message"`
	Data      struct {
		TaskId     string `json:"TaskId"`
		TaskKey    string `json:"TaskKey"`
		TaskStatus string `json:"TaskStatus"`
	} `json:"Data"`
}

func get_task_info(taskid string, akkey string, aksecret string) (*GetTaskInfoResponse, string, error) {
	client, err := sdk.NewClientWithAccessKey("cn-beijing", akkey, aksecret)
	if err != nil {
		return nil, "", err
	}

	request := requests.NewCommonRequest()
	request.Method = "GET"
	request.Domain = "tingwu.cn-beijing.aliyuncs.com"
	request.Version = "2023-09-30"
	request.PathPattern = "/openapi/tingwu/v2/tasks/" + taskid
	request.SetScheme("https")

	log.Default().Print("request task:", taskid)
	response, err := client.ProcessCommonRequest(request)
	if err != nil {
		return nil, "", err
	}

	log.Default().Print("response body:\n", string(response.GetHttpContentBytes()))
	resp := new(GetTaskInfoResponse)
	err = json.Unmarshal(response.GetHttpContentBytes(), resp)
	if err != nil {
		return nil, response.GetHttpContentString(), err
	}
	return resp, response.GetHttpContentString(), nil
}

func main() {
	akkey := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
	aksecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
	_, raw, _ := get_task_info("請(qǐng)輸入創(chuàng)建任務(wù)(含離線轉(zhuǎn)寫、實(shí)時(shí)會(huì)議)的TaskId", akkey, aksecret)
	log.Default().Println("response :", raw)
}
#include <cstdlib>
#include <iostream>
#include <string>
#include <alibabacloud/core/AlibabaCloud.h>
#include <alibabacloud/core/CommonRequest.h>
#include <alibabacloud/core/CommonClient.h>
#include <alibabacloud/core/CommonResponse.h>
/**
 * @author tingwu2023
 * @desc 演示了通過OpenAPI 根據(jù)TaskId查詢?nèi)蝿?wù)狀態(tài)和結(jié)果 的調(diào)用方式。
 */
int main( int argc, char** argv ) {
    std::string taskId = "請(qǐng)輸入創(chuàng)建任務(wù)(含離線轉(zhuǎn)寫、實(shí)時(shí)會(huì)議)的TaskId";

    AlibabaCloud::InitializeSdk();
    AlibabaCloud::ClientConfiguration configuration( "cn-beijing" );
    // specify timeout when create client.
    configuration.setConnectTimeout(1500);
    configuration.setReadTimeout(4000);
    // Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
    AlibabaCloud::Credentials credential( getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") );
    AlibabaCloud::CommonClient client( credential, configuration );
    AlibabaCloud::CommonRequest request(AlibabaCloud::CommonRequest::RequestPattern::RoaPattern);
    request.setHttpMethod(AlibabaCloud::HttpRequest::Method::Get);
    request.setDomain("tingwu.cn-beijing.aliyuncs.com");
    request.setVersion("2023-09-30");
    request.setHeaderParameter("Content-Type", "application/json");
    request.setResourcePath("/openapi/tingwu/v2/tasks/" + taskId);

    auto response = client.commonResponse(request);
    if (response.isSuccess()) {
        printf("request success.\n");
        printf("result: %s\n", response.result().payload().c_str());
    } else {
        printf("error: %s\n", response.error().errorMessage().c_str());
        printf("request id: %s\n", response.error().requestId().c_str());
    }
      
    AlibabaCloud::ShutdownSdk();
    return 0;
} 

示例輸出

當(dāng)任務(wù)仍在運(yùn)行中時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0********",
        "TaskStatus":"ONGOING"
    },
    "Message":"success",
    "RequestId":"5fa32fc6-441f-4dd1-bb86-c030********"
}

當(dāng)任務(wù)在運(yùn)行中但有部分結(jié)果時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0********",
        "TaskStatus":"ONGOING",
        "OutputMp3Path":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_20231101141801.mp3?ExLTAI4G4uXHLPwQHj6oX8****AccessKeyId=LTAI4G4uXHLPwQHj6oX8****&amp;Signature=********JBMijH7wLq0xX6aivHc%3D",
        "Result":{
            "Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_Transcription_20231101141926.json?Expires=1698906034&amp;OSSAcceLTAI4G4uXHLPwQHj6oX8****6oX8nt5S&amp;Signature=********NJlqSEWJxfkMwjwsHCA%3D"
        }
    },
    "Message":"success",
    "RequestId":"1b20e0d9-c55c-4cc3-85af-80b4********"
}

當(dāng)任務(wù)已完成時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0********",
        "TaskStatus":"COMPLETED",
        "OutputMp3Path":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_20231101141801.mp3?ExLTAI4G4uXHLPwQHj6oX8****AccessKeyId=LTAI4G4uXHLPwQHj6oX8****&amp;Signature=********JBMijH7wLq0xX6aivHc%3D",
        "Result":{
            "AutoChapters":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_AutoChapters_20231101141955.json?Expires=1698906034&amp;OSSAcceLTAI4G4uXHLPwQHj6oX8****6oX8nt5S&amp;Signature=********Ax9FvifYAO8dj4qzWg%3D",
            "Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_Transcription_20231101141926.json?Expires=1698906034&amp;OSSAccessKeyId=LTAI4G4uXHLPwQHj6oX8****&amp;Signature=********NJlqSEWJxfkMwjwsHCA%3D"
        }
    },
    "Message":"success",
    "RequestId":"1b20e0d9-c55c-4cc3-85af-80b4********"
}

當(dāng)任務(wù)失敗時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"b76389677b1441fa82165cb1********",
        "TaskStatus":"FAILED",
        "ErrorCode":"TSC.AudioFileLink",
        "ErrorMessage":"Audio file link invalid."
    },
    "Message":"success",
    "RequestId":"d181d898-b627-4040-b7c9-9563********"
}

回調(diào)通知任務(wù)狀態(tài)和結(jié)果

如果您希望通過回調(diào)方式來獲取任務(wù)狀態(tài)和結(jié)果,需要在控制臺(tái)配置好回調(diào)類型和地址,創(chuàng)建離線轉(zhuǎn)寫任務(wù)時(shí)將參數(shù)AppKey配置為對(duì)應(yīng)的項(xiàng)目AppKey,同時(shí)將參數(shù)Input.ProgressiveCallbacksEnabled設(shè)為true。

重要

當(dāng)您選擇http回調(diào)方式時(shí),我們將設(shè)置一個(gè)最大請(qǐng)求時(shí)間限制。這意味著,如果我們?cè)诎l(fā)起請(qǐng)求后的超過5秒鐘內(nèi)沒有收到您的回復(fù),我們將不再等待返回結(jié)果,系統(tǒng)判斷回調(diào)請(qǐng)求發(fā)送失敗,稍后將會(huì)進(jìn)行重試。

我們建議您審核和調(diào)整您的系統(tǒng),以確保能夠在5秒鐘內(nèi)響應(yīng)我們的回調(diào)請(qǐng)求。這可能包括但不限于:

  • 優(yōu)化您的處理邏輯,確保高效執(zhí)行;

  • 對(duì)不必要的長(zhǎng)操作進(jìn)行異步處理,不在主回調(diào)響應(yīng)路徑中等待;

  • 實(shí)施錯(cuò)誤處理和重試機(jī)制,以應(yīng)對(duì)超時(shí)或失敗的情況。

說明

回調(diào)重試機(jī)制說明

當(dāng)回調(diào)消息發(fā)送失敗時(shí),聽悟服務(wù)端會(huì)在5秒鐘后重新發(fā)送一次回調(diào)消息,如果第二次發(fā)送仍然失敗,則會(huì)在之后的每5分鐘再發(fā)送一次,重試次數(shù)最多為3次

示例輸出

當(dāng)單個(gè)AI模型子任務(wù)完成時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0********",
        "TaskStatus":"ONGOING",
        "TaskKey":"TingwuDemo",
        "Result":{
            "Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_Transcription_20231101141926.json?Expires=1698906034&amp;OSSAcceLTAI4G4uXHLPwQHj6oX8****6oX8nt5S&amp;Signature=********NJlqSEWJxfkMwjwsHCA%3D"
        }
    },
    "Message":"success",
    "RequestId":"5cf2b587ac6e41e6a1f06ca1********"
}

當(dāng)任務(wù)完成時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0********",
        "TaskStatus":"COMPLETED",
        "TaskKey":"TingwuDemo",
        "Result":{
            "AutoChapters":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_AutoChapters_20231101141955.json?Expires=1698906034&amp;OSSAcceLTAI4G4uXHLPwQHj6oX8****6oX8nt5S&amp;Signature=********Ax9FvifYAO8dj4qzWg%3D",
            "Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/e8adc0b3bc4b42d898fcadb0a1710635/e8adc0b3bc4b42d898fcadb0a1710635_Transcription_20231101141926.json?Expires=1698906034&amp;OSSAccessKeyId=LTAI4G4uXHLPwQHj6oX8****&amp;Signature=********NJlqSEWJxfkMwjwsHCA%3D"
        }
    },
    "Message":"success",
    "RequestId":"9c60b07f152445349eaa6161********"
}

當(dāng)任務(wù)失敗時(shí):

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0********",
        "TaskStatus":"FAILED",
        "TaskKey":"TingwuDemo",
        "ErrorCode":"TSC.AudioFileLink",
        "ErrorMessage":"Audio file link invalid."
    },
    "Message":"success",
    "RequestId":"5e1c0babe36844e49f1b7bee********"
}

重跑任務(wù)刷新結(jié)果

若您需要對(duì)已完成任務(wù)進(jìn)行刷新,比如重新生成某個(gè)算法結(jié)果,或者增量增加某個(gè)算法結(jié)果,則可以通過“提交任務(wù)”時(shí)返回的TaskId以及新的控制參數(shù)作為輸入,再次發(fā)起任務(wù)處理請(qǐng)求,等待結(jié)果完成。

比如您在首次創(chuàng)建任務(wù)時(shí)未啟動(dòng)章節(jié)速覽功能,此時(shí)您可直接增加新的參數(shù)后繼續(xù)該任務(wù),而無須再提交音視頻文件從頭開始運(yùn)行。

重要

發(fā)起重跑任務(wù)的前提條件是該任務(wù)已經(jīng)完成(COMPLETED),也即是對(duì)已完成的任務(wù)執(zhí)行重跑,而不能對(duì)運(yùn)行中或是失敗的任務(wù)執(zhí)行重跑。

請(qǐng)求參數(shù)

功能名稱

參數(shù)

類型

默認(rèn)值

說明

基本請(qǐng)求信息

(Input)

TaskId

string

-

必選,您待重跑的任務(wù)TaskId

翻譯

(Translation)

TranslationEnabled

boolean

false

是否開啟翻譯功能。

Translation.TargetLanguages

list[string]

[en]

  • 如果開啟翻譯,需要設(shè)置目標(biāo)翻譯語言

  • 支持設(shè)置 中文(cn)、英語(en)、日語(ja)、韓語(ko)、德語(de)、法語(fr)、俄語(ru)。

章節(jié)速覽

AutoChaptersEnabled

boolean

false

章節(jié)速覽功能,包括:議程標(biāo)題和議程摘要。

要點(diǎn)提煉

MeetingAssistanceEnabled

boolean

false

關(guān)鍵詞、行動(dòng)項(xiàng)、待辦、場(chǎng)景識(shí)別。

摘要總結(jié)

SummarizationEnabled

boolean

false

是否開啟摘要功能。

Summarization.Types

list[string]

[]

支持設(shè)置1個(gè)或多個(gè)。

  • Paragraph(全文摘要)

  • Conversational(發(fā)言總結(jié))

  • QuestionsAnswering(問答回顧、要點(diǎn)回顧)

  • MindMap(思維導(dǎo)圖)

PPT提取及摘要

PptExtractionEnabled

boolean

false

是否開啟PPT功能,包含PPT抽取、PPT摘要。

口語書面化

TextPolishEnabled

boolean

false

是否開啟口語書面化功能。

服務(wù)質(zhì)檢

ServiceInspectionEnabled

boolean

false

是否開啟服務(wù)質(zhì)檢功能。

ServiceInspection

object

-

參考服務(wù)質(zhì)檢參數(shù)對(duì)象對(duì)服務(wù)過程中的對(duì)話進(jìn)行質(zhì)量檢測(cè),支持自定義多個(gè)質(zhì)檢維度,輔助客戶提升服務(wù)水平。

自定義Prompt

CustomPromptEnabled

boolean

false

是否開啟自定義prompt功能。

CustomPrompt

object

-

參考自定義prompt參數(shù)對(duì)象由客戶自主定義大模型提示詞,引導(dǎo)大模型完成客戶定義的各類任務(wù)。

示例代碼

#!/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'] = '輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey'
    # 基本請(qǐng)求參數(shù)
    input = dict()
    input['TaskId'] = '請(qǐng)輸入已完成任務(wù)的TaskId'
    root['Input'] = input

    # AI相關(guān)參數(shù),按需設(shè)置即可
    parameters = dict()
    # 音視頻轉(zhuǎn)換: 暫不支持重新運(yùn)行
    # 語音識(shí)別: 暫不支持重新運(yùn)行語音識(shí)別算法

    # 翻譯: 可選
    parameters['TranslationEnabled'] = True
    translation = dict()
    translation['TargetLanguages'] = ['en'] # 假設(shè)翻譯成英文
    parameters['Translation'] = translation

    # 章節(jié)速覽: 可選
    parameters['AutoChaptersEnabled'] = True

    # 智能紀(jì)要: 可選
    parameters['MeetingAssistanceEnabled'] = True

    # 摘要相關(guān): 可選
    parameters['SummarizationEnabled'] = True
    summarization = dict()
    summarization['Types'] = ['Paragraph', 'Conversational', 'QuestionsAnswering', 'MindMap']
    parameters['Summarization'] = summarization
    root['Parameters'] = parameters

    # PPT抽取: 可選(不支持對(duì)實(shí)時(shí)會(huì)議或原文件是音頻格式的離線轉(zhuǎn)寫任務(wù)的重跑)
    parameters['PptExtractionEnabled'] = True
    
    # 口語書面化: 可選
    parameters['TextPolishEnabled'] = True
    
    root['Parameters'] = parameters
    return root

body = init_parameters()
print(body)

# TODO  請(qǐng)通過環(huán)境變量設(shè)置您的 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.common;

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
 * @desc 演示了通過OpenAPI 根據(jù)TaskId對(duì)已完成的任務(wù)進(jìn)行重新運(yùn)行的 調(diào)用方式。
 */
public class RerunTaskTest {

    @Test
    public void testRerunTask() 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();
        JSONObject input = new JSONObject();
        input.put("TaskId", "請(qǐng)輸入已完成任務(wù)的TaskId");
        root.put("Input", input);
        root.put("AppKey", "輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey");

        JSONObject parameters = initRequestParametersForReRun();
        root.put("Parameters", parameters);

        System.out.println(root.toJSONString());
        request.setHttpContent(root.toJSONString().getBytes(), "utf-8", FormatType.JSON);

        // TODO 請(qǐng)通過環(huán)境變量設(shè)置您的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 JSONObject initRequestParametersForReRun() {
        JSONObject parameters = new JSONObject();

        // 音視頻轉(zhuǎn)換: 暫不支持重新運(yùn)行

        // 語音識(shí)別: 暫不支持重新運(yùn)行語音識(shí)別算法

        // 翻譯: 可選
        JSONObject translation = new JSONObject();
        JSONArray langArry = new JSONArray();
        langArry.add("en");
        translation.put("TargetLanguages", langArry);
        parameters.put("Translation", translation);
        parameters.put("TranslationEnabled", true);

        // 章節(jié)速覽: 可選
        parameters.put("AutoChaptersEnabled", true);

        // 智能紀(jì)要: 可選
        parameters.put("MeetingAssistanceEnabled", true);

        // 摘要相關(guān): 可選
        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);

        // PPT抽取: 可選(不支持對(duì)實(shí)時(shí)會(huì)議或原文件是音頻格式的離線轉(zhuǎn)寫任務(wù)的重跑)
        //parameters.put("PptExtractionEnabled", false);
      
      	// 口語書面化:可選
        parameters.put("TextPolishEnabled", true);

        return parameters;
    }
  
    public static CommonRequest createCommonRequest(String domain, String version, ProtocolType protocolType, MethodType method, String uri) {
        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;
    }
}
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)

type TranscodeingParam struct {
	TargetAudioFormat     string `json:"TargetAudioFormat,omitempty"`
	TargetVideoFormat     string `json:"TargetVideoFormat,omitempty"`
	VideoThumbnailEnabled bool   `json:"VideoThumbnailEnabled,omitempty"`
	SpectrumEnabled       bool   `json:"SpectrumEnabled,omitempty"`
}

type DiarizationParam struct {
	SpeakerCount int `json:"SpeakerCount,omitempty"`
}

type TranscriptionParam struct {
	AudioEventDetectionEnabled bool              `json:"AudioEventDetectionEnabled,omitempty"`
	DiarizationEnabled         bool              `json:"DiarizationEnabled,omitempty"`
	Diarization                *DiarizationParam `json:"Diarization,omitempty"`
}

type TranslationParam struct {
	TargetLanguages []string `json:"TargetLanguages,omitempty"`
}

type SummarizationParam struct {
	Types []string `json:"Types,omitempty"`
}

type ExtraParamerters struct {
	Transcoding              *TranscodeingParam  `json:"Transcoding,omitempty"`
	Transcription            *TranscriptionParam `json:"Transcription,omitempty"`
	TranslationEnabled       bool                `json:"TranslationEnabled,omitempty"`
	Translation              *TranslationParam   `json:"Translation,omitempty"`
	AutoChaptersEnabled      bool                `json:"AutoChaptersEnabled,omitempty"`
	MeetingAssistanceEnabled bool                `json:"MeetingAssistanceEnabled,omitempty"`
	SummarizationEnabled     bool                `json:"SummarizationEnabled,omitempty"`
	Summarization            *SummarizationParam `json:"Summarization,omitempty"`
  TextPolishEnabled        bool                `json:"TextPolishEnabled,omitempty"`
}

type InputParam struct {
	SourceLanguage string `json:"SourceLanguage"`
	FileUrl        string `json:"FileUrl,omitempty"`
	TaskKey        string `json:"TaskKey,omitempty"`
	TaskId         string `json:"TaskId,omitempty"`
	Format         string `json:"Format,omitempty"`
	SampleRate     int    `json:"SampleRate,omitempty"`
}

type TaskBodyParam struct {
	Appkey      string            `json:"AppKey"`
	Input       InputParam        `json:"Input"`
	Paramerters *ExtraParamerters `json:"Parameters,omitempty"`
}

type GetTaskInfoResponse struct {
	RequestId string `json:"RequestId"`
	Code      string `json:"Code"`
	Message   string `json:"Message"`
	Data      struct {
		TaskId     string `json:"TaskId"`
		TaskKey    string `json:"TaskKey"`
		TaskStatus string `json:"TaskStatus"`
	} `json:"Data"`
}

func init_request_param_offline() *ExtraParamerters {
	param := new(ExtraParamerters)
	param.Transcoding = new(TranscodeingParam)

	transcription := new(TranscriptionParam)
	transcription.Diarization = new(DiarizationParam)
	transcription.Diarization.SpeakerCount = 2
	transcription.DiarizationEnabled = true
	param.Transcription = transcription

	// 設(shè)置翻譯語言
	translation := new(TranslationParam)
	translation.TargetLanguages = []string{"en"}
	param.Translation = translation
	param.TranslationEnabled = true
	param.AutoChaptersEnabled = false
	param.MeetingAssistanceEnabled = false
	param.SummarizationEnabled = true

	summarization := new(SummarizationParam)
	summarization.Types = []string{"Paragraph", "Conversational", "QuestionsAnswering", "MindMap"}
	param.Summarization = summarization
  param.TextPolishEnabled = true

	return param
}

func test_rerun_task() {
	akkey := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
	aksecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
	client, err := sdk.NewClientWithAccessKey("cn-beijing", akkey, aksecret)
	if err != nil {
		log.Default().Fatalln(err)
		return
	}

	request := requests.NewCommonRequest()
	request.Method = "PUT"
	request.Domain = "tingwu.cn-beijing.aliyuncs.com"
	request.Version = "2023-09-30"
	request.SetContentType("application/json")
	request.PathPattern = "/openapi/tingwu/v2/tasks"
	request.QueryParams["type"] = "offline"

	param := new(TaskBodyParam)
	param.Appkey = "輸入您在聽悟管控臺(tái)創(chuàng)建的Appkey"
	param.Input.SourceLanguage = "cn"
	param.Input.TaskId = "請(qǐng)輸入已完成任務(wù)的TaskId"
	param.Input.FileUrl = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example.wav"
	param.Input.TaskKey = "task_" + fmt.Sprint(time.Now().Unix())

	b, _ := json.Marshal(param)
	log.Default().Print("request body:\n", string(b))
	request.SetContent(b)
	request.SetScheme("https")

	response, err := client.ProcessCommonRequest(request)
	if err != nil {
		log.Default().Fatalln(err)
		return
	}

	log.Default().Print("response body:\n", string(response.GetHttpContentBytes()))
}

func main() {
	test_rerun_task()
}

示例輸出

在重跑任務(wù)后,您可以根據(jù)該TaskId繼續(xù)查詢?nèi)蝿?wù)狀態(tài)和結(jié)果,輸入請(qǐng)求與提交任務(wù)時(shí)基本一致,以JSON格式的字符串傳入請(qǐng)求對(duì)象的Body,示例JSON報(bào)文如下:

{
    "Input":{
        "TaskId":"be602978409b47ecb1788e36********"
    },
    "Parameters":{
        "Translation":{
            "TargetLanguages":[
                "en"
            ]
        },
        "TranslationEnabled":true
    }
}

協(xié)議解析

具體字段定義如下。

參數(shù)名

類型

說明

TaskId

string

創(chuàng)建任務(wù)時(shí)生成的TaskId

TaskStatus

string

任務(wù)狀態(tài),包括:

  • ONGOING :運(yùn)行中

  • COMPLETED : 已完成

  • FAILED : 任務(wù)失敗

  • INVALID :無效,可能是TaskId不存在

OutputMp3Path

string

若您在請(qǐng)求參數(shù)時(shí),設(shè)置了將原始音視頻轉(zhuǎn)成mp3格式,通過此字段返回生成的mp3文件的http下載鏈接

Result

list[]

多個(gè)算法結(jié)果的集合:

提示,此處返回的均是下載鏈接,您可以參考對(duì)應(yīng)模型章節(jié)的介紹,處理結(jié)果。

ErrorCode

string

錯(cuò)誤原因

ErrorMessage

string

錯(cuò)誤詳細(xì)信息

常見問題

生成的http鏈接肯定是有效的,為什么報(bào)AudioFileLink?

  • 雖然通常情況下結(jié)果可以分鐘級(jí)返回,但并不能保證。因離線任務(wù)轉(zhuǎn)寫屬于異步處理過程,存在著排隊(duì)狀態(tài),因此當(dāng)前離線任務(wù)時(shí)效性是3小時(shí)內(nèi)返回。如果您設(shè)置的音頻http鏈接有效期不足3小時(shí),則可能存在當(dāng)處理該任務(wù)時(shí)由于鏈接已過期而無法下載的可能。

返回結(jié)果的http鏈接是有時(shí)效性的嗎?

  • 返回結(jié)果中參數(shù)Result內(nèi)的http鏈接有30天的有效期,30天后您將無法通過該鏈接訪問到任務(wù)結(jié)果。需要注意的是,Result內(nèi)容中的http鏈接同樣為30天有效期,例如PPT抽取的Result中包含了PPT封面的圖片文件http鏈接,該鏈接同樣會(huì)在30天后失效。

  • 如果返回結(jié)果中的http鏈接失效,您可以通過調(diào)用任務(wù)查詢接口,重新獲取30天有效期的任務(wù)結(jié)果。

重跑任務(wù)在什么時(shí)候或什么場(chǎng)景下使用?

  • 如果您每次提交的離線轉(zhuǎn)寫任務(wù)都是預(yù)知需要進(jìn)行哪些算法處理、獲取哪些結(jié)果的話,可以在提交時(shí)一次性設(shè)置對(duì)應(yīng)功能參數(shù)即可,此時(shí)是不需要進(jìn)行重跑的。

  • 如果您基于聽悟API進(jìn)行二次封裝開發(fā),比如自有SaaS服務(wù),允許用戶基于交互的方式展現(xiàn)不同算法結(jié)果,您可以通過此接口進(jìn)行重跑,加速執(zhí)行速度。

重跑任務(wù)和我重新提交一次音視頻文件離線轉(zhuǎn)寫有什么區(qū)別或好處?

  • 如果您重新提交一次音視頻文件離線轉(zhuǎn)寫+新增參數(shù)的方式一樣可以完成本文檔描述的功能, 但若您通過重跑任務(wù)的形式執(zhí)行,因?yàn)樵摲绞讲⒉皇菑?開始處理,會(huì)復(fù)用上一次的部分算法結(jié)果,因此執(zhí)行時(shí)間會(huì)相對(duì)變短,以及由于復(fù)用,相對(duì)的調(diào)用成本也不會(huì)帶來冗余。

語種該怎么選擇?

  • 常見語種場(chǎng)景示例如下:

    語種類型

    對(duì)應(yīng)參數(shù)

    適用場(chǎng)景

    參考示例

    單語種

    (已知語種)

    參數(shù)名:Input.SourceLanguage

    參數(shù)值可配置(單選):中文(cn)、 英語(en)、粵語(yue)、日語(ja)、韓語(ko)

    • 單語種語音識(shí)別模型。

    • 中、英支持8K和16K。

    • 日、粵、韓僅支持16K。

    示例1:

    若已知語音的語種是中文

    Input.SourceLanguage="cn"

    識(shí)別結(jié)果:感謝您使用通義聽悟。

    示例2:

    若已知語音的語種是英文

    Input.SourceLanguage="en"

    識(shí)別結(jié)果:Thank you for using Tongyi Tingwu.

    單語種

    (未知語種)

    參數(shù)名:Input.SourceLanguage

    參數(shù)值:auto

    • 自動(dòng)單語種識(shí)別。

    • 僅支持16K。

    • 若未知語音中涉及的語種,可傳入自動(dòng)語種識(shí)別(auto),語種算法檢測(cè)后,系統(tǒng)自動(dòng)選擇對(duì)應(yīng)的單語種模型進(jìn)行語音識(shí)別,此功能僅在離線轉(zhuǎn)寫任務(wù)下可用

    • auto的語種判定范圍:中、英、日、粵、韓。

    示例1:

    若未知語音的語種,需要自動(dòng)先進(jìn)行語種檢測(cè)和判定再進(jìn)行識(shí)別。

    Input.SourceLanguage="auto"

    識(shí)別結(jié)果:感謝您使用通義聽悟。

    查看語種識(shí)別結(jié)果

    多語種混合

    • 參數(shù)名1:Input.SourceLanguage

      參數(shù)值:multilingual

    • 參數(shù)名2:Input.LanguageHints

      參數(shù)值可配置(可多選): 中文(cn), 英語(en), 粵語(yue), 日語(ja)、韓語(ko)、德語(de)、法語(fr)、俄語(ru)

    • 多語種語音識(shí)別。

    • 僅支持16K。

    • 支持同時(shí)識(shí)別出中文、英文、日語、粵語、韓語、德語、法語和俄語。

    • 支持限定語種的范圍。

    示例1:

    若語音中的語種非單語種,涉及多個(gè)語種,直接識(shí)別對(duì)應(yīng)語種的文字。

    Input.SourceLanguage="multilingual"

    識(shí)別結(jié)果:hello, everyone. 感謝您使用通義聽悟。

    示例2:

    若語音中的語種非單語種,涉及多個(gè)語種,但已知語種的范圍(如只有中、英、粵),直接識(shí)別對(duì)應(yīng)語種的文字,同時(shí)避免誤識(shí)別出日、法、俄等和場(chǎng)景無關(guān)的語種。

    Input.SourceLanguage="multilingual"

    Input.LanguageHints=['cn', 'en', 'yue']