DashScope SDK for Python を使用して Qwen-LiveTranslate を呼び出し、リアルタイム音声翻訳を実行します。
前提条件
- SDK をインストールします。DashScope SDK のバージョンが 1.25.6 以降であることを確認してください。
- API キーを取得します。
重要Alibaba Cloud Model Studio は、中国 (北京) およびシンガポールの各リージョン向けにワークスペース固有ドメインをリリースしました。これらの新しい専用ドメインにより、推論リクエストのパフォーマンスと安定性が向上します。以下の新しいドメインへの移行を推奨します:
- 中国 (北京):
wss://dashscope.aliyuncs.comからwss://{WorkspaceId}.cn-beijing.maas.aliyuncs.comへ - シンガポール:
wss://dashscope-intl.aliyuncs.comからwss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.comへ
{WorkspaceId} はワークスペース ID です。Alibaba Cloud Model Studio コンソールの ワークスペースの詳細 ページで確認できます。既存のドメインは引き続き問題なく利用できます。
リクエストパラメーター
-
OmniRealtimeConversationクラスのコンストラクターで、以下のパラメーターを設定します。サンプルコードの表示
from dashscope.audio.qwen_omni import ( OmniRealtimeConversation, OmniRealtimeCallback, MultiModality, ) from dashscope.audio.qwen_omni.omni_realtime import TranslationParams class MyCallback(OmniRealtimeCallback): """リアルタイム音声翻訳のコールバックハンドラー""" def __init__(self, conversation=None): self.conversation = conversation self.handlers = { 'session.created': self._handle_session_created, 'response.audio_transcript.done': self._handle_translation_done, 'response.audio.delta': self._handle_audio_delta, 'response.done': lambda r: print('======Response Done======'), 'input_audio_buffer.speech_started': lambda r: print('======Speech Start======'), 'input_audio_buffer.speech_stopped': lambda r: print('======Speech Stop======'), } def on_open(self): print('Connection opened') def on_close(self, code, msg): print(f'Connection closed, code: {code}, msg: {msg}') def on_event(self, response): try: handler = self.handlers.get(response['type']) if handler: handler(response) except Exception as e: print(f'[Error] {e}') def _handle_session_created(self, response): print(f"Session created: {response['session']['id']}") def _handle_translation_done(self, response): print(f"Translation result: {response['transcript']}") def _handle_audio_delta(self, response): # インクリメンタルな音声データを処理します。 audio_b64 = response.get('delta', '') # 音声データをデコードして再生または保存します。 conversation = OmniRealtimeConversation( model='qwen3.5-livetranslate-flash-realtime', # 中国 (北京) リージョン。{WorkspaceId} をお使いの Bailian ワークスペース ID に置き換えてください。URL はリージョンによって異なります。 url='wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime', callback=MyCallback(conversation=None) # 一時的に None を渡します。後でインジェクトされます。 ) # コールバックに self をインジェクトします。 conversation.callback.conversation = conversationパラメーター タイプ 必須 説明 modelstrはい
使用するモデル名。
qwen3.5-livetranslate-flash-realtime(推奨) に設定します。qwen3-livetranslate-flash-realtimeはレガシーモデルです。callbackOmniRealtimeCallbackはい
サーバーサイドのイベントを処理するためのコールバックインスタンス。
urlstrはい
リアルタイム音声翻訳のサービスエンドポイント:
- 中国 (北京):
wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime - シンガポール:
wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime
{WorkspaceId}を実際の ワークスペース ID に置き換えてください。 - 中国 (北京):
-
OmniRealtimeConversationクラスのupdate_sessionメソッドを使用して、以下のパラメーターを設定します。サンプルコードの表示
# 翻訳パラメーターの設定 translation_params = TranslationParams( language='en', # ターゲット言語 corpus=TranslationParams.Corpus( phrases={ 'Inteligencia Artificial': 'Artificial Intelligence', 'Aprendizaje Automático': 'Machine Learning' } ) ) # セッション設定の更新 conversation.update_session( output_modalities=[MultiModality.TEXT, MultiModality.AUDIO], voice='Tina', translation_params=translation_params, )パラメーター
タイプ
必須
説明
output_modalitiesList[MultiModality]いいえ
翻訳結果の出力フォーマット。
デフォルト:
[MultiModality.TEXT, MultiModality.AUDIO]有効値:
[MultiModality.TEXT]:テキストのみを出力[MultiModality.TEXT, MultiModality.AUDIO]:テキストと音声を出力
voicestrいいえ
音声出力のボイス。
デフォルト:
Qwen3.5-LiveTranslate-Flash-Realtime:
TinaQwen3-LiveTranslate-Flash-Realtime:
Cherry
有効値: サポートされているボイス
input_audio_transcription_modelstrいいえ
このパラメーターを
qwen3-asr-flash-realtimeに設定すると、ソース言語の音声認識結果を受信できます。translation_paramsTranslationParamsいいえ
翻訳設定 (ターゲット言語とホットワード)。
enable_turn_detectionboolいいえ
音声アクティビティ検出 (VAD) を有効にするかどうか。
デフォルト値:
True。 サーバーが音声の開始/終了を自動検出し、翻訳をトリガーする VAD モードを有効にします。Falseに設定すると手動モードに切り替わり、クライアントはcommitメソッドを使って手動で音声を送信します。パラメーターの詳細な説明については、クライアントイベントドキュメントのturn_detectionの説明をご参照ください。 -
TranslationParamsクラスのコンストラクターで、以下のパラメーターを設定します。サンプルコードの表示
translation_params = TranslationParams( language='en', # ターゲット言語コード corpus=TranslationParams.Corpus( phrases={ 'Inteligencia Artificial': 'Artificial Intelligence', # ソースフレーズ:ターゲット翻訳 'Aprendizaje Automático': 'Machine Learning' } ) )パラメーター
タイプ
必須
説明
languagestrいいえ
翻訳のターゲット言語。
デフォルト:
en有効値: サポートされている言語
corpusTranslationParams.Corpusいいえ
特定の用語の翻訳精度を向上させるためのホットワードマッピング。
corpus.phrasesdictいいえ
キーがソース用語で、値がターゲット翻訳であるホットワードマッピングテーブル。
例:
{'Inteligencia Artificial': 'Artificial Intelligence'}
主要なインターフェイス
OmniRealtimeConversation クラス
インポート: from dashscope.audio.qwen_omni import OmniRealtimeConversation
| メソッドシグネチャ | サーバーサイドのレスポンスイベント (コールバック経由で送信) | 説明 |
|---|---|---|
|
| サーバーに接続します。 |
| サーバーサイドイベント
| セッション設定を更新します。接続後すぐに呼び出します。このメソッドを呼び出さない場合、デフォルト設定が適用されます。 |
|
| セッションを終了します。サーバーは最終的な翻訳処理を完了します。 |
| None | Base64 エンコードされた音声チャンクをサーバーに送信します。音声検出と翻訳は自動的に行われます。 |
|
| 手動モードでは、 |
|
| 現在のサーバーバッファー内のコミットされていない音声データをクリアします。 |
| None | タスクを停止し、接続を閉じます。 |
| None | セッション ID を取得します。 |
| None | 最後のレスポンス ID を取得します。 |
コールバックインターフェイス (OmniRealtimeCallback)
コールバック経由でサーバーのイベントとデータを受信します。
このクラスを継承し、そのメソッドを実装してサーバーからのイベントを処理します。
インポート: from dashscope.audio.qwen_omni import OmniRealtimeCallback
| メソッドシグネチャ | パラメーター | 説明 |
|---|---|---|
| None | WebSocket 接続が開いたときに呼び出されます。 |
| message: サーバーサイドイベント | サーバーがイベントを送信したときに呼び出されます。 |
| close_status_code:ステータスコード。 close_msg:WebSocket 接続が閉じられたときのログメッセージ。 | WebSocket 接続が閉じたときに呼び出されます。 |
完全なサンプルコード
この例では、マイクの音声を録音し、リアルタイムで翻訳します。
マイクからのリアルタイム翻訳のサンプルコード
import os
import sys
import base64
import signal
import pyaudio
from dashscope.audio.qwen_omni import (
OmniRealtimeConversation,
OmniRealtimeCallback,
MultiModality,
)
from dashscope.audio.qwen_omni.omni_realtime import TranslationParams
class Callback(OmniRealtimeCallback):
"""リアルタイム翻訳のコールバックハンドラークラス"""
def __init__(self, speaker):
self.speaker = speaker
def on_open(self):
print("[Connection established]")
def on_close(self, code, msg):
print(f"[Connection closed] code: {code}, msg: {msg}")
def on_event(self, response):
event_type = response.get("type", "")
if event_type == "input_audio_buffer.speech_started":
print("====== Speech input detected ======")
elif event_type == "input_audio_buffer.speech_stopped":
print("====== Speech input ended ======")
elif event_type == "conversation.item.input_audio_transcription.completed":
print(f"[Original text] {response.get('transcript', '')}")
elif event_type == "response.audio_transcript.done":
print(f"[Translation result] {response.get('transcript', '')}")
elif event_type == "response.audio.delta":
audio_b64 = response.get("delta", "")
if audio_b64:
self.speaker.write(base64.b64decode(audio_b64))
elif event_type == "error":
print(f"[Error] {response.get('error', {}).get('message', '')}")
def main():
# API キーの確認。
if not os.environ.get("DASHSCOPE_API_KEY"):
print("Set the DASHSCOPE_API_KEY environment variable.")
sys.exit(1)
# PyAudio の初期化。
pya = pyaudio.PyAudio()
# 翻訳された音声を再生するためのスピーカーを初期化します。
speaker = pya.open(
format=pyaudio.paInt16,
channels=1,
rate=24000,
output=True,
frames_per_buffer=2400
)
# 音声入力をキャプチャするためのマイクを初期化します。
mic = pya.open(
format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True,
frames_per_buffer=1600
)
# コールバックインスタンスを作成します。
callback = Callback(speaker=speaker)
# リアルタイムセッションを作成します。
conversation = OmniRealtimeConversation(
model="qwen3.5-livetranslate-flash-realtime",
# 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
url="wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime",
callback=callback
)
# サーバーに接続します。
conversation.connect()
# 翻訳パラメーターを設定します。
translation_params = TranslationParams(
language="en", # 翻訳のターゲット言語:英語
corpus=TranslationParams.Corpus(
phrases={
"Source Term 1": "Target Translation 1",
"Source Term 2": "Target Translation 2"
}
)
)
# セッション設定を更新します。
conversation.update_session(
output_modalities=[MultiModality.TEXT, MultiModality.AUDIO],
input_audio_transcription_model="qwen3-asr-flash-realtime",
voice="Tina",
translation_params=translation_params,
)
# 終了シグナルハンドラーを登録します。
def on_exit(sig, frame):
print("\n[Exiting...]")
mic.stop_stream()
mic.close()
speaker.stop_stream()
speaker.close()
pya.terminate()
conversation.end_session()
conversation.close()
sys.exit(0)
signal.signal(signal.SIGINT, on_exit)
print("[Starting real-time translation] Speak into the microphone. Press Ctrl+C to exit.")
# マイク音声を継続的にキャプチャして送信します。
while True:
audio_data = mic.read(1600, exception_on_overflow=False)
conversation.append_audio(base64.b64encode(audio_data).decode("ascii"))
if __name__ == "__main__":
main()