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

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

最終更新日:Jul 15, 2026

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

概要

非同期タスクを送信することで、事前に録音された音声ファイルやビデオファイルを一括で文字起こしします。

  • コンテキスト強調をサポートしており、コンテキストヒントを提供することで認識精度を向上させることができます (fun-asr-flash-2026-06-15 のみ)。

  • カスタムホットワードをサポートしており、事前定義された単語リストを通じてドメイン固有の用語の認識精度を高めます。

  • 設定可能な機能には、話者分離、禁止用語フィルタリング、文レベルおよび単語レベルのタイムスタンプが含まれます。

  • 最大 12 時間、2 GB の単一の音声ファイルを非同期で文字起こしします。

  • 任意のサンプルレートに対応し、AAC、WAV、MP3 などの一般的な音声およびビデオ形式で動作します。

ライブキャプション、オンライン会議、音声アシスタントなどのリアルタイムシナリオでは、代わりにリアルタイム音声認識を使用してください。適切なモデルの選択に関するガイダンスについては、「Speech-to-text」をご参照ください。

前提条件

説明

WorkspaceId の取得:Model Studio コンソールにログインし、左側のサイドバーで [Workspace Management] に移動し、ワークスペースリストページでワークスペース ID を見つけます。ワークスペース ID は、特定の API エンドポイント URL で使用される文字列識別子です。

代替エンドポイント:ほとんどの API 呼び出しでは、WorkspaceId プレフィックスを必要とせずに、ベース URL として https://dashscope-intl.aliyuncs.com を使用できます。例:https://dashscope-intl.aliyuncs.com/api/v1/services/audio/asr/transcription。これにより、リージョン固有のルーティングが必要ない場合にセットアップが簡素化されます。

クイックスタート

Fun-ASR

音声ファイルやビデオファイルは通常サイズが大きいため、ファイル文字起こし API は非同期です。タスクを送信し、クエリエンドポイントでそのステータスをポーリングし、タスク完了後に認識結果を取得します。

cURL

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

タスクの送信

以下の設定はシンガポールリージョン用です。`{WorkspaceId}` を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。

# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
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}` を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。

# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
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 に置き換えてください。設定はリージョンによって異なります。
# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# シンガポールリージョンと北京リージョンの API キーは異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
# 環境変数が設定されていない場合は、次の行を Model Studio の API キーに置き換えてください: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 に置き換えてください。設定はリージョンによって異なります。
        // 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
        // 文字起こしリクエストのパラメーターを作成します。
        TranscriptionParam param =
                TranscriptionParam.builder()
                        // シンガポールリージョンと北京リージョンの API キーは異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
                        // 環境変数が設定されていない場合は、次の行を Model Studio の API キーに置き換えてください:.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());
            // タスクが完了するまでブロックして待機し、結果を取得します
            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": "this is",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 1920,
                                "end_time": 2520,
                                "text": "Alibaba",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2520,
                                "end_time": 2840,
                                "text": "Speech",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2840,
                                "end_time": 3240,
                                "text": "Lab",
                                "punctuation": "."
                            }
                        ]
                    }
                ]
            }
        ]
    }

Fun-ASR-Flash

fun-asr-flash-2026-06-15 は、最大 5 分間の音声ファイルに対して同期呼び出しをサポートします。結果はストリーミングモードまたは非ストリーミングモードで返すことができます。

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

# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
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 のレスポンス構造に関する注意:fun-asr-flash-2026-06-15 モデルは、標準の DashScope マルチモーダル生成フォーマットとは異なるレスポンス構造を返します。認識されたテキストは、レスポンスの output.choices[].message.content ではなく、output.output.sentence.text および output.text で利用可能です。このモデルからのレスポンスを解析する際は、output.output パスを使用して認識結果にアクセスしてください。

レスポンスの抜粋例:

{
  "output": {
    "output": {
      "sentence": {
        "text": "Hello World,这里是阿里巴巴语音实验室。"
      }
    },
    "text": "Hello World,这里是阿里巴巴语音实验室。"
  },
  "request_id": "..."
}

Qwen3-ASR-Flash-Filetrans

Qwen3-ASR-Flash-Filetrans は、音声ファイルの非同期文字起こし専用に構築されています。最大 12 時間の録音をサポートし、公開アクセス可能な音声ファイル URL のみを受け付け (ローカルファイルのアップロードはサポートされていません)、タスク完了後に完全な認識結果を単一のレスポンスで返します。

cURL

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

タスクの送信

以下の設定はシンガポールリージョン用です。`{WorkspaceId}` を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。

# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
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}` を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。

# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
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 に置き換えてください。設定はリージョンによって異なります。
    // 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
    private static final String API_URL_SUBMIT = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription";
    // 以下の設定はシンガポールリージョン用です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
    // 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
    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/ja/model-studio/get-api-key をご参照ください。
        // 環境変数が設定されていない場合は、次の行を 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": "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 submitted, task_id: " + taskId);
                } else {
                    System.out.println("Submit 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;
    }
}

Python

import os
import time
import requests
import json

# 以下の設定はシンガポールリージョン用です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
API_URL_SUBMIT = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription"
# 以下の設定はシンガポールリージョン用です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
# 代替:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用
API_URL_QUERY_BASE = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/"

def main():
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
    # 環境変数が設定されていない場合は、次の行を 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": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"
        },
        "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"Request to submit task failed: {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("Unexpected submit 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"Request to query task failed: {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. Final result:")
                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 に置き換えてください。 設定はリージョンによって異なります。
        // 代替案: WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用します
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
        QwenTranscriptionParam param =
                QwenTranscriptionParam.builder()
                        // シンガポールリージョンと北京リージョンの API キーは異なります。 API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
                        // 環境変数が設定されていない場合は、次の行を実際の Model Studio の API キーに置き換えてください: .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);
            // タスクのステータスを照会
            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 をご参照ください。
    # 環境変数が設定されていない場合は、次の行をご利用の Model Studio の API キーに置き換えます:dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

    # 次の構成はシンガポールリージョン向けです。「{WorkspaceId}」を実際のワークスペース ID に置き換えてください。構成はリージョンによって異なります。
    # または、WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用することも可能です。
    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 に置き換えてください。 設定はリージョンによって異なります。
# 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数が設定されていない場合は、次の行を 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", "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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
                // 環境変数が設定されていない場合は、次の行を 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 に置き換えてください。 設定はリージョンによって異なります。
            // 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
            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 に置き換えてください。 設定はリージョンによって異なります。

# 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
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 エンコードされた音声を データ 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("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 に置き換えてください。 設定はリージョンによって異なります。
# 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
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"Audio file not found: {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 をご参照ください。
    # 環境変数が設定されていない場合は、次の行を 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

この例では、次の音声ファイルを使用します: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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
                // 環境変数が設定されていない場合は、次の行を 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 に置き換えてください。 設定はリージョンによって異なります。
            // 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
            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 とオペレーティングシステムに応じてパスを構築します。

オペレーティングシステム

SDK

ファイルパスのフォーマット

Linux または macOS

Python SDK

file://{absolute_path_to_file}

file:///home/audio/test.wav

Java SDK

Windows

Python SDK

file://{absolute_path_to_file}

file://D:/audio/test.wav

Java SDK

file:///{absolute_path_to_file}

file:///D:/audio/test.wav

重要

ローカルファイルの呼び出しは 100 QPS に制限されており、この制限を引き上げることはできません。そのため、本番環境、高同時実行数、または負荷テストのワークロードには適していません。より高い同時実行数が必要な場合は、ファイルを OSS にアップロードし、その URL を使用して API を呼び出してください。

Python SDK

この例では、次の音声ファイルを使用します:welcome.mp3

import os
import dashscope

# 以下の設定はシンガポールリージョン向けです。 「{WorkspaceId}」を実際のワークスペース ID に置き換えてください。 設定はリージョンによって異なります。
# 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数が設定されていない場合は、次の行を 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

この例では、次の音声ファイルを使用します: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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
                // 環境変数が設定されていない場合は、次の行を 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 に置き換えてください。 設定はリージョンによって異なります。
            // 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
            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);
    }
}

ストリーミング出力

モデルは中間結果を段階的に生成し、最終結果はそれらを組み立てて作成されます。 非ストリーミング呼び出しは完全な結果を待ってから 1 つの応答で返しますが、ストリーミング呼び出しは結果が生成されるとすぐに返すため、最初のトークンまでの時間が大幅に短縮されます。 呼び出しメソッドに一致するストリーミングパラメーターを選択してください:

  • DashScope Python SDK:stream を true に設定します。

  • DashScope Java SDK:streamCall メソッドを呼び出します。

  • DashScope HTTP:X-DashScope-SSE ヘッダーを enable に設定します。

Python SDK

import os
import dashscope

# 以下の設定はシンガポールリージョン向けです。 「{WorkspaceId}」を実際のワークスペース ID に置き換えてください。 設定はリージョンによって異なります。
# 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数が設定されていない場合は、次の行を 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", "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 キーは異なります。 API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
                // 環境変数が設定されていない場合は、次の行を 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 に置き換えてください。 設定はリージョンによって異なります。
            // 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
            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 に置き換えてください。 設定はリージョンによって異なります。

# 代替案:WorkspaceId プレフィックスなしで「https://dashscope-intl.aliyuncs.com」を使用します
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 の非同期呼び出しと同様です。モデル名を Paraformer のモデル名に置き換えてください。

高度な機能

OpenAI 互換 API の使用

重要

OpenAI 互換モードは米国リージョンでは利用できません。

Qwen3-ASR-Flash モデルシリーズのみが 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 (v4.x) を使用する場合、Node.js SDK は extra_body フィールドをサポートしていないため、asr_optionsextra_body でラップせずに、リクエストボディオブジェクトで直接渡します。

入力:音声ファイルの URL

Python SDK

from openai import OpenAI
import os

try:
    client = OpenAI(
        # シンガポール/米国リージョンと北京リージョンでは API キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
        # 環境変数が設定されていない場合は、次の行をお使いの Model Studio API キーに置き換えてください:api_key = "sk-xxx"
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # 以下の設定はシンガポールリージョン向けです。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
        # 代替案:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用します。
        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("Streaming output:")
        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"Full content: {full_content}")
    else:
        print(f"Non-streaming output: {completion.choices[0].message.content}")
except Exception as e:
    print(f"Error: {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 をご参照ください。
  // 環境変数が設定されていない場合は、次の行をお使いの Model Studio API キーに置き換えてください:apiKey: "sk-xxx"
  apiKey: process.env.DASHSCOPE_API_KEY,
  // 以下の設定はシンガポールリージョン向けです。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
  // 代替案:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用します。
  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("Streaming output:");
      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(`Full content: ${fullContent}`);
    } else {
      console.log(`Non-streaming output: ${completion.choices[0].message.content}`);
    }
  } catch (err) {
    console.error(`Error: ${err}`);
  }
}

main();

cURL

以下の設定はシンガポールリージョン向けです。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。

# 代替案:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用します。
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 エンコードされた音声を データ 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("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"Audio file not found: {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 をご参照ください。
        # 環境変数が設定されていない場合は、次の行をお使いの Model Studio API キーに置き換えてください:api_key = "sk-xxx"
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # 以下の設定はシンガポールリージョン向けです。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
        # 代替案:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用します。
        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("Streaming output:")
        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"Full content: {full_content}")
    else:
        print(f"Non-streaming output: {completion.choices[0].message.content}")
except Exception as e:
    print(f"Error: {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 キーが異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
  // 環境変数が設定されていない場合は、次の行をお使いの Model Studio API キーに置き換えてください:apiKey: "sk-xxx"
  apiKey: process.env.DASHSCOPE_API_KEY,
  // 以下の設定はシンガポールリージョン向けです。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
  // 代替案:WorkspaceId プレフィックスなしで "https://dashscope-intl.aliyuncs.com" を使用します。
  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("Streaming output:");
      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(`Full content: ${fullContent}`);
    } else {
      console.log(`Non-streaming output: ${completion.choices[0].message.content}`);
    }
  } catch (err) {
    console.error(`Error: ${err}`);
  }
}

main();

長い音声ファイルの処理

非リアルタイム音声認識は、長い音声ファイルを非同期で文字起こしするため、会議議事録の作成、インタビューの文字起こし、通話録音のレビューなどに適しています。

制限事項:

  • Qwen3-ASR-Flash-Filetrans、Fun-ASR、および Paraformer:各音声ファイルはサイズが 2 GB、長さが 12 時間に制限されます。

  • Qwen3-ASR-Flash:各音声ファイルはサイズが 10 MB、長さが 5 分に制限されます。より長い音声の場合は、Qwen3-ASR-Flash-Filetrans または Fun-ASR を使用してください。

  • 話者ダイアライゼーションが有効な場合:認識の失敗やタイムアウトを避けるため、音声の長さを 2 時間未満にしてください。詳細については、「話者ダイアライゼーション」をご参照ください。

仕組み:長い音声の文字起こしは、非同期タスクとして 3 つのステップで実行されます。

  1. 文字起こしタスクを送信し、task_id を受け取ります。

  2. タスクのステータスをポーリングするか、SDK の wait メソッドを呼び出してタスクが完了するまでブロックします。

  3. タスクが完了したら、返された URL から結果の JSON をダウンロードします。

サンプルコードについては、「Qwen3-ASR-Flash-Filetrans のクイックスタート」をご参照ください。

ストリーミング出力

Qwen3-ASR-Flash はストリーミング出力をサポートしています。音声の処理中に中間結果が返されるため、リアルタイムの進捗フィードバックが必要なユースケースに適しています。

Fun-ASR、Paraformer、および Qwen3-ASR-Flash-Filetrans は非同期文字起こしモデルであり、ストリーミング出力をサポートしていません。最終結果はタスクポーリングを通じて取得します (「長い音声ファイルの処理」をご参照ください)。

ストリーミング出力を有効にするには:

  • DashScope Python SDK:streamTrue に設定します。

  • DashScope Java SDK:streamCall メソッドを介して API を呼び出します。

  • DashScope HTTP:X-DashScope-SSE ヘッダーを enable に設定します。

  • OpenAI 互換 SDK:streamTrue に設定します。

ストリーミングのサンプルコードについては、Qwen3-ASR-Flash のクイックスタートの「ストリーミング出力」をご参照ください。

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

Fun-ASR と Paraformer は、ホットワードを通じてドメイン固有の固有名詞 (人名、地名、製品名) の認識精度を向上させます。Model Studio コンソールでホットワードリストを作成し、その ID を vocabulary_id パラメーターを介して API に渡します。

ホットワードリストの作成と使用方法については、「認識精度の向上」をご参照ください。

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

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

fun-asr-flash-2026-06-15 モデルは、会話履歴やドメインテキストをモデルに渡すコンテキスト強調を通じて、固有名詞 (人名、地名、製品用語) の認識精度を向上させます。

使用方法と例については、「コンテキスト強調」をご参照ください。

話者ダイアライゼーション

話者ダイアライゼーションは、音声ファイル内の異なる話者を識別し、文字起こしされた各文に話者ラベルを付けます。複数人での会議やインタビューの録音に適しています。

サポート対象モデル:Fun-ASR と Paraformer は話者ダイアライゼーションをサポートしています (デフォルトではオフ)。Qwen-ASR シリーズはまだサポートしていません。

有効にするには:API リクエストで diarization_enabledtrue に設定します。結果の各文には、話者を識別する speaker_id フィールドが含まれます。

レスポンス構造 (抜粋):

{
  "transcripts": [
    {
      "sentences": [
        { "begin_time": 100, "end_time": 3820, "text": "Hello, let's discuss the project progress today.", "speaker_id": 0 },
        { "begin_time": 3820, "end_time": 6500, "text": "Sure, I'll give the update first.", "speaker_id": 1 }
      ]
    }
  ]
}

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

重要

話者ダイアライゼーションが有効な場合、認識の失敗やタイムアウトを避けるため、音声の長さを 2 時間未満にしてください。(ダイアライゼーションが有効でない場合の音声の長さの制限については、「長い音声ファイルの処理」をご参照ください。) ダイアライゼーションはモノラル音声でのみサポートされます。

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

禁止用語フィルター

禁止用語フィルターは、認識結果から禁止用語を置き換えまたは削除します。カスタマーサービスの品質保証 (QA)、コンテンツコンプライアンス、字幕モデレーションに適しています。

サポート対象モデル:Fun-ASR と Paraformer は禁止用語フィルターをサポートしています。Qwen-ASR シリーズ (Qwen3-ASR-Flash および Qwen3-ASR-Flash-Filetrans) はまだサポートしていません。

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

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

  • filter_with_signed.word_list:文字列の配列で、一致したものが同数の * 文字に置き換えられます。例えば、["test"] を指定すると、"please help me test it" は "please help me **** it" になります。

  • 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 は、追加の構成なしで常に感情認識が有効になっています。結果には、surprised (驚き)、neutral (中立)、happy (喜び)、sad (悲しみ)、disgusted (嫌悪)、angry (怒り)、fearful (恐怖) の 7 つの詳細なカテゴリからなる話者の感情タグが含まれます。

フィールドパス (インターフェイスによって異なります):

  • 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": "Welcome to Alibaba Cloud.",
      "emotion": "neutral",
      "language": "en"
    }]
  }]
}

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

重要

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

タイムスタンプの取得

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

  • Qwen3-ASR-Flash-Filetrans:DashScope 非同期インターフェイスのみがタイムスタンプをサポートしており、この機能は常に有効です。リクエストパラメーター enable_words は粒度を制御します。false (デフォルト) は文レベルのタイムスタンプを返し、true は単語レベルのタイムスタンプを返します。単語レベルのタイムスタンプは、中国語、英語、日本語、韓国語、ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ロシア語でのみサポートされています。他の言語での精度は保証されません。

  • Fun-ASR:タイムスタンプは常に有効で、無効にすることはできません。

  • Paraformer:タイムスタンプはデフォルトでオフです。有効にするには、リクエストパラメーター timestamp_alignment_enabledtrue に設定します。

重要

Qwen3-ASR-Flash が OpenAI 互換インターフェイスを介して呼び出された場合、出力は chat.completion であり、タイムスタンプフィールドは含まれません。タイムスタンプを取得するには、Qwen3-ASR-Flash-Filetrans (非同期タスクインターフェイス) を使用してください。

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

  • 文レベル:sentences[].begin_timesentences[].end_time は、音声内の各文の開始と終了を示します。

  • 単語レベル:sentences[].words[] 配列です。各要素には begin_timeend_time、および text (単語または文字のテキスト) が含まれます。

レスポンス構造 (DashScope 非同期タスクインターフェイスからの抜粋):

{
  "transcripts": [{
    "sentences": [{
      "begin_time": 100,
      "end_time": 3820,
      "text": "Hello, let's discuss the project progress today.",
      "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 リファレンスをご参照ください。

本番環境への適用

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

本番環境でのベストプラクティス

  • ファイルホスティング:音声ファイルは Alibaba Cloud Object Storage Service (OSS) にアップロードし、URL を使用して API を呼び出してください。ローカルファイルのアップロードは避けてください (ローカルファイル API の上限は 100 QPS であり、この上限を引き上げることはできません)。

  • 非同期ポーリング:長時間音声の文字起こしは非同期フローを使用します。頻繁なクエリによってクォータを消費し尽くすことを避けるため、ポーリング間隔を適切に設定してください (例:2~5 秒)。100 QPS のクエリ上限を超えるスループットが必要な場合は、イベントコールバック通知に切り替えてください。詳細については、「高同時実行ワークロードにおけるポーリングのコールバックへの置き換え」をご参照ください。

  • エラーハンドリング:堅牢なリトライメカニズムを実装してください。ネットワークタイムアウトや一時的なサーバーエラー (5xx) が発生した場合は、指数バックオフを使用してリトライしてください。

  • ノイズリダクション:ノイズの多い音声ファイルは、認識のために送信する前に FFmpeg などのツールで前処理を行ってください。

  • モデル選択:音声の長さに応じてモデルを選択してください。5 分までの短い音声には Qwen3-ASR-Flash を使用します。それより長い音声には Fun-ASR または Qwen3-ASR-Flash-Filetrans を使用してください。

高同時実行ワークロードにおけるポーリングのコールバックへの置き換え

POST /api/v1/services/audio/asr/transcription を介して非同期文字起こしタスク (Fun-ASR、Qwen3-ASR-Flash-Filetrans、または Paraformer) を送信した後、通常は GET /api/v1/tasks/{task_id} をポーリングして結果を取得します。このクエリエンドポイントのデフォルトは 20 QPS で、最大 100 QPS までスケールアップしますが、高同時実行バッチワークロードでは容易にスロットリングがトリガーされる可能性があります。

代わりに EventBridge を介してコールバック通知を設定します。タスクが完了すると、Model Studio は設定したターゲット (HTTP/HTTPS エンドポイントまたは RocketMQ トピック) に dashscope:System:AsyncTaskFinish イベントを自動的にプッシュします。コンシューマーはイベントから直接結果を読み取るため、クエリエンドポイントを呼び出す必要がなくなり、ポーリングによるスロットリングのリスクが解消されます。設定の詳細については、「EventBridge コールバック通知の設定」をご参照ください。

対象モデル

  • サポート対象: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 には resultsresult は含まれなくなります。代わりに、codemessage が含まれます。まず data.task_status を確認してから、結果を読み取ってください。

モデル

送信パラメーター

結果フィールドのパス (コールバック本文内)

usage フィールド

Fun-ASR

input.file_urls (配列。リクエストごとに 1 つの URL のみサポート)。

data.output_result.output.results[].transcription_url (ファイルごとに 1 つのエントリを持つ配列。subtask_statustask_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 トピック) へのメッセージ到着まで、約 1~90 秒かかると想定してください。正確なレイテンシは、その時点の EventBridge の負荷によって異なります。

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

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

シンガポール

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

  • Fun-ASR: fun-asr (stable、現在の fun-asr-2025-11-07 に相当)、fun-asr-2025-11-07 (スナップショット)、fun-asr-2025-08-25 (スナップショット)、fun-asr-mtl (stable、現在の 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 (stable、現在の qwen3-asr-flash-filetrans-2025-11-17 に相当)、qwen3-asr-flash-filetrans-2025-11-17 (スナップショット)

  • Qwen3-ASR-Flash: qwen3-asr-flash (stable、現在の 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 (stable、現在の qwen3-asr-flash-2025-09-08-us に相当)、qwen3-asr-flash-2025-09-08-us (スナップショット)

中国 (北京)

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

  • Fun-ASR: fun-asr (stable、現在の fun-asr-2025-11-07 に相当)、fun-asr-2025-11-07 (スナップショット)、fun-asr-2025-08-25 (スナップショット)、fun-asr-mtl (stable、現在の 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 (stable、現在の qwen3-asr-flash-filetrans-2025-11-17 に相当)、qwen3-asr-flash-filetrans-2025-11-17 (スナップショット)

  • Qwen3-ASR-Flash: qwen3-asr-flash (stable、現在の 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 を開くか、その 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. ホットワードの設定:専門用語や固有名詞に対してホットワードを設定してください。