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

Alibaba Cloud Model Studio:Qwen-LiveTranslate Java SDK - API リファレンス

最終更新日:Sep 02, 2026

DashScope Java SDK と qwen3.5-livetranslate-flash-realtime モデルを使用して、音声をリアルタイムで翻訳します。SDK は WebSocket 経由で接続し、音声入力をストリーミングして、翻訳されたテキストと合成音声を返します。

事前準備

  1. DashScope SDK バージョン 2.22.5 以降をインストールします。
  2. API キーを取得します。
  3. API キーを環境変数として設定します:
   # Linux / macOS
   export DASHSCOPE_API_KEY=<your-api-key>
   source ~/.bashrc

   # Windows
   set DASHSCOPE_API_KEY=<your-api-key>
  1. Qwen-LiveTranslate モデルの概要で、サポートされている言語と音声を確認します。

重要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} は、Alibaba Cloud Model Studio コンソールの [ワークスペース詳細] ページで確認できるワークスペース ID です。既存のドメインも引き続き完全に機能します。

クイックスタート

接続し、音声を送信し、翻訳されたテキストを受信します:

import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import java.util.Arrays;

// 1. 接続パラメーターを構築します
OmniRealtimeParam param = OmniRealtimeParam.builder()
        .model("qwen3.5-livetranslate-flash-realtime")
        // 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
        .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
        .apikey(System.getenv("DASHSCOPE_API_KEY"))
        .build();

// 2. サーバーイベントを処理するためのコールバックを定義します
OmniRealtimeCallback callback = new OmniRealtimeCallback() {
    @Override public void onOpen() { System.out.println("Connected"); }

    @Override
    public void onEvent(JsonObject message) {
        String type = message.get("type").getAsString();
        if ("response.audio_transcript.done".equals(type)) {
            System.out.println("Translation: " + message.get("transcript").getAsString());
        }
    }

    @Override
    public void onClose(int code, String reason) {
        System.out.println("Closed: " + code + " " + reason);
    }
};

// 3. セッションを開き、音声のストリーミングを開始します
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, callback);
conversation.connect();

// 4. 翻訳のターゲット言語を設定します
OmniRealtimeConfig config = OmniRealtimeConfig.builder()
        .modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
        .translationConfig(OmniRealtimeTranslationParam.builder()
                .language("en")
                .build())
        .build();
conversation.updateSession(config);

// 5. Base64 エンコードされた音声チャンク (PCM 16 kHz, 16-bit, モノラル) を送信します
conversation.appendAudio(audioBase64);

// 6. 完了したらセッションを終了します
conversation.endSession();

リクエストパラメーター

OmniRealtimeParam

WebSocket 接続を確立するために、OmniRealtimeParam.builder() を使用してこれらを構築します。

サンプルコードを表示するにはクリックしてください

OmniRealtimeParam param = OmniRealtimeParam.builder()
        .model("qwen3.5-livetranslate-flash-realtime")
        // 以下はシンガポールリージョンの URL です。{WorkspaceId} を実際のワークスペース ID に置き換えてください。URL はリージョンによって異なります。
        .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
        // API キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください
        // 環境変数が設定されていない場合は、次の行をお使いの Model Studio API キーに置き換えてください: .apikey("sk-xxx")
        .apikey(System.getenv("DASHSCOPE_API_KEY"))
        .build();

パラメーター

タイプ

必須

説明

model

String

はい

モデル名。qwen3.5-livetranslate-flash-realtime を推奨します。qwen3-livetranslate-flash-realtime はレガシーモデルです。

url

String

はい

WebSocket エンドポイント。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 に置き換えてください。

apikey

String

いいえ

認証用の API キー。設定しない場合は、DASHSCOPE_API_KEY 環境変数を介して設定します。

OmniRealtimeConfig

OmniRealtimeConfig.builder() でこれらを構築し、接続後に conversation.updateSession(config) を呼び出します。

サンプルコードを表示するにはクリックしてください

// カスタム翻訳フレーズを設定します
Map<String, Object> phrases = new HashMap<>();
phrases.put("Inteligencia Artificial", "Artificial Intelligence");
phrases.put("Aprendizaje Automático", "Machine Learning");

OmniRealtimeConfig config = OmniRealtimeConfig.builder()
        .modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
        .voice("Cherry")
        .inputAudioFormat(OmniRealtimeAudioFormat.PCM_16000HZ_MONO_16BIT)
        .outputAudioFormat(OmniRealtimeAudioFormat.PCM_24000HZ_MONO_16BIT)
        .InputAudioTranscription("qwen3-asr-flash-realtime")
        .translationConfig(OmniRealtimeTranslationParam.builder()
                .language("en")
                .corpus(OmniRealtimeTranslationParam.Corpus.builder()
                        .phrases(phrases)
                        .build())
                .build())
        .build();

conversation.updateSession(config);

パラメーター

タイプ

必須

説明

modalities

List<OmniRealtimeModality>

いいえ

出力モダリティ。デフォルト:[AUDIO, TEXT]。テキストのみの出力には [TEXT] を使用します。

voice

String

いいえ

合成音声のボイス。デフォルトのボイスはモデルによって異なります:qwen3.5-livetranslate-flash-realtime の場合は Tinaqwen3-livetranslate-flash-realtime の場合は Cherry です。サポートされている音声をご参照ください。

inputAudioFormat

OmniRealtimeAudioFormat

いいえ

入力音声フォーマット。デフォルト:PCM_16000HZ_MONO_16BIT

outputAudioFormat

OmniRealtimeAudioFormat

いいえ

出力音声フォーマット。デフォルト:PCM_24000HZ_MONO_16BIT

InputAudioTranscription

String

いいえ

元の音声を文字起こしするための ASR モデル。qwen3-asr-flash-realtime に設定すると、翻訳と同時にソース言語の文字起こしを受信できます。

translationConfig

OmniRealtimeTranslationParam

いいえ

翻訳設定。下記の OmniRealtimeTranslationParam をご参照ください。

enableTurnDetection

boolean

いいえ

VAD (音声アクティビティ検出) を有効にするかどうか。

デフォルト値:true。この場合、VAD モードが有効になり、サーバーが自動的に発話の開始/終了を検出し、翻訳をトリガーします。

false に設定すると手動モードに切り替わり、クライアントが commit() メソッドを介して手動で音声を送信します。詳細なパラメーター説明については、クライアントイベントドキュメントの turn_detection の説明をご参照ください。

OmniRealtimeTranslationParam

OmniRealtimeTranslationParam.builder() を使用して、ターゲット言語とカスタム用語を構築します。

サンプルコードを表示するにはクリックしてください

// 翻訳フレーズを設定します
Map<String, Object> phrases = new HashMap<>();
phrases.put("Inteligencia Artificial", "Artificial Intelligence");  // ソース言語の単語:ターゲット言語の翻訳
phrases.put("Aprendizaje Automático", "Machine Learning");

OmniRealtimeTranslationParam translationParam = OmniRealtimeTranslationParam.builder()
        .language("en")  // ターゲット言語コード
        .corpus(OmniRealtimeTranslationParam.Corpus.builder()
                .phrases(phrases)
                .build())
        .build();

パラメーター

タイプ

必須

説明

language

String

いいえ

ターゲット言語コード。デフォルト:enサポートされている言語をご参照ください。

corpus

Corpus

いいえ

ドメイン固有の用語のためのカスタム用語。

corpus.phrases

Map<String, Object>

いいえ

用語マッピング:キーはソース用語、値はターゲット翻訳です。例:{"Inteligencia Artificial": "Artificial Intelligence"}

主要なインターフェイス

OmniRealtimeConversation

WebSocket 接続と音声ストリーミングのライフサイクルを管理します。

インポートcom.alibaba.dashscope.audio.omni.OmniRealtimeConversation

メソッド

説明

OmniRealtimeConversation(OmniRealtimeParam param, OmniRealtimeCallback callback)

接続パラメーターとイベントコールバックを持つ会話インスタンスを作成します。

void connect()

WebSocket 接続を開きます。session.created および session.updated イベントをトリガーします。NoApiKeyExceptionInterruptedException をスローします。

void updateSession(OmniRealtimeConfig config)

接続後にセッション構成を更新します。session.updated イベントをトリガーします。必要なパラメーターのみを設定してください。省略されたパラメーターにはデフォルト値が適用されます。

void appendAudio(String audioBase64)

Base64 エンコードされた音声チャンクをサーバーに送信します。サーバーは自動的に発話の境界を検出し、翻訳をトリガーします。

void commit()

手動モードでは、appendAudio メソッドを介して以前にサーバーバッファーに追加された音声をコミットします。サーバーはコミットを受信すると自動的に翻訳応答の生成を開始します。VAD モードでは、サーバーが自動的にコミットするため、このメソッドを呼び出す必要はありません。input_audio_buffer.committed イベントをトリガーします。

void clearAppendedAudio()

サーバーバッファーからコミットされていない音声データをクリアします。input_audio_buffer.cleared イベントをトリガーします。

void endSession()

セッションを正常に終了します。サーバーは、session.finished を送信する前に、進行中の翻訳を完了します。InterruptedException をスローします。

void close(int code, String reason)

タスクを停止し、WebSocket 接続を閉じます。

String getSessionId()

セッション ID を返します。

String getResponseId()

最新のサーバー応答の応答 ID を返します。

long getFirstTextDelay()

最新の応答の最初のテキスト遅延 (ミリ秒) を返します。

long getFirstAudioDelay()

最新の応答の最初の音声遅延 (ミリ秒) を返します。

OmniRealtimeCallback

WebSocket を介して配信されるサーバーイベントを処理します。このクラスを拡張し、各メソッドを実装してイベントを処理します。

インポートcom.alibaba.dashscope.audio.omni.OmniRealtimeCallback

メソッド

パラメーター

説明

void onOpen()

なし

WebSocket 接続が確立されたときに呼び出されます。

abstract void onEvent(JsonObject message)

messageサーバー側イベントを含む JSON オブジェクト。

各サーバーイベントに対して呼び出されます。type フィールドを解析してイベントの種類を判別します。

abstract void onClose(int code, String reason)

code:WebSocket 状態コード。reason:クローズの説明。

WebSocket 接続が閉じられたときに呼び出されます。

onEvent で受信される一般的なイベントタイプ:

イベントタイプ

説明

input_audio_buffer.speech_started

サーバーが音声ストリームで発話を検出しました。

input_audio_buffer.speech_stopped

サーバーが発話セグメントの終了を検出しました。

conversation.item.input_audio_transcription.completed

ソース言語の文字起こしが準備完了です。message.get("transcript") を読み取ります。InputAudioTranscription の設定が必要です。

response.audio_transcript.done

翻訳されたテキストが準備完了です。message.get("transcript") を読み取ります。

response.audio.delta

翻訳された音声のチャンクが利用可能です。Base64 エンコードされた音声データについては message.get("delta") を読み取ります。

error

エラーが発生しました。詳細については message.get("error").getAsJsonObject().get("message") を読み取ります。

完全な例

この例では、マイクの音声をキャプチャし、リアルタイムで翻訳し、翻訳された音声をシステムスピーカーで再生します。

この例の動作

  1. WebSocket を介して Qwen-LiveTranslate に接続します。
  2. カスタム用語を使用して、スペイン語から英語への翻訳を設定します。
  3. マイクの音声を 100 ms のチャンクでストリーミングします。
  4. 元の文字起こしと翻訳されたテキストを出力します。
  5. 翻訳された音声をスピーカーで再生します。

リアルタイムマイク翻訳のサンプルコード

import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;

import javax.sound.sampled.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * マイクをリアルタイム音声・動画翻訳モデルで使用する例です。
 */
public class Main {
    private static final int INPUT_CHUNK_SIZE = 3200;   // 16 kHz、16-bit、モノラル音声の 100 ms
    private static final int OUTPUT_CHUNK_SIZE = 4800;  // 24 kHz、16-bit、モノラル音声の 100 ms
    private static final AtomicBoolean running = new AtomicBoolean(true);
    private static SourceDataLine speaker;  // スピーカー

    public static void main(String[] args) throws InterruptedException {
        String apiKey = System.getenv("DASHSCOPE_API_KEY");
        if (apiKey == null || apiKey.isEmpty()) {
            System.err.println("DASHSCOPE_API_KEY 環境変数を設定してください。");
            System.exit(1);
        }

        // 接続パラメーターを作成します。
        OmniRealtimeParam param = OmniRealtimeParam.builder()
                .model("qwen3.5-livetranslate-flash-realtime")
                .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
                .apikey(apiKey)
                .build();

        // コールバックハンドラを作成します。
        OmniRealtimeCallback callback = new OmniRealtimeCallback() {
            @Override
            public void onOpen() {
                System.out.println("[接続が確立されました]");
            }

            @Override
            public void onEvent(JsonObject message) {
                String type = message.get("type").getAsString();
                switch (type) {
                    case "input_audio_buffer.speech_started":
                        System.out.println("====== 音声入力が検出されました ======");
                        break;
                    case "input_audio_buffer.speech_stopped":
                        System.out.println("====== 音声入力が終了しました ======");
                        break;
                    case "conversation.item.input_audio_transcription.completed":
                        String originalText = message.get("transcript").getAsString();
                        System.out.println("[元のテキスト] " + originalText);
                        break;
                    case "response.audio_transcript.done":
                        String translatedText = message.get("transcript").getAsString();
                        System.out.println("[翻訳結果] " + translatedText);
                        break;
                    case "response.audio.delta":
                        // 翻訳された音声をデコードして再生します。
                        String audioB64 = message.get("delta").getAsString();
                        byte[] audioBytes = Base64.getDecoder().decode(audioB64);
                        if (speaker != null) {
                            speaker.write(audioBytes, 0, audioBytes.length);
                        }
                        break;
                    case "error":
                        JsonObject error = message.get("error").getAsJsonObject();
                        System.err.println("[エラー] " + error.get("message").getAsString());
                        break;
                }
            }

            @Override
            public void onClose(int code, String reason) {
                System.out.println("[接続が閉じられました] code: " + code + ", reason: " + reason);
            }
        };

        // セッションを作成します。
        OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, callback);

        try {
            // スピーカーを初期化します (翻訳された音声を再生するため)。
            AudioFormat speakerFormat = new AudioFormat(24000, 16, 1, true, false);
            DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class, speakerFormat);
            speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
            speaker.open(speakerFormat, OUTPUT_CHUNK_SIZE * 4);
            speaker.start();

            // マイクを初期化します (音声入力をキャプチャするため)。
            AudioFormat micFormat = new AudioFormat(16000, 16, 1, true, false);
            DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class, micFormat);
            if (!AudioSystem.isLineSupported(micInfo)) {
                System.err.println("マイクが利用できません。");
                System.exit(1);
            }
            TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(micInfo);
            microphone.open(micFormat);
            microphone.start();

            // サーバーに接続します。
            conversation.connect();

            // 翻訳パラメーターを設定します。
            Map<String, Object> phrases = new HashMap<>();
            phrases.put("Inteligencia Artificial", "Artificial Intelligence");
            phrases.put("Aprendizaje Automático", "Machine Learning");

            OmniRealtimeConfig config = OmniRealtimeConfig.builder()
                    .modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
                    .voice("Cherry")
                    .inputAudioFormat(OmniRealtimeAudioFormat.PCM_16000HZ_MONO_16BIT)
                    .outputAudioFormat(OmniRealtimeAudioFormat.PCM_24000HZ_MONO_16BIT)
                    .InputAudioTranscription("qwen3-asr-flash-realtime")
                    .translationConfig(OmniRealtimeTranslationParam.builder()
                            .language("en")
                            .corpus(OmniRealtimeTranslationParam.Corpus.builder()
                                    .phrases(phrases)
                                    .build())
                            .build())
                    .build();

            conversation.updateSession(config);

            // シャットダウンフックを登録します。
            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                System.out.println("\n[終了中...]");
                running.set(false);
                microphone.stop();
                microphone.close();
                speaker.stop();
                speaker.close();
                try {
                    conversation.endSession();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                conversation.close(1000, "User stopped");
            }));

            System.out.println("[リアルタイム翻訳を開始します] マイクに向かって話してください。Ctrl+C で終了します。");

            // マイクの音声を継続的にキャプチャして送信します。
            byte[] buffer = new byte[INPUT_CHUNK_SIZE];
            while (running.get()) {
                int bytesRead = microphone.read(buffer, 0, buffer.length);
                if (bytesRead > 0) {
                    conversation.appendAudio(Base64.getEncoder().encodeToString(buffer));
                }
            }

        } catch (NoApiKeyException e) {
            System.err.println("API キーエラー: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("例外が発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

プレースホルダーを実際の値に置き換えてください:

プレースホルダー

説明

<your-api-key>

Model Studio API キー

sk-xxxxxxxx

関連トピック