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

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

最終更新日:Jan 06, 2026

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

適用範囲

サポートリージョン

  • シンガポール:このリージョンから取得した API キー が必要です。

  • 北京:このリージョンから取得した API キー が必要です。

サポートモデル

国際

国際デプロイメントモードでは、エンドポイントとデータストレージはシンガポールリージョンに配置され、推論計算リソースはグローバルに (中国本土を除く) 動的にスケジュールされます。

モデル名

コンテキストウィンドウ (トークン)

最大入力 (トークン)

最大出力 (トークン)

入力コスト

出力コスト

無料クォータ

(注)

(トークン)

(百万トークン)

qwen3-omni-30b-a3b-captioner

65,536

32,768

32,768

$3.81

$3.06

100 万トークン

Alibaba Cloud 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 呼び出しのみをサポートしています。Alibaba Cloud 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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
    base_url="https://dashscope-intl.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)

応答

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

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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
        baseURL: "https://dashscope-intl.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)

応答

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

curl

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

curl -X POST https://dashscope-intl.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://dashscope.aliyuncs.com/api/v1 に置き換えてください
dashscope.base_http_api_url="https://dashscope-intl.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 をご参照ください
    # 環境変数を設定していない場合は、次の行をご利用の 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.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://dashscope.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://dashscope-intl.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);
    }
}

応答

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

curl

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

curl -X POST 'https://dashscope-intl.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 互換

OpenAI 互換メソッドでストリーミング出力を有効にするには、リクエストで stream パラメーターを true に設定します。

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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
    base_url="https://dashscope-intl.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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
        baseURL: "https://dashscope-intl.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 です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope-intl.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://dashscope.aliyuncs.com/api/v1 に置き換えてください
dashscope.base_http_api_url="https://dashscope-intl.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(
     # 環境変数を設定していない場合は、次の行をご利用の 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,
    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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://dashscope-intl.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()
                 // 環境変数を設定していない場合は、次の行をご利用の Model Studio 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 です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation に置き換えてください
# === 実行前にこのコメントを削除してください ===

curl -X POST 'https://dashscope-intl.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 は前のステップで生成した Base64 文字列です。

  3. モデルの呼び出し:audio (DashScope SDK) または input_audio (OpenAI 互換 SDK) パラメーターを使用して データ URL を渡します。

制限事項:

  • より高い安定性のために、ファイルパスを直接渡すことを推奨します。1 MB 未満のファイルには Base64 エンコーディングも使用できます。

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

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

ファイルパスで渡す

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

Python

import dashscope
import os

# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください
dashscope.base_http_api_url = 'https://dashscope-intl.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://dashscope.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://dashscope-intl.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 をご参照ください
                // 環境変数を設定していない場合は、次の行をご利用の Model Studio 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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
    base_url="https://dashscope-intl.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 はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
        baseURL: "https://dashscope-intl.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 です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope-intl.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://dashscope-intl.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://dashscope.aliyuncs.com/api/v1 に置き換えてください
        Constants.baseHttpApiUrl="https://dashscope-intl.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 です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation に置き換えてください
# === 実行前にこのコメントを削除してください ===

curl -X POST 'https://dashscope-intl.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 の入出力パラメーターについては、Qwen をご参照ください。

エラーコード

呼び出しが失敗した場合は、トラブルシューティングのためにエラーメッセージをご参照ください。

よくある質問

必要なサイズに音声ファイルを圧縮するにはどうすればよいですか?

  • オンラインツール: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 未満である必要があります。詳細については、ローカルファイルの渡し方をご参照ください。

    ファイルを圧縮するには、必要なサイズに音声ファイルを圧縮するにはどうすればよいですか?