すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:Non-real-time speech recognition

最終更新日:Sep 09, 2026

非リアルタイム音声認識モデルは、録音された音声をテキストに変換します。多言語認識、歌声認識、ノイズ除去、話者ダイアライゼーションをサポートしており、会議の文字起こし、通話分析、字幕生成などのシナリオに適しています。

概要

非同期タスクを通じて、録音された音声ファイルや動画ファイルをバッチで文字起こしします。

  • コンテキスト強調により、設定可能なコンテキストを通じて認識精度が向上します。
  • カスタムホットワードにより、事前設定された単語リストを通じて固有名詞の認識精度が向上します。
  • 話者ダイアライゼーション、禁止用語フィルタリング、文レベルまたは単語レベルのタイムスタンプなどの設定可能な機能があります。
  • 非同期文字起こしは、最大 12 時間、サイズ 2 GB までの単一の音声ファイルをサポートします。
  • 任意のサンプルレート、および AAC、WAV、MP3 などの主要な音声・動画形式をサポートします。

ライブ字幕、オンライン会議、音声アシスタントなどのリアルタイムシナリオでは、リアルタイム音声認識をご利用ください。モデル選択のガイダンスについては、「音声テキスト変換」をご参照ください。

前提条件

クイックスタート

重要非リアルタイム音声認識では、Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、Qwen3-ASR-Flash-Filetrans、および Paraformer は非同期呼び出しを使用します。リクエストヘッダー X-DashScope-Async: enable を設定してタスクを送信し、その後クエリ API をポーリングして結果を取得します。Fun-ASR-Flash や Qwen3-ASR-Flash などの他のモデルは同期呼び出しを使用します。

モデルサービスの専用デプロイメントを呼び出し、エラー current user api does not support asynchronous calls が返された場合、そのデプロイメントは同期呼び出しのみをサポートしています。リクエストヘッダーを X-DashScope-Async: disable に変更し、呼び出しの他の部分は変更しないでください。

Qwen-Audio-3.0-ASR-Flash-Filetrans/Fun-ASR

音声ファイルや動画ファイルはサイズが大きくなる可能性があるため、ファイル文字起こし API は非同期呼び出しを使用します。タスクを送信し、クエリ API でそのステータスをポーリングし、タスク完了後に認識結果を取得します。

cURL

cURL で API を呼び出す場合、まずタスクを送信して task_id を取得し、その ID を使用してタスク結果をクエリします。

タスクの送信

以下の構成は、シンガポールリージョン向けです。{WorkspaceId}を、実際のワークスペース 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": "qwen-audio-3.0-asr-flash-filetrans",
    "input": {
        "file_urls": [
            "{YOUR_AUDIO_URL}"
        ]
    },
    "parameters": {
        "channel_id": [0],
        "language_hints": ["zh", "en"]
    }
}'

タスク結果の取得

このクエリ API は、デフォルトで 20 QPS を許可し、最大 100 QPS までスケールアップできます。より高い頻度で利用する場合や、ポーリングによるスロットリングを避けるためには、非同期タスクコールバックを設定してください (「高同時実行シナリオ:ポーリングの代わりにコールバックを使用」をご参照ください)。

以下の構成はシンガポールリージョン用です。 {WorkspaceId}を、実際のワークスペース 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"

認識結果のダウンロード

タスクが成功すると、クエリ API によって返される output.results[].transcription_url は、完全な認識結果を含むパブリックにダウンロード可能な JSON ファイルを指します。この URL はデフォルトで 24 時間有効ですので、速やかにダウンロードして保存してください。

# {transcription_url} をクエリ API から返された 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 キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
# 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

task_response = Transcription.async_call(
    model='qwen-audio-3.0-asr-flash-filetrans',
    file_urls=['{YOUR_AUDIO_URL}'],
    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 キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
                        // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください:.apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model("qwen-audio-3.0-asr-flash-filetrans")
                        // language_hints は、認識する音声の言語コードを指定するためのオプションパラメーターです。値の範囲については、API リファレンスドキュメントをご参照ください。
                        .parameter("language_hints", new String[]{"zh", "en"})
                        .fileUrls(
                                Arrays.asList(
                                        "{YOUR_AUDIO_URL}"))
                        .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": "{YOUR_AUDIO_URL}",
    "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, this is the Alibaba Speech Lab.",
            "sentences": [
                {
                    "begin_time": 760,
                    "end_time": 3240,
                    "text": "Hello World, this is the Alibaba Speech Lab.",
                    "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": "this is",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 1920,
                            "end_time": 2520,
                            "text": "the Alibaba",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 2520,
                            "end_time": 2840,
                            "text": "Speech",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 2840,
                            "end_time": 3240,
                            "text": "Lab",
                            "punctuation": "."
                        }
                    ]
                }
            ]
        }
    ]
}

Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash

Qwen-Audio-3.0-ASR-Flash および Fun-ASR-Flash モデルシリーズは、5 分未満の音声ファイルの同期呼び出しをサポートし、ストリーミングまたは非ストリーミングモードで認識結果を返すことができます。

以下の構成は、シンガポールリージョン向けです。{WorkspaceId} を実際のワークスペース IDに置き換えてください。構成はリージョンによって異なります。シンガポールリージョンの API キーは、北京リージョンのものとは異なります。

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": "qwen-audio-3.0-asr-flash",
    "input": {
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": "{YOUR_AUDIO_URL}"
                        }
                    }
                ]
            }
        ]
    },
    "parameters": {
        "format": "wav",
        "sample_rate": "16000"
    }
}'

重要注:Qwen-Audio-3.0-ASR-Flash および Fun-ASR-Flash モデルシリーズが DashScope 同期 API (multimodal-generation エンドポイント) を介して返すレスポンス構造は、標準の DashScope マルチモーダルレスポンス形式とは異なります。実際のレスポンス構造は次のとおりです。

{
  "output": {
    "output": {
      "sentence": {
        "text": "Recognized text content"
      }
    },
    "text": "Hello World, this is the Alibaba Speech Lab."
  },
  "request_id": "..."
}

ここで、output.output.sentence.text とトップレベルの output.text は認識されたテキストのフィールドであり、choices フィールドはありません。レスポンスを適宜解析してください。

Qwen3-ASR-Flash-Filetrans

Qwen3-ASR-Flash-Filetrans は、音声ファイルの非同期文字起こし用に設計されており、最大 12 時間の録音をサポートします。パブリックな音声ファイル URL のみを受け付け、ローカルファイルのアップロードはサポートしていません。タスクが完了すると、一度にすべての認識結果を返します。

cURL

cURL で API を呼び出す場合、まずタスクを送信して task_id を取得し、その ID を使用してタスク結果をクエリします。

タスクの送信

以下の構成はシンガポール リージョン用です。 {WorkspaceId} を実際の ワークスペース 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": "{YOUR_AUDIO_URL}"
    },
    "parameters": {
        "channel_id":[
            0
        ],
        "enable_itn": false,
        "enable_words": true
    }
}'

タスク結果の取得

このクエリ API は、デフォルトで 20 QPS を許可し、最大 100 QPS までスケールアップできます。より高い頻度で利用する場合や、ポーリングによるスロットリングを避けるためには、非同期タスクコールバックを設定してください (「高同時実行シナリオ:ポーリングの代わりにコールバックを使用」をご参照ください)。

以下の構成はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース 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"

認識結果のダウンロード

タスクが成功すると、クエリ API によって返される output.result.transcription_url は、完全な認識結果を含むパブリックにダウンロード可能な JSON ファイルを指します。この URL はデフォルトで 24 時間有効ですので、速やかにダウンロードして保存してください。

# {transcription_url} をクエリ API から返された transcription_url の値に置き換えます
curl -sS '{transcription_url}' -o transcription.json
cat transcription.json | jq .

完全な例

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 キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
        // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: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": "{YOUR_AUDIO_URL}"
                    },
                    "parameters": {
                        "channel_id": [0],
                        "enable_itn": false,
                        "language": "zh"
                    }
                }
                """;*/
        String payloadJson = """
                {
                    "model": "qwen3-asr-flash-filetrans",
                    "input": {
                        "file_url": "{YOUR_AUDIO_URL}"
                    },
                    "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 submitted, task_id: " + taskId);
                } else {
                    System.out.println("Submission response content: " + respBody);
                    return;
                }
            } else {
                System.out.println("Task submission failed! 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("Current task status: " + status);
                        if ("SUCCEEDED".equalsIgnoreCase(status)
                                || "FAILED".equalsIgnoreCase(status)
                                || "UNKNOWN".equalsIgnoreCase(status)) {
                            finished = true;
                            System.out.println("Task completed, final result: ");
                            System.out.println(queryResponse);
                        }
                    } else {
                        System.out.println("Query response content: " + 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;
    }
}
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 キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: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": "{YOUR_AUDIO_URL}"
        },
        "parameters": {
            "channel_id": [0],
            # "language": "zh",
            "enable_itn": False,
            "enable_words": True
        }
    }

    print("Submitting ASR transcription task...")
    try:
        submit_resp = requests.post(API_URL_SUBMIT, headers=headers, data=json.dumps(payload))
    except requests.RequestException as e:
        print(f"Failed to request task submission: {e}")
        return

    if submit_resp.status_code != 200:
        print(f"Task submission failed! 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("Abnormal submission response content:", resp_data)
        return

    task_id = output["task_id"]
    print(f"Task submitted, 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"Failed to request task query: {e}")
            return

        if query_resp.status_code != 200:
            print(f"Task query failed! 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"Current task status: {status}")

            if status.upper() in ("SUCCEEDED", "FAILED", "UNKNOWN"):
                finished = True
                print("Task completed. The final result is as follows:")
                print(json.dumps(query_data, indent=2, ensure_ascii=False))
        else:
            print("Query response content:", 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 キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得については、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
                        // 環境変数を設定していない場合は、次の行をご利用の Alibaba Cloud Model Studio の API キーに置き換えてください: .apiKey("sk-xxx")
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .model("qwen3-asr-flash-filetrans")
                        .fileUrl("{YOUR_AUDIO_URL}")
                        //.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

# 文字起こしスクリプトを実行
if __name__ == '__main__':
    # API キーは、シンガポールリージョンと北京リージョンで異なります。 API キーの取得については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: 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='{YOUR_AUDIO_URL}',
        #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": "{YOUR_AUDIO_URL}"}]}
]

response = dashscope.MultiModalConversation.call(
    # API キーは、シンガポール/米国リージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: 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", "{YOUR_AUDIO_URL}")))
                .build();

        Map<String, Object> asrOptions = new HashMap<>();
        asrOptions.put("enable_itn", false);
        // asrOptions.put("language", "zh"); // オプション。音声の言語がわかっている場合は、このパラメーターを使用して認識する言語を指定し、認識精度を向上させることができます
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // API キーは、シンガポール/米国リージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: .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} を実際の ワークスペース 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": "{YOUR_AUDIO_URL}"
                    }
                ],
                "role": "user"
            }
        ]
    },
    "parameters": {
        "asr_options": {
            "enable_itn": false
        }
    }
}'

入力:Base64 エンコードされた音声ファイル

Base64 エンコードされたデータ (データ URL) を「data:<mediatype>;base64,<data>」のフォーマットで渡すことができます。

  • <mediatype>:MIME タイプ。

    これは音声フォーマットによって異なり、例えば次のようになります:

    • WAV: audio/wav
    • MP3: audio/mpeg
  • <data>:オーディオの Base64 エンコードされた文字列。

    Base64 エンコーディングはファイルサイズを増加させるため、エンコード後の結果が入力音声サイズの制限 (10 MB) を満たすように、元のファイルを十分に小さくしてください。

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

    クリックしてサンプルコードを表示

    import base64, pathlib
    
    # input.mp3 は音声クローニングに使用されるローカル音声ファイルです。ご自身の音声ファイルのパスに置き換え、音声要件を満たしていることを確認してください。
    file_path = pathlib.Path("{YOUR_AUDIO_FILE}")
    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("{YOUR_AUDIO_FILE}"));
        }
    }
    
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 = "{YOUR_AUDIO_FILE}"
# 実際の音声ファイルの MIME タイプに置き換えてください
audio_mime_type = "audio/mpeg"

file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
    raise FileNotFoundError(f"Audio file does not exist: {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 キーは、シンガポール/米国リージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: 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)
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 = "{YOUR_AUDIO_FILE}";
    // 実際の音声ファイルの 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 キーは、シンガポール/米国リージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: .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);
    }

    // データ 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 を介して呼び出してください。

import os
import dashscope

# 以下はシンガポールリージョンの設定です。呼び出し時に、"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# ABSOLUTE_PATH/{YOUR_AUDIO_FILE} をローカル音声ファイルの絶対パスに置き換えてください
audio_file_path = "file://ABSOLUTE_PATH/{YOUR_AUDIO_FILE}"

messages = [
    {"role": "user", "content": [{"audio": audio_file_path}]}
]
response = dashscope.MultiModalConversation.call(
    # API キーは、シンガポール/米国リージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: 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)
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/{YOUR_AUDIO_FILE} をローカルファイルの絶対パスに置き換えてください
        String localFilePath = "file://ABSOLUTE_PATH/{YOUR_AUDIO_FILE}";
        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 キーは、シンガポールリージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: .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 API を呼び出します。
  • DashScope HTTP:X-DashScope-SSE ヘッダーを enable に設定します。

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": "{YOUR_AUDIO_URL}"}]}
]
response = dashscope.MultiModalConversation.call(
    # API キーは、シンガポール/米国リージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: 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", "{YOUR_AUDIO_URL}")))
                .build();

        Map<String, Object> asrOptions = new HashMap<>();
        asrOptions.put("enable_itn", false);
        // asrOptions.put("language", "zh"); // オプション。音声の言語がわかっている場合は、このパラメーターを使用して認識する言語を指定し、認識精度を向上させることができます
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // API キーは、シンガポールリージョンと北京リージョンで異なります。API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えてください: .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} を実際の ワークスペース 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": "{YOUR_AUDIO_URL}"
                    }
                ],
                "role": "user"
            }
        ]
    },
    "parameters": {
        "incremental_output": true,
        "asr_options": {
            "enable_itn": false
        }
    }
}'

Paraformer

Paraformer のサンプルコードは、Fun-ASR の非同期呼び出しと同様です。モデルの値を Paraformer のモデル名に置き換えてください。

高度な機能

OpenAI 互換 API の使用

重要米国リージョンは OpenAI 互換モードをサポートしていません。

Qwen3-ASR-Flash シリーズモデルのみが OpenAI 互換モードでの呼び出しをサポートしています。このモードは、公開アクセス可能な音声ファイルの URL のみを受け付けます。ローカル音声ファイルの絶対パスは受け付けません。

OpenAI Python SDK 1.52.0 以降、または Node.js SDK 4.68.0 以降を使用してください。SDK をインストールまたはアップグレードするには、次のコマンドを実行します。

# 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 キーは、シンガポール/米国リージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
        # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: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": "{YOUR_AUDIO_URL}"
                        }
                    }
                ],
                "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("The streaming output is:")
        for chunk in completion:
            # stream_options.include_usage が True の場合、最後のチャンクの choices フィールドは空のリストであり、スキップする必要があります (トークン使用量は chunk.usage で取得できます)
            print(chunk)
            if chunk.choices and chunk.choices[0].delta.content:
                full_content += chunk.choices[0].delta.content
        print(f"The complete content is: {full_content}")
    else:
        print(f"The non-streaming output is: {completion.choices[0].message.content}")
except Exception as e:
    print(f"Error message: {e}")

Node.js SDK

// 実行前の準備:
// Windows/Mac/Linux 共通:
// 1. Node.js がインストールされていることを確認します (バージョン 14 以上を推奨)
// 2. 次のコマンドを実行して、必要な依存関係をインストールします:npm install openai

import OpenAI from "openai";

const client = new OpenAI({
  // API キーは、シンガポール/米国リージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
  // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: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: "{YOUR_AUDIO_URL}"
              }
            }
          ]
        }
      ],
      stream: streamEnabled,
      // stream が False に設定されている場合、stream_options パラメーターは設定できません
      // stream_options: {
      //   "include_usage": true
      // },
      asr_options: {
        // language: "zh",
        enable_itn: false
      }
    });

    if (streamEnabled) {
      let fullContent = "";
      console.log("The streaming output is:");
      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(`The complete content is: ${fullContent}`);
    } else {
      console.log(`The non-streaming output is: ${completion.choices[0].message.content}`);
    }
  } catch (err) {
    console.error(`Error message: ${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": "{YOUR_AUDIO_URL}"
                    }
                }
            ],
            "role": "user"
        }
    ],
    "stream":false,
    "asr_options": {
        "enable_itn": false
    }
}'

入力:Base64 エンコードされた音声ファイル

Base64 エンコードされたデータは、data:<mediatype>;base64,<data> というフォーマットの Data URL として渡します。

  • <mediatype>: MIME タイプです。

    MIME タイプは音声フォーマットによって異なります。例:

    • WAV: audio/wav
    • MP3: audio/mpeg
  • <data>:音声を Base64 エンコードした文字列。

    Base64 エンコーディングはデータサイズを増加させます。エンコード後の結果が入力音声サイズ制限 (10 MB) を満たすように、ソースファイルを十分に小さくしてください。

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

    サンプルコードの表示

    import base64, pathlib
    
    # input.mp3 は音声クローニングに使用されるローカル音声ファイルです。ご自身の音声ファイルのパスに置き換え、音声要件を満たしていることを確認してください。
    file_path = pathlib.Path("{YOUR_AUDIO_FILE}")
    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("{YOUR_AUDIO_FILE}"));
        }
    }
    
import base64
from openai import OpenAI
import os
import pathlib

try:
    # 実際の音声ファイルのパスに置き換えてください
    file_path = "{YOUR_AUDIO_FILE}"
    # 実際の音声ファイルの MIME タイプに置き換えてください
    audio_mime_type = "audio/mpeg"

    file_path_obj = pathlib.Path(file_path)
    if not file_path_obj.exists():
        raise FileNotFoundError(f"Audio file does not exist: {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 キーは、シンガポール/米国リージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
        # 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: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("The streaming output is:")
        for chunk in completion:
            # stream_options.include_usage が True の場合、最後のチャンクの choices フィールドは空のリストであり、スキップする必要があります (トークン使用量は chunk.usage で取得できます)
            print(chunk)
            if chunk.choices and chunk.choices[0].delta.content:
                full_content += chunk.choices[0].delta.content
        print(f"The complete content is: {full_content}")
    else:
        print(f"The non-streaming output is: {completion.choices[0].message.content}")
except Exception as e:
    print(f"Error message: {e}")
// 実行前の準備:
// Windows/Mac/Linux 共通:
// 1. Node.js がインストールされていることを確認します (バージョン 14 以上を推奨)
// 2. 次のコマンドを実行して、必要な依存関係をインストールします:npm install openai

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

const client = new OpenAI({
  // API キーは、シンガポール/米国リージョンと北京リージョンで異なります。 API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
  // 環境変数を設定していない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: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("{YOUR_AUDIO_FILE}")}`;

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("The streaming output is:");
      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(`The complete content is: ${fullContent}`);
    } else {
      console.log(`The non-streaming output is: ${completion.choices[0].message.content}`);
    }
  } catch (err) {
    console.error(`Error message: ${err}`);
  }
}

main();

長い音声ファイルの処理

非リアルタイム音声認識は、長い音声ファイルの非同期文字起こしをサポートしています。これは、会議議事録、インタビューの文字起こし、通話の再生などのシナリオに適しています。

制限事項:
  • Qwen-Audio-3.0-ASR-Flash-Filetrans/Fun-ASR / Qwen3-ASR-Flash-Filetrans / Paraformer:単一の音声ファイルは最大 2 GB のサイズ、12 時間の持続時間まで可能です。
  • Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash/Qwen3-ASR-Flash:単一の音声ファイルは最大 10 MB のサイズ、5 分の持続時間まで可能です。より長い音声の場合は、Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、または Qwen3-ASR-Flash-Filetrans を使用してください。
  • 話者分離が有効な場合:音声の持続時間を 2 時間以内にしてください。より長い音声は、認識失敗やタイムアウトを引き起こす可能性があります。詳細については、「話者分離」をご参照ください。

呼び出しフロー:長い音声の文字起こしは、3つのステップからなる非同期タスクモデルを使用します。

  1. 文字起こしタスクを送信し、task_id を取得します。
  2. クエリ API をポーリングしてタスクステータスを確認するか、SDK の wait メソッドを使用してタスクが完了するまでブロックします。
  3. タスクが完了した後、返された URL から認識結果の JSON をダウンロードします。

サンプルコードについては、非リアルタイム音声認識の「クイックスタート」のコードをご参照ください。

ストリーミング出力

Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash/Qwen3-ASR-Flash はストリーミング出力をサポートしています。認識が進むにつれて中間結果を返します。これは、リアルタイムの進捗フィードバックが必要なシナリオに適しています。

Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer などの非同期文字起こしモデルは、ストリーミング出力をサポートしていません。タスクをポーリングして最終結果を取得します (詳細については、「長い音声ファイルの処理」をご参照ください)。

有効にする方法:
  • DashScope Python SDK: stream パラメーターを True に設定します。
  • DashScope Java SDK: streamCall API を呼び出します。
  • DashScope HTTP: X-DashScope-SSE ヘッダーを enable に設定します。
  • OpenAI 互換 SDK: stream パラメーターを True に設定します。

ストリーミング出力のサンプルコードについては、クイックスタートの Qwen3-ASR-Flash の非リアルタイム音声認識セクションをご参照ください。

ホットワードによる精度の向上

ホットワードは、名前、地名、製品名などのドメイン固有の固有名詞の認識精度を向上させます。ホットワードの作成方法と使用方法の詳細については、「認識精度の向上」をご参照ください。

SDK によって、これらのパラメーターの命名規則は異なります (ディクショナリキー、オブジェクトプロパティ、メソッドなど)。完全なフィールドマッピングについては、各 SDK の API リファレンスをご参照ください。

コンテキスト強調による精度の向上

コンテキスト強調は、会話履歴を ASR モデルに渡すことで、固有名詞の文字起こし精度を大幅に向上させます。この機能の使用方法と結果の例については、「コンテキスト強調」をご参照ください。

話者分離

話者分離は、音声中の異なる話者を自動的に識別し、文字起こし結果の各文に話者タグを付けます。これは、複数人での会議やインタビューの録音などのシナリオに適しています。

サポート対象モデル:Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、および Paraformer シリーズモデル。

有効にする方法: API リクエストで diarization_enabled パラメーターを true に設定します。結果では、各文に話者を識別する 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 によって、これらのフィールドの命名規則は異なります (ディクショナリキー、オブジェクトプロパティ、メソッドなど)。完全なフィールドマッピングについては、各 SDK の API リファレンスをご参照ください。

重要話者分離が有効な場合、音声の持続時間を 2 時間以内にしてください。より長い音声は、認識失敗やタイムアウトを引き起こす可能性があります。話者分離が無効な場合の音声長の制限については、「長い音声ファイルの処理」をご参照ください。話者分離はモノラル音声のみをサポートします。

完全なフィールド定義については、API リファレンスをご参照ください。

禁止用語フィルタリング

禁止用語フィルタリングは、認識結果内の禁止用語を置き換えまたは削除します。これは、カスタマーサービスの品質検査、コンテンツコンプライアンス、字幕モデレーションなどのシナリオに適しています。

サポート対象モデル:Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、および Paraformer シリーズモデル。

デフォルトの動作: special_word_filter パラメーターが渡されない場合、システムは組み込みの Model Studio 禁止用語リスト を使用します。一致した単語は、同じ長さの * の文字列に置き換えられます。

カスタム構成: special_word_filter は、3 つのサブフィールドを持つ JSON オブジェクトです。

  • filter_with_signed.word_list は、同じ長さの * の文字列で置き換える禁止用語の文字列配列です。たとえば、["test"] を指定した場合、"Please help me test this" は "Please help me **** this" になります。
  • filter_with_empty.word_list: 結果から完全に削除する禁止用語の文字列配列。 たとえば、["start"] を指定すると、"Is the game about to start now" は "Is the game about to now" になります。
  • system_reserved_filter: デフォルトで true になるブール値です。 カスタムリストと合わせて、システム組み込みの禁止用語リストも適用するかどうかを制御します。

構成例:

{
  "special_word_filter": {
    "filter_with_signed": {
      "word_list": ["test"]
    },
    "filter_with_empty": {
      "word_list": ["start", "happen"]
    },
    "system_reserved_filter": true
  }
}

SDK によって、これらのパラメーターの命名規則は異なります (ディクショナリキー、オブジェクトプロパティ、メソッドなど)。完全なフィールドマッピングについては、各 SDK の API リファレンスをご参照ください。

感情認識

Qwen3-ASR-Flash-Filetrans および Qwen3-ASR-Flash シリーズモデルでは、感情認識が常時有効になっており、追加の構成は不要です。結果には話者の感情タグが含まれます。このタグは、surprisedneutralhappysaddisgustedangry、および fearful の 7 つの詳細な感情から選択されます。

フィールドパス (API によって異なります):

  • OpenAI 互換 API (Qwen3-ASR-Flash リアルタイム文字起こし):choices[].delta.annotations[].emotion (ストリーミング出力) または choices[].message.annotations[].emotion (非ストリーミング) にネストされています。
  • DashScope 同期 API (Qwen3-ASR-Flash): output.choices[].message.annotations[].emotion にネストされています。
  • DashScope 非同期タスク API (Qwen3-ASR-Flash-Filetrans 録画ファイルの文字起こし): 各 sentence オブジェクト内のタイムスタンプ、話者、およびその他のフィールドと並んで、transcripts[].sentences[].emotion にネストされています。

返り値の構造例 (DashScope 非同期タスク API からの抜粋):

{
  "transcripts": [{
    "sentences": [{
      "begin_time": 0,
      "end_time": 1440,
      "text": "Alibaba Cloud へようこそ。",
      "emotion": "neutral",
      "language": "en"
    }]
  }]
}

SDK によって、これらのフィールドの命名規則は異なります (ディクショナリキー、オブジェクトプロパティ、メソッドなど)。完全なフィールドマッピングについては、各 SDK の API リファレンスをご参照ください。

重要Qwen-Audio-3.0-ASR-Flash-Filetrans、Qwen-Audio-3.0-ASR-Flash、Fun-ASR-Flash、Fun-ASR、および Paraformer の非リアルタイムモデルは感情認識をサポートしていません。リアルタイム認識で感情認識を使用するには、「リアルタイム音声認識」の対応するセクションをご参照ください。

タイムスタンプの取得

非リアルタイム音声認識は、文字起こし結果にタイムスタンプを出力でき、字幕生成、キーワードハイライト、音声/ビデオ編集に役立ちます。Qwen-Audio-3.0-ASR-Flash-Filetrans、Qwen-Audio-3.0-ASR-Flash、Fun-ASR、Fun-ASR-Flash、Qwen3-ASR-Flash-Filetrans、および Paraformer はすべてタイムスタンプをサポートしていますが、デフォルトの動作と制御方法はモデルによって異なります。

  • Qwen-Audio-3.0-ASR-Flash-Filetrans/Qwen-Audio-3.0-ASR-Flash/Fun-ASR/Fun-ASR-Flash/Paraformer:タイムスタンプは常時有効で、無効にすることはできません。
  • Qwen3-ASR-Flash-Filetrans: DashScope の非同期呼び出しでのみタイムスタンプがサポートされており、タイムスタンプは常時有効化されています。enable_words リクエストパラメーターを使用してタイムスタンプのレベルをコントロールします。これを false (デフォルト) に設定すると文レベルのタイムスタンプが返され、true に設定すると単語レベルのタイムスタンプが返されます。単語レベルのタイムスタンプは、次の言語のみをサポートしています: 中国語、英語、日本語、韓国語、ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ロシア語。他の言語については、精度は保証されません。

重要OpenAI 互換 API 経由で Qwen3-ASR-Flash を呼び出すと、出力フォームは chat.completion となり、タイムスタンプフィールドは返されません。タイムスタンプを取得するには、Qwen3-ASR-Flash-Filetrans (非同期タスク API) を使用してください。

タイムスタンプはミリ秒単位で、2つのレベルで返されます。

  • 文レベル: sentences[].begin_timesentences[].end_time は、音声内の各文の開始時間と終了時間を示します。
  • 単語レベル: sentences[].words[] 配列では、各要素に begin_timeend_time、および text (その単語のテキスト) が含まれます。

返り値の構造例 (DashScope 非同期タスク API からの抜粋):

{
  "transcripts": [{
    "sentences": [{
      "begin_time": 100,
      "end_time": 3820,
      "text": "こんにちは、今日はプロジェクト の進捗について話し合いましょう。",
      "words": [
        { "begin_time": 100, "end_time": 596, "text": "Hello," },
        { "begin_time": 596, "end_time": 844, "text": "let's" }
      ]
    }]
  }]
}

重要音声タイムスタンプは、ミリ秒の整数です (例: 100)。タスクレベルの end_time (タスク完了時間、つまり "2024-09-12 15:11:40.903" のような文字列の日付) と混同しないでください。これらは異なるフィールドです。

SDK によって、これらのフィールドの命名規則は異なります (ディクショナリキー、オブジェクトプロパティ、メソッドなど)。完全なフィールドマッピングについては、各 SDK の API リファレンスをご参照ください。

本番環境への適用

非リアルタイム音声認識を本番環境で適用する際は、以下のベストプラクティスを実践することで、認識品質とシステムの安定性が向上します。

高同時実行シナリオ:ポーリングの代わりにコールバックを使用

Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer などの非同期文字起こしタスクでは、POST /api/v1/services/audio/asr/transcription を介してタスクを送信し、通常はクエリ API GET /api/v1/tasks/{task_id} を定期的に呼び出して結果を取得します。このクエリ API は、デフォルトで 20 QPS、最大で 100 QPS までスケールアップします。高同時実行のバッチシナリオでは、頻繁なポーリングは容易に速度制限を引き起こします。

EventBridge を介してコールバック通知を設定します。タスクが完了すると、Model Studio は設定されたターゲット (HTTP/HTTPS エンドポイントまたは RocketMQ トピック) に dashscope:System:AsyncTaskFinish イベントを自動的にプッシュします。コンシューマーがイベントを受信すると、クエリ API を呼び出す必要がなくなり、頻繁なポーリングによる速度制限のリスクを回避できます。詳細については、「EventBridge コールバック通知の設定」をご参照ください。

サポート対象モデル

  • サポート対象:Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、Qwen3-ASR-Flash-Filetrans、Paraformer (すべての非同期文字起こしタスク)。
  • サポート対象外:Qwen3-ASR-Flash (同期またはストリーミング呼び出し。これらは非同期タスクではありません)。

コールバックメッセージの内容

これら 3 つのモデルすべてにおいて、コールバックメッセージの本文では data.contain_resulttrue に設定され、data.output_result には transcription_url が直接含まれます。コンシューマーはコールバックを受信後、再度 GET /api/v1/tasks/{task_id} を呼び出すことなく認識結果を取得できます。ただし、結果フィールドのパスと構造は 3 つのモデル間で異なります。次の表をご参照ください。

注記コンシューマーを作成する際は、使用するモデルに応じて正しいパスを選択してください。単一のパスをハードコーディングしないでください。障害シナリオでは、data.output_result.output には results/result が含まれなくなり、代わりに code および message フィールドが含まれます。最初に data.task_status を確認してから、結果を読み取ってください。

モデル

送信パラメーター

結果フィールドのパス (コールバック本文に基づく)

usage フィールド

Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR

input.file_urls (配列。呼び出しごとに 1 つの URL のみ)

data.output_result.output.results[ ].transcription_url (配列。ファイルごとに 1 つのエントリがあり、subtask_status を含む。 task_metrics も含む)

duration

Paraformer

input.file_urls (配列。呼び出しごとに 1 つの URL のみ)

Qwen-Audio-3.0-ASR-Flash-Filetrans/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 トピック) がメッセージを受信するまでの遅延は、通常約 1〜90 秒です。正確な遅延は、EventBridge のリアルタイムの負荷によって異なります。

べき等性:リトライにより、同じイベントが複数回配信される可能性があります。コンシューマー側で、CloudEvents の data.id または data.task_id を重複排除キーとして使用し、べき等な処理を実装してください。

本番環境での推奨事項

  • ファイルホスティング:音声ファイルを Alibaba Cloud OSS にアップロードし、URL で API を呼び出すことを推奨します。ローカルファイルのアップロードは避けてください (ローカルファイルでの呼び出しは 100 QPS に制限されており、スケールアップできません)。
  • 非同期ポーリング:長時間音声の文字起こしでは非同期モデルを使用します。クォータを消費する頻繁なクエリを避けるため、ポーリング間隔を合理的 (2〜5 秒など) に設定してください。20〜100 QPS のクエリ制限を超える必要がある場合は、イベントコールバック通知に切り替えてください。詳細については、「高同時実行シナリオ:ポーリングの代わりにコールバックを使用」をご参照ください。
  • エラー処理:堅牢なリトライメカニズムを実装してください。ネットワークタイムアウトや一時的なサーバー側エラー (5xx) の場合は、指数バックオフ戦略でリトライしてください。
  • ノイズリダクション:ノイズの多い音声の場合は、認識のために送信する前に FFmpeg などのツールで前処理を行ってください。
  • モデルの選択:音声の長さに応じて適切なモデルを選択してください。5 分以内の短い音声には Qwen3-ASR-Flash を使用します。5 分を超える長い音声には、Qwen-Audio-3.0-ASR-Flash-Filetrans、Fun-ASR、または Qwen3-ASR-Flash-Filetrans を使用します。

サポートされるモデルとリージョン

シンガポール

以下のモデルを呼び出すには、API キー のシンガポールリージョンを使用します。

  • Qwen-Audio-3.0-ASR-Flash-Filetrans: qwen-audio-3.0-asr-flash-filetrans
  • Qwen-Audio-3.0-ASR-Flash: qwen-audio-3.0-asr-flash
  • 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 キー の米国リージョンを使用します。

Qwen3-ASR-Flash: qwen3-asr-flash-us (安定版、現在の qwen3-asr-flash-2025-09-08-us に相当)、qwen3-asr-flash-2025-09-08-us (スナップショット版)

中国 (北京)

以下のモデルを呼び出すには、API キー の北京リージョンを使用します。

  • Qwen-Audio-3.0-ASR-Flash-Filetrans: qwen-audio-3.0-asr-flash-filetrans
  • Qwen-Audio-3.0-ASR-Flash: qwen-audio-3.0-asr-flash
  • 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 を提供するにはどうすればよいですか?

Alibaba Cloud Object Storage Service (OSS) を使用します。OSS は、高可用性かつ高信頼性のストレージを提供し、パブリックアクセス URL を生成できます。

生成された URL がパブリックネットワーク経由でアクセス可能であることを確認します:ブラウザで URL を開くか、curl コマンドを使用して、音声ファイルがダウンロードまたは再生されること (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
  • フォーマットの変換

    たとえば、任意の音声を 16 kHz、16 ビット、モノラルの WAV ファイルに変換するには、次のようにします:

# -i:入力ファイル
# -ac 1:チャンネル数を 1 (モノラル) に設定します
# -ar 16000:サンプルレートを 16000 Hz (16 kHz) に設定します
# -sample_fmt s16:サンプルフォーマットを 16 ビット符号付き整数 PCM に設定します
# output.wav:出力ファイル
ffmpeg -i input.mp3 -ac 1 -ar 16000 -sample_fmt s16 output.wav

Q:認識精度を向上させるにはどうすればよいですか?

以下の要因が認識精度に影響します。各要因を確認し、適宜最適化を行ってください。

主な要因:

  1. 音質:録音デバイスの品質、サンプルレート、環境ノイズは、音声の明瞭度に直接影響します。高品質な音声入力は、正確な認識の基盤となります。
  2. 話者の特徴:ピッチ、話速、アクセント、方言の違い (特に珍しい方言や強い訛り) は、認識の難易度を高めます。
  3. 言語と語彙:混合言語、専門用語、俗語は認識の難易度を高めます。特定分野の用語の精度を向上させるには、ホットワードを設定してください。

最適化方法:

  1. 音質の向上:高性能マイクを使用し、推奨サンプルレートで録音し、環境ノイズやエコーを最小限に抑えてください。
  2. 話者への適応:アクセントが強い、または顕著な方言がある音声の場合は、対応する方言をサポートするモデルを選択してください。
  3. ホットワードの設定:専門用語、固有名詞、および類似の単語に対してホットワードを設定してください。