Skip to main content

Qwen-Omni

Qwen-Omni モデルは、マルチモーダル入力を受け付け、テキストまたは音声で応答を生成します。人間のような音声を生成し、複数の言語や方言での音声出力をサポートします。ユースケースには、コンテンツモデレーション、テキスト作成、視覚認識、音声ビデオインタラクションなどがあります。

サポートリージョン:シンガポール、北京。ご利用のリージョンの API キー を使用してください。

クイックスタート

前提条件 この例では、テキストプロンプトを Qwen-Omni API に送信し、テキストと音声の両方を含むストリーミング応答を返します。
import os
import base64
import soundfile as sf
import numpy as np
from openai import OpenAI

# 1. クライアントを初期化します
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),  # 環境変数が設定されていることを確認します
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

# 2. リクエストを送信します
try:
    completion = client.chat.completions.create(
        model="qwen3.5-omni-plus",
        messages=[{"role": "user", "content": "Who are you?"}],
        modalities=["text", "audio"],  # テキストと音声の出力を指定します
        audio={"voice": "Tina", "format": "wav"},
        stream=True,  # True に設定する必要があります
        stream_options={"include_usage": True},
    )

    # 3. ストリーミング応答を処理し、音声をデコードします
    print("Model response:")
    audio_base64_string = ""
    for chunk in completion:
        # テキスト部分を処理します
        if chunk.choices and chunk.choices[0].delta.content:
            print(chunk.choices[0].delta.content, end="")

        # 音声部分を収集します
        if chunk.choices and hasattr(chunk.choices[0].delta, "audio") and chunk.choices[0].delta.audio:
            audio_base64_string += chunk.choices[0].delta.audio.get("data", "")

    # 4. 音声ファイルを保存します
    if audio_base64_string:
        wav_bytes = base64.b64decode(audio_base64_string)
        audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
        sf.write("audio_assistant.wav", audio_np, samplerate=24000)
        print("\nAudio file saved to: audio_assistant.wav")

except Exception as e:
    print(f"リクエストに失敗しました: {e}")
Python または Node.js のコードを実行すると、テキスト応答がコンソールに表示され、audio_assistant.wav という名前のオーディオファイルがコードファイルと同じディレクトリに保存されます。
Model response:
I am a large language model developed by Alibaba Cloud. My name is Qwen. How can I help you?
HTTP コードを実行すると、テキストと Base64 でエンコードされた音声データが、audio フィールドに直接返されます。
data: {"choices":[{"delta":{"content":"I"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1757647879,"system_fingerprint":null,"model":"qwen3.5-omni-plus","id":"chatcmpl-a68eca3b-c67e-4666-a72f-73c0b4919860"}
data: {"choices":[{"delta":{"content":"am"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1757647879,"system_fingerprint":null,"model":"qwen3.5-omni-plus","id":"chatcmpl-a68eca3b-c67e-4666-a72f-73c0b4919860"}
......
data: {"choices":[{"delta":{"audio":{"data":"/v8AAAAAAAAAAAAAAA...","expires_at":1757647879,"id":"audio_a68eca3b-c67e-4666-a72f-73c0b4919860"}},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1757647879,"system_fingerprint":null,"model":"qwen3.5-omni-plus","id":"chatcmpl-a68eca3b-c67e-4666-a72f-73c0b4919860"}
data: {"choices":[{"finish_reason":"stop","delta":{"content":""},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1764763585,"system_fingerprint":null,"model":"qwen3.5-omni-plus","id":"chatcmpl-e8c82e9e-073e-4289-a786-a20eb444ac9c"}
data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":207,"completion_tokens":103,"total_tokens":310,"completion_tokens_details":{"audio_tokens":83,"text_tokens":20},"prompt_tokens_details":{"text_tokens":207}},"created":1757940330,"system_fingerprint":null,"model":"qwen3.5-omni-plus","id":"chatcmpl-9cdd5a26-f9e9-4eff-9dcc-93a878165afc"}

モデルの選択

  • Qwen3.5-Omni シリーズ:長編動画分析、会議の要約、字幕生成、コンテンツモデレーション、音声ビデオインタラクションに最適です。
    • 入力制限:最大 3 時間の音声または 1 時間の動画
    • 音声コントロール:命令による音量、話速、感情の調整をサポート
    • 視覚能力:Qwen3.5 のレベルに匹敵します。画像、音声、効果音、その他のマルチモーダル入力を理解します
    • 複合マルチモーダル入力:1 つのリクエストで、テキストと画像、音声、動画の任意の組み合わせをサポートします
    • 複合マルチモーダル入力は、Qwen3.5-Omni シリーズでのみサポートされています。 1 つのリクエストで、イメージ、オーディオ、テキスト、またはビデオ、イメージ、テキストなど、複数のモダリティを任意に組み合わせてデータを提供できます。
  • Qwen3-Omni-Flash シリーズ:短編動画分析やコストに敏感なシナリオに最適です。
    • 入力制限:音声と動画の入力は最大 150 秒
    • 思考モード:思考モードをサポートする唯一の Qwen-Omni シリーズモデル
    • 入力モダリティ:テキストと他の単一モダリティ (画像、音声、または動画) の組み合わせのみをサポートします。
シリーズ音声・動画の説明ディープシンキングWeb 検索入力音声言語出力音声言語サポートされている音声
Qwen3.5-Omni最新世代のオムニモーダルモデル強力非サポートサポート113
言語:中国語、英語、ドイツ語、フランス語、イタリア語、チェコ語、インドネシア語、タイ語、韓国語、ポーランド語、日本語、ベトナム語、フィンランド語、ポルトガル語、スペイン語、オランダ語、ロシア語、マレー語、カタルーニャ語、スウェーデン語、トルコ語、ウクライナ語、ルーマニア語、スロバキア語、デンマーク語、アイスランド語、ノルウェー語 (ブークモール)、マケドニア語、ギリシャ語、ハンガリー語、ガリシア語、フィリピン語、クロアチア語、ボスニア語、スロベニア語、ブルガリア語、カザフ語、ベラルーシ語、ラトビア語、エストニア語、アゼルバイジャン語、ウイグル語、スワヒリ語、ヒンディー語、エスペラント語、キルギス語、タジク語、セブアノ語、アフリカーンス語、アラビア語、リトアニア語、ジャワ語、ベンガル語、ペルシャ語、ヘブライ語、パンジャブ語、グジャラート語、モンゴル語、アストゥリアス語、カンナダ語、マラーティー語、インターリングア、マラヤーラム語、マルタ語、ノルウェー語ニーノシュク、テルグ語、ウルドゥー語、グルジア語、バスク語、タミル語、オリヤー語、セルビア語、マオリ語方言:
東北官話、貴州方言、広東語、河南方言、香港広東語、上海語、陝西省方言、天津方言、台湾閩南語、雲南省方言、安徽省方言、福建省方言、甘粛省方言、広東省方言、湖北省方言、湖南省方言、江西省方言、山東省方言、山西省方言、四川省方言、広西チワン族自治区方言、海南語、重慶方言、長沙方言、杭州方言、合肥方言、銀川方言、鄭州方言、瀋陽方言、温州語、武漢方言、昆明方言、太原方言、南昌方言、済南方言、蘭州方言、南京方言、客家語、閩南語

... (many
tags) ...
36
言語:中国語、英語、ドイツ語、イタリア語、ポルトガル語、スペイン語、日本語、韓国語、フランス語、ロシア語、タイ語、インドネシア語、アラビア語、ベトナム語、トルコ語、フィンランド語、ポーランド語、ヒンディー語、オランダ語、チェコ語、ウルドゥー語、タガログ語、スウェーデン語、デンマーク語、ヘブライ語、アイスランド語、マレー語、ノルウェー語、ペルシャ語
方言:四川方言、北京方言、天津方言、南京方言、陝西方言、広東語、閩南語
55
Qwen3-Omni-Flashハイブリッド思考モデル比較的弱いサポート非サポート19
言語:中国語、英語、ドイツ語、フランス語、イタリア語、タイ語、韓国語、日本語、ロシア語、スペイン語、ポルトガル語方言:四川方言、上海語、広東語、閩南語、陝西方言、南京方言、天津方言、北京方言
19
言語:中国語、英語、ドイツ語、フランス語、イタリア語、タイ語、韓国語、日本語、ロシア語、スペイン語、ポルトガル語方言:四川語、上海語、広東語、福建語、陝西方言、南京方言、天津方言、北京方言
17~49
バージョンによって異なります
モデル名、コンテキストウィンドウ、価格、スナップショットバージョンについては、Model Studio コンソールでご確認ください。レート制限については、「レート制限」をご参照ください。

モデルのパフォーマンス

音声・動画コンテンツ分析

この動画のタイムスタンプ付きの詳細な説明を生成してください。
00:00.000 – 00:02.500雨に濡れた街の通りがワイドスクリーンのフレームいっぱいに広がる。長時間露光撮影により、濡れた舗道に赤と青の車のライトが筋状に伸びている。暗い膝丈のトレンチコートと明るいシャツにネクタイを締めた一人の男が、右側の歩道をカメラに向かって歩いてくる。雨粒が彼の肩と髪に付着している。一歩ごとに、湿ったコンクリートの上でくぐもった音がする。低く不吉な電子音のハミングが環境音の下に響き、絶え間なく降る雨が周囲でパチパチと音を立てる。彼の横のレンガの壁はカラフルなグラフィティで覆われ、遠くにはネオンサインが光っている。1 つはオレンジがかった赤の筆記体で「Nice」とはっきりと表示され、もう 1 つの縦長のサインは下部に「AT」の文字が見える。......00:12.300 – 00:14.533カメラが下に傾く。懐中電灯の光の中で、黄ばんで古びた一枚の紙が浅い水たまりに横たわっており、その端は焦げ、角は丸まっている。インクで書かれた段落がその表面のほとんどを覆っているが、湿気と焦げ跡でテキストは判読不能である。男はひざまずき、手袋をはめた指をドキュメントに向かって伸ばす。彼の手が近づくにつれて、波紋が外側に広がる。サイレンの音がピークに達した後、わずかに遠ざかり始めるが、環境音のハミングは一定のままである。震える紙に触れる直前でシーンはフリーズし、クリップは終了する。
一部のタイムスタンプのみ表示されています。

多方言理解

異なる中国語の方言を話す歌手の声の特徴、感情状態、および完全な歌詞を記述してください。
この音声は、中国のさまざまな地域の歌手によるラップパフォーマンスを特集しており、豊かな方言の多様性を示しています。以下は、各歌手の声の特徴、感情状態、および対応する歌詞の詳細な説明です:杭州方言 (呉語)声の特徴:男性歌手の声は柔らかく穏やかで、呉語特有の滑らかさと温かみがあります。彼のイントネーションは穏やかに上下し、リズムは軽快で速く、リラックスした語り口の効果を生み出しています。感情状態:リラックスして快適で、日常生活に満ちています。彼は杭州のゆったりとしたライフスタイルと都市の変化を描写し、故郷への愛情と現代の発展についての考察を表現しています。全体的に、彼は居心地が良く、親しみやすいと感じています。歌詞:> 杭州方言、よく聞いて!私たちの文化には、地元の児化音の発音が含まれています。> 西湖のほとりに咲く花のように、文化調査は必要ありません。私たちが一番よく理解しています。> あなたたちは誰も理解していません。「三不打門」、「哥儿」、「老儿」、「份儿」、「丫儿」...部外者がこれらをどうやって見分けることができるでしょうか?> 行こう!交通は速い。どこにでも地下鉄がある。確認してみよう。> 東南アジアとタイを歓迎し、「十三太」のショーを見る。私たちの街を誇りに思い、性格は率直です。> あなたは「橋渡り」の経験のためだけに来て、味が違うから帰らないのですか?
一部の結果のみ表示されています。

歌詞字幕生成

歌詞を書き起こし、各行にこのフォーマットでタイムスタンプを付けてください:[00:00:15,020 --> 00:00:28,085] : When you walk through a storm, hold your head up high.[00:00:28,085 --> 00:00:40,200] And don't be afraid of the dark. ......
[00:00:12,680 --> 00:00:16,960] 猫の糸が木々の月明かりをかすめて揺れる。[00:00:18,400 --> 00:00:22,800] ラジエーターが 1998 年のチャートヒットをハミングする。[00:00:24.160 → 00:00:28.080] 時間が霧のような熱波を分ける。[00:00:28,920 --> 00:00:33,000] 画面からのネオンが私の鼻筋を照らす。......[00:03:16,720 --> 00:03:21,680] 私たちは木の幹の最も柔らかい輪の中に寄り添う。[00:03:22,400 --> 00:03:27,000] 呼吸が残りの暖かさを蜂蜜砂糖に変える。[00:03:28,160 --> 00:03:33,200] ソファが雲のようなふわふわの形に沈む。[00:03:34,000 --> 00:03:38,800] すべての毛穴が太陽の光を吸収する。[00:04:09,000 --> 00:04:10,020] (終了)
一部の結果のみ表示されています。

音声・動画プログラミング

使用方法

ストリーミング出力

Qwen-Omni へのすべてのリクエストは stream=True をセットする必要があります。

モデル構成

コスト、速度、品質のバランスをとるために、パラメーター、プロンプト、メディアの長さを構成します。
  • 音声・動画理解
  • 音声理解
ユースケース推奨動画長推奨プロンプト推奨 max_pixels
高速レビュー、低コスト≤60 分50 ワード以内の簡単なプロンプト230,400
コンテンツ抽出 (長編動画のセグメンテーション)≤60 分921,600~2,073,600
標準分析 (短編動画のタグ付け)≤4 分以下の構造化プロンプトを使用してください
Provide a detailed description of the video.
It should explicitly include three sections:
1. A structured chronological storyline of **every noticeable audio and visual detail**
2. A structured list of all visible text. For each text element, include start timestamp, end timestamp, the exact text content, and the appearance characteristics. If no text appears, explicitly state so.
3. A structured speech-to-text transcription, include speaker (corresponding to the character or voice‑over in Section 1, including their accent and tone), exact spoken content, start timestamp, end timestamp, and speaking state (prosody, emotion, and style). If no speech appears, explicitly state so.
Aside from these three required sections, you are free to organize any additional content in any way you find helpful. This additional content can include global information about the entire video or localized information about specific moments. You may choose the topic of this extra content freely.
Output Format:
```
## Storyline
<xx:xx.xxx> - <xx:xx.xxx>
<an unstructured long paragraph in natural language describing what happened during this period, blending both audio and video details.>
<xx:xx.xxx> - <xx:xx.xxx>
<an unstructured long paragraph in natural language describing what happened during this period, blending both audio and video details.>
<xx:xx.xxx> - <xx:xx.xxx>
<an unstructured long paragraph in natural language describing what happened during this period, blending both audio and video details.>
...
## Visible Text
<xx:xx.xxx> - <xx:xx.xxx>
“<element>”: <appearance>
“<element>”: <appearance>
<xx:xx.xxx> - <xx:xx.xxx>
“<element>”: <appearance>
“<element>”: <appearance>
“<element>”: <appearance>
<xx:xx.xxx> - <xx:xx.xxx>
“<element>”: <appearance>
...
## Speakers and Transcript
Speaker profiles:
<speaker> - <profile>
<speaker> - <profile>
<speaker> - <profile>
...
<xx:xx.xxx> - <xx:xx.xxx>
Speaker: <speaker>
State: <description>
Content: “<content>”
<xx:xx.xxx> - <xx:xx.xxx>
Speaker: <speaker>
State: <description>
Content: “<content>”
<xx:xx.xxx> - <xx:xx.xxx>
Speaker: <speaker>
State: <description>
Content: “<content>”
...
## <another section>
<paragraphs>
## <another section>
<paragraphs>
...
```
921,600~2,073,600
詳細な分析 (複数の話者/複雑なシーン)≤2 分2,073,600
最初に長編動画をセグメント化して、詳細な説明を取得できます。

複合マルチモーダル入力

複合マルチモーダル入力は、Qwen3.5-Omni シリーズでのみサポートされています。画像、音声、テキストの任意の組み合わせ、または動画、画像、テキストなど、複数のモダリティのデータを同じリクエストで提供できます。
次の例は、マルチモーダル分析のために 1 つのリクエストで画像と音声を提供する方法を示しています。
  • OpenAI 互換
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3.5-omni-plus",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/20241022/emyrja/dog_and_girl.jpeg"
                    },
                },
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/20250211/tixcef/cherry.wav",
                        "format": "wav"
                    },
                },
                {"type": "text", "text": "Describe the image content and tell me what the audio is about."},
            ],
        },
    ],
    modalities=["text", "audio"],
    audio={"voice": "Tina", "format": "wav"},
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in completion:
    if chunk.choices:
        print(chunk.choices[0].delta)
    else:
        print(chunk.usage)

単一モダリティ入力

各リクエストには、テキストと他の 1 つのモダリティ (動画、音声、または画像) が含まれます。すべての Qwen-Omni モデルがこれをサポートしています。
  • 動画とテキストの入力
  • 音声とテキストの入力
  • 画像とテキストの入力
動画を画像リストまたは動画ファイル (音声サポート付き) として提供します。
  • 動画ファイル (動画内の音声をサポート)
  • 画像リスト形式
  • ファイル数:
    • Qwen3.5-Omni シリーズ:パブリック URL を使用して最大 512 ファイル、Base64 エンコーディングを使用して最大 250 ファイル。
    • Qwen3-Omni-Flash シリーズ:1 ファイルのみ許可されます。
  • ファイルサイズ:
    • パブリック URL の使用:
      • Qwen3.5-Omni シリーズ:最大 2 GB
      • Qwen3-Omni-Flash:最大 256 MB
    • Base64 エンコーディングの使用:エンコードされた Base64 文字列は 10 MB 未満である必要があります
  • 持続時間制限:
    • Qwen3.5-Omni シリーズ:1 時間
    • Qwen3-Omni-Flash:150 秒
  • ファイル形式:MP4、AVI、MKV、MOV、FLV、WMV。
  • 動画ファイル内の視覚情報と音声情報は別々に課金されます。
  • OpenAI 互換
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.5-omni-plus", # Qwen3-Omni-Flash の場合は、ノンシンキングモードで実行します。
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {
                        "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/20241115/cqqkru/1.mp4"
                    },
                },
                {"type": "text", "text": "What is the video about?"},
            ],
        },
    ],
    # 出力モダリティを設定します。現在、["text","audio"] と ["text"] の 2 つのオプションがサポートされています
    modalities=["text", "audio"],
    audio={"voice": "Tina", "format": "wav"},
    # stream は True に設定する必要があります。そうしないと、エラーが発生します。
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in completion:
    if chunk.choices:
        print(chunk.choices[0].delta)
    else:
        print(chunk.usage)
リクエストで Invalid data found when processing input などの動画デコードエラーが発生した場合は、ローカルでファイルを確認してから再エンコードします。以下のコマンドには、libx264 エンコーダーを備えた FFmpeg が必要です。
  1. ファイル全体をデコードできるか確認します。-xerror はエラー発生時に処理を停止し、-f null - は出力ファイルを作成しません。エラーなく正常終了すれば、このデコードチェックは完了です。
    ffmpeg -v error -xerror -i input.mp4 -f null -
    
  2. 映像を H.264、音声を AAC に再エンコードします。元のファイルを残すため、新しいファイルに保存します。
    ffmpeg -i input.mp4 -c:v libx264 -c:a aac reencoded.mp4
    
  3. 新しいファイルを再度チェックします。チェックに通り、長さ、映像、音声に問題がないことを確認したら、再アップロードしてモデルへのリクエストをやり直します。
    ffmpeg -v error -xerror -i reencoded.mp4 -f null -
    
再エンコードで失われた内容は復元できません。フレームや音声の欠落、映像の乱れが残る場合は、元の素材から動画を再度書き出してください。

Web 検索

Qwen3.5-Omni シリーズは、Web 検索をサポートしてリアルタイム情報を取得し、推論を実行します。
  • ウェブ検索は Qwen3.5-Omni シリーズでのみサポートされています。search_strategy パラメーターには agent のみを指定できます。
  • 課金については、課金の agent ポリシーをご参照ください。
Web 検索を有効にするには、enable_search と search_strategy を agent に設定します:
  • OpenAI 互換
# 前提条件:
# pip install openai

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",
)

# リクエストを送信します (Web 検索を有効)
try:
    completion = client.chat.completions.create(
        model="qwen3.5-omni-plus",
        messages=[{
            "role": "user",
            "content": "What is today's date and day of the week, and what important holidays are there today?"
        }],
        stream=True,
        stream_options={"include_usage": True},
        # Web 検索を有効にします
        extra_body={
            "enable_search": True
        }
    )

    print("モデルの応答 (リアルタイム情報あり):")
    for chunk in completion:
        if chunk.choices and chunk.choices[0].delta.content:
            print(chunk.choices[0].delta.content, end="")
    print()

except Exception as e:
    print(f"リクエストに失敗しました:{e}")

思考モードの有効化/無効化

Qwen-Omni シリーズでは、Qwen3-Omni-Flash モデルのみがハイブリッド思考モデルです。enable_thinking パラメーターを使用して、思考モードを有効化または無効化できます:
  • true
  • false (デフォルト)
思考モードでは、音声出力はサポートされていません。
  • OpenAI 互換
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-flash",
    messages=[{"role": "user", "content": "Who are you?"}],

    extra_body={'enable_thinking': True},

    # 出力モダリティを設定します。ノンシンキングモードでは ["text","audio"] と ["text"] の 2 つのオプションがサポートされています。思考モードでは ["text"] のみがサポートされています。
    modalities=["text"],

    # 音声を設定します。audio パラメーターは思考モードではサポートされていません。
    # audio={"voice": "Tina", "format": "wav"},
    # stream は True に設定する必要があります。そうしないと、エラーが発生します。
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in completion:
    if chunk.choices:
        print(chunk.choices[0].delta)
    else:
        print(chunk.usage)
data: {"choices":[{"delta":{"content":null,"role":"assistant","reasoning_content":""},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1757937336,"system_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}
data: {"choices":[{"finish_reason":null,"logprobs":null,"delta":{"content":null,"reasoning_content":"Hmm"},"index":0}],"object":"chat.completion.chunk","usage":null,"reated":1757937336,"system_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}
data: {"choices":[{"delta":{"content":null,"reasoning_content":","},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"reated":1757937336,"system_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}
......
data: {"choices":[{"delta":{"content":"Tell me"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1757937336,"tem_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}
data: {"choices":[{"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1757937336,"systm_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}
data: {"choices":[{"finish_reason":"stop","delta":{"content":"","reasoning_content":null},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1757937336,"system_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}
data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":11,"completion_tokens":363,"total_tokens":374,"completion_tokens_details":{"reasoning_tokens":195,"text_tokens":168},"prompt_tokens_details":{"text_tokens":11}},"created":1757937336,"system_fingerprint":null,"model":"qwen3-omni-flash","id":"chatcmpl-ce3d6fe5-e717-4b7e-8b40-3aef12288d4c"}

マルチターン対話

Qwen-Omni モデルをマルチターン対話で使用する場合、次の点にご注意ください:
  • アシスタントメッセージ messages 配列のアシスタントメッセージには、テキストデータのみを含めることができます。
  • ユーザーメッセージ ユーザーメッセージには、テキストと他の 1 つのモダリティを含めることができます。マルチターン対話では、異なるユーザーメッセージで異なるモダリティを入力できます。
  • OpenAI 互換
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.5-omni-plus", # Qwen3-Omni-Flash の場合は、ノンシンキングモードで実行します。
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3",
                        "format": "mp3",
                    },
                },
                {"type": "text", "text": "What is this audio about"},
            ],
        },
        {
            "role": "assistant",
            "content": [{"type": "text", "text": "This audio says: Welcome to Alibaba Cloud"}],
        },
        {
            "role": "user",
            "content": [{"type": "text", "text": "Tell me about this company."}],
        },
    ],
    # 出力モダリティを設定します。現在、["text","audio"] と ["text"] の 2 つのオプションがサポートされています
    modalities=["text"],
    # stream は True に設定する必要があります。そうしないと、エラーが発生します。
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in completion:
    if chunk.choices:
        print(chunk.choices[0].delta)
    else:
        print(chunk.usage)

Base64 エンコードされた出力音声データの解析

Qwen-Omni モデルは、音声をストリーミング Base64 エンコードデータとして出力します。生成中に、文字列変数を維持し、返された各チャンクからの Base64 エンコードデータを追加します。生成が完了したら、完全な文字列を Base64 デコードして音声ファイルを取得します。または、各チャンクをリアルタイムでデコードして再生することもできます。
# pyaudio のインストール手順:
# APPLE Mac OS X
#   brew install portaudio
#   pip install pyaudio
# Debian/Ubuntu
#   sudo apt-get install python-pyaudio python3-pyaudio
#   or
#   pip install pyaudio
# CentOS
#   sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
#   python -m pip install pyaudio

import os
from openai import OpenAI
import base64
import numpy as np
import soundfile as sf

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.5-omni-plus", # Qwen3-Omni-Flash の場合は、ノンシンキングモードで実行します。
    messages=[{"role": "user", "content": "Who are you?"}],
    # 出力モダリティを設定します。現在、["text","audio"] と ["text"] の 2 つのオプションがサポートされています
    modalities=["text", "audio"],
    audio={"voice": "Tina", "format": "wav"},
    # stream は True に設定する必要があります。そうしないと、エラーが発生します。
    stream=True,
    stream_options={"include_usage": True},
)

# 方法 1:生成完了後にデコード
audio_string = ""
for chunk in completion:
    if chunk.choices:
        if hasattr(chunk.choices[0].delta, "audio"):
            try:
                audio_string += chunk.choices[0].delta.audio["data"]
            except Exception as e:
                print(chunk.choices[0].delta.content)
    else:
        print(chunk.usage)

wav_bytes = base64.b64decode(audio_string)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
sf.write("audio_assistant_py.wav", audio_np, samplerate=24000)

# 方法 2:生成中にデコード (方法 2 を使用するには、方法 1 のコードをコメントアウトします)
# # PyAudio を初期化します
# import pyaudio
# import time
# p = pyaudio.PyAudio()
# # 音声ストリームを作成します
# stream = p.open(format=pyaudio.paInt16,
#                 channels=1,
#                 rate=24000,
#                 output=True)

# for chunk in completion:
#     if chunk.choices:
#         if hasattr(chunk.choices[0].delta, "audio"):
#             try:
#                 audio_string = chunk.choices[0].delta.audio["data"]
#                 wav_bytes = base64.b64decode(audio_string)
#                 audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
#                 # 音声データを直接再生します
#                 stream.write(audio_np.tobytes())
#             except Exception as e:
#                 print(chunk.choices[0].delta.content)

# time.sleep(0.8)
# # リソースをクリーンアップします
# stream.stop_stream()
# stream.close()
# p.terminate()

Base64 エンコードされたローカルファイルの入力

Base64 エンコーディングを使用してファイルを送信する場合、エンコードされた Base64 文字列は 10 MB 未満である必要があります。
  • 画像
  • 音声
  • 動画
この例では、ローカルに保存されたファイル eagle.png を使用します。
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",
)

# Base64 エンコード形式
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

base64_image = encode_image("eagle.png")

completion = client.chat.completions.create(
    model="qwen3.5-omni-plus", # Qwen3-Omni-Flash の場合は、ノンシンキングモードで実行します。
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{base64_image}"},
                },
                {"type": "text", "text": "What scene is depicted in the image?"},
            ],
        },
    ],
    # 出力モダリティを設定します。現在、["text","audio"] と ["text"] の 2 つのオプションがサポートされています
    modalities=["text", "audio"],
    audio={"voice": "Tina", "format": "wav"},
    # stream は True に設定する必要があります。そうしないと、エラーが発生します。
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in completion:
    if chunk.choices:
        print(chunk.choices[0].delta)
    else:
        print(chunk.usage)

API リファレンス

入力および出力パラメーターについては、「OpenAI 互換チャット」をご参照ください。

課金とレート制限

課金ルール Qwen-Omni は、モダリティ (音声、画像、動画) 全体で消費されたトークンに基づいて課金されます。課金の詳細はコンソールでご確認ください。
  • 音声
  • 画像
  • 動画
  • Qwen3.5-Omni シリーズ:
    • 入力オーディオの数式: Total tokens = Audio duration (秒) * 7
    • 出力音声の数式: 合計トークン = 音声の持続時間 (秒) * 12.5
  • Qwen3-Omni-Flash では、入力と出力の両方のオーディオについて、合計トークン = オーディオの持続時間 (秒) * 12.5 となります。
音声の持続時間が 1 秒未満の場合は、1 秒として計算されます。
無料クォータ 無料クォータの申請、クエリ、または使用については、「新規ユーザー向けの無料クォータ」をご参照ください。 レート制限 レート制限ルールとよくある質問については、「レート制限」をご参照ください。

エラーコード

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

音声リスト

Qwen-Omni モデルの音声リストについては、「音声リスト」をご参照ください。