Paraformer語音識別
支持的領域 / 任務:audio(音頻) / asr(語音識別)
Paraformer語音識別提供的文件轉寫API,能夠對常見的音頻或音視頻文件進行語音識別,并將結果返回給調用者。
新一代語音識別模型paraformer-v2,支持常見的視頻直播、電話客服等場景下任意采樣率的音頻輸入,同時可以通過language_hints參數選擇語種獲得更準確的識別效果。
Paraformer語音識別返回較為豐富的結果供調用者選擇使用,包括全文級文字、句子級文字、詞和時間戳等。模型默認進行標點符號預測和逆文本正則化。
由于音視頻文件的尺寸通常較大,文件傳輸和語音識別處理均需要時間,文件轉寫API通過異步調用方式來提交任務。開發者需要通過查詢接口,在文件轉寫完成后獲得語音識別結果。文件轉寫API支持批處理,用戶可以單次上傳最多100個文件URL,待所有URL轉寫完成后,用戶可以一次性獲取全部轉寫結果。
錄音文件識別目前不支持識別本地文件。
模型概覽
模型名 | 模型簡介 |
paraformer-v2 | 推薦使用 Paraformer最新語音識別模型,支持多個語種的語音識別。可以通過language_hints參數選擇語種獲得更準確的識別效果,支持任意采樣率。 支持的語言包括:中文(包含中文普通話和各種方言)、英文、日語、韓語。支持熱詞功能,用法請參考定制熱詞。 上海話、吳語、閩南語、東北話、甘肅話、貴州話、河南話、湖北話、湖南話、江西話、寧夏話、山西話、陜西話、山東話、四川話、天津話、云南話、粵語 |
paraformer-8k-v2 | 推薦使用 Paraformer最新中文語音識別模型,模型結構升級,具有更好的識別效果。僅支持中文熱詞。用法請參考定制熱詞。 |
paraformer-v1 | Paraformer中英文語音識別模型,支持任意采樣率的音頻或視頻語音識別。 |
paraformer-8k-v1 | Paraformer中文語音識別模型,支持8kHz電話語音識別。 |
paraformer-mtl-v1 | Paraformer多語言語音識別模型,支持16kHz及以上采樣率的音頻或視頻語音識別。 支持的語種/方言包括:中文普通話、中文方言(粵語、吳語、閩南語、東北話、甘肅話、貴州話、河南話、湖北話、湖南話、寧夏話、山西話、陜西話、山東話、四川話、天津話)、英語、日語、韓語、西班牙語、印尼語、法語、德語、意大利語、馬來語。 |
前提條件
通過DashScope SDK實現異步轉寫音視頻文件
調用示例
用以進行語音識別的具體模型通過
model
參數指定。需要進行語音識別的音視頻文件通過
file_urls
參數指定,支持HTTP / HTTPS協議的URL。file_urls
參數指定最多100個文件URL進行轉寫,且文件小于等于2 GB。如果希望處理的文件超過了上述限制,可嘗試對文件進行預處理以降低文件尺寸。有關文件預處理的最佳實踐可以查閱預處理視頻文件以提高文件轉寫效率。
API支持當前主流的音視頻文件格式,包括:
aac
、amr
、avi
、flac
、flv
、m4a
、mkv
、mov
、mp3
、mp4
、mpeg
、ogg
、opus
、wav
、webm
、wma
、wmv
重要由于音視頻格式及其變種眾多,技術上無法窮盡測試,API不能保證所有格式均能夠被正確識別。請通過測試驗證您所提供的文件能夠獲得正常的語音識別結果。
文件轉寫API采用異步調用方式,開發者需謹慎處理任務提交、狀態查詢、獲取結果的異步邏輯。
說明文件轉寫服務對通過API提交的任務采取盡力服務原則進行處理。具體任務的排隊等待時間取決于并發的隊列長度和其它任務的文件時長,因而無法提供確切等待時間。通常情況下排隊等待時間應小于數分鐘。一旦結束排隊進入處理狀態,文件將以數百倍的加速比進行語音識別。
每一個任務完成后,識別結果和URL下載鏈接有效期為24小時,超時后無法查詢任務或通過先前查詢結果中的URL下載結果。
# For prerequisites running the following sample, visit http://bestwisewords.com/document_detail/611472.html
from http import HTTPStatus
import dashscope
import json
# 如您未將API Key配置到環境變量中,可帶上下面這行代碼并將your-dashscope-api-key替換成您自己的API Key
# dashscope.api_key = 'your-dashscope-api-key'
task_response = dashscope.audio.asr.Transcription.async_call(
model='paraformer-v2',
file_urls=['https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav',
'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav'],
language_hints=['zh', 'en'] # “language_hints”只支持paraformer-v2和paraformer-realtime-v2模型
)
transcribe_response = dashscope.audio.asr.Transcription.wait(task=task_response.output.task_id)
if transcribe_response.status_code == HTTPStatus.OK:
print(json.dumps(transcribe_response.output, indent=4, ensure_ascii=False))
print('transcription done!')
package com.alibaba.dashscope.sample.transcription;
import com.alibaba.dashscope.audio.asr.transcription.*;
import com.google.gson.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
import java.net.HttpURLConnection;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
TranscriptionParam param =
TranscriptionParam.builder()
// 如您未將API Key配置到環境變量中,可帶上下面這行代碼并將your-dashscope-api-key替換成您自己的API Key
// .apiKey("your-dashscope-api-key")
.model("paraformer-v2")
.fileUrls(
Collections.singletonList(
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav"))
// “language_hints”只支持paraformer-v2和paraformer-realtime-v2模型
.parameter("language_hints", new String[]{"zh", "en"})
.build();
try {
Transcription transcription = new Transcription();
// 提交轉寫請求
TranscriptionResult result = transcription.asyncCall(param);
// 打印TaskId
System.out.println("TaskId: " + result.getTaskId());
// 等待轉寫完成
result =
transcription.wait(
TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
// 獲取轉寫結果
List<TranscriptionTaskResult> taskResultList = result.getResults();
if (taskResultList != null && taskResultList.size() > 0) {
TranscriptionTaskResult taskResult = taskResultList.get(0);
// 獲取轉寫結果的url
String transcriptionUrl = taskResult.getTranscriptionUrl();
// 通過Http獲取url內對應的結果
HttpURLConnection connection =
(HttpURLConnection) new URL(transcriptionUrl).openConnection();
connection.setRequestMethod("GET");
connection.connect();
BufferedReader reader =
new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 格式化輸出json結果
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(gson.fromJson(reader, JsonObject.class)));
}
} catch (Exception e) {
System.out.println("error: " + e);
}
System.exit(0);
}
}
返回結果示例
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
"properties": {
"audio_format": "pcm_s16le",
"channels": [
0
],
"original_sampling_rate": 16000,
"original_duration_in_milliseconds": 4726
},
"transcripts": [
{
"channel_id": 0,
"content_duration_in_milliseconds": 4570,
"text": "Hello world, 這里是阿里巴巴語音實驗室。",
"sentences": [
{
"begin_time": 140,
"end_time": 4710,
"text": "Hello world, 這里是阿里巴巴語音實驗室。",
"words": [
{
"begin_time": 140,
"end_time": 597,
"text": "Hello ",
"punctuation": ""
},
{
"begin_time": 597,
"end_time": 1054,
"text": "world",
"punctuation": ", "
},
{
"begin_time": 1054,
"end_time": 1663,
"text": "這里",
"punctuation": ""
},
{
"begin_time": 1663,
"end_time": 2272,
"text": "是阿",
"punctuation": ""
},
{
"begin_time": 2272,
"end_time": 2881,
"text": "里巴",
"punctuation": ""
},
{
"begin_time": 2881,
"end_time": 3490,
"text": "巴語",
"punctuation": ""
},
{
"begin_time": 3490,
"end_time": 4099,
"text": "音實",
"punctuation": ""
},
{
"begin_time": 4099,
"end_time": 4710,
"text": "驗室",
"punctuation": "。"
}
]
}
]
}
]
}
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"properties": {
"audio_format": "pcm_s16le",
"channels": [
0
],
"original_sampling_rate": 16000,
"original_duration_in_milliseconds": 3834
},
"transcripts": [
{
"channel_id": 0,
"content_duration_in_milliseconds": 3530,
"text": "Hello world, 這里是阿里巴巴語音實驗室。",
"sentences": [
{
"begin_time": 280,
"end_time": 3810,
"text": "Hello world, 這里是阿里巴巴語音實驗室。",
"words": [
{
"begin_time": 280,
"end_time": 633,
"text": "Hello ",
"punctuation": ""
},
{
"begin_time": 633,
"end_time": 986,
"text": "world",
"punctuation": ", "
},
{
"begin_time": 986,
"end_time": 1456,
"text": "這里",
"punctuation": ""
},
{
"begin_time": 1456,
"end_time": 1926,
"text": "是阿",
"punctuation": ""
},
{
"begin_time": 1926,
"end_time": 2396,
"text": "里巴",
"punctuation": ""
},
{
"begin_time": 2396,
"end_time": 2866,
"text": "巴語",
"punctuation": ""
},
{
"begin_time": 2866,
"end_time": 3336,
"text": "音實",
"punctuation": ""
},
{
"begin_time": 3336,
"end_time": 3810,
"text": "驗室",
"punctuation": "。"
}
]
}
]
}
]
}
返回參數說明
返回參數 | 類型 | 說明 |
audio_format | string | 源文件中音頻的格式。 |
channels | List[int] | 源文件中音頻的音軌索引信息,對單軌音頻返回[0],對雙軌音頻返回[0, 1],以此類推。 |
original_sampling_rate | int | 源文件中音頻的采樣率(Hz)。 |
original_duration | int | 源文件中的原始音頻時長(ms)。 |
channel_id | int | 表明轉寫結果的音軌索引,以0為起始。 |
content_duration | int | 音軌中被判定為語音內容的時長(ms)。 重要 Paraformer語音識別模型服務僅對音軌中被判定為語音內容的時長進行語音轉寫,并據此進行計量計費,非語音內容不計量、不計費。通常情況下語音內容時長會短于原始音頻時長。由于對是否存在語音內容的判定是由AI模型給出的,可能與實際情況存在一定誤差。 |
transcript | string | 段落級別的語音轉寫結果。 |
sentences | List[] | 句子級別的語音轉寫結果。 |
words | List[] | 詞級別的語音轉寫結果。 |
begin_time | int | 開始時間戳(ms)。 |
end_time | int | 結束時間戳(ms)。 |
text | string | 語音轉寫結果。 |
punctuation | string | 預測出的詞之后的標點符號(如有)。 |
接口詳情
當一個文件轉寫任務成功后,通過wait()
或fetch()
調用可獲取文件轉寫的結果。這個結果同樣以文件的形式保存,其鏈接以transcription_url
給出。開發者可以打開該URL以獲取結果。
異步任務文件轉寫結果文件URL的有效時間是24小時,從異步任務完成的時間開始計算。
異步調用
以異步調用的方式向文件轉寫服務提交一個任務,返回被提交任務的信息。
接口
以下代碼片段展示了如何創建一個使用paraformer-v2模型,配置熱詞和語種等請求參數進行異步調用:
# Submit the transcription task
task_response = dashscope.audio.asr.Transcription.async_call(
model='paraformer-v2',
language_hints=['zh', 'en'],
vocabulary_id='vocab-Xxxx',
speaker_count=1,
diarization_enabled=True,
file_urls=[
'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav',
'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/sample_video_poetry.mp4',
'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/long_audio_demo_cn.mp3'
])
TranscriptionParam param =
TranscriptionParam.builder()
.apiKey("sk-3b184157bef946c6aa7d950b5916325f")
.model("paraformer-v2")
.parameter("language_hints", new String[] {"en"})
.vocabularyId("vocab-Xxxx")
.speakerCount(1)
.diarizationEnabled(true)
.fileUrls(
Arrays.asList(
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav",
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/sample_video_poetry.mp4",
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/long_audio_demo_cn.mp3"))
.build();
Transcription transcription = new Transcription();
// 提交轉寫請求
TranscriptionResult result = transcription.asyncCall(param);
參數配置
參數 | 類型 | 默認值 | 說明 |
model | string | - | 指定用于音視頻文件轉寫的Paraformer模型名,可以從paraformer-v1、paraformer-8k-v1、paraformer-MTL-v1中進行選擇。關于如何進行模型選擇,請參考:模型概覽。 |
file_urls | List[string] | - | 音視頻文件轉寫的URL列表,支持HTTP / HTTPS協議,可最多支持100個文件URL。 |
vocabulary_id(可選) | string | - | 最新熱詞ID,支持最新v2系列模型并配置語種信息,此次語音識別中生效此熱詞ID對應的熱詞信息。默認不啟用。使用方法請參考定制熱詞 |
phrase_id (可選) | string | - | 舊版熱詞ID,此次語音識別中生效的熱詞ID對應的熱詞信息。默認不啟用。 注:phrase_id為舊版本熱詞方案,不支持v2及后續系列模型。支持舊版本熱詞的模型列表請參考Paraformer語音識別熱詞定制與管理 |
channel_id (可選) | List[int] | [0] | 指定在多音軌文件中需要進行語音識別的音軌索引,以List的形式給出,例如 [0] 代表對第一條音軌進行識別、 [0, 1] 代表對第一和第二條音軌分別進行識別等。 |
disfluency_removal_enabled | boolean | false | 過濾語氣詞,默認關閉 |
timestamp_alignment_enabled | boolean | false | 是否啟用時間戳校準功能,默認關閉。 |
special_word_filter | string | - | 敏感詞過濾功能,支持開啟或關閉,支持自定義敏感詞。該參數可實現: 不處理(默認,即展示原文)、過濾、替換為*。 具體調用說明請見下文的敏感詞調用示例。 說明 開啟但未配置敏感詞,則會過濾默認詞表:敏感詞表。 |
language_hints | List[str] | ['zh', 'en'] | 指定識別語音中語言的代碼列表。支持的語言代碼:
注:僅對paraformer-v2生效。在java SDK中,此參數需要通過parameter額外參數配置,用法請參考快速開始中示例代碼。 |
diarization_enabled | bool | false | 自動說話人分離,默認關閉。 |
speaker_count | int | - | 說話人數量參考值。取值范圍為2至100的整數(包含2和100)。 開啟說話人分離功能后(diarization_enabled設置為true)生效。 默認自動判斷說話人數量,如果配置此項,只能輔助算法盡量輸出指定人數,無法保證一定會輸出此人數。 |
敏感詞調用示例
敏感詞的輸入為一個JSON格式字符串,示例如下:
{
"system_reserved_filter": true,
"filter_with_empty": {
"word_list": [
"開始",
"發生"
]
},
"filter_with_signed": {
"word_list": [
"測試"
]
}
}
其中,system_reserved_filter開關打開后會使用默認敏感詞表。filter_with_empty中的詞會在識別結果中被替換為空,filter_with_signed中的詞會在識別結果中被替換為"*"。
返回結果示例
{
"status_code": 200,
"request_id": "8c59f00c-7723-455e-922d-ac3a31838170",
"code": "",
"message": "",
"output": {
"task_id": "bd725f8f-f699-4962-bcad-38a9fc2bcd7c",
"task_status": "PENDING"
},
"usage": null
}
返回參數說明
返回參數 | 類型 | 說明 |
code | int | 狀態碼,詳情請參考:錯誤碼 |
task_id | string | 提交的異步任務的ID,該ID作為任務的全局唯一標識符將用于后續對任務狀態的查詢、結果獲取等操作。 |
等待異步任務結束
以阻塞的方式等待異步任務結束(即到達 SUCCEEDED 或 FAILED 狀態),返回任務的狀態和文件轉寫結果。異步任務的狀態包括 PENDING 、 RUNNING 、 SUCCEEDED 、 FAILED 。當任務處于 PENDING 或 RUNNING 狀態時,該調用將被阻塞。當任務處于 SUCCEEDED 或 FAILED 狀態時,該調用將返回任務的狀態和結果。
接口
dashscope.audio.asr.Transcription.wait()
TranscriptionResult wait(TranscriptionQueryParam param);
參數配置
參數 | 類型 | 默認值 | 說明 |
task | string | - | 在調用提交任務接口時所返回的 task_id 。 |
返回結果示例
{
"status_code": 200,
"request_id": "0411a162-f0df-9196-ba4e-7c4a03788bae",
"code": null,
"message": "",
"output": {
"task_id": "39bfce34-8744-4ee3-a85b-d42cc150908b",
"task_status": "SUCCEEDED",
"submit_time": "2023-10-23 17:41:03.403",
"scheduled_time": "2023-10-23 17:41:03.429",
"end_time": "2023-10-23 17:41:04.022",
"results": [{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/paraformer-v2/20231023/17%3A41/4adeaf61-aa36-4a16-81a1-db381d627f06-1.json?Expires=1698140464&OSSAccessKeyId=LTAI5**************4G8qL&Signature=QhsuSA0OCm%2BEBBmdRRF8K4xXP8Q%3D",
"subtask_status": "SUCCEEDED"
}, {
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/paraformer-v2/20231023/17%3A41/d9b23f85-55c1-43b9-a172-17a7afba3e40-1.json?Expires=1698140464&OSSAccessKeyId=LTAI5**************4G8qL&Signature=eTXOgbROSgExlW6J31RL%2F%2Fr7zk4%3D",
"subtask_status": "SUCCEEDED"
}],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 2,
"FAILED": 0
}
},
"usage": {
"duration": 7
}
}
返回參數說明
返回參數 | 類型 | 說明 |
task_id | string | 被查詢任務的ID。 |
task_status | string | 被查詢任務的狀態。 |
file_url | string | 文件轉寫任務中所處理的文件URL。 |
transcription_url | string | 所處理文件的處理結果URL。 |
查詢異步任務
查詢異步任務,返回任務的狀態和文件轉寫結果。異步任務的狀態包括 PENDING 、 RUNNING 、 SUCCEEDED 、 FAILED 。本調用不會阻塞,將立即返回所查詢任務的狀態和結果。開發者可以編寫代碼,采用輪詢的方式直到任務完成,再獲取文件轉寫結果。
接口
dashscope.audio.asr.Transcription.fetch()
TranscriptionResult fetch(TranscriptionQueryParam param);
參數配置
參數 | 類型 | 默認值 | 說明 |
task | string | - | 在調用提交任務接口時所返回的 task_id 。 |
返回結果示例
PENDING/RUNNING狀態
{
"status_code": 200,
"request_id": "04ea046b-ccca-4765-882c-9f60bd985150",
"code": null,
"message": "",
"output": {
"task_id": "bd725f8f-f699-4962-bcad-38a9fc2bcd7c",
"task_status": "RUNNING"
},
"usage": null
}
SUCCEEDED狀態
{
"status_code": 200,
"request_id": "0411a162-f0df-9196-ba4e-7c4a03788bae",
"code": null,
"message": "",
"output": {
"task_id": "39bfce34-8744-4ee3-a85b-d42cc150908b",
"task_status": "SUCCEEDED",
"submit_time": "2023-10-23 17:41:03.403",
"scheduled_time": "2023-10-23 17:41:03.429",
"end_time": "2023-10-23 17:41:04.022",
"results": [{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/paraformer-v2/20231023/17%3A41/4adeaf61-aa36-4a16-81a1-db381d627f06-1.json?Expires=1698140464&OSSAccessKeyId=LTAI5**************4G8qL&Signature=QhsuSA0OCm%2BEBBmdRRF8K4xXP8Q%3D",
"subtask_status": "SUCCEEDED"
}, {
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/paraformer-v2/20231023/17%3A41/d9b23f85-55c1-43b9-a172-17a7afba3e40-1.json?Expires=1698140464&OSSAccessKeyId=LTAI5**************4G8qL&Signature=eTXOgbROSgExlW6J31RL%2F%2Fr7zk4%3D",
"subtask_status": "SUCCEEDED"
}],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 2,
"FAILED": 0
}
},
"usage": {
"duration": 7
}
}
返回參數說明
返回參數 | 類型 | 說明 |
task_id | string | 被查詢任務的ID。 |
task_status | string | 被查詢任務的狀態。 |
file_url | string | 文件轉寫任務中所處理的文件URL。 |
transcription_url | string | 所處理文件的處理結果URL。 |
通過HTTP調用接口實現異步轉寫音視頻文件
文件轉寫是異步任務,開發者可以通過HTTP提交接口提交任務,并且在循環中通過查詢接口確認任務狀態。在文件轉寫完成后獲得語音識別結果。
Curl
提交任務
請將'{api-key}'替換為你的apikey。
curl -X POST \
-H 'Authorization: Bearer {api-key}' \
-H 'Content-Type: application/json' \
-H 'X-DashScope-Async: enable' \
-d '{"model":"paraformer-v2","input":{"file_urls":["https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav"]},"parameters":{"channel_id":[0],"language_hints":["zh", "en"]}}' \
https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription
返回示例:
{
"output": {
"task_status": "PENDING",
"task_id": "c2e5d63b-96e1-4607-bb91-************"
},
"request_id": "77ae55ae-be17-97b8-9942--************""
}
查詢任務
請將'{api-key}'替換為你的apikey,'{task_id}'為提交任務成功后獲得的task_id。
curl -X POST -i 'https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}' --header 'Authorization: Bearer {api-key}'
返回示例:
{
"request_id": "f9e1afad-94d3-997e-a83b-************",
"output": {
"task_id": "f86ec806-4d73-485f-a24f-************",
"task_status": "SUCCEEDED",
"submit_time": "2024-09-12 15:11:40.041",
"scheduled_time": "2024-09-12 15:11:40.071",
"end_time": "2024-09-12 15:11:40.903",
"results": [
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/3bdf7689-b598-409d-806a-121cff5e4a31-1.json?Expires=1726211500&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4****&Signature=Fj%2BaF%2FH0Kayj3w3My2ECBeP****%3D",
"subtask_status": "SUCCEEDED"
},
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/409a4b92-445b-4dd8-8c1d-f110954d82d8-1.json?Expires=1726211500&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4****&Signature=v5Owy5qoAfT7mzGmQgH0g8C****%3D",
"subtask_status": "SUCCEEDED"
}
],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 2,
"FAILED": 0
}
},
"usage": {
"duration": 9
}
}
返回結果請參考接口詳情-等待異步任務結束
Python
import requests
import json
import time
api_key = "your-dashscope-api-key" # 在此處替換為您的API密鑰
file_urls = [
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
]
language_hints = ["zh", "en"]
# 提交文件轉寫任務,包含待轉寫文件url列表
def submit_task(apikey, file_urls) -> str:
headers = {
"Authorization": f"Bearer {apikey}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
}
data = {
"model": "paraformer-v2",
"input": {"file_urls": file_urls},
"parameters": {
"channel_id": [0],
"language_hints": language_hints,
},
}
# 錄音文件轉寫服務url
service_url = (
"https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription"
)
response = requests.post(
service_url, headers=headers, data=json.dumps(data)
)
# 打印響應內容
if response.status_code == 200:
return response.json()["output"]["task_id"]
else:
print("task failed!")
print(response.json())
return None
# 循環查詢任務狀態直到成功
def wait_for_complete(task_id):
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
}
pending = True
while pending:
# 查詢任務狀態服務url
service_url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}"
response = requests.post(
service_url, headers=headers
)
if response.status_code == 200:
status = response.json()['output']['task_status']
if status == 'SUCCEEDED':
print("task succeeded!")
pending = False
return response.json()['output']['results']
elif status == 'RUNNING' or status == 'PENDING':
pass
else:
print("task failed!")
pending = False
else:
print("query failed!")
pending = False
print(response.json())
time.sleep(0.1)
task_id = submit_task(apikey=api_key, file_urls=file_urls)
print("task_id: ", task_id)
result = wait_for_complete(task_id)
print("transcription result: ", result)
任務失敗
當錄音文件識別任務失敗時會返回報錯信息。您可以通過報錯信息和錯誤碼定位出錯原因并處理。
錯誤返回示例
{
"task_id": "7bac899c-06ec-4a79-8875-xxxxxxxxxxxx",
"task_status": "SUCCEEDED",
"submit_time": "2024-12-16 16:30:59.170",
"scheduled_time": "2024-12-16 16:30:59.204",
"end_time": "2024-12-16 16:31:02.375",
"results": [
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/long_audio_demo_cn.mp3",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20241216/xxxx",
"subtask_status": "SUCCEEDED"
},
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_exaple_1.wav",
"code": "InvalidFile.DownloadFailed",
"message": "The audio file cannot be downloaded.",
"subtask_status": "FAILED"
}
],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 1,
"FAILED": 1
}
}
當在一次調用中提交多個任務時,只要存在成功的任務 task_status 就會顯示SUCCEEDED,請您查看每一個任務的 subtask_status 和 message 判斷任務的狀態。
語音相關錯誤碼
錯誤碼(code) | 原因 | 解決方案 |
SUCCESS_WITH_NO_VALID_FRAGMENT | 識別結果查詢接口調用成功,但是VAD模塊未檢測到有效語音。 | 此種情況下可檢查: 錄音文件是否包含有效語音,如果都是無效語音,例如純靜音。上述情況下沒有識別結果是正常現象。 |
ASR_RESPONSE_HAVE_NO_WORDS | 識別結果查詢接口調用成功,但是最終識別結果為空。 | 此種情況下可檢查: 錄音文件是否包含有效語音,或有效語音是否都是語氣詞且開啟了順滑參數 |
FILE_DOWNLOAD_FAILED | 文件下載失敗。 | 檢查錄音文件路徑是否正確,以及是否可以通過外網訪問和下載。 |
FILE_CHECK_FAILED | 文件格式錯誤。 | 檢查錄音文件是否是單軌/雙軌的WAV格式或MP3格式。 |
FILE_TOO_LARGE | 文件過大。 | 檢查錄音文件大小是否超過2GB,超過則需您對錄音文件分段。 |
FILE_NORMALIZE_FAILED | 文件歸一化失敗。 | 檢查錄音文件是否有損壞,是否可以正常播放。 |
FILE_PARSE_FAILED | 文件解析失敗。 | 檢查錄音文件是否有損壞,是否可以正常播放。 |
MKV_PARSE_FAILED | MKV解析失敗。 | 檢查錄音文件是否損壞,是否可以正常播放。 |
FILE_TRANS_TASK_EXPIRED | 錄音文件識別任務過期。 | TaskId不存在,或者已過期。 |
REQUEST_INVALID_FILE_URL_VALUE | 請求file_link參數非法。 | 確認file_url參數格式是否正確。 |
CONTENT_LENGTH_CHECK_FAILED | content-length 檢查失敗。 | 檢查下載文件時,HTTP response中的content-length與文件實際大小是否一致。 |
FILE_404_NOT_FOUND | 需要下載的文件不存在。 | 檢查需要下載的文件是否存在。 |
FILE_403_FORBIDDEN | 沒有權限下載需要的文件。 | 檢查是否有權限下載錄音文件。 |
FILE_SERVER_ERROR | 請求的文件所在的服務不可用。 | 檢查請求的文件所在的服務是否可用。 |
AUDIO_DURATION_TOO_LONG | 請求的文件時長超過12小時。 | 建議將音頻進行切分,分多次提交識別任務,可以參考文檔。 |
DECODER_ERROR | 檢測音頻文件信息失敗。 | 確認文件下載鏈接中文件為支持的音頻格式。 |
INTERNAL_ERROR | 受機器負載、網絡等因素導致的異常,通常為偶發出現。 | 一般重試調用即可恢復,如無法恢復,請聯系技術支持人員。 |
更多百煉平臺相關錯誤碼請參考錯誤碼。