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

Alibaba Cloud Model Studio:音声理解 (Qwen3-Omni-Captioner)

最終更新日:Jun 26, 2026

Qwen3-Omni-Captioner は、Qwen3-Omni をベースに構築されたオープンソースモデルです。プロンプトなしで、複雑な音声 (スピーチ、環境音、音楽、効果音) に対して、正確かつ包括的な説明を自動的に生成します。このモデルは、話者の感情、音楽的要素 (スタイル、楽器)、機密情報を識別します。音声コンテンツ分析、セキュリティ監査、インテント認識、ビデオ編集に最適です。

サポートされるモデル

シンガポール

モデル

コンテキストウィンドウ

最大入力

最大出力

入力コスト

出力コスト

無料クォータ

(注)

(トークン)

(100 万トークンあたり)

qwen3-omni-30b-a3b-captioner

65,536

32,768

32,768

$3.81

$3.06

100 万トークン

Model Studio のアクティベート後 90 日間有効

中国 (北京)

中国本土のデプロイメント範囲を選択した場合、モデル推論の計算リソースは中国本土に制限されます。静的データは選択したリージョンに保存されます。サポートされるリージョン:中国 (北京)。

モデル

コンテキストウィンドウ

最大入力

最大出力

入力コスト

出力コスト

無料クォータ

(注)

(トークン)

(100 万トークンあたり)

qwen3-omni-30b-a3b-captioner

65,536

32,768

32,768

$2.265

$1.821

無料クォータなし

音声のトークン変換ルール:合計トークン数 = 音声の持続時間 (秒) × 12.5。音声の持続時間が 1 秒未満の場合は、1 秒としてカウントされます。

クイックスタート

前提条件

Qwen3-Omni-Captioner は API 呼び出しのみをサポートします。Model Studio コンソールでのオンラインテストは利用できません。

これらのコードサンプルは、ローカルファイルではなく URL を介してオンライン音声を分析します。ローカルファイルの受け渡し方法音声ファイルの制限についてご確認ください。

OpenAI 互換

Python

import os
from openai import OpenAI

client = OpenAI(
    # API キーはリージョンによって異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3-omni-30b-a3b-captioner",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"                    
                    }
                }
            ]
        }
    ]
)
print(completion.choices[0].message.content)

応答

このオーディオクリップは、突然の大きな金属的な打撃音で始まります。この音は音場全体を支配し、即座に工業地帯や作業場のような環境であることを示唆します。打撃音はリズミカルで一貫しており、鋭く響き渡る質感を持ち、金属製の工具 (ハンマー、レンチなど) が硬い金属面に打ち付けられていることを連想させます。音は耳障りでわずかに歪んでおり、各衝撃でクリッピングが聞き取れます。これは、マイクが音源に近く、音量が大きいためと考えられます。
最初の打撃音が消え去ると、いら立ちと不満の口調で中国語 (標準語) を話す男性の声が入ってきます。声はクリアで、マイクに近く、歪みはありません。彼は「ああ、これじゃ静かに仕事なんてできないよ」と言っているようです。彼のイントネーションは会話的で非公式であり、上昇する疑問形の抑揚が特徴で、演技やフォーマルなスピーチではなく、日常会話に典型的なものです。アクセントは標準的な普通話 (Putonghua) で、強い地域的な特徴はなく、中国の北部または中部地域のネイティブスピーカーであることを示唆しています。
話者の発話中、金属的な打撃音が再開し、彼の声と重なります。これらの音のタイミングと性質から、話者は同じ空間にいる別の人が引き起こしているであろう継続的な騒音に直接反応していることがわかります。音響環境は「ドライ」でエコーが最小限であり、吸音材のある小規模または中規模の部屋であることを意味し、作業場や工業的な設定をさらに裏付けています。その他のバックグラウンドノイズ、音楽、環境音はなく、公共または商業スペースである証拠もありません。
録音品質は中程度です。マイクは低音の鈍い音と鋭い金属的な過渡音の両方を捉えていますが、大きな打撃音はデジタルクリッピングを引き起こし、衝撃時に耳障りで「ザラザラした」歪みを生じさせています。しかし、話者の声はクリアで聞き取りやすいままです。全体的な印象は、率直な現実世界のやり取りであり、おそらく労働者やオフィスワーカーが騒がしい環境での中断について不平を言っている場面です。
要約すると、この音声は、作業場または工業的な環境にいる中国語 (標準語) を話す男性が、彼の仕事を妨げる継続的な金属的な打撃音にいら立ちながら反応している様子を描写しています。録音は非公式でクリアであり、手作業や技術的な仕事の文脈に基づいています。台本のある演技、音楽、または無関係な活動の証拠はありません。

Node.js

import OpenAI from "openai";

const openai = new OpenAI(
    {
        // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
        baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
    }
);
const completion = await openai.chat.completions.create({
    model: "qwen3-omni-30b-a3b-captioner",
    messages: [
        {
            "role": "user",
            "content": [{
                "type": "input_audio",
                "input_audio": {
                    "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"
                     }
            }]
        }]
});

console.log(completion.choices[0].message.content)

応答

このオーディオクリップは、突然の大きな金属的な打撃音で始まります。この音は音場全体を支配し、即座に工業地帯や作業場のような環境であることを示唆します。打撃音はリズミカルで一貫しており、鋭く響き渡る質感を持ち、金属製の工具 (ハンマー、レンチなど) が硬い金属面に打ち付けられていることを連想させます。音は耳障りでわずかに歪んでおり、各衝撃でクリッピングが聞き取れます。これは、マイクが音源に近く、音量が大きいためと考えられます。
最初の打撃音が消え去ると、いら立ちと不満の口調で中国語 (標準語) を話す男性の声が入ってきます。声はクリアで、マイクに近く、歪みはありません。彼は「ああ、これじゃ静かに仕事なんてできないよ」と言っているようです。彼のイントネーションは会話的で非公式であり、上昇する疑問形の抑揚が特徴で、演技やフォーマルなスピーチではなく、日常会話に典型的なものです。アクセントは標準的な普通話 (Putonghua) で、強い地域的な特徴はなく、中国の北部または中部地域のネイティブスピーカーであることを示唆しています。
話者の発話中、金属的な打撃音が再開し、彼の声と重なります。これらの音のタイミングと性質から、話者は同じ空間にいる別の人が引き起こしているであろう継続的な騒音に直接反応していることがわかります。音響環境は「ドライ」でエコーが最小限であり、吸音材のある小規模または中規模の部屋であることを意味し、作業場や工業的な設定をさらに裏付けています。その他のバックグラウンドノイズ、音楽、環境音はなく、公共または商業スペースである証拠もありません。
録音品質は中程度です。マイクは低音の鈍い音と鋭い金属的な過渡音の両方を捉えていますが、大きな打撃音はデジタルクリッピングを引き起こし、衝撃時に耳障りで「ザラザラした」歪みを生じさせています。しかし、話者の声はクリアで聞き取りやすいままです。全体的な印象は、率直な現実世界のやり取りであり、おそらく労働者やオフィスワーカーが騒がしい環境での中断について不平を言っている場面です。
要約すると、この音声は、作業場または工業的な環境にいる中国語 (標準語) を話す男性が、彼の仕事を妨げる継続的な金属的な打撃音にいら立ちながら反応している様子を描写しています。録音は非公式でクリアであり、手作業や技術的な仕事の文脈に基づいています。台本のある演技、音楽、または無関係な活動の証拠はありません。

curl

# ======= 重要 =======
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# シンガポールリージョンの base_url。北京リージョンの場合は、https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/chat/completions を使用してください
# === 実行前にこのコメントを削除してください ===

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-omni-30b-a3b-captioner",
    "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "input_audio",
          "input_audio": {
            "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"
          }
        }
      ]
    }
  ]
}'

応答

{
  "choices": [
    {
      "message": {
        "content": "このオーディオクリップは、約 6 秒間の短い低忠実度の録音で、反響の多い小さな屋内空間 (おそらくホームオフィスや寝室) で収録されたものです。録音は、0.5〜0.6 秒ごとに繰り返される、速く、金属的で、リズミカルなハンマー音で始まります。各打撃はわずかに不均一で、短いエコーを伴います。この音はステレオ音場の左側を支配し、マイクに近いため、ハンマー音が近くのやや左側で発生していることを示唆しています。\n\nハンマー音と重なって、一人の男性の声が中国語 (標準語) で話しており、その口調は明らかに苛立ちと焦燥感を表しています。彼は「ああ、これじゃ静かに仕事なんてできないよ」と言っています。彼の話し方は、音質が悪いにもかかわらず明瞭で、標準的で訛りのない標準語で話されており、中国北部または中部出身のネイティブスピーカーであることを示しています。\n\n声はハンマー音よりも遠く、ステレオ音場の中央に位置し、部屋の反響がより多く含まれています。感情的な内容は明白です。彼の声は最後にわずかに上がり、そのフレーズを修辞的な不満に変え、彼のいら立ちを強調しています。他の声、音楽、環境音は存在しません。音声以外の音は、ハンマー音と録音デバイスのかすかなヒス音だけです。\n\n環境音、話者の言語、そして彼の口調の組み合わせは、ホームオフィスでの妨害のシナリオを強く示唆しています。おそらく、在宅勤務中の誰かが、近くで行われているリフォームや修理作業に邪魔されているのでしょう。録音はハンマーの音の途中で突然終わり、キャプチャの自発的で率直な性質をさらに強調しています。\n\n要約すると、この音声は、中国語 (標準語) を話す男性が、おそらく中国で、近くの建設または修理活動のために平和に仕事ができないことへの不満を表明している、現実的で低忠実度のスナップショットです。これは個人的な屋内設定でキャプチャされたものです。",
        "role": "assistant"
      },
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null
    }
  ],
  "object": "chat.completion",
  "usage": {
    "prompt_tokens": 160,
    "completion_tokens": 387,
    "total_tokens": 547,
    "prompt_tokens_details": {
      "audio_tokens": 152,
      "text_tokens": 8
    },
    "completion_tokens_details": {
      "text_tokens": 387
    }
  },
  "created": 1758002134,
  "system_fingerprint": null,
  "model": "qwen3-omni-30b-a3b-captioner",
  "id": "chatcmpl-f4155bf9-b860-49d6-8ee2-092da7359097"
}

DashScope

Python

import dashscope
import os

# 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1 に置き換えてください
dashscope.base_http_api_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"

messages = [
    {
        "role": "user",
        "content": [
            {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"}
        ]
    }
]

response = dashscope.MultiModalConversation.call(
    # API キーはリージョンによって異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
    # 環境変数が設定されていない場合は、ご利用の API キーに置き換えてください: api_key="sk-xxx"
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen3-omni-30b-a3b-captioner",
    messages=messages
)

print("Output:")
print(response["output"]["choices"][0]["message"].content[0]["text"])

応答

このオーディオクリップは、突然の大きな金属的な打撃音で始まります。この音は音場全体を支配し、即座に工業地帯や作業場のような環境であることを示唆します。打撃音はリズミカルで一貫しており、鋭く響き渡る質感を持ち、金属製の工具 (ハンマー、レンチなど) が硬い金属面に打ち付けられていることを連想させます。音は耳障りでわずかに歪んでおり、各衝撃でクリッピングが聞き取れます。これは、マイクが音源に近く、音量が大きいためと考えられます。
最初の打撃音が消え去ると、いら立ちと不満の口調で中国語 (標準語) を話す男性の声が入ってきます。声はクリアで、マイクに近く、歪みはありません。彼は「ああ、これじゃ静かに仕事なんてできないよ」と言っているようです。彼のイントネーションは会話的で非公式であり、上昇する疑問形の抑揚が特徴で、演技やフォーマルなスピーチではなく、日常会話に典型的なものです。アクセントは標準的な普通話 (Putonghua) で、強い地域的な特徴はなく、中国の北部または中部地域のネイティブスピーカーであることを示唆しています。
話者の発話中、金属的な打撃音が再開し、彼の声と重なります。これらの音のタイミングと性質から、話者は同じ空間にいる別の人が引き起こしているであろう継続的な騒音に直接反応していることがわかります。音響環境は「ドライ」でエコーが最小限であり、吸音材のある小規模または中規模の部屋であることを意味し、作業場や工業的な設定をさらに裏付けています。その他のバックグラウンドノイズ、音楽、環境音はなく、公共または商業スペースである証拠もありません。
録音品質は中程度です。マイクは低音の鈍い音と鋭い金属的な過渡音の両方を捉えていますが、大きな打撃音はデジタルクリッピングを引き起こし、衝撃時に耳障りで「ザラザラした」歪みを生じさせています。しかし、話者の声はクリアで聞き取りやすいままです。全体的な印象は、率直な現実世界のやり取りであり、おそらく労働者やオフィスワーカーが騒がしい環境での中断について不平を言っている場面です。
要約すると、この音声は、作業場または工業的な環境にいる中国語 (標準語) を話す男性が、彼の仕事を妨げる継続的な金属的な打撃音にいら立ちながら反応している様子を描写しています。録音は非公式でクリアであり、手作業や技術的な仕事の文脈に基づいています。台本のある演技、音楽、または無関係な活動の証拠はありません。

Java

import java.util.Arrays;
import java.util.Collections;
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.JsonUtils;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    static {
         // 以下はシンガポールリージョンの base-url です。北京リージョンのモデルを使用する場合は、URL を https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }
    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://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav")))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen3-omni-30b-a3b-captioner")
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("Output:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

応答

このオーディオクリップは、突然の大きな金属的な打撃音で始まります。この音は音場全体を支配し、即座に工業地帯や作業場のような環境であることを示唆します。打撃音はリズミカルで一貫しており、鋭く響き渡る質感を持ち、金属製の工具 (ハンマー、レンチなど) が硬い金属面に打ち付けられていることを連想させます。音は耳障りでわずかに歪んでおり、各衝撃でクリッピングが聞き取れます。これは、マイクが音源に近く、音量が大きいためと考えられます。
最初の打撃音が消え去ると、いら立ちと不満の口調で中国語 (標準語) を話す男性の声が入ってきます。声はクリアで、マイクに近く、歪みはありません。彼は「ああ、これじゃ静かに仕事なんてできないよ」と言っているようです。彼のイントネーションは会話的で非公式であり、上昇する疑問形の抑揚が特徴で、演技やフォーマルなスピーチではなく、日常会話に典型的なものです。アクセントは標準的な普通話 (Putonghua) で、強い地域的な特徴はなく、中国の北部または中部地域のネイティブスピーカーであることを示唆しています。
話者の発話中、金属的な打撃音が再開し、彼の声と重なります。これらの音のタイミングと性質から、話者は同じ空間にいる別の人が引き起こしているであろう継続的な騒音に直接反応していることがわかります。音響環境は「ドライ」でエコーが最小限であり、吸音材のある小規模または中規模の部屋であることを意味し、作業場や工業的な設定をさらに裏付けています。その他のバックグラウンドノイズ、音楽、環境音はなく、公共または商業スペースである証拠もありません。
録音品質は中程度です。マイクは低音の鈍い音と鋭い金属的な過渡音の両方を捉えていますが、大きな打撃音はデジタルクリッピングを引き起こし、衝撃時に耳障りで「ザラザラした」歪みを生じさせています。しかし、話者の声はクリアで聞き取りやすいままです。全体的な印象は、率直な現実世界のやり取りであり、おそらく労働者やオフィスワーカーが騒がしい環境での中断について不平を言っている場面です。
要約すると、この音声は、作業場または工業的な環境にいる中国語 (標準語) を話す男性が、彼の仕事を妨げる継続的な金属的な打撃音にいら立ちながら反応している様子を描写しています。録音は非公式でクリアであり、手作業や技術的な仕事の文脈に基づいています。台本のある演技、音楽、または無関係な活動の証拠はありません。

curl

# ======= 重要 =======
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# シンガポールリージョンの base_url。北京リージョンの場合は、https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation を使用してください
# === 実行前にこのコメントを削除してください ===

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-omni-30b-a3b-captioner",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"}
                ]
            }
        ]
    }
}'

応答

{
  "output":{
    "choices": [
      {
        "finish_reason": "stop",
        "message": {
          "role": "assistant",
          "content": [
            {
              "text": "このオーディオクリップは、静かな屋内環境で設定された 6 秒間の高忠実度録音です。主な音は、おそらく 10 代後半から 20 代半ばの男性話者が、軽い苛立ちの口調で中国語 (標準語) を話しているものです。彼の話し方は明瞭で自然であり、「ああ、これじゃ静かに仕事なんてできないよ」と会話形式で話しています。彼の声はマイクに近く、部屋は音響的にニュートラルで、目立ったエコーやバックグラウンドノイズはなく、小さくて家具の整った空間であることを示唆しています。\n\nスピーチに重なるように、持続的でリズミカルな機械音が聞こえます。これは、0.6 秒ごとに繰り返される一連の鋭い金属的なクリック音またはガタガタ音です。音はドライで反響がなく、マイクに非常に近い機械装置によって生成されているという推測をさらに裏付けています。音の規則性と音色から、大きな機械や複雑な機械ではなく、小さな金属製の物体 (鍵、コイン、ペンなど) が硬い表面で繰り返し叩かれているか、打たれていることが示唆されます。\n\n話者の不満は、機械音に対する直接的な反応であり、邪魔のために集中したり平和に仕事ができないことへの苛立ちを表現しています。口調は怒りや緊急性を帯びたものではなく、個人的なまたは家庭的な環境で軽微で持続的な迷惑に遭遇した人によく見られる、諦めに近い苛立ちのものです。\n\n他の声、音楽、または環境の手がかりは存在しません。全体的な印象は、短い率直な瞬間です。おそらく、学生、オフィスワーカー、または静かな家庭環境にいる誰かが、邪魔で反復的な騒音について (自分自身または近くの仲間に) 不平を言っている間にマイクに捉えられたものです。録音は技術的にクリーンで焦点が合っており、すべての注意が話者と機械音に向けられているため、このクリップが意図的にキャプチャされた可能性が非常に高いです。おそらく、ボイスノート、ソーシャルメディアの投稿、または効果音ライブラリのサンプルとしてキャプチャされたものでしょう。"
            }
          ]
        }
      }
    ]
  },
  "usage": {
    "input_tokens_details": {
      "audio_tokens": 152,
      "text_tokens": 8
    },
    "total_tokens": 559,
    "output_tokens": 399,
    "input_tokens": 160,
    "output_tokens_details": {
      "text_tokens": 399
    }
  },
  "request_id": "d532f72c-e75b-4ffb-a1ef-d2465e758958"
}

仕組み

  • シングルターンインタラクション:各リクエストは独立した分析タスクです。マルチターン会話はサポートされていません。

  • 固定タスク:モデルは音声の説明を英語でのみ生成します。命令 (システムメッセージなど) を使用して、動作、出力フォーマット、またはコンテンツのフォーカスを変更することはできません。

  • 音声入力のみ:モデルは音声のみを受け付けます。テキストプロンプトは不要です。message パラメーターのフォーマットは固定されています。

    メッセージフォーマットの例

    OpenAI 互換

    messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "input_audio",
                        "input_audio": {
                            "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"
                        }
                    }
                ]
            }
        ]

    DashScope

    messages = [
        {
            "role": "user",
            "content": [
                {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"}
            ]
        }
    ]

ストリーミング出力

ストリーミング出力は、中間結果を段階的に生成し、同時に返すことで、生成中の応答を読み取ることができます。これにより、待機時間が短縮されます。

OpenAI 互換

streamtrue に設定して、ストリーミング出力を有効にします。

Python

import os
from openai import OpenAI

client = OpenAI(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3-omni-30b-a3b-captioner",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"
                    }
                }
            ]
        }
    ],
    stream=True,
    stream_options={"include_usage": True},

)
for chunk in completion:
    # stream_options.include_usage が True の場合、最後のチャンクの choices フィールドは空のリストであり、スキップする必要があります。トークンの使用量は chunk.usage から取得できます。
    if chunk.choices and chunk.choices[0].delta.content != "":
        print(chunk.choices[0].delta.content,end="")

Node.js

import OpenAI from "openai";

const openai = new OpenAI(
    {
        // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
        baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
    }
);
const completion = await openai.chat.completions.create({
    model: "qwen3-omni-30b-a3b-captioner",
    messages: [
        {
            "role": "user",
            "content": [{
                "type": "input_audio",
                "input_audio": {
                    "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"
                     },
            }]
        }],
    stream: true,
    stream_options: {
        include_usage: true
    },
});

for await (const chunk of completion) {
    if (Array.isArray(chunk.choices) && chunk.choices.length > 0) {
        console.log(chunk.choices[0].delta.content);
    } else {
        console.log(chunk.usage);
    }
}

curl

# ======= 重要 =======
# シンガポールリージョンの base_url。北京リージョンの場合は、https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/chat/completions を使用してください
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# === 実行前にこのコメントを削除してください ===

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-omni-30b-a3b-captioner",
    "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "input_audio",
          "input_audio": {
            "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"
          }
        }
      ]
    }
  ],
    "stream":true,
    "stream_options":{
        "include_usage":true
    }
}'

DashScope

DashScope SDK または HTTP 経由で呼び出します。使用するメソッドに応じてパラメーターを設定します:

  • Python SDK:stream パラメーターを True に設定します。

  • Java SDK:streamCall メソッドを使用します。

  • HTTP:ヘッダーで X-DashScope-SSEenable に設定します。

デフォルトでは、ストリーミング出力は非増分です。つまり、返される各チャンクには、以前に生成されたすべてのコンテンツが含まれます。増分出力を得るには、incremental_output (Java では incrementalOutput) を true に設定します。

Python

import dashscope

# 次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1 に置き換えてください
dashscope.base_http_api_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"

messages = [
    {
        "role": "user",
        "content": [
            {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"}
        ]
    }
]

response = dashscope.MultiModalConversation.call(
     # 環境変数が設定されていない場合は、ご利用の API キーに置き換えてください: api_key="sk-xxx"
    # API キーはリージョンによって異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen3-omni-30b-a3b-captioner",
    messages=messages,
    stream=True,
    incremental_output=True
)

full_content = ""
print("Streaming output:")
for response in response:
    if response["output"]["choices"][0]["message"].content:
        print(response["output"]["choices"][0]["message"].content[0]["text"])
        full_content += response["output"]["choices"][0]["message"].content[0]["text"]
print(f"Full content: {full_content}")

Java

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
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 io.reactivex.Flowable;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    static {
        // 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }
    public static void streamCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                // qwen3-omni-30b-a3b-captioner は入力として 1 つの音声ファイルのみをサポートします。
                .content(Arrays.asList(
                        new HashMap<String, Object>(){{put("audio", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav");}}
                )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                 // 環境変数が設定されていない場合は、ご利用の API キーに置き換えてください: .apiKey("sk-xxx")
                // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3-omni-30b-a3b-captioner")
                .message(userMessage)
                .incrementalOutput(true)
                .build();
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(item -> {
            try {
                List<com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult.Output.Choice.Message.Content> content = item.getOutput().getChoices().get(0).getMessage().getContent();
                // content が存在し、空でないことを確認します。
                if (content != null &&  !content.isEmpty()) {
                    System.out.println(content.get(0).get("text"));
                }
            } catch (Exception e){
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        try {
            streamCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

# ======= 重要 =======
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# シンガポールリージョンの base_url。北京リージョンの場合は、https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation を使用してください
# === 実行前にこのコメントを削除してください ===

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-omni-30b-a3b-captioner",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"}
                ]
            }
        ]
    },
    "parameters": {
      "incremental_output": true
    }
}'

ローカルファイルの受け渡し (Base64 エンコーディングまたはファイルパス)

ローカルファイルをアップロードするには、2 つの方法があります:

  • Base64 エンコーディングを使用する

  • 直接ファイルパスを使用する (転送の安定性が高いため推奨)

アップロード方法:

ファイルパスによる受け渡し

ファイルパスをモデルに直接渡します。DashScope Python および Java SDK のみでサポートされており、HTTP ではサポートされていません。言語とオペレーティングシステムごとのパス形式については、以下の表をご参照ください。

ファイルパスの指定

システム

SDK

入力ファイルパス

Linux または macOS

Python SDK

file://{ファイルの絶対パス}

file:///home/images/test.mp3

Java SDK

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

Python SDK

file://{ファイルの絶対パス}

file://D:/images/test.mp3

Java SDK

file:///{ファイルの絶対パス}

file:///D:/images/test.mp3

Base64 エンコーディングによる受け渡し

ファイルを Base64 文字列に変換し、モデルに渡します。

Base64 エンコードされた文字列を渡す手順

  1. ファイルのエンコード:ローカルの音声ファイルを Base64 文字列に変換します。

    例:音声ファイルを Base64 文字列に変換する

    import base64
    
    # エンコード関数:ローカルファイルを Base64 エンコードされた文字列に変換する
    def encode_audio(audio_path):
        with open(audio_path, "rb") as audio_file:
            return base64.b64encode(audio_file.read()).decode("utf-8")
    
    # xxxx/test.mp3 をご利用のローカル音声ファイルの絶対パスに置き換えてください
    base64_audio = encode_audio("xxxx/test.mp3")
  2. データ URL を構築します:data:;base64,{base64_audio}。ここで、base64_audio はステップ 1 の Base64 文字列です。

  3. audio (DashScope) または input_audio (OpenAI 互換) パラメーターを介してデータ URL を渡します。

制限事項:

  • 推奨:転送の安定性を高めるために、ファイルパスを直接渡すことをお勧めします。1 MB 未満のファイルの場合は、Base64 エンコーディングも機能します。

  • ファイルパスで渡す場合、音声ファイルは 10 MB 未満である必要があります。

  • Base64 を使用する場合、エンコードされた文字列は 10 MB 未満である必要があります。注意:Base64 はファイルサイズを増加させます。

ファイルパスによる受け渡し

ファイルパスによる受け渡しは、DashScope Python および Java SDK のみでサポートされており、HTTP ではサポートされていません。

Python

import dashscope
import os

# 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# ABSOLUTE_PATH/welcome.mp3 をご利用のローカル音声ファイルの絶対パスに置き換えてください。
# ローカルファイルの完全なパスは、有効なパスを確保するために file:// で始まる必要があります。例:file:///home/images/test.mp3
audio_file_path = "file://ABSOLUTE_PATH/welcome.mp3"
messages = [
    {
        "role": "user",
        # audio パラメーターに file:// で始まるファイルパスを渡します。
        "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'),
    model="qwen3-omni-30b-a3b-captioner", 
    messages=messages)

print("Output:")
print(response["output"]["choices"][0]["message"].content[0]["text"])

Java

import java.util.Arrays;
import java.util.HashMap;
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.JsonUtils;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    static {
        // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }

    public static void callWithLocalFile()
            throws ApiException, NoApiKeyException, UploadFileException {

        // ABSOLUTE_PATH/welcome.mp3 をご利用のローカル音声ファイルの絶対パスに置き換えてください。
        // ローカルファイルの完全なパスは、有効なパスを確保するために file:// で始まる必要があります。例:file:///home/images/test.mp3
        // 現在のテストシステムは macOS です。Windows を使用する場合は、代わりに "file:///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(
                        new HashMap<String, Object>(){{put("audio", localFilePath);}}
                ))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                 // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
                // 環境変数が設定されていない場合は、ご利用の API キーに置き換えてください: .apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3-omni-30b-a3b-captioner")
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("Output:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            callWithLocalFile();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

Base64 エンコーディングによる受け渡し

OpenAI 互換

Python

import os
from openai import OpenAI
import base64

client = OpenAI(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

def encode_audio(audio_path):
    with open(audio_path, "rb") as audio_file:
        return base64.b64encode(audio_file.read()).decode("utf-8")


# ABSOLUTE_PATH/welcome.mp3 をご利用のローカル音声ファイルの絶対パスに置き換えてください。
audio_file_path = "xxx/ABSOLUTE_PATH/welcome.mp3"
base64_audio = encode_audio(audio_file_path)

completion = client.chat.completions.create(
    model="qwen3-omni-30b-a3b-captioner",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        # Base64 エンコーディングでローカルファイルを渡す場合、有効なファイル URL を確保するために data: プレフィックスを使用する必要があります。
                        # "base64" キーワードは、Base64 エンコードされたデータ (base64_audio) の前に含める必要があります。そうしないとエラーが発生します。
                        "data": f"data:;base64,{base64_audio}"
                    },
                }
            ],
        },
    ]
)
print(completion.choices[0].message.content)

Node.js

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

const openai = new OpenAI(
    {
        // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 次の URL はシンガポールリージョン用です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。北京リージョンの場合は、[中国 (北京)] タブに表示されている URL を使用してください。
        baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
    }
);

const encodeAudio = (audioPath) => {
    const audioFile = readFileSync(audioPath);
    return audioFile.toString('base64');
};
//  ABSOLUTE_PATH/welcome.mp3 をご利用のローカル音声ファイルの絶対パスに置き換えてください。
const base64Audio = encodeAudio("xxx/ABSOLUTE_PATH/welcome.mp3")

const completion = await openai.chat.completions.create({
    model: "qwen3-omni-30b-a3b-captioner",
    messages: [
        {
            "role": "user",
            "content": [{
                "type": "input_audio",
                "input_audio": { "data": `data:;base64,${base64Audio}`}
            }]
        }]
});

console.log(completion.choices[0].message.content);

curl

  • ファイルを Base64 エンコードされた文字列に変換する方法については、コードサンプルをご参照ください。

  • デモンストレーションのため、"data:;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5...." の Base64 文字列は切り捨てられています。実際には、完全なエンコード済み文字列を渡す必要があります。

# ======= 重要 =======
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# シンガポールリージョンの base_url。北京リージョンの場合は、https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/chat/completions を使用してください
# === 実行前にこのコメントを削除してください ===

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-omni-30b-a3b-captioner",
    "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "input_audio",
          "input_audio": {
            "data": "data:;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5...."
            
          }
        }
      ]
    }
  ]
}'

DashScope

Python

import os
import base64
import dashscope 

dashscope.base_http_api_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"
# エンコード関数:ローカルファイルを Base64 エンコードされた文字列に変換する
def encode_audio(audio_file_path):
    with open(audio_file_path, "rb") as audio_file:
        return base64.b64encode(audio_file.read()).decode("utf-8")

# ABSOLUTE_PATH/welcome.mp3 をご利用のローカル音声ファイルの絶対パスに置き換えてください。
audio_file_path = "xxx/ABSOLUTE_PATH/welcome.mp3"
base64_audio = encode_audio(audio_file_path)
print(base64_audio)

messages = [
    {
        "role": "user",
        # Base64 エンコーディングでローカルファイルを渡す場合、有効なファイル URL を確保するために data: プレフィックスを使用する必要があります。
        # "base64" キーワードは、Base64 エンコードされたデータ (base64_audio) の前に含める必要があります。そうしないとエラーが発生します。
        "content": [{"audio":f"data:;base64,{base64_audio}"}],
    }
]

response = dashscope.MultiModalConversation.call(
    # 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: api_key="sk-xxx"
    # API キーはリージョンによって異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model="qwen3-omni-30b-a3b-captioner",
    messages=messages,
    )
print(response.output.choices[0].message.content[0]["text"])

Java

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import java.util.Arrays;
import java.util.Base64;
import java.util.HashMap;

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;

public class Main {

    static {
        // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }

    private static String encodeAudioToBase64(String audioPath) throws IOException {
        Path path = Paths.get(audioPath);
        byte[] audioBytes = Files.readAllBytes(path);
        return Base64.getEncoder().encodeToString(audioBytes);
    }

    public static void callWithLocalFile()
            throws ApiException, NoApiKeyException, UploadFileException,IOException{
        // ABSOLUTE_PATH/welcome.mp3 をご利用のローカルファイルの実際のパスに置き換えてください。
        String localFilePath = "ABSOLUTE_PATH/welcome.mp3";
        String base64Audio = encodeAudioToBase64(localFilePath);

        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                // Base64 エンコーディングでローカルファイルを渡す場合、有効なファイル URL を確保するために data: プレフィックスを使用する必要があります。
                // "base64" キーワードは、Base64 エンコードされたデータ (base64_audio) の前に含める必要があります。そうしないとエラーが発生します。
                .content(Arrays.asList(
                        new HashMap<String, Object>(){{put("audio", "data:;base64," + base64Audio);}}
                ))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen3-omni-30b-a3b-captioner")
                // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
               // 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: .apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("Output:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            callWithLocalFile();
        } catch (ApiException | NoApiKeyException | UploadFileException | IOException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

  • ファイルを Base64 エンコードされた文字列に変換する方法については、コードサンプルをご参照ください。

  • デモンストレーションのため、"data:;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5...." の Base64 文字列は切り捨てられています。実際には、完全なエンコード済み文字列を渡す必要があります。

# ======= 重要 =======
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# シンガポールリージョンの base_url。北京リージョンの場合は、https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation を使用してください
# === 実行前にこのコメントを削除してください ===

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-omni-30b-a3b-captioner",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"audio": "data:;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5...."}
                ]
            }
        ]
    }
}'

API リファレンス

Qwen3-Omni-Captioner のパラメーターについては、テキスト生成をご参照ください。

エラーコード

モデルの呼び出しが失敗し、エラーメッセージが返された場合は、エラーコードを参照して解決してください。

よくある質問

音声ファイルを必要なサイズに圧縮する方法は?

  • オンラインツール:Compresss などのツールを使用して音声を圧縮できます。

  • コード実装:FFmpeg を使用します。使用方法の詳細については、FFmpeg の公式サイトをご参照ください。

    # 基本的な変換コマンド (汎用テンプレート)
    # -i: 入力ファイルパスを指定します。例:input.mp3
    
    # -b:a: 音声のビットレートを設定します。
      # 一般的な値:64 kbps (低品質、音声および低帯域幅ストリーミング用)、128k (中品質、一般音声およびポッドキャスト用)、192 kbps (高品質、音楽および放送用)。
      # ビットレートが高いほど音質は向上し、ファイルサイズは大きくなります。
      
    # -ar: 音声のサンプルレート (1 秒あたりのサンプル数) を設定します。
     # 一般的な値:8000 Hz、22050 Hz、44100 Hz (標準サンプルレート)。
     # サンプルレートが高いほどファイルサイズは大きくなります。
     
    # -ac: オーディオチャンネル数を設定します。一般的な値:1 (モノラル)、2 (ステレオ)。モノラルファイルの方がサイズは小さくなります。
    
    # -y: 出力ファイルが存在する場合に上書きします (値は不要)。# output.mp3: 出力ファイルパスを指定します。
    
    ffmpeg -i input.mp3 -b:a 128k -ar 44100 -ac 1 output.mp3 -y

制限事項

音声ファイルの制限:

  • 持続時間:最大 40 分。

  • ファイル数:リクエストごとに 1 つの音声ファイルのみがサポートされます。

  • ファイル形式AMR、WAV (CodecID: GSM_MS)、WAV (PCM)、3GP、3GPP、AAC、および MP3

  • ファイル入力方法:パブリック URL、Base64 エンコーディング、またはローカルファイルパス。

  • ファイルサイズ:

    • パブリック URL:1 GB 以下。

    • ファイルパス:音声ファイルは 10 MB 未満である必要があります。

    • Base64 エンコーディング:エンコードされた Base64 文字列は 10 MB 未満である必要があります。詳細については、ローカルファイルの受け渡しをご参照ください。

    ファイルを圧縮するには、音声ファイルを必要なサイズに圧縮する方法は?