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

接口與實現

本文主要介紹實時記錄接入流程。

說明

如果您需要咨詢更多產品技術問題,歡迎搜索釘釘群號78410012058,加入通義聽悟咨詢群聯系我們。

使用須知

  • 支持的輸入格式:PCM(無壓縮的PCM或WAV文件)、OPUS、SPEEX、MP3、AAC格式,16 bit采樣位數、單聲道(mono)。

  • 支持的音頻采樣率:16000 Hz、8000Hz。

  • 支持的單次記錄時長:24小時。

  • 支持設置返回結果:是否返回中間識別結果。

  • 支持設置多語言識別:中文、英文、粵語、日語、韓語、中英自由說(長段中英混)。

  • 支持設置開啟翻譯:支持中、英、日、韓、德、法、俄語間的雙向互譯,中英自由說翻譯目標語言可為中文、英文或中文&英文,支持會議中開啟或關閉。

  • 支持設置同步音頻轉碼:轉碼為比特率128kb/s的mp3格式音頻,準實時寫入的指定OSS。

  • 支持開啟各項大模型能力:章節速覽、大模型摘要總結(全文摘要、發言總結、問答回顧、思維導圖)、要點提煉(關鍵詞、待辦事項、重點內容、場景識別)、服務質檢、PPT提取及摘要、口語書面化、自定義prompt等。

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

交互流程

image

接入步驟

步驟1:調用CreateTask接口創建實時記錄,對應交互流程1-2。

說明

轉寫的管理粒度為記錄,在完成記錄創建后便可基于該記錄體驗會中實時記錄語音推流轉寫。

步驟2:實時記錄語音推流,在完成記錄創建后,可通過聽悟提供的交互流程與實現進行會中實時的語音推流并接收識別結果和翻譯結果。

步驟3:調用CreateTask接口結束實時記錄

步驟4:調用GetTaskInfo接口查詢實時記錄狀態

說明

結束實時記錄后進入智能紀要提取等AI能力階段,此時可查詢或者通過回調獲取結果。

前提條件

AccessKey環境變量設置

需要使用您的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

創建實時記錄

參考如下內容創建一個實時記錄任務,之后根據獲取到的記錄推流url,建立websocket鏈接,實時推流并進行識別。

請求參數

功能名稱

參數

類型

默認值

說明

AppKey

AppKey

string

-

必選,請設置為您在管控臺上創建的appkey。

基本請求信息

(Input)

Input.Format

string

-

必選,實時推送二進制音頻流時對應的音頻格式,支持pcm、opus、aac、speex、mp3。

Input.SampleRate

int

-

必選,實時推送二進制音頻流時對應的采樣率,支持16000和8000;一般來說大部分記錄場景都是16000。

Input.SourceLanguage

string

-

必選根據音視頻中的語種類別來配置對應的參數。

  • 若語音的語種是單語種,音視頻文件對應的語言種類;支持cn(中文)、en(英文)、粵語(yue)、日語(ja)、韓語(ko)。

  • 若語音中的語種非單語種,涉及多個語種,可傳入(multilingual),識別出對應語種的文字。結合Input.LanguageHints一起使用。

Input.LanguageHints

list[string]

null

指定多語言模型時需語音識別出文字的語種列表。

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

Input.TaskKey

string

null

用戶自行設置的自定義標識。

Input.ProgressiveCallbacksEnabled

boolean

false

是否開啟回調功能。

當需要開啟回調功能時,您需要在控制臺配置好回調類型和地址,并在創建任務時將該參數置為true。

轉碼

(Transcoding)

Transcoding.TargetAudioFormat

string

null

當前只支持設置mp3轉換,默認不開啟。

語音識別

(Transcription)

Transcription.OutputLevel

int

1

設置語音識別結果返回等級。

  • 1:識別出完整句子時返回識別結果

  • 2:識別出中間結果及完整句子時返回識別結果

僅在實時記錄場景下按需設置,離線轉寫場景無須設置。

Transcription.DiarizationEnabled

boolean

false

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

Transcription.Diarization.SpeakerCount

int

-

開啟說話人分離功能時,設置的說話人數。

  • 不設置:不使用說話人角色區分

  • 0:說話人角色區分結果為不定人數

  • 2:說話人角色區分結果為2人

當有此參數時,使用此參數輔助指定的人數。最終分軌人數以真實分類人數為準。

Transcription.PhraseId

String

-

熱詞詞表ID。

翻譯

(Translation)

TranslationEnabled

boolean

false

是否開啟翻譯功能。

Translation.OutputLevel

int

1

設置實時語言翻譯識別結果返回等級。

  • 1:識別出完整句子時返回識別結果;

  • 2:識別出中間結果及完整句子時返回識別結果

僅在實時記錄場景下按需設置,離線轉寫場景無須設置。

Translation.TargetLanguages

list[string]

-

如果開啟翻譯,需要設置目標翻譯語言。支持設置 中文(cn)、英語(en)、日語(ja)、韓語(ko)、德語(de)、法語(fr)、俄語(ru)。

章節速覽

AutoChaptersEnabled

boolean

false

章節速覽功能,包括:議程標題和議程摘要

要點提煉

MeetingAssistanceEnabled

boolean

false

關鍵詞、待辦事項、重點內容、場景識別

摘要總結

SummarizationEnabled

boolean

false

是否開啟摘要總結功能。

Summarization.Types

list[string]

-

如果開啟摘要功能,需要設置摘要類型。支持設置1個或多個。

  • Paragraph(全文摘要)

  • Conversational(發言總結)

  • QuestionsAnswering(問答回顧)

  • MindMap(思維導圖)

口語書面化

TextPolishEnabled

boolean

false

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

服務質檢

ServiceInspectionEnabled

boolean

false

是否開啟服務質檢功能。

ServiceInspection

object

-

參考服務質檢參數對象對服務過程中的對話進行質量檢測,支持自定義多個質檢維度,輔助客戶提升服務水平。

自定義Prompt

CustomPromptEnabled

boolean

false

是否開啟自定義prompt功能。

CustomPrompt

object

-

參考自定義prompt參數對象由客戶自主定義大模型提示詞,引導大模型完成客戶定義的各類任務。

代碼示例

package com.alibaba.tingwu.client.demo.realtimemeeting;

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 創建實時記錄的調用方式。
 */
public class SubmitRealtimeMeetingTaskTest {

    @Test
    public void testSummitRealtimeMeetingTask() throws ClientException {
        CommonRequest request = createCommonRequest("tingwu.cn-beijing.aliyuncs.com", "2023-09-30", ProtocolType.HTTPS, MethodType.PUT, "/openapi/tingwu/v2/tasks");
        request.putQueryParameter("type", "realtime");

        JSONObject root = new JSONObject();
        root.put("AppKey", "輸入您在聽悟管控臺創建的Appkey");

        JSONObject input = new JSONObject();
        input.fluentPut("SourceLanguage", "cn").fluentPut("Format", "pcm").fluentPut("SampleRate", 16000).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 請通過環境變量設置您的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"));
        System.out.println("MeetingJoinUrl = " + data.getString("MeetingJoinUrl"));
    }

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

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

        // 語音識別
        JSONObject transcription = new JSONObject();
        transcription.put("DiarizationEnabled", true);
        JSONObject speakerCount = new JSONObject();
        speakerCount.put("SpeakerCount", 2);
        transcription.put("Diarization", speakerCount);
        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);

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

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

        // 摘要相關: 可選
        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抽取: 不可選,實時記錄沒有視頻信息,無法進行ppt功能
        // parameters.put("PptExtractionEnabled", false);
      	
	// 口語書面化:可選
        parameters.put("TextPolishEnabled", false);

        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"`
	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 CreateTaskResponse struct {
	RequestId string `json:"RequestId"`
	Code      string `json:"Code"`
	Message   string `json:"Message"`
	Data      struct {
		TaskId         string `json:"TaskId"`
		TaskKey        string `json:"TaskKey"`
		MeetingJoinUrl string `json:"MeetingJoinUrl,omitempty"`
	} `json:"Data"`
}

func init_request_param() *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

	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 = false

	return param
}

func test_submit_realtime_meeting_task() string {
	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"] = "realtime"

	param := new(TaskBodyParam)
	param.Appkey = "輸入您在聽悟管控臺創建的Appkey"
	param.Input.SourceLanguage = "cn"
	param.Input.Format = "pcm"
	param.Input.SampleRate = 16000
	param.Input.TaskKey = "task_" + fmt.Sprint(time.Now().Unix())
	param.Paramerters = init_request_param()

	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()))

	var resp CreateTaskResponse
	err = json.Unmarshal(response.GetHttpContentBytes(), &resp)
	if err != nil {
		log.Default().Fatalln(err)
		return ""
	}

	log.Default().Println("TaskId:", resp.Data.TaskId)
	log.Default().Println("MeetingJoinUrl:", resp.Data.MeetingJoinUrl)

	return resp.Data.MeetingJoinUrl
}

func main() {
	test_submit_realtime_meeting_task()
}
#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>
#include "jsoncpp/json.h"
/**
 * @author tingwu2023
 * @desc 演示了通過OpenAPI 創建實時轉寫記錄 的調用方式。
 */
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.setQueryParameter("type", "realtime");
    request.setHeaderParameter("Content-Type", "application/json");
    
    Json::Value root;
    root["Appkey"] = "輸入您在聽悟管控臺創建的Appkey";
    root["Appkey"] = "tEA3SDcxTKire0ut";

    Json::Value input;
    input["SourceLanguage"] = "cn";
    input["Format"]         = "pcm";
    input["SampleRate"]     = "16000";
    input["SourceLanguage"] = "cn";
    input["TaskKey"] = "輸入您為該次請求自定義的標識";
    root["Input"] = input;

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

    // 語音轉寫: 以下是開啟說話人分離功能(角色分離),若您不需要,則無須設置
    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;

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

    // 智能紀要: 可選,包括: 待辦、關鍵信息(關鍵詞、重點內容、場景識別)
    parameters["MeetingAssistanceEnabled"] = true;
    Json::Value meetingAssistance;
    Json::Value meetingAssistanceTypeList;
    meetingAssistanceTypeList.append("Actions");
    meetingAssistanceTypeList.append("KeyInformation");
    meetingAssistance["Types"] = meetingAssistanceTypeList;
    parameters["MeetingAssistanceTypeList"] = meetingAssistanceTypeList;

    // 摘要相關: 可選, 以下設置將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;
  	
    // 口語書面化: 可選
    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;
} 
#!/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'] = '輸入您在聽悟管控臺創建的Appkey'

    # 基本請求參數
    input = dict()

    #輸入語音流格式和采樣率和以下參數設置保持一致
    input['Format'] = 'pcm'
    input['SampleRate'] = 16000
    input['SourceLanguage'] = 'cn'
    input['TaskKey'] = 'task' + datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    input['ProgressiveCallbacksEnabled'] = False
    body['Input'] = input

    # AI相關參數,按需設置即可
    parameters = dict()

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

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

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

    # 章節速覽相關 : 可選,包括: 標題、議程摘要
    parameters['AutoChaptersEnabled'] = True

    # 智能紀要相關 : 可選,包括: 待辦、關鍵信息(關鍵詞、重點內容、場景識別)
    parameters['MeetingAssistanceEnabled'] = True
    meetingAssistance = dict()
    meetingAssistance['Types'] = ['Actions', 'KeyInformation']
    parameters['MeetingAssistance'] = meetingAssistance

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

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

    body['Parameters'] = parameters
    return body

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', 'realtime')

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))

示例輸出

{
    "Code":"0",
    "Data":{
        "TaskId":"3190978427bb43z09c01dfff********",
        "TaskKey":"task16988********",
        "MeetingJoinUrl":"wss://tingwu-realtime-cn-beijing.aliyuncs.com/api/ws/v1?mc=g9ySw5kiwXM4K7tBnIajKq6Fh9G1aUokzkptBIFixj7e7zv6c8AKxUDTW2Oz8AFFONWXtTQedh-NpKZUffqIYdW7yAlivqlo9B0TdeM88fzgWaYk2Ifg********"
    },
    "Message":"success",
    "RequestId":"6582c654-cc37-4f2d-b80d-e5e7********"
}

協議解析

具體字段定義如下。

參數名

類型

說明

TaskId

string

創建任務時生成的TaskId,用于查詢任務狀態、結果以及排查問題時使用。

TaskKey

string

您創建任務時設置的TaskKey

MeetingJoinUrl

string

實時記錄場景下生成的音頻流推送地址,您可以在后續實時音頻流識別時通過該地址進行

RequestId

string

RequestId用于排查問題使用。

實時記錄語音推流

在完成記錄創建后,便可通過聽悟提供的交互流程與實現進行會中實時語音推流并接收實時識別結果和翻譯結果。

結束實時記錄

當該記錄結束時,您務必參考如下內容及時調用API結束該記錄。若您之前在創建實時記錄時設置了后續的比如摘要、章節速覽、智能紀要等功能參數,那么在結束記錄之后,該實時記錄狀態并不是COMPLETED,而是ONGOING,表示此時進入到后處理階段。

說明

結束實時記錄操作,此時進入到后處理階段,對后處理相關的AI模型能力產生計費,若重復結束,則會觸發多次會后大模型能力計費,建議不要對同一個TaskId進行多次的“結束實時記錄”操作。

請求參數

參數名

類型

是否必填

說明

TaskId

string

您提交任務時 返回的TaskId信息

代碼示例

package com.alibaba.tingwu.client.demo.realtimemeeting;

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 結束實時會議 的調用方式。
 */
public class StopRealtimeMeetingTaskTest {

    @Test
    public void stopTask() throws ClientException {
        CommonRequest request = createCommonRequest("tingwu.cn-beijing.aliyuncs.com", "2023-09-30", ProtocolType.HTTPS, MethodType.PUT, "/openapi/tingwu/v2/tasks");
        request.putQueryParameter("type", "realtime");
        // 必須設置 operation=stop
        request.putQueryParameter("operation", "stop");

        JSONObject root = new JSONObject();
        JSONObject input = new JSONObject();
        input.put("TaskId", "請輸入實時會議的TaskId");
        root.put("Input", input);
        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) {
        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 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"`
}

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 CreateTaskResponse struct {
	RequestId string `json:"RequestId"`
	Code      string `json:"Code"`
	Message   string `json:"Message"`
	Data      struct {
		TaskId         string `json:"TaskId"`
		TaskKey        string `json:"TaskKey"`
		MeetingJoinUrl string `json:"MeetingJoinUrl,omitempty"`
	} `json:"Data"`
}

func test_stop_realtime_meeting_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"] = "realtime"
	request.QueryParams["operation"] = "stop"

	param := new(TaskBodyParam)
	param.Appkey = "輸入您在聽悟管控臺創建的Appkey"
	param.Input.TaskId = "請輸入實時會議的TaskId"

	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()))
	return
}

func main() {
	test_stop_realtime_meeting_task()
}
#include <cstdlib>
#include <iostream>
#include <string>
#include <string.h>
#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 結束實時記錄 的調用方式。
 */
int main( int argc, char** argv ) {
    std::string taskId = "請輸入創建任務(含離線轉寫、實時會議)的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::Put);
    request.setDomain("tingwu.cn-beijing.aliyuncs.com");
    request.setVersion("2023-09-30");
    request.setResourcePath("/openapi/tingwu/v2/tasks");
    request.setQueryParameter("type", "realtime");
    request.setQueryParameter("operation", "stop");
    request.setHeaderParameter("Content-Type", "application/json");

    Json::Value root;
    Json::Value input;
    input["TaskId"] = taskId;
    root["Input"] = input;

    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;
} 
#!/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'] = '輸入您在聽悟管控臺創建的Appkey'

    # 基本請求參數
    input = dict()

    #輸入語音流格式和采樣率和以下參數設置保持一致
    input['TaskId'] = '請輸入實時會議的TaskId'
    body['Input'] = input

    return body

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', 'realtime')
request.add_query_param('operation', 'stop')

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))

示例輸出

當僅使用實時語音識別時:

{
    "Code":"0",
    "Data":{
        "TaskId":"e8adc0b3bc4b42d898fcadb0a*******",
        "TaskStatus":"COMPLETED"
    },
    "Message":"success",
    "RequestId":"1b20e0d9-c55c-4cc3-85af-80b********"
}

當開啟語音識別的同時開啟了摘要、章節速覽、智能紀要等功能時:

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

協議解析

具體字段定義如下。

參數名

類型

說明

TaskId

string

創建任務時生成的TaskId

TaskStatus

string

任務狀態,包括:

  • NEW: 剛創建狀態,此時還未發送音頻流

  • ONGOING :運行中

  • PAUSED:實時記錄暫停,在發送音頻流之后停止發送,此時狀態為PAUSED

  • COMPLETED : 已完成

  • FAILED : 任務失敗

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

ErrorCode

string

錯誤原因

ErrorMessage

string

錯誤詳細信息

常見問題

相比離線轉寫,為什么實時記錄參數里缺少了PPT提取功能參數?

PPT提取(包括PPT抽取和PPT摘要)主要是針對在離線轉寫場景下,原文件是視頻格式的情況下發揮作用的。不論是音頻文件還是實時記錄里的二進制音頻流都沒有視頻信息,因此也不會產生PPT相關結果。

為什么查詢實時記錄的狀態是PAUSED?

請確保您的實時記錄交互順序正確。實時記錄正常交互流程是先創建實時記錄,向實時記錄服務返回的MeetingJoinUrl發送StartTranscription開始識別指令、推送語音幀、發送StopTranscription結束識別指令,然后關閉MeetingJoinUrl鏈接,再結束實時記錄操作以及獲取實時記錄最終結果。MeetingJoinUrl鏈接可重復發送開始識別指令、推送語音幀、發送結束識別指令來實現實時記錄的暫停。

語種該怎么選擇?

  • 常見語種場景示例如下:

    語種類型

    對應參數

    適用場景(實時記錄)

    參考示例

    單語種

    (已知語種)

    參數名:Input.SourceLanguage

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

    • 單語種語音識別模型。

    • 中文支持8K和16K。

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

    示例1:

    若已知語音的語種是中文

    Input.SourceLanguage="cn"

    識別結果:感謝您使用通義聽悟。

    示例2:

    若已知語音的語種是英文

    Input.SourceLanguage="en"

    識別結果:Thank you for using Tongyi Tingwu.

    多語種混合

    • 參數名1:Input.SourceLanguage

      參數值:multilingual

    • 參數名2:Input.LanguageHints

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

    • 多語種語音識別。

    • 僅支持16K。

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

    • 支持限定語種的范圍。

    示例1:

    若語音中的語種非單語種,涉及多個語種,直接識別對應語種的文字。

    Input.SourceLanguage="multilingual"

    識別結果:hello, everyone. 感謝您使用通義聽悟。

    示例2:

    若語音中的語種非單語種,涉及多個語種,但已知語種的范圍(如只有中、英、粵),直接識別對應語種的文字,同時避免誤識別出日、法、俄等和場景無關的語種。

    Input.SourceLanguage="multilingual"

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