本文主要介紹語音轉寫的AI能力和實現方式。
語音轉寫是通義聽悟的核心功能, 用以將音視頻文件或實時音頻流中的語音轉寫成文字。語音轉寫是通義聽悟API服務鏈路中的第一個節點,必選其中的一種形式,無法禁用。支持中、英、粵、日等語種,可在轉寫參數中配置說話人分離功能。
請求參數
參數名 | 類型 | 是否必填 | 說明 |
Transcription | object | 否 | 語音識別控制參數對象。 |
Transcription.DiarizationEnabled | boolean | 否 | 是否在轉寫過程中開啟發言人區分(說話人分離)功能。 |
Transcription.Diarization | object | 否 | 說話人分離功能對象。 |
Transcription.Diarization.SpeakerCount | int | 否 | 0:說話人角色區分結果為不定人數。 2:說話人角色區分結果為2人。 |
Transcription.PhraseId | string | 否 | 熱詞詞表ID。 |
Transcription.Model | string | 否 | 語音轉寫模型選擇,通過該參數可調用領域專屬模型,用于提升特定領域的識別準確率,該參數為空時則調用默認模型。目前可選參數如下:
|
Transcription.Model參數:通過該參數可調用領域專屬模型,可用于提升特定領域的識別準確率。目前可選用的領域專屬模型如下表所示:
模型名稱 | 參數值 | 支持語言 | 采樣率 | 實時/離線 | 適用場景 |
汽車領域銷售對話語音識別模型 | domain-automotive | 中文 | 16k | 離線 | 適用于汽車行業,包括門店接待、汽車試駕、車型推銷等場景下的語音識別 |
教育領域網課場景語音識別模型 | domain-education | 中文 | 16k | 離線 | 適用于教育行業,包括網課等場景下的語音識別 |
示例設置
// 完全不設置
{
"Input":{
...
},
"Parameters":{
}
}
// 設置開啟說話人分離功能
{
"Input":{
...
},
"Parameters":{
"Transcription":{
"DiarizationEnabled":true,
"Diarization":{
"SpeakerCount":2
}
}
}
}
代碼示例
#!/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()
# 語音識別控制相關
transcription = dict()
# 角色分離
transcription['DiarizationEnabled'] = True
diarization = dict()
diarization['SpeakerCount'] = 2
transcription['Diarization'] = diarization
parameters['Transcription'] = transcription
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 TranscriptionTest {
@Test
public void testFiletrans() 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();
JSONObject transcription = new JSONObject();
transcription.put("DiarizationEnabled", true);
JSONObject speakerCount = new JSONObject();
speakerCount.put("SpeakerCount", 2);
transcription.put("Diarization", speakerCount);
parameters.put("Transcription", transcription);
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":"10683ca4ad3f4f06bdf6e9dd********",
"TaskStatus":"COMPLETED",
"Result":{
"Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/10683ca4ad3f4f06bdf6e9dc1f3c1584/10683ca4ad3f4f06bdf6e9dc1f3c1584_Transcription_20231031165005.json?Expires=1698828606&OSSAccessKeLTAI4G4uXHLPwQHj6oX8****nt5S&Signature=GMm%2BdN2tUPx*********ehu74%3D"
}
},
"Message":"success",
"RequestId":"7a63ee43-8a35-4ef2-8d5c-c76*********"
}
其中Transcription字段對應的即為語音轉寫結果的http url下載鏈接。
協議解析
上述輸出中的語音轉寫結果url中的內容為JSON格式的報文,示例如下所示。(實時轉寫結果中不包含AudioInfo中的Size、SampleRate和Language字段)
{
"TaskId":"10683ca4ad3f4f06bdf6e9dc*********",
"Transcription":{
"AudioInfo": {
"Size": 670663,
"Duration": 10394,
"SampleRate": 48000,
"Language": "cn"
},
"Paragraphs":[
{
"ParagraphId":"16987422100275*******",
"SpeakerId":"1",
"Words":[
{
"Id":10,
"SentenceId":1,
"Start":4970,
"End":5560,
"Text":"您好,"
},
{
"Id":20,
"SentenceId":1,
"Start":5730,
"End":6176,
"Text":"我是"
}
]
}
]
"AudioSegments": [
[12130, 16994],
[17000, 19720],
[19940, 28649]
]
}
}
具體字段定義如下。
參數名 | 類型 | 說明 |
TaskId | string | 創建任務時生成的TaskId。 |
Transcription | object | 語音轉寫結果對象。 |
Transcription.Paragraphs | list[] | 語音轉寫結構以段落形式組織的集合。 |
Transcription.Paragraphs[i].ParagraphId | string | 段落級別id。 |
Transcription.Paragraphs[i].SpeakerId | string | 發言人id。 |
Transcription.Paragraphs[i].Words | list[] | 該段落包含的word信息。 |
Transcription.Paragraphs[i].Words[i].Id | int | word序號,通常無須關注。 |
Transcription.Paragraphs[i].Words[i].SentenceId | int | 句子id,同屬于一個SentenceId的word信息可以組裝成一句話。 |
Transcription.Paragraphs[i].Words[i].Start | long | 該word相對于音頻起始時間的開始時間,相對時間戳,單位毫秒。 |
Transcription.Paragraphs[i].Words[i].End | long | 該word相對于音頻起始時間的結束時間,相對時間戳,單位毫秒。 |
Transcription.Paragraphs[i].Words[i].Text | string | word文本。 |
Transcription.AudioInfo | object | 音頻信息對象。 |
Transcription.AudioInfo.Size | long | 音頻大小,單位:字節。 |
Transcription.AudioInfo.Duration | long | 音頻時長,單位:毫秒。(實時語音轉寫時,該字段不表示實際音頻時長) |
Transcription.AudioInfo.SampleRate | int | 音頻采樣率。 |
Transcription.AudioInfo.Language | string | 音頻語種。 |
Transcription.AudioSegments | list[][] | 有效音頻片斷范圍。 |
Transcription.AudioSegments[i][0] | int | 有效音頻片段的開始時間,單位為毫秒。 |
Transcription.AudioSegments[i][1] | int | 有效音頻片段的結束時間,單位為毫秒。 |
常見問題
上傳一個文件,為什么識別結果為空?
您可以檢查原始音視頻文件是否存在有效人聲、背景噪音過多等問題。