全部產品
Search
文件中心

Alibaba Cloud Model Studio:非即時語音辨識

更新時間:Jul 15, 2026

非即時語音辨識模型能將錄製好的音頻轉換為文本,支援多語言識別、歌唱識別、雜訊拒識、說話人分離等功能,適用於會議轉寫、通話分析、字幕產生等情境。

概述

通過非同步任務對錄製好的音視頻檔案進行批量轉寫。

  • 支援上下文增強,通過配置上下文提高識別準確率(僅 fun-asr-flash-2026-06-15 模型)

  • 支援自訂熱詞,通過預設詞表提升專有名詞識別準確率

  • 支援說話人分離、敏感詞過濾、句子/詞語級時間戳記等可配置功能

  • 支援單個時間長度不超過 12 小時、體積不超過 2GB 的音頻檔案非同步轉寫

  • 支援任意採樣率,相容 aac、wav、mp3 等多種主流音視頻格式

即時情境(直播字幕、線上會議、語音助手等)可使用即時語音辨識。各模型選型建議請參見語音辨識

前提條件

快速開始

Fun-ASR

音視頻檔案較大,檔案轉寫 API 採用非同步呼叫:提交任務後通過查詢介面輪詢狀態,任務完成後擷取識別結果。

cURL

使用 cURL 調用時,先提交任務擷取 task_id,再通過該 ID 查詢任務執行結果。

提交任務

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-Async: enable" \
-d '{
    "model": "fun-asr",
    "input": {
        "file_urls": [
            "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav"
        ]
    },
    "parameters": {
        "channel_id": [0],
        "language_hints": ["zh", "en"]
    }
}'

擷取任務執行結果

此查詢介面預設 20 QPS、最高可擴容到 100 QPS。如需更高頻次或避免輪詢限流,建議配置非同步任務回調(參見 高並發情境:使用回調替代輪詢)。

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X GET 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/{task_id}' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json"

下載識別結果

任務成功後,查詢介面返回的 output.results[].transcription_url 指向公網可下載的 JSON 檔案,包含完整識別結果。該 URL 預設在 24 小時內有效,請及時下載並落盤儲存。

# 將 {transcription_url} 替換為查詢介面返回的 transcription_url 值
curl -sS '{transcription_url}' -o transcription.json
cat transcription.json | jq .

Python

from http import HTTPStatus
from dashscope.audio.asr import Transcription
from urllib import request
import dashscope
import os
import json

# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

task_response = Transcription.async_call(
    model='fun-asr',
    file_urls=['https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav'],
    language_hints=['zh', 'en']  # language_hints為選擇性參數,用於指定待識別音訊語言代碼。取值範圍請參見API參考文檔。
)

transcription_response = Transcription.wait(task=task_response.output.task_id)

if transcription_response.status_code == HTTPStatus.OK:
    for transcription in transcription_response.output['results']:
        if transcription['subtask_status'] == 'SUCCEEDED':
            url = transcription['transcription_url']
            result = json.loads(request.urlopen(url).read().decode('utf8'))
            print(json.dumps(result, indent=4,
                            ensure_ascii=False))
        else:
            print('transcription failed!')
            print(transcription)
else:
    print('Error: ', transcription_response.output.message)

Java

import com.alibaba.dashscope.audio.asr.transcription.*;
import com.alibaba.dashscope.utils.Constants;
import com.google.gson.*;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
        // 建立轉寫請求參數。
        TranscriptionParam param =
                TranscriptionParam.builder()
                        // 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                        // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:.apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model("fun-asr")
                        // language_hints為選擇性參數,用於指定待識別音訊語言代碼。取值範圍請參見API參考文檔。
                        .parameter("language_hints", new String[]{"zh", "en"})
                        .fileUrls(
                                Arrays.asList(
                                        "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav"))
                        .build();
        try {
            Transcription transcription = new Transcription();
            // 提交轉寫請求
            TranscriptionResult result = transcription.asyncCall(param);
            System.out.println("RequestId: " + result.getRequestId());
            // 檢查任務是否提交成功
            if (result.getTaskId() == null) {
                System.out.println("Error: " + result.getOutput());
                System.exit(1);
            }
            // 阻塞等待任務完成並擷取結果
            result = transcription.wait(
                    TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
            // 擷取轉寫結果
            List<TranscriptionTaskResult> taskResultList = result.getResults();
            if (taskResultList != null && taskResultList.size() > 0) {
                for (TranscriptionTaskResult taskResult : taskResultList) {
                    String transcriptionUrl = taskResult.getTranscriptionUrl();
                    HttpURLConnection connection =
                            (HttpURLConnection) new URL(transcriptionUrl).openConnection();
                    connection.setRequestMethod("GET");
                    connection.connect();
                    BufferedReader reader =
                            new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    Gson gson = new GsonBuilder().setPrettyPrinting().create();
                    JsonElement jsonResult = gson.fromJson(reader, JsonObject.class);
                    System.out.println(gson.toJson(jsonResult));
                }
            }
        } catch (Exception e) {
            System.out.println("error: " + e);
        }
        System.exit(0);
    }
}

完整的識別結果會以JSON格式列印在控制台。完整結果包含轉換後的文本以及文本在音視頻檔案中的起始、結束時間(以毫秒為單位)。

  • 識別結果

    {
        "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": 2480,
                "text": "Hello World,這裡是阿里巴巴語音實驗室。",
                "sentences": [
                    {
                        "begin_time": 760,
                        "end_time": 3240,
                        "text": "Hello World,這裡是阿里巴巴語音實驗室。",
                        "sentence_id": 1,
                        "words": [
                            {
                                "begin_time": 760,
                                "end_time": 1000,
                                "text": "Hello",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 1000,
                                "end_time": 1120,
                                "text": " World",
                                "punctuation": ","
                            },
                            {
                                "begin_time": 1400,
                                "end_time": 1920,
                                "text": "這裡是",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 1920,
                                "end_time": 2520,
                                "text": "阿里巴巴",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2520,
                                "end_time": 2840,
                                "text": "語音",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2840,
                                "end_time": 3240,
                                "text": "實驗室",
                                "punctuation": "。"
                            }
                        ]
                    }
                ]
            }
        ]
    }

Fun-ASR-Flash

fun-asr-flash-2026-06-15 支援同步調用,適用於 5 分鐘以內的音頻檔案,可流式或非流式返回識別結果。

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。新加坡地區和北京地區的API Key不同。

curl --location --request POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
     --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
     --header "Content-Type: application/json" \
     --header "X-DashScope-SSE: disable" \
     --data '{
    "model": "fun-asr-flash-2026-06-15",
    "input": {
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav"
                        }
                    }
                ]
            }
        ]
    },
    "parameters": {
        "format": "wav",
        "sample_rate": "16000"
    }
}'
重要

注意:fun-asr-flash-2026-06-15 模型通過 DashScope 同步調用介面(multimodal-generation 端點)返回的響應結構與標準 DashScope 多模態介面格式不同。實際返回結構為:

{
  "output": {
    "output": {
      "sentence": {
        "text": "識別常值內容"
      }
    },
    "text": "Hello World,這裡是阿里巴巴語音實驗室。"
  },
  "request_id": "..."
}

其中 output.output.sentence.text 和頂層 output.text 為識別文字欄位,無 choices 欄位。請據此解析響應。

Qwen3-ASR-Flash-Filetrans

Qwen3-ASR-Flash-Filetrans 專為音頻檔案非同步轉寫設計,支援最長 12 小時錄音;僅接受公網音頻檔案 URL(不支援本地檔案上傳),任務完成後一次性返回全部識別結果。

cURL

使用 cURL 調用時,先提交任務擷取 task_id,再通過該 ID 查詢任務執行結果。

提交任務

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-Async: enable" \
-d '{
    "model": "qwen3-asr-flash-filetrans",
    "input": {
        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
    },
    "parameters": {
        "channel_id":[
            0
        ], 
        "enable_itn": false,
        "enable_words": true
    }
}'

擷取任務執行結果

此查詢介面預設 20 QPS、最高可擴容到 100 QPS。如需更高頻次或避免輪詢限流,建議配置非同步任務回調(參見 高並發情境:使用回調替代輪詢)。

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X GET 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/{task_id}' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json"

下載識別結果

任務成功後,查詢介面返回的 output.result.transcription_url 指向公網可下載的 JSON 檔案,包含完整識別結果。該 URL 預設在 24 小時內有效,請及時下載並落盤儲存。

# 將 {transcription_url} 替換為查詢介面返回的 transcription_url 值
curl -sS '{transcription_url}' -o transcription.json
cat transcription.json | jq .

完整樣本

Java

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import okhttp3.*;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class Main {
    // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
    private static final String API_URL_SUBMIT = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription";
    // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
    private static final String API_URL_QUERY = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/";
    private static final Gson gson = new Gson();

    public static void main(String[] args) {
        // 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:String apiKey = "sk-xxx"
        String apiKey = System.getenv("DASHSCOPE_API_KEY");

        OkHttpClient client = new OkHttpClient();

        // 1. 提交任務
        /*String payloadJson = """
                {
                    "model": "qwen3-asr-flash-filetrans",
                    "input": {
                        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
                    },
                    "parameters": {
                        "channel_id": [0],
                        "enable_itn": false,
                        "language": "zh"
                    }
                }
                """;*/
        String payloadJson = """
                {
                    "model": "qwen3-asr-flash-filetrans",
                    "input": {
                        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
                    },
                    "parameters": {
                        "channel_id": [0],
                        "enable_itn": false,
                        "enable_words": true
                    }
                }
                """;

        RequestBody body = RequestBody.create(payloadJson, MediaType.get("application/json; charset=utf-8"));
        Request submitRequest = new Request.Builder()
                .url(API_URL_SUBMIT)
                .addHeader("Authorization", "Bearer " + apiKey)
                .addHeader("Content-Type", "application/json")
                .addHeader("X-DashScope-Async", "enable")
                .post(body)
                .build();

        String taskId = null;

        try (Response response = client.newCall(submitRequest).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                String respBody = response.body().string();
                ApiResponse apiResp = gson.fromJson(respBody, ApiResponse.class);
                if (apiResp.output != null) {
                    taskId = apiResp.output.taskId;
                    System.out.println("任務已提交,task_id: " + taskId);
                } else {
                    System.out.println("提交返回內容: " + respBody);
                    return;
                }
            } else {
                System.out.println("任務提交失敗! HTTP code: " + response.code());
                if (response.body() != null) {
                    System.out.println(response.body().string());
                }
                return;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        // 2. 輪詢任務狀態
        boolean finished = false;
        while (!finished) {
            try {
                TimeUnit.SECONDS.sleep(2);  // 等待 2 秒再查詢
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            }

            String queryUrl = API_URL_QUERY + taskId;
            Request queryRequest = new Request.Builder()
                    .url(queryUrl)
                    .addHeader("Authorization", "Bearer " + apiKey)
                    .addHeader("X-DashScope-Async", "enable")
                    .addHeader("Content-Type", "application/json")
                    .get()
                    .build();

            try (Response response = client.newCall(queryRequest).execute()) {
                if (response.body() != null) {
                    String queryResponse = response.body().string();
                    ApiResponse apiResp = gson.fromJson(queryResponse, ApiResponse.class);

                    if (apiResp.output != null && apiResp.output.taskStatus != null) {
                        String status = apiResp.output.taskStatus;
                        System.out.println("當前任務狀態: " + status);
                        if ("SUCCEEDED".equalsIgnoreCase(status)
                                || "FAILED".equalsIgnoreCase(status)
                                || "UNKNOWN".equalsIgnoreCase(status)) {
                            finished = true;
                            System.out.println("任務完成,最終結果: ");
                            System.out.println(queryResponse);
                        }
                    } else {
                        System.out.println("查詢返回內容: " + queryResponse);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
        }
    }

    static class ApiResponse {
        @SerializedName("request_id")
        String requestId;
        Output output;
    }

    static class Output {
        @SerializedName("task_id")
        String taskId;
        @SerializedName("task_status")
        String taskStatus;
    }
}

Python

import os
import time
import requests
import json

# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
API_URL_SUBMIT = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription"
# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
API_URL_QUERY_BASE = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/"


def main():
    # 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")

    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
        "X-DashScope-Async": "enable"
    }

    # 1. 提交任務
    payload = {
        "model": "qwen3-asr-flash-filetrans",
        "input": {
            "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
        },
        "parameters": {
            "channel_id": [0],
            # "language": "zh",
            "enable_itn": False,
            "enable_words": True
        }
    }

    print("提交 ASR 轉寫任務...")
    try:
        submit_resp = requests.post(API_URL_SUBMIT, headers=headers, data=json.dumps(payload))
    except requests.RequestException as e:
        print(f"請求提交任務失敗: {e}")
        return

    if submit_resp.status_code != 200:
        print(f"任務提交失敗! HTTP code: {submit_resp.status_code}")
        print(submit_resp.text)
        return

    resp_data = submit_resp.json()
    output = resp_data.get("output")
    if not output or "task_id" not in output:
        print("提交返回內容異常:", resp_data)
        return

    task_id = output["task_id"]
    print(f"任務已提交,task_id: {task_id}")

    # 2. 輪詢任務狀態
    finished = False
    while not finished:
        time.sleep(2)  # 等待 2 秒再查詢

        query_url = API_URL_QUERY_BASE + task_id
        try:
            query_resp = requests.get(query_url, headers=headers)
        except requests.RequestException as e:
            print(f"請求查詢任務失敗: {e}")
            return

        if query_resp.status_code != 200:
            print(f"查詢任務失敗! HTTP code: {query_resp.status_code}")
            print(query_resp.text)
            return

        query_data = query_resp.json()
        output = query_data.get("output")
        if output and "task_status" in output:
            status = output["task_status"]
            print(f"當前任務狀態: {status}")

            if status.upper() in ("SUCCEEDED", "FAILED", "UNKNOWN"):
                finished = True
                print("任務完成,最終結果如下:")
                print(json.dumps(query_data, indent=2, ensure_ascii=False))
        else:
            print("查詢返回內容:", query_data)


if __name__ == "__main__":
    main()

Java SDK

import com.alibaba.dashscope.audio.qwen_asr.*;
import com.alibaba.dashscope.utils.Constants;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
        QwenTranscriptionParam param =
                QwenTranscriptionParam.builder()
                        // 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                        // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:.apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model("qwen3-asr-flash-filetrans")
                        .fileUrl("https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav")
                        //.parameter("language", "zh")
                        //.parameter("channel_id", new ArrayList<String>(){{add("0");add("1");}})
                        .parameter("enable_itn", false)
                        .parameter("enable_words", true)
                        .build();
        try {
            QwenTranscription transcription = new QwenTranscription();
            // 提交任務
            QwenTranscriptionResult result = transcription.asyncCall(param);
            System.out.println("create task result: " + result);
            // 檢查任務是否提交成功
            if (result.getTaskId() == null) {
                System.out.println("Error: " + result.getOutput());
                return;
            }
            // 查詢任務狀態
            result = transcription.fetch(QwenTranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
            System.out.println("task status: " + result);
            // 等待任務完成
            result =
                    transcription.wait(
                            QwenTranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
            System.out.println("task result: " + result);
            // 擷取語音辨識結果
            QwenTranscriptionTaskResult taskResult = result.getResult();
            if (taskResult != null) {
                // 擷取識別結果的url
                String transcriptionUrl = taskResult.getTranscriptionUrl();
                // 擷取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);
        }
    }
}

Python SDK

import json
import os
import sys
from http import HTTPStatus

import dashscope
from dashscope.audio.qwen_asr import QwenTranscription
from dashscope.api_entities.dashscope_response import TranscriptionResponse


# run the transcription script
if __name__ == '__main__':
    # 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

    # 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
    dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
    task_response = QwenTranscription.async_call(
        model='qwen3-asr-flash-filetrans',
        file_url='https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav',
        #language="",
        enable_itn=False,
        enable_words=True
    )
    print(f'task_response: {task_response}')
    print(task_response.output.task_id)
    query_response = QwenTranscription.fetch(task=task_response.output.task_id)
    print(f'query_response: {query_response}')
    task_result = QwenTranscription.wait(task=task_response.output.task_id)
    print(f'task_result: {task_result}')

Qwen3-ASR-Flash

Qwen3-ASR-Flash 支援最長 5 分鐘錄音,輸入支援公網音頻檔案 URL 或本地檔案上傳,可流式返回識別結果。

輸入內容:音頻檔案URL

Python SDK

import os
import dashscope

# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [
    {"role": "user", "content": [{"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"}]}
]

response = dashscope.MultiModalConversation.call(
    # 新加坡/美國地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
    model="qwen3-asr-flash",
    messages=messages,
    result_format="message",
    asr_options={
        #"language": "zh", # 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        "enable_itn":False
    }
)
print(response)

Java SDK

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

public class Main {
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("audio", "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3")))
                .build();

        Map<String, Object> asrOptions = new HashMap<>();
        asrOptions.put("enable_itn", false);
        // asrOptions.put("language", "zh"); // 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 新加坡/美國地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                // 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
                .model("qwen3-asr-flash")
                .message(userMessage)
                .parameter("asr_options", asrOptions)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(JsonUtils.toJson(result));
    }
    public static void main(String[] args) {
        try {
            // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
            Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

cURL

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X POST "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-asr-flash",
    "input": {
        "messages": [
            {
                "content": [
                    {
                        "audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
                    }
                ],
                "role": "user"
            }
        ]
    },
    "parameters": {
        "asr_options": {
            "enable_itn": false
        }
    }
}'

輸入內容:Base64編碼的音頻檔案

可輸入Base64編碼資料(Data URL),格式為:data:<mediatype>;base64,<data>

  • <mediatype>:MIME類型

    因音頻格式而異,例如:

    • WAV:audio/wav

    • MP3:audio/mpeg

  • <data>:音頻轉成的Base64編碼的字串

    Base64編碼會增大體積,請控制原檔案大小,確保編碼後仍符合輸入音頻大小限制(10MB)

  • 樣本:data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9

    點擊查看範例程式碼

    import base64, pathlib
    
    # input.mp3為用於聲音複刻的本地音頻檔案,請替換為自己的音頻檔案路徑,確保其符合音頻要求
    file_path = pathlib.Path("input.mp3")
    base64_str = base64.b64encode(file_path.read_bytes()).decode()
    data_uri = f"data:audio/mpeg;base64,{base64_str}"
    import java.nio.file.*;
    import java.util.Base64;
    
    public class Main {
        /**
         * filePath為用於聲音複刻的本地音頻檔案,請替換為自己的音頻檔案路徑,確保其符合音頻要求
         */
        public static String toDataUrl(String filePath) throws Exception {
            byte[] bytes = Files.readAllBytes(Paths.get(filePath));
            String encoded = Base64.getEncoder().encodeToString(bytes);
            return "data:audio/mpeg;base64," + encoded;
        }
    
        // 使用樣本
        public static void main(String[] args) throws Exception {
            System.out.println(toDataUrl("input.mp3"));
        }
    }

Python SDK

樣本中用到的音頻檔案為:welcome.mp3

import base64
import dashscope
import os
import pathlib

# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# 請替換為實際的音頻檔案路徑
file_path = "welcome.mp3"
# 請替換為實際的音頻檔案MIME類型
audio_mime_type = "audio/mpeg"

file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
    raise FileNotFoundError(f"音頻檔案不存在: {file_path}")

base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"

messages = [
    {"role": "user", "content": [{"audio": data_uri}]}
]
response = dashscope.MultiModalConversation.call(
    # 新加坡/美國和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
    model="qwen3-asr-flash",
    messages=messages,
    result_format="message",
    asr_options={
        # "language": "zh", # 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        "enable_itn":False
    }
)
print(response)

Java SDK

樣本中用到的音頻檔案為:welcome.mp3

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

public class Main {
    // 請替換為實際的音頻檔案路徑
    private static final String AUDIO_FILE = "welcome.mp3";
    // 請替換為實際的音頻檔案MIME類型
    private static final String AUDIO_MIME_TYPE = "audio/mpeg";

    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException, IOException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("audio", toDataUrl())))
                .build();

        Map<String, Object> asrOptions = new HashMap<>();
        asrOptions.put("enable_itn", false);
        // asrOptions.put("language", "zh"); // 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 新加坡/美國和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                // 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
                .model("qwen3-asr-flash")
                .message(userMessage)
                .parameter("asr_options", asrOptions)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(JsonUtils.toJson(result));
    }

    public static void main(String[] args) {
        try {
            // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
            Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException | IOException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }

    // 產生 data URI
    public static String toDataUrl() throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(AUDIO_FILE));
        String encoded = Base64.getEncoder().encodeToString(bytes);
        return "data:" + AUDIO_MIME_TYPE + ";base64," + encoded;
    }
}

輸入內容:本地音頻檔案絕對路徑

使用 DashScope SDK 處理本地音頻檔案時需傳入檔案路徑。請參考下表,結合調用方式與作業系統建立對應路徑。

系統

SDK

傳入的檔案路徑

樣本

Linux或macOS系統

Python SDK

file://{檔案的絕對路徑}

file:///home/images/test.png

Java SDK

Windows系統

Python SDK

file://{檔案的絕對路徑}

file://D:/images/test.png

Java SDK

file:///{檔案的絕對路徑}

file:///D:/images/test.png

重要

本地檔案調用上限 100 QPS,不支援擴容,不適合生產環境、高並發或壓測情境;如需更高並發,請將檔案上傳至 OSS 並通過 URL 方式調用。

Python SDK

樣本中用到的音頻檔案為:welcome.mp3

import os
import dashscope

# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# 請用您的本地音訊絕對路徑替換 ABSOLUTE_PATH/welcome.mp3
audio_file_path = "file://ABSOLUTE_PATH/welcome.mp3"

messages = [
    {"role": "user", "content": [{"audio": audio_file_path}]}
]
response = dashscope.MultiModalConversation.call(
    # 新加坡/美國地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
    model="qwen3-asr-flash",
    messages=messages,
    result_format="message",
    asr_options={
        # "language": "zh", # 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        "enable_itn":False
    }
)
print(response)

Java SDK

樣本中用到的音頻檔案為:welcome.mp3

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

public class Main {
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        // 請用您本地檔案的絕對路徑替換掉ABSOLUTE_PATH/welcome.mp3
        String localFilePath = "file://ABSOLUTE_PATH/welcome.mp3";
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("audio", localFilePath)))
                .build();

        Map<String, Object> asrOptions = new HashMap<>();
        asrOptions.put("enable_itn", false);
        // asrOptions.put("language", "zh"); // 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                // 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
                .model("qwen3-asr-flash")
                .message(userMessage)
                .parameter("asr_options", asrOptions)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(JsonUtils.toJson(result));
    }
    public static void main(String[] args) {
        try {
            // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
            Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

流式輸出

模型逐步產生中間結果,最終結果由其拼接而成。非流式調用需等待全部結果產生後一次性返回;流式調用邊產生邊返回,可顯著降低首字延遲。根據調用方式選擇對應的流式參數:

  • DashScope Python SDK方式:設定stream參數為true。

  • DashScope Java SDK方式:需要通過streamCall介面調用。

  • DashScope HTTP方式:需要在Header中指定X-DashScope-SSEenable

Python SDK

import os
import dashscope

# 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [
    {"role": "user", "content": [{"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"}]}
]
response = dashscope.MultiModalConversation.call(
    # 新加坡/美國地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
    model="qwen3-asr-flash",
    messages=messages,
    result_format="message",
    asr_options={
        # "language": "zh", # 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        "enable_itn":False
    },
    stream=True
)

for response in response:
    try:
        print(response["output"]["choices"][0]["message"].content[0]["text"])
    except:
        pass

Java SDK

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import io.reactivex.Flowable;

public class Main {
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("audio", "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3")))
                .build();

        Map<String, Object> asrOptions = new HashMap<>();
        asrOptions.put("enable_itn", false);
        // asrOptions.put("language", "zh"); // 可選,若已知音訊語種,可通過該參數指定待識別語種,以提升識別準確率
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                // 若使用美國地區的模型,需在模型後面加上“-us”尾碼,例如qwen3-asr-flash-us
                .model("qwen3-asr-flash")
                .message(userMessage)
                .parameter("asr_options", asrOptions)
                .build();
        Flowable<MultiModalConversationResult> resultFlowable = conv.streamCall(param);
        resultFlowable.blockingForEach(item -> {
            try {
                System.out.println(item.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
            } catch (Exception e){
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        try {
            // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
            Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

cURL

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X POST "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-SSE: enable" \
-d '{
    "model": "qwen3-asr-flash",
    "input": {
        "messages": [
            {
                "content": [
                    {
                        "audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
                    }
                ],
                "role": "user"
            }
        ]
    },
    "parameters": {
        "incremental_output": true,
        "asr_options": {
            "enable_itn": false
        }
    }
}'

Paraformer

Paraformer範例程式碼和Fun-ASR的非同步呼叫相似,將model替換成Paraformer模型名即可。

進階功能

使用OpenAI相容API

重要

美國地區不支援OpenAI相容模式。

僅Qwen3-ASR-Flash系列模型支援OpenAI相容方式調用。OpenAI相容方式僅允許輸入公網可訪問的音頻檔案URL,不支援輸入本地音頻檔案絕對路徑。

OpenAI Python SDK 版本應不低於1.52.0, Node.js SDK 版本應不低於 4.68.0。安裝/升級命令:

# Python
pip install -U "openai>=1.52.0"

# Node.js
npm install openai@^4.68.0

asr_options非OpenAI標準參數。使用 OpenAI Python SDK 時,請通過 extra_body 傳入;使用 Node.js OpenAI SDK 時,直接將 asr_options 作為請求體的頂層參數傳入。

輸入內容:音頻檔案URL

Python SDK

from openai import OpenAI
import os

try:
    client = OpenAI(
        # 新加坡/美國地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
        base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
    )
    

    stream_enabled = False  # 是否開啟流式輸出
    completion = client.chat.completions.create(
        model="qwen3-asr-flash",
        messages=[
            {
                "content": [
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
                        }
                    }
                ],
                "role": "user"
            }
        ],
        stream=stream_enabled,
        # stream設為False時,不能設定stream_options參數
        # stream_options={"include_usage": True},
        extra_body={
            "asr_options": {
                # "language": "zh",
                "enable_itn": False
            }
        }
    )
    if stream_enabled:
        full_content = ""
        print("流式輸出內容為:")
        for chunk in completion:
            # 如果stream_options.include_usage為True,則最後一個chunk的choices欄位為空白列表,需要跳過(可以通過chunk.usage擷取 Token 使用量)
            print(chunk)
            if chunk.choices and chunk.choices[0].delta.content:
                full_content += chunk.choices[0].delta.content
        print(f"完整內容為:{full_content}")
    else:
        print(f"非流式輸出內容為:{completion.choices[0].message.content}")
except Exception as e:
    print(f"錯誤資訊:{e}")

Node.js SDK

// 運行前的準備工作:
// Windows/Mac/Linux 通用:
// 1. 確保已安裝 Node.js (建議版本 >= 14)
// 2. 運行以下命令安裝必要的依賴: npm install openai

import OpenAI from "openai";

const client = new OpenAI({
  // 新加坡/美國地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
  // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:apiKey: "sk-xxx",
  apiKey: process.env.DASHSCOPE_API_KEY,
  // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
  baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});

async function main() {
  try {
    const streamEnabled = false; // 是否開啟流式輸出
    const completion = await client.chat.completions.create({
      model: "qwen3-asr-flash",
      messages: [
        {
          role: "user",
          content: [
            {
              type: "input_audio",
              input_audio: {
                data: "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
              }
            }
          ]
        }
      ],
      stream: streamEnabled,
      // stream設為False時,不能設定stream_options參數
      // stream_options: {
      //   "include_usage": true
      // },
      asr_options: {
        // language: "zh",
        enable_itn: false
      }
    });

    if (streamEnabled) {
      let fullContent = "";
      console.log("流式輸出內容為:");
      for await (const chunk of completion) {
        console.log(JSON.stringify(chunk));
        if (chunk.choices && chunk.choices.length > 0) {
          const delta = chunk.choices[0].delta;
          if (delta && delta.content) {
            fullContent += delta.content;
          }
        }
      }
      console.log(`完整內容為:${fullContent}`);
    } else {
      console.log(`非流式輸出內容為:${completion.choices[0].message.content}`);
    }
  } catch (err) {
    console.error(`錯誤資訊:${err}`);
  }
}

main();

cURL

以下為新加坡地區的配置,調用時請將{WorkspaceId}替換為真實的Workspace ID,各地區的配置不同。

curl -X POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-asr-flash",
    "messages": [
        {
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
                    }
                }
            ],
            "role": "user"
        }
    ],
    "stream":false,
    "asr_options": {
        "enable_itn": false
    }
}'

輸入內容:Base64編碼的音頻檔案

可輸入Base64編碼資料(Data URL),格式為:data:<mediatype>;base64,<data>

  • <mediatype>:MIME類型

    因音頻格式而異,例如:

    • WAV:audio/wav

    • MP3:audio/mpeg

  • <data>:音頻轉成的Base64編碼的字串

    Base64編碼會增大體積,請控制原檔案大小,確保編碼後仍符合輸入音頻大小限制(10MB)

  • 樣本:data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9

    點擊查看範例程式碼

    import base64, pathlib
    
    # input.mp3為用於聲音複刻的本地音頻檔案,請替換為自己的音頻檔案路徑,確保其符合音頻要求
    file_path = pathlib.Path("input.mp3")
    base64_str = base64.b64encode(file_path.read_bytes()).decode()
    data_uri = f"data:audio/mpeg;base64,{base64_str}"
    import java.nio.file.*;
    import java.util.Base64;
    
    public class Main {
        /**
         * filePath為用於聲音複刻的本地音頻檔案,請替換為自己的音頻檔案路徑,確保其符合音頻要求
         */
        public static String toDataUrl(String filePath) throws Exception {
            byte[] bytes = Files.readAllBytes(Paths.get(filePath));
            String encoded = Base64.getEncoder().encodeToString(bytes);
            return "data:audio/mpeg;base64," + encoded;
        }
    
        // 使用樣本
        public static void main(String[] args) throws Exception {
            System.out.println(toDataUrl("input.mp3"));
        }
    }

Python SDK

樣本中用到的音頻檔案為:welcome.mp3

import base64
from openai import OpenAI
import os
import pathlib

try:
    # 請替換為實際的音頻檔案路徑
    file_path = "welcome.mp3"
    # 請替換為實際的音頻檔案MIME類型
    audio_mime_type = "audio/mpeg"

    file_path_obj = pathlib.Path(file_path)
    if not file_path_obj.exists():
        raise FileNotFoundError(f"音頻檔案不存在: {file_path}")

    base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
    data_uri = f"data:{audio_mime_type};base64,{base64_str}"

    client = OpenAI(
        # 新加坡/美國和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
        base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
    )
    

    stream_enabled = False  # 是否開啟流式輸出
    completion = client.chat.completions.create(
        model="qwen3-asr-flash",
        messages=[
            {
                "content": [
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": data_uri
                        }
                    }
                ],
                "role": "user"
            }
        ],
        stream=stream_enabled,
        # stream設為False時,不能設定stream_options參數
        # stream_options={"include_usage": True},
        extra_body={
            "asr_options": {
                # "language": "zh",
                "enable_itn": False
            }
        }
    )
    if stream_enabled:
        full_content = ""
        print("流式輸出內容為:")
        for chunk in completion:
            # 如果stream_options.include_usage為True,則最後一個chunk的choices欄位為空白列表,需要跳過(可以通過chunk.usage擷取 Token 使用量)
            print(chunk)
            if chunk.choices and chunk.choices[0].delta.content:
                full_content += chunk.choices[0].delta.content
        print(f"完整內容為:{full_content}")
    else:
        print(f"非流式輸出內容為:{completion.choices[0].message.content}")
except Exception as e:
    print(f"錯誤資訊:{e}")

Node.js SDK

樣本中用到的音頻檔案為:welcome.mp3

// 運行前的準備工作:
// Windows/Mac/Linux 通用:
// 1. 確保已安裝 Node.js (建議版本 >= 14)
// 2. 運行以下命令安裝必要的依賴: npm install openai

import OpenAI from "openai";
import { readFileSync } from 'fs';

const client = new OpenAI({
  // 新加坡/美國和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
  // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:apiKey: "sk-xxx",
  apiKey: process.env.DASHSCOPE_API_KEY,
  // 以下為新加坡地區的配置,調用時請將"{WorkspaceId}"替換為真實的業務空間ID,各地區的配置不同。
  baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});

const encodeAudioFile = (audioFilePath) => {
    const audioFile = readFileSync(audioFilePath);
    return audioFile.toString('base64');
};

// 請替換為實際的音頻檔案路徑
const dataUri = `data:audio/mpeg;base64,${encodeAudioFile("welcome.mp3")}`;

async function main() {
  try {
    const streamEnabled = false; // 是否開啟流式輸出
    const completion = await client.chat.completions.create({
      model: "qwen3-asr-flash",
      messages: [
        {
          role: "user",
          content: [
            {
              type: "input_audio",
              input_audio: {
                data: dataUri
              }
            }
          ]
        }
      ],
      stream: streamEnabled,
      // stream設為False時,不能設定stream_options參數
      // stream_options: {
      //   "include_usage": true
      // },
      asr_options: {
        // language: "zh",
        enable_itn: false
      }
    });

    if (streamEnabled) {
      let fullContent = "";
      console.log("流式輸出內容為:");
      for await (const chunk of completion) {
        console.log(JSON.stringify(chunk));
        if (chunk.choices && chunk.choices.length > 0) {
          const delta = chunk.choices[0].delta;
          if (delta && delta.content) {
            fullContent += delta.content;
          }
        }
      }
      console.log(`完整內容為:${fullContent}`);
    } else {
      console.log(`非流式輸出內容為:${completion.choices[0].message.content}`);
    }
  } catch (err) {
    console.error(`錯誤資訊:${err}`);
  }
}

main();

長音頻檔案處理

非即時語音辨識支援長音頻檔案非同步轉寫,適用於會議記錄、訪談整理、通話回放等情境。

限制說明:

  • Fun-ASR / Qwen3-ASR-Flash-Filetrans / Paraformer:單個音頻檔案大小不超過 2GB,時間長度不超過 12 小時。

  • Qwen3-ASR-Flash:單個音頻檔案大小不超過 10MB,時間長度不超過 5 分鐘。對於較長音頻,請使用 Fun-ASR 或Qwen3-ASR-Flash-Filetrans。

  • 啟用說話人分離時:建議音頻時間長度不超過 2 小時,否則可能導致識別失敗或逾時。詳見說話人分離

調用方式:長音頻轉寫採用非同步任務模式,分三步:

  1. 提交轉寫任務,擷取 task_id

  2. 通過輪詢介面查詢任務狀態(或使用 SDK 的等待方法阻塞等待)。

  3. 任務完成後從返回的 URL 下載識別結果 JSON。

具體程式碼範例請參見Qwen3-ASR-Flash-Filetrans的快速開始代碼。

流式輸出

Qwen3-ASR-Flash 支援流式輸出:邊識別邊返回中間結果,適用於需要即時反饋進度的情境。

Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer 等非同步轉寫模型不支援流式輸出,需通過任務輪詢擷取最終結果(詳見長音頻檔案處理)。

啟用方式:

  • DashScope Python SDK:設定 stream 參數為 True

  • DashScope Java SDK:通過 streamCall 介面調用。

  • DashScope HTTP:在 Header 中設定 X-DashScope-SSEenable

  • OpenAI 相容 SDK:設定 stream 參數為 True

具體的流式輸出程式碼範例,請參見快速開始中Qwen3-ASR-Flash的流式輸出章節。

使用熱詞提升準確率

Fun-ASR 和 Paraformer 支援通過熱詞提升特定領域專有名詞(人名、地名、產品名等)的識別準確率。在阿里雲百鍊控制台建立熱詞表後,調用 API 時通過 vocabulary_id 參數指定該熱詞表 ID 即可。

詳細的建立和使用方法,請參見提升識別準確率

不同 SDK 暴露上述參數的命名習慣不同(如字典 key、對象屬性、方法等),完整欄位對照請參見各 SDK 的 API 參考。

使用上下文增強提升準確率

fun-asr-flash-2026-06-15 模型支援上下文增強功能,可將對話歷史傳入 ASR 模型,顯著提升專有詞彙的轉寫準確率。詳細的使用方法和效果樣本,請參見上下文增強

說話人分離

說話人分離可自動識別音頻中不同說話人,並在轉寫結果中為每個句子標註說話人標籤,適用於多人會議、訪談錄音等情境。

支援範圍:Fun-ASR 和 Paraformer 模型支援說話人分離功能(預設關閉),Qwen-ASR 系列暫不支援。

啟用方式:在 API 請求參數中設定 diarization_enabledtrue。識別結果中每個句子會包含 speaker_id 欄位,標識不同說話人。

返回結構樣本(節選):

{
  "transcripts": [
    {
      "sentences": [
        { "begin_time": 100, "end_time": 3820, "text": "你好,我們今天討論專案進度。", "speaker_id": 0 },
        { "begin_time": 3820, "end_time": 6500, "text": "好的,我先彙報一下。", "speaker_id": 1 }
      ]
    }
  ]
}

不同 SDK 暴露上述欄位的命名習慣不同(如字典 key、對象屬性、方法等),完整欄位對照請參見各 SDK 的 API 參考。

重要

啟用說話人分離功能時,建議音頻時間長度不超過 2 小時,否則可能導致識別失敗或逾時(不啟用時音頻長度限制詳見長音頻檔案處理)。說話人分離僅支援單聲道音頻。

完整欄位定義請參見API參考。

敏感詞過濾

敏感詞過濾可對識別結果中的敏感詞執行替換或移除,適用於客服質檢、內容合規、字幕審核等情境。

支援範圍:Fun-ASR 與 Paraformer 模型支援,Qwen-ASR 系列(Qwen3-ASR-Flash 與Qwen3-ASR-Flash-Filetrans)暫不支援。

預設行為:未傳入 special_word_filter 參數時,系統啟用內建的阿里雲百鍊敏感詞表,匹配的詞語會被替換為等長的 *

自訂配置special_word_filter 是 JSON 對象,包含三個子欄位:

  • filter_with_signed.word_list:字串數組,列出需要被替換為等長 * 的敏感詞。例如 ["測試"],「幫我測試一下」會變成「幫我**一下」。

  • filter_with_empty.word_list:字串數組,列出需要從結果中完全移除的敏感詞。例如 ["開始"],「比賽這就要開始了嗎」會變成「比賽這就要了嗎」。

  • system_reserved_filter:布爾值,預設 true。是否同時啟用系統預置敏感詞表(與自訂詞表疊加生效)。

配置樣本:

{
  "special_word_filter": {
    "filter_with_signed": {
      "word_list": ["測試"]
    },
    "filter_with_empty": {
      "word_list": ["開始", "發生"]
    },
    "system_reserved_filter": true
  }
}

不同 SDK 暴露上述參數的命名習慣不同(如字典 key、對象屬性、方法等),完整欄位對照請參見 API參考。

情感識別

Qwen3-ASR-Flash-Filetrans 與Qwen3-ASR-Flash 模型固定開啟情感識別,無需額外配置。識別結果中會附帶說話人的情緒標籤,取值為 7 類細粒度情緒:surprised(驚訝)、neutral(平靜)、happy(愉快)、sad(悲傷)、disgusted(厭惡)、angry(憤怒)、fearful(恐懼)。

欄位路徑(因介面而異):

  • OpenAI 相容介面(Qwen3-ASR-Flash 即時轉寫):嵌套在 choices[].delta.annotations[].emotion(流式輸出)或 choices[].message.annotations[].emotion(非流式)。

  • DashScope 同步調用介面(Qwen3-ASR-Flash):嵌套在 output.choices[].message.annotations[].emotion

  • DashScope 非同步任務介面(Qwen3-ASR-Flash-Filetrans 錄音檔案轉寫):嵌套在 transcripts[].sentences[].emotion,與時間戳記、說話人等欄位並列在每個句子物件中。

返回結構樣本(DashScope 非同步任務介面節選):

{
  "transcripts": [{
    "sentences": [{
      "begin_time": 0,
      "end_time": 1440,
      "text": "歡迎使用阿里雲。",
      "emotion": "neutral",
      "language": "zh"
    }]
  }]
}

不同 SDK 暴露上述欄位的命名習慣不同(如字典 key、對象屬性、方法等),完整欄位對照請參見API參考。

重要

Fun-ASR 和 Paraformer 非即時模型暫不支援情感識別功能。如需在即時識別中使用情感識別,可參考 即時語音辨識 的對應章節。

擷取時間戳記

非即時語音辨識支援在轉寫結果中輸出時間戳記,便於字幕產生、關鍵詞高亮、音視訊剪輯等情境。Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer 三個非同步轉寫模型均支援,但各模型的時間戳記預設行為和控制方式不同:

  • Fun-ASR:時間戳記功能固定開啟,不可關閉。

  • Qwen3-ASR-Flash-Filetrans:僅 DashScope 非同步呼叫方式支援時間戳記,時間戳記功能固定開啟。可通過請求參數 enable_words 控制時間戳記層級:設為 false(預設)返回句級時間戳記,設為 true 返回字級時間戳記。字層級時間戳記僅支援以下語種:中文、英語、日語、韓語、德語、法語、西班牙語、意大利語、葡萄牙語、俄語,其他語種可能無法保證準確性。

  • Paraformer:時間戳記功能預設關閉,可通過請求參數 timestamp_alignment_enabled 設為 true 開啟。

重要

Qwen3-ASR-Flash 通過 OpenAI 相容介面調用時,輸出形態為 chat.completion,不返回時間戳記欄位。如需時間戳記,請使用Qwen3-ASR-Flash-Filetrans(非同步任務介面)。

時間戳記單位均為毫秒,分兩個層級返回:

  • 句級sentences[].begin_timesentences[].end_time,標識每個句子在音頻中的起止時刻。

  • 字級sentences[].words[] 數組,每個元素包含 begin_timeend_timetext(該字/詞文本)。

返回結構樣本(DashScope 非同步任務介面節選):

{
  "transcripts": [{
    "sentences": [{
      "begin_time": 100,
      "end_time": 3820,
      "text": "你好,我們今天討論專案進度。",
      "words": [
        { "begin_time": 100, "end_time": 596, "text": "你好" },
        { "begin_time": 596, "end_time": 844, "text": "我們" }
      ]
    }]
  }]
}
重要

音頻內時間戳記是毫秒整數(如 100),與任務級 end_time(任務完成時間,字串日期如 "2024-09-12 15:11:40.903")不是同一欄位,請勿混淆。

不同 SDK 暴露上述欄位的命名習慣不同(如字典 key、對象屬性、方法等),完整欄位對照請參見 API參考。

應用於生產環境

將非即時語音辨識應用於生產環境時,以下最佳實務有助於提升識別效果和系統穩定性。

高並發情境:使用回調替代輪詢

非同步轉寫任務(Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer)通過 POST /api/v1/services/audio/asr/transcription 提交後,通常做法是周期性調用查詢介面 GET /api/v1/tasks/{task_id} 擷取結果。該查詢介面預設 20 QPS、最高可擴容至 100 QPS,在高並發批量情境下,頻繁輪詢易觸發限流。

通過事件匯流排 EventBridge 配置回調通知,任務完成時阿里雲百鍊會自動推送 dashscope:System:AsyncTaskFinish 事件至您配置的目標(HTTP/HTTPS 端點或 RocketMQ Topic),消費端收到事件後無需再調用查詢介面,從而規避因頻繁輪詢而被限流的風險。詳情請參見配置 EventBridge 回調通知

適用模型

  • 適用模型:Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer(均為非同步轉寫任務)。

  • 不適用:Qwen3-ASR-Flash(同步/流式調用,不屬非同步任務範疇)。

回調訊息內容

三種模型的回調訊息體中 data.contain_result 均為 truedata.output_result 直接攜帶 transcription_url,消費端收到回調後即可擷取識別結果,無需再調用 GET /api/v1/tasks/{task_id}。但三個模型的結果欄位路徑與結構不同,詳見下表。

說明

編寫消費端時請按使用的模型選擇正確路徑,不可寫死為單一路徑。失敗情境下 data.output_result.output 不再含 results/result,而是含 codemessage 欄位,需先判斷 data.task_status 再取結果。

模型

提交參數

結果欄位路徑(基於回調 Body)

usage 欄位

Fun-ASR

input.file_urls(數組,單次僅支援 1 個 URL)

data.output_result.output.results[ ].transcription_url(數組,每個檔案一項,含 subtask_status;並附 task_metrics

duration

Paraformer

input.file_urls(數組,單次僅支援 1 個 URL)

同 Fun-ASR:data.output_result.output.results[ ].transcription_url

duration

Qwen3-ASR-Flash-Filetrans

input.file_url單對象,單次僅支援 1 個 URL)

data.output_result.output.result.transcription_url單對象,無 results[ ] / task_metrics

seconds

注意事項

安全(HTTP/HTTPS 投遞方式):生產環境必須校正回調要求標頭中的 X-Eventbridge-Signature* 數列欄位後再消費,否則任意外部 IP 都可偽造 AsyncTaskFinish 事件,注入虛假識別結果。建議同時為接收端設定至少 5 秒的接收逾時。RocketMQ 投遞方式無訊息級簽名,安全性由 RocketMQ 鑒權機制保證。

投遞延遲:從任務結束(end_time)到投遞目標(HTTP/HTTPS 端點或 RocketMQ Topic)收到訊息,通常約 1–90 秒,具體延遲受 EventBridge 即時負載影響。

等冪性:同一事件可能因重試而被投遞多次。消費端需實現等冪處理,建議以 CloudEvents data.iddata.task_id 作為去重鍵。

生產環境建議

  • 檔案託管:將音頻檔案上傳至阿里雲 OSS,通過 URL 方式調用,避免使用本地檔案上傳(本地檔案調用上限 100 QPS,不支援擴容)。

  • 非同步輪詢:長音頻轉寫採用非同步模式,建議設定合理的輪詢間隔(如 2~5 秒),避免頻繁查詢消耗配額。如需突破 20–100 QPS 查詢上限,可改用事件回調通知,詳見高並發情境:使用回調替代輪詢

  • 錯誤處理:實現完善的重試機制;網路逾時或服務端臨時錯誤(5xx)按指數退避策略重試。

  • 降噪處理:雜訊較大的音頻建議先用 FFmpeg 等工具預先處理後再提交識別。

  • 模型選擇:根據音頻時間長度選擇合適的模型。5 分鐘以內的短音頻使用Qwen3-ASR-Flash,超過 5 分鐘的長音頻使用 Fun-ASR 或Qwen3-ASR-Flash-Filetrans。

支援的模型與地區

新加坡

調用以下模型時,請選擇新加坡地區的API Key

  • Fun-ASR:fun-asr(穩定版,當前等同fun-asr-2025-11-07)、fun-asr-2025-11-07(快照版)、fun-asr-2025-08-25(快照版)、fun-asr-mtl(穩定版,當前等同fun-asr-mtl-2025-08-25)、fun-asr-mtl-2025-08-25(快照版)

  • Fun-ASR-Flash:fun-asr-flash-2026-06-15

  • Qwen3-ASR-Flash-Filetrans:qwen3-asr-flash-filetrans(穩定版,當前等同qwen3-asr-flash-filetrans-2025-11-17)、qwen3-asr-flash-filetrans-2025-11-17(快照版)

  • Qwen3-ASR-Flash:qwen3-asr-flash(穩定版,當前等同qwen3-asr-flash-2025-09-08)、qwen3-asr-flash-2026-02-10(最新快照版)、qwen3-asr-flash-2025-09-08(快照版)

美國(維吉尼亞)

調用以下模型時,請選擇美國地區的API Key

Qwen3-ASR-Flash:qwen3-asr-flash-us(穩定版,當前等同qwen3-asr-flash-2025-09-08-us)、qwen3-asr-flash-2025-09-08-us(快照版)

華北2(北京)

調用以下模型時,請選擇北京地區的API Key

  • Fun-ASR:fun-asr(穩定版,當前等同fun-asr-2025-11-07)、fun-asr-2025-11-07(快照版)、fun-asr-2025-08-25(快照版)、fun-asr-mtl(穩定版,當前等同fun-asr-mtl-2025-08-25)、fun-asr-mtl-2025-08-25(快照版)

  • Fun-ASR-Flash:fun-asr-flash-2026-06-15

  • Qwen3-ASR-Flash-Filetrans:qwen3-asr-flash-filetrans(穩定版,當前等同qwen3-asr-flash-filetrans-2025-11-17)、qwen3-asr-flash-filetrans-2025-11-17(快照版)

  • Qwen3-ASR-Flash:qwen3-asr-flash(穩定版,當前等同qwen3-asr-flash-2025-09-08)、qwen3-asr-flash-2026-02-10(最新快照版)、qwen3-asr-flash-2025-09-08(快照版)

  • Paraformer:paraformer-v2、paraformer-8k-v2

API參考

常見問題

Q:如何為API提供公網可訪問的音頻URL?

推薦使用阿里雲Object Storage Service,它提供了高可用、高可靠的儲存服務,並且可以方便地產生公網訪問URL。

在公網環境下驗證產生的 URL 可正常訪問:可在瀏覽器或通過 curl 命令訪問該 URL,確保音頻檔案能夠成功下載或播放(HTTP狀態代碼為200)。

Q:如何檢查音頻格式是否符合要求?

可以使用開源工具ffprobe快速擷取音訊詳細資料:

# 查詢音訊容器格式(format_name)、編碼(codec_name)、採樣率(sample_rate)、聲道數(channels)
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 your_audio_file.mp3

Q:如何處理音頻以滿足模型要求?

可以使用開源工具FFmpeg對音頻進行裁剪或格式轉換:

  • 音頻裁剪:從長音頻中截取片段

    # -i: 輸入檔案
    # -ss 00:01:30: 設定裁剪的起始時間 (從1分30秒開始)
    # -t 00:02:00: 設定裁剪的持續時間長度 (裁剪2分鐘)
    # -c copy: 直接複製音頻流,不重新編碼,速度快
    # output_clip.wav: 輸出檔案
    ffmpeg -i long_audio.wav -ss 00:01:30 -t 00:02:00 -c copy output_clip.wav
  • 格式轉換

    例如,將任意音頻轉換為16kHz、16-bit、單聲道WAV檔案

    # -i: 輸入檔案
    # -ac 1: 設定聲道數為1 (單聲道)
    # -ar 16000: 設定採樣率為16000Hz (16kHz)
    # -sample_fmt s16: 設定採樣格式為16-bit signed integer PCM
    # output.wav: 輸出檔案
    ffmpeg -i input.mp3 -ac 1 -ar 16000 -sample_fmt s16 output.wav

Q:如何提升識別準確率?

以下因素影響識別準確率,請逐項排查並針對性最佳化。

主要影響因素:

  1. 聲音品質:錄音裝置品質、採樣率及環境雜訊直接影響音頻清晰度,高品質音頻輸入是準確識別的基礎

  2. 說話人特徵:音調、語速、口音和方言差異(尤其少見方言或重口音)增加識別難度

  3. 語言和詞彙:多語言混合、專業術語或俚語增加識別難度,可通過配置熱詞最佳化特定領域術語的準確率

最佳化方法:

  1. 最佳化音頻品質:使用高效能麥克風,按推薦採樣率錄音,盡量減少環境雜訊與回聲

  2. 適配說話人:對於口音較重或方言明顯的音頻,選用支援對應方言的模型

  3. 配置熱詞:為專業術語、專有名詞等設定熱詞