Qwen-Omni-Realtime は、Qwen シリーズのリアルタイム音声・ビデオチャットモデルです。ビデオストリームからリアルタイムで抽出された連続した画像フレームなど、ストリーミング音声と画像入力を理解できます。また、高品質のテキストと音声をリアルタイムで生成することもできます。
使用方法
1. 接続の確立
Qwen-Omni-Realtime モデルには、WebSocket プロトコルを介してアクセスします。以下の Python コード例または DashScope SDK を使用して接続を確立できます。
Qwen-Omni-Realtime の単一の WebSocket セッションは、最大 30 分間持続します。この制限に達すると、サービスは自動的に接続を閉じます。
ネイティブ WebSocket 接続
以下の設定項目が必要です:
設定項目 | 説明 |
エンドポイント | 中国 (北京): wss://dashscope.aliyuncs.com/api-ws/v1/realtime 国際 (シンガポール): wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime |
クエリパラメーター | クエリパラメーターは `model` です。アクセスしたいモデルの名前に設定する必要があります。例: |
リクエストヘッダー | Bearer トークンを使用した認証: Authorization: Bearer DASHSCOPE_API_KEY DASHSCOPE_API_KEY は、Model Studio でリクエストした API キー です。 |
# pip install websocket-client
import json
import websocket
import os
API_KEY=os.getenv("DASHSCOPE_API_KEY")
API_URL = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime?model=qwen3-omni-flash-realtime"
headers = [
"Authorization: Bearer " + API_KEY
]
def on_open(ws):
print(f"Connected to server: {API_URL}")
def on_message(ws, message):
data = json.loads(message)
print("Received event:", json.dumps(data, indent=2))
def on_error(ws, error):
print("Error:", error)
ws = websocket.WebSocketApp(
API_URL,
header=headers,
on_open=on_open,
on_message=on_message,
on_error=on_error
)
ws.run_forever()DashScope SDK
# SDK バージョン 1.23.9 以降
import os
import json
from dashscope.audio.qwen_omni import OmniRealtimeConversation,OmniRealtimeCallback
import dashscope
# シンガポールリージョンと北京リージョンの API キーは異なります。API キーを取得するには、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください
# API キーを設定していない場合は、次の行を dashscope.api_key = "sk-xxx" に変更します
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
class PrintCallback(OmniRealtimeCallback):
def on_open(self) -> None:
print("Connected Successfully")
def on_event(self, response: dict) -> None:
print("Received event:")
print(json.dumps(response, indent=2, ensure_ascii=False))
def on_close(self, close_status_code: int, close_msg: str) -> None:
print(f"Connection closed (code={close_status_code}, msg={close_msg}).")
callback = PrintCallback()
conversation = OmniRealtimeConversation(
model="qwen3-omni-flash-realtime",
callback=callback,
# 以下はシンガポールリージョンの URL です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/realtime に置き換えてください
url="wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime"
)
try:
conversation.connect()
print("Conversation started. Press Ctrl+C to exit.")
conversation.thread.join()
except KeyboardInterrupt:
conversation.close()// SDK バージョン 2.20.9 以降
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) throws InterruptedException, NoApiKeyException {
CountDownLatch latch = new CountDownLatch(1);
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen3-omni-flash-realtime")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
// 以下はシンガポールリージョンの URL です。北京リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/realtime に置き換えてください
.url("wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime")
.build();
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
@Override
public void onOpen() {
System.out.println("Connected Successfully");
}
@Override
public void onEvent(JsonObject message) {
System.out.println(message);
}
@Override
public void onClose(int code, String reason) {
System.out.println("connection closed code: " + code + ", reason: " + reason);
latch.countDown();
}
});
conversation.connect();
latch.await();
conversation.close(1000, "bye");
System.exit(0);
}
}2. セッションの設定
session.update クライアントイベントを送信します:
{
// このイベントの ID。クライアントによって生成されます。
"event_id": "event_ToPZqeobitzUJnt3QqtWg",
// イベントタイプ。session.update に固定されています。
"type": "session.update",
// セッション設定。
"session": {
// 出力モダリティ。サポートされている値は ["text"] (テキストのみ) または ["text", "audio"] (テキストと音声) です。
"modalities": [
"text",
"audio"
],
// 出力音声のボイス。
"voice": "Cherry",
// 入力音声フォーマット。pcm16 のみがサポートされています。
"input_audio_format": "pcm16",
// 出力音声フォーマット。pcm24 のみがサポートされています。
"output_audio_format": "pcm24",
// システムメッセージ。モデルの目標やロールを設定するために使用されます。
"instructions": "あなたは五つ星ホテルの AI カスタマーサービスエージェントです。客室タイプ、施設、価格、予約ポリシーに関するお客様からのお問い合わせに、正確かつフレンドリに回答してください。常にプロフェッショナルで親切な態度で対応してください。未確認の情報やホテルのサービスの範囲を超える情報は提供しないでください。",
// 音声区間検出を有効にするかどうかを指定します。有効にするには、設定オブジェクトを渡します。サーバーは、このオブジェクトに基づいて音声の開始と終了を自動的に検出します。
// null に設定すると、クライアントがモデルの応答を開始するタイミングを決定します。
"turn_detection": {
// VAD タイプ。server_vad に設定する必要があります。
"type": "server_vad",
// VAD 検出のしきい値。騒がしい環境ではこの値を大きくし、静かな環境では小さくします。
"threshold": 0.5,
// 音声の終了を検出するための無音の持続時間。この値を超えると、モデルの応答がトリガーされます。
"silence_duration_ms": 800
}
}
}3. 音声と画像の入力
クライアントは、input_audio_buffer.append および input_image_buffer.append イベントを使用して、Base64 でエンコードされた音声および画像データをサーバーバッファーに送信します。音声入力は必須です。画像入力はオプションです。
画像は、ローカルファイルから、またはビデオストリームからリアルタイムでキャプチャできます。
サーバー側の音声区間検出 (VAD) が有効になっている場合、サーバーは音声の終了を検出すると自動的にデータを送信し、応答をトリガーします。VAD が無効になっている場合 (手動モード)、クライアントは input_audio_buffer.commit イベントを呼び出してデータを送信する必要があります。
4. モデルの応答を受信する
モデルの応答のフォーマットは、設定された出力モダリティによって異なります。
テキストのみ
response.text.delta イベントを介してストリーミングテキストを受信できます。response.text.done イベントで完全なテキストを取得できます。
テキストと音声
テキスト: response.audio_transcript.delta イベントを介してストリーミングテキストを受信できます。response.audio_transcript.done イベントで完全なテキストを取得できます。
音声: response.audio.delta イベントを介して、Base64 でエンコードされたストリーミング音声出力データを取得できます。response.audio.done イベントは、音声データの生成が完了したことを示します。
モデルリスト
Qwen3-Omni-Flash-Realtime は、Qwen シリーズの最新のリアルタイムマルチモーダルモデルです。更新されなくなる旧世代モデル Qwen-Omni-Turbo-Realtime と比較して、Qwen3-Omni-Flash-Realtime には次の利点があります:
サポートされている言語
サポートされている言語の数は 10 に増加しました。これには、中国語 (標準語および上海語、広東語、四川語などの方言)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語が含まれます。Qwen-Omni-Turbo-Realtime は、中国語 (標準語) と英語の 2 つの言語のみをサポートしています。
サポートされている音声
サポートされている音声の数は 17 に増加しました。Qwen-Omni-Turbo-Realtime は 4 つしかサポートしていません。詳細については、「音声リスト」をご参照ください。
国際 (シンガポール)
モデル | バージョン | コンテキストウィンドウ | 最大入力 | 最大出力 | 無料クォータ |
(トークン) | |||||
qwen3-omni-flash-realtime qwen3-omni-flash-realtime-2025-09-15 と同等 | 安定 | 65,536 | 49,152 | 16,384 | モダリティに関係なく、それぞれ 100 万トークン Model Studio をアクティベートしてから 90 日間有効 |
qwen3-omni-flash-realtime-2025-09-15 | スナップショット | ||||
中国 (北京)
モデル | バージョン | コンテキストウィンドウ | 最大入力 | 最大出力 | 無料クォータ |
(トークン) | |||||
qwen3-omni-flash-realtime qwen3-omni-flash-realtime-2025-09-15 と同等 | 安定 | 65,536 | 49,152 | 16,384 | 無料クォータなし |
qwen3-omni-flash-realtime-2025-09-15 | スナップショット | ||||
はじめに
「準備: API キーの取得と設定」および「API キーを環境変数として設定する (非推奨、API キーの設定に統合予定)」の手順を完了する必要があります。
使い慣れたプログラミング言語を選択し、以下の手順に従って Qwen-Omni-Realtime モデルとのリアルタイム対話をすばやく開始します。
DashScope Python SDK
ランタイム環境の準備
Python のバージョンは 3.10 以降である必要があります。
まず、オペレーティングシステムに基づいて pyaudio をインストールします。
macOS
brew install portaudio && pip install pyaudioDebian/Ubuntu
仮想環境を使用していない場合、システムのパッケージマネージャを使用して直接インストールできます:
sudo apt-get install python3-pyaudio仮想環境を使用している場合、まずコンパイルの依存関係をインストールする必要があります:
sudo apt update sudo apt install -y python3-dev portaudio19-dev次に、アクティブ化された仮想環境で pip を使用してインストールします:
pip install pyaudio
CentOS
sudo yum install -y portaudio portaudio-devel && pip install pyaudioWindows
pip install pyaudioインストールが完了したら、pip を使用して依存関係をインストールします:
pip install websocket-client dashscopeインタラクションモードの選択
VAD モード (音声区間検出、音声の開始と終了を自動的に検出)
サーバーは、ユーザーがいつ話し始め、いつ話し終えたかを自動的に判断し、それに応じて応答します。
手動モード (押して話し、離して送信)
クライアントは音声の開始と終了を制御します。ユーザーが話し終えた後、クライアントはサーバーに積極的にメッセージを送信する必要があります。
VAD モード
vad_dash.py という名前の新しい Python ファイルを作成し、次のコードをファイルにコピーします:
vad_dash.pyを実行して、マイクを通じて Qwen-Omni-Realtime モデルとリアルタイムで会話します。システムはあなたの音声の開始と終了を検出し、手動介入なしで自動的にサーバーに送信します。手動モード
manual_dash.pyという名前の新しい Python ファイルを作成し、次のコードをファイルにコピーします:manual_dash.pyを実行し、Enter キーを押して話し始め、再度 Enter キーを押してモデルの音声応答を受信します。
DashScope Java SDK
インタラクションモードの選択
VAD モード (音声区間検出、音声の開始と終了を自動的に検出)
Realtime API は、ユーザーがいつ話し始め、いつ話し終えたかを自動的に判断し、それに応じて応答します。
手動モード (押して話し、離して送信)
クライアントは音声の開始と終了を制御します。ユーザーが話し終えた後、クライアントはサーバーに積極的にメッセージを送信する必要があります。
VAD モード
OmniServerVad.main() メソッドを実行して、マイクを通じて Qwen-Omni-Realtime モデルとリアルタイムで会話します。システムはあなたの音声の開始と終了を検出し、手動介入なしで自動的にサーバーに送信します。
手動モード
OmniWithoutServerVad.main() メソッドを実行します。Enter キーを押して録音を開始します。録音中に再度 Enter キーを押すと、録音が停止し、音声が送信されます。その後、モデルの応答が受信され、再生されます。
WebSocket (Python)
ランタイム環境の準備
Python のバージョンは 3.10 以降である必要があります。
まず、オペレーティングシステムに基づいて pyaudio をインストールします。
macOS
brew install portaudio && pip install pyaudioDebian/Ubuntu
sudo apt-get install python3-pyaudio or pip install pyaudiopip install pyaudioの使用を推奨します。インストールが失敗した場合は、まずオペレーティングシステムのportaudio依存関係をインストールしてください。CentOS
sudo yum install -y portaudio portaudio-devel && pip install pyaudioWindows
pip install pyaudioインストールが完了したら、pip を使用して websocket 関連の依存関係をインストールします:
pip install websockets==15.0.1クライアントの作成
ローカルディレクトリに
omni_realtime_client.pyという名前の新しい Python ファイルを作成し、次のコードをファイルにコピーします:インタラクションモードの選択
VAD モード (音声区間検出、音声の開始と終了を自動的に検出)
Realtime API は、ユーザーがいつ話し始め、いつ話し終えたかを自動的に判断し、それに応じて応答します。
手動モード (押して話し、離して送信)
クライアントは音声の開始と終了を制御します。ユーザーが話し終えた後、クライアントはサーバーに積極的にメッセージを送信する必要があります。
VAD モード
omni_realtime_client.pyと同じディレクトリに、vad_mode.pyという名前の別の Python ファイルを作成し、次のコードをファイルにコピーします:vad_mode.pyを実行して、マイクを通じて Qwen-Omni-Realtime モデルとリアルタイムで会話します。システムはあなたの音声の開始と終了を検出し、手動介入なしで自動的にサーバーに送信します。手動モード
omni_realtime_client.pyと同じディレクトリに、manual_mode.pyという名前の別の Python ファイルを作成し、次のコードをファイルにコピーします:manual_mode.pyを実行し、Enter キーを押して話し始め、再度 Enter キーを押してモデルの音声応答を受信します。
インタラクションフロー
VAD モード
session.update イベントの session.turn_detection を "server_vad" に設定して VAD モードを有効にします。このモードでは、サーバーは音声の開始と終了を自動的に検出し、それに応じて応答します。このモードは、音声通話シナリオに適しています。
インタラクションフローは次のとおりです:
サーバーは音声の開始を検出し、input_audio_buffer.speech_started イベントを送信します。
クライアントはいつでも input_audio_buffer.append および input_image_buffer.append イベントを送信して、音声と画像をバッファーに追加できます。
input_image_buffer.append イベントを送信する前に、少なくとも 1 つの input_audio_buffer.append イベントを送信する必要があります。
サーバーは音声の終了を検出し、input_audio_buffer.speech_stopped イベントを送信します。
サーバーは input_audio_buffer.committed イベントを送信して、オーディオバッファーをコミットします。
サーバーは conversation.item.created イベントを送信します。これには、バッファーから作成されたユーザーメッセージ項目が含まれます。
ライフサイクル | クライアントイベント | サーバーイベント |
セッションの初期化 | セッション設定 | セッションが作成されました セッション設定が更新されました |
ユーザーの音声入力 | バッファーに音声を追加 バッファーに画像を追加 | input_audio_buffer.speech_started 音声開始を検出 input_audio_buffer.speech_stopped 音声終了を検出 サーバーが送信された音声を受信しました |
サーバーの音声出力 | なし | サーバーが応答の生成を開始します 応答中の新しい出力コンテンツ 会話項目が作成されました アシスタントメッセージに新しい出力コンテンツが追加されました response.audio_transcript.delta インクリメンタルに生成された文字起こしテキスト モデルからインクリメンタルに生成された音声 response.audio_transcript.done テキストの文字起こしが完了しました 音声生成が完了しました アシスタントメッセージのテキストまたは音声コンテンツのストリーミングが完了しました アシスタントメッセージの出力項目全体のストリーミングが完了しました 応答が完了しました |
手動モード
session.update イベントの session.turn_detection を null に設定して手動モードを有効にします。このモードでは、クライアントは input_audio_buffer.commit および response.create イベントを明示的に送信してサーバーの応答を要求します。このモードは、チャットアプリケーションで音声メッセージを送信するなど、プッシュツートークシナリオに適しています。
インタラクションフローは次のとおりです:
クライアントはいつでも input_audio_buffer.append および input_image_buffer.append イベントを送信して、音声と画像をバッファーに追加できます。
input_image_buffer.append イベントを送信する前に、少なくとも 1 つの input_audio_buffer.append イベントを送信する必要があります。
クライアントは input_audio_buffer.commit イベントを送信して、音声および画像バッファーをコミットします。これにより、現在のターンのすべてのユーザー入力 (音声と画像を含む) が送信されたことがサーバーに通知されます。
サーバーは input_audio_buffer.committed イベントで応答します。
クライアントは response.create イベントを送信し、サーバーからのモデルの出力を待ちます。
サーバーは conversation.item.created イベントで応答します。
ライフサイクル | クライアントイベント | サーバーイベント |
セッションの初期化 | セッション設定 | セッションが作成されました セッション設定が更新されました |
ユーザーの音声入力 | バッファーに音声を追加 バッファーに画像を追加 音声と画像をサーバーに送信 モデル応答を作成 | サーバーが送信された音声を受信しました |
サーバーの音声出力 | バッファーから音声をクリア | サーバーが応答の生成を開始します 応答中の新しい出力コンテンツ 会話項目が作成されました アシスタントメッセージ項目に新しい出力コンテンツが追加されました response.audio_transcript.delta インクリメンタルに生成された文字起こしテキスト モデルからインクリメンタルに生成された音声 response.audio_transcript.done テキストの文字起こしが完了しました 音声生成が完了しました アシスタントメッセージのテキストまたは音声コンテンツのストリーミングが完了しました アシスタントメッセージの出力項目全体のストリーミングが完了しました 応答が完了しました |
API リファレンス
課金とスロットリング
課金ルール
Qwen-Omni-Realtime モデルは、音声や画像など、さまざまな入力モダリティに使用されるトークンの数に基づいて課金されます。課金の詳細については、「モデルリスト」をご参照ください。
スロットリング
モデルのスロットリングルールの詳細については、「スロットリング」をご参照ください。
エラーコード
呼び出しが失敗した場合は、「エラーメッセージ」を参照してトラブルシューティングを行ってください。
音声リスト
Qwen3-Omni-Flash-Realtime
名前 |
| 音声効果 | 説明 | サポートされている言語 |
Cherry | Cherry | 明るく、フレンドリで、自然な若い女性の声。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Ethan | Ethan | わずかな北方なまりのある標準中国語。明るく、温かく、エネルギッシュな声。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Nofish | Nofish | そり舌音を使用しないデザイナー。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Jennifer | Jennifer | プレミアムで映画のようなアメリカ英語の女性音声。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Ryan | Ryan | リアリズムと緊張感を備えた、リズミカルでドラマチックな声。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Katerina | Katerina | 成熟したリズミカルな女性の声。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
エリアス | エリアス | 学術的な厳密さと明確なストーリーテリングで、複雑なトピックを解説します。 | 中国語、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Shanghai-Jada | Jada | 上海出身の活発な女性。 | 中国語 (上海語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Beijing-Dylan | Dylan | 北京の胡同で育った 10代の少年。 | 中国語 (北京語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Sichuan-Sunny | Sunny | 四川の甘い女性の声。 | 中国語 (四川語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
南京-Li | Li | 忍耐強いヨガの先生です。 | 中国語 (南京方言)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
Shaanxi-Marcus | マーカス | 陝西なまりの誠実で深みのある音声。 | 中国語 (陝西方言)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
マン・ナン・ロイ | ロイ | ユーモラスで活気のある、閩南語なまりの若い男性の声。 | 中国語 (閩南語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
天津-ピーター | ピーター | 天津クロストークのツッコミ役用の声。 | 中国語 (天津方言)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
カントニーズ-ロッキー | Rocky | オンラインチャット向けの、ウィットに富んだユーモラスな男性の声。 | 中国語 (広東語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
広東語-Kiki | キキ | 香港出身の優しい親友。 | 中国語 (広東語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 | |
四川-Eric | エリック | 四川省成都の、型破りで洗練された男性の声。 | 中国語 (四川語)、英語、フランス語、ドイツ語、ロシア語、イタリア語、スペイン語、ポルトガル語、日本語、韓国語、タイ語 |
Qwen-Omni-Turbo-Realtime
名前 |
| 音声効果 | 説明 | 対応言語 |
Cherry | Cherry | 明るく、フレンドリで、誠実な若い女性。 | 中国語、英語 | |
Serena | Serena | 親切な若い女性。 | 中国語、英語 | |
Ethan | Ethan | 標準的な中国語に、わずかな北方なまりがあります。明るく、温かく、エネルギッシュな声です。 | 中国語、英語 | |
Chelsie | Chelsie | アニメ風のバーチャル彼女の声です。 | 中国語、英語 |