Tous les produits
Search
Centre de documentation

Alibaba Cloud Model Studio:Qwen-LiveTranslate Java SDK - API reference

Dernière mise à jour :Oct 11, 2026

Traduisez la parole en temps réel à l'aide du SDK DashScope pour Java et du modèle qwen3.5-livetranslate-flash-realtime . Le SDK établit une connexion WebSocket, transmet le flux audio entrant et retourne le texte traduit ainsi que la synthèse vocale correspondante.

Prérequis

  1. Installez le SDK DashScope version 2.22.5 ou ultérieure.

  2. Obtenez une clé API.

  3. Définissez la clé API comme variable d'environnement :

       # Linux / macOS
       export DASHSCOPE_API_KEY=<your-api-key>
       source ~/.bashrc
    
       # Windows
       set DASHSCOPE_API_KEY=<your-api-key>
    
  4. Consultez la présentation du modèle Qwen-LiveTranslate pour connaître les langues et voix prises en charge.

ImportantAlibaba Cloud Model Studio a publié des domaines spécifiques aux espaces de travail pour les régions Chine (Pékin) et Singapour. Ces nouveaux domaines dédiés offrent des performances supérieures et une stabilité accrue pour les requêtes d'inférence. Nous vous recommandons de migrer vers ces nouveaux domaines :

  • Chine (Pékin) : passez de wss://dashscope.aliyuncs.com à wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com
  • Singapour : passez de wss://dashscope-intl.aliyuncs.com à wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com

{WorkspaceId} correspond à votre ID d'espace de travail, disponible sur la page Workspace Details de la console Alibaba Cloud Model Studio. Le domaine existant reste pleinement fonctionnel.

Démarrage rapide

Établissez la connexion, envoyez l'audio et recevez le texte traduit :

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

// 1. Build connection parameters
OmniRealtimeParam param = OmniRealtimeParam.builder()
        .model("qwen3.5-livetranslate-flash-realtime")
        // The following is the Singapore region URL. Replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
        .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
        .apikey(System.getenv("DASHSCOPE_API_KEY"))
        .build();

// 2. Define a callback to handle server events
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. Open a session and start streaming audio
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, callback);
conversation.connect();

// 4. Configure translation target language
OmniRealtimeConfig config = OmniRealtimeConfig.builder()
        .modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
        .translationConfig(OmniRealtimeTranslationParam.builder()
                .language("en")
                .build())
        .build();
conversation.updateSession(config);

// 5. Send Base64-encoded audio chunks (PCM 16 kHz, 16-bit, mono)
conversation.appendAudio(audioBase64);

// 6. End the session when done
conversation.endSession();

Paramètres de requête

OmniRealtimeParam

Construisez ces paramètres avec OmniRealtimeParam.builder() pour établir la connexion WebSocket.

Cliquez pour afficher l'exemple de code

OmniRealtimeParam param = OmniRealtimeParam.builder()
        .model("qwen3.5-livetranslate-flash-realtime")
        // The following is the Singapore region URL. Replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
        .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
        // API keys vary by region. To obtain an API key, see https://www.alibabacloud.com/help/en/model-studio/get-api-key
        // If an environment variable is not configured, replace the next line with your Model Studio API key: .apikey("sk-xxx")
        .apikey(System.getenv("DASHSCOPE_API_KEY"))
        .build();

Paramètre

Type

Obligatoire

Description

model

String

Oui

Nom du modèle. Nous recommandons qwen3.5-livetranslate-flash-realtime.

url

String

Oui

Endpoint WebSocket. Utilisez wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime (Chine (Pékin)) ou wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime (Singapour).

Remplacez {WorkspaceId} par votre véritable ID d'espace de travail.

apikey

String

Non

Clé API pour l'authentification. Si elle n'est pas définie, configurez-la via la variable d'environnement DASHSCOPE_API_KEY.

OmniRealtimeConfig

Construisez cette configuration avec OmniRealtimeConfig.builder(), puis appelez conversation.updateSession(config) après la connexion.

Cliquez pour afficher l'exemple de code

// Set custom translation phrases
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);

Paramètre

Type

Obligatoire

Description

modalities

List<OmniRealtimeModality>

Non

Modalités de sortie. Valeur par défaut : [AUDIO, TEXT]. Utilisez [TEXT] pour une sortie texte uniquement.

voice

String

Non

Voix utilisée pour la synthèse vocale. La voix par défaut pour qwen3.5-livetranslate-flash-realtime est Tina. Consultez voix prises en charge.

inputAudioFormat

OmniRealtimeAudioFormat

Non

Format audio d'entrée. Valeur par défaut : PCM_16000HZ_MONO_16BIT.

outputAudioFormat

OmniRealtimeAudioFormat

Non

Format audio de sortie. Valeur par défaut : PCM_24000HZ_MONO_16BIT.

InputAudioTranscription

String

Non

Modèle ASR servant à transcrire la parole originale. Définissez-le sur qwen3-asr-flash-realtime pour obtenir la transcription dans la langue source en plus de la traduction.

translationConfig

OmniRealtimeTranslationParam

Non

Paramètres de traduction. Reportez-vous à la section OmniRealtimeTranslationParam ci-dessous.

enableTurnDetection

boolean

Non

Active ou désactive la détection d'activité vocale (VAD).

Valeur par défaut : true. Ce réglage active le mode VAD, où le serveur détecte automatiquement le début et la fin de la parole pour déclencher la traduction.

Définissez ce paramètre sur false pour passer en mode manuel. Le client soumet alors explicitement l'audio via la méthode commit(). Pour une description détaillée des paramètres, consultez la section relative à turn_detection dans le document Événements client.

OmniRealtimeTranslationParam

Définissez la langue cible et la terminologie personnalisée à l'aide de OmniRealtimeTranslationParam.builder().

Cliquez pour afficher l'exemple de code

// Set translation phrases
Map<String, Object> phrases = new HashMap<>();
phrases.put("Inteligencia Artificial", "Artificial Intelligence");  // Source language word: Target language translation
phrases.put("Aprendizaje Automático", "Machine Learning");

OmniRealtimeTranslationParam translationParam = OmniRealtimeTranslationParam.builder()
        .language("en")  // Target language code
        .corpus(OmniRealtimeTranslationParam.Corpus.builder()
                .phrases(phrases)
                .build())
        .build();

Paramètre

Type

Obligatoire

Description

language

String

Non

Code de la langue cible. Valeur par défaut : en. Consultez les langues prises en charge.

corpus

Corpus

Non

Terminologie personnalisée pour les termes spécifiques au domaine.

corpus.phrases

Map<String, Object>

Non

Mappage des termes : les clés correspondent aux termes sources et les valeurs aux traductions cibles. Exemple : {"Inteligencia Artificial": "Artificial Intelligence"}

Interfaces principales

OmniRealtimeConversation

Gère la connexion WebSocket et le cycle de vie du streaming audio.

Importation : com.alibaba.dashscope.audio.omni.OmniRealtimeConversation

Méthode

Description

OmniRealtimeConversation(OmniRealtimeParam param, OmniRealtimeCallback callback)

Crée une instance de conversation avec les paramètres de connexion et un callback d'événements.

void connect()

Ouvre la connexion WebSocket. Déclenche les événements session.created et session.updated. Lève les exceptions NoApiKeyException et InterruptedException.

void updateSession(OmniRealtimeConfig config)

Met à jour la configuration de la session après la connexion. Déclenche l'événement session.updated. Ne définissez que les paramètres nécessaires ; les valeurs par défaut s'appliquent aux paramètres omis.

void appendAudio(String audioBase64)

Envoie un segment audio encodé en Base64 au serveur. Celui-ci détecte automatiquement les limites de la parole et lance la traduction.

void commit()

En mode manuel, valide l'audio précédemment ajouté au tampon du serveur via la méthode appendAudio. Dès réception de cette validation, le serveur commence automatiquement à générer la réponse traduite. En mode VAD, cet appel est inutile car le serveur effectue la validation automatiquement. Déclenche l'événement input_audio_buffer.committed.

void clearAppendedAudio()

Efface les données audio non validées du tampon serveur. Déclenche l'événement input_audio_buffer.cleared.

void endSession()

Termine la session correctement. Le serveur achève la traduction en cours avant d'envoyer l'événement session.finished. Lève l'exception InterruptedException.

void close(int code, String reason)

Arrête la tâche et ferme la connexion WebSocket.

String getSessionId()

Retourne l'ID de session.

String getResponseId()

Retourne l'ID de la réponse serveur la plus récente.

long getFirstTextDelay()

Retourne le délai d'obtention du premier texte pour la réponse la plus récente (en millisecondes).

long getFirstAudioDelay()

Retourne le délai d'obtention du premier segment audio pour la réponse la plus récente (en millisecondes).

OmniRealtimeCallback

Traite les événements serveur transmis via WebSocket. Étendez cette classe et implémentez chaque méthode pour gérer les événements.

Importation : com.alibaba.dashscope.audio.omni.OmniRealtimeCallback

Méthode

Paramètres

Description

void onOpen()

Aucun

Appelée lors de l'établissement de la connexion WebSocket.

abstract void onEvent(JsonObject message)

message : objet JSON contenant un événement côté serveur.

Appelée pour chaque événement serveur. Analysez le champ type afin de déterminer la nature de l'événement.

abstract void onClose(int code, String reason)

code : code d'état WebSocket. reason : motif de fermeture.

Appelée lors de la fermeture de la connexion WebSocket.

Types d'événements courants reçus dans onEvent :

Type d'événement

Description

input_audio_buffer.speech_started

Le serveur a détecté de la parole dans le flux audio.

input_audio_buffer.speech_stopped

Le serveur a détecté la fin d'un segment de parole.

conversation.item.input_audio_transcription.completed

La transcription dans la langue source est prête. Lisez message.get("transcript"). Nécessite que InputAudioTranscription soit défini.

response.audio_transcript.done

Le texte traduit est prêt. Lisez message.get("transcript").

response.audio.delta

Un segment audio traduit est disponible. Lisez message.get("delta") pour obtenir les données audio encodées en Base64.

error

Une erreur est survenue. Lisez message.get("error").getAsJsonObject().get("message") pour obtenir les détails.

Exemple complet

Cet exemple capture l'audio du microphone, le traduit en temps réel et diffuse la parole traduite via le haut-parleur du système.

Fonctionnement :

  1. Connexion à Qwen-LiveTranslate via WebSocket.
  2. Configuration de la traduction espagnol-anglais avec une terminologie personnalisée.
  3. Streaming de l'audio du microphone par segments de 100 ms.
  4. Affichage de la transcription originale et du texte traduit.
  5. Lecture de l'audio traduit sur le haut-parleur.

Exemple de code pour la traduction en temps réel depuis le microphone

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;

/**
 * Example of using a microphone with the real-time audio and video translation model.
 */
public class Main {
    private static final int INPUT_CHUNK_SIZE = 3200;   // 100 ms of 16 kHz, 16-bit, mono audio
    private static final int OUTPUT_CHUNK_SIZE = 4800;  // 100 ms of 24 kHz, 16-bit, mono audio
    private static final AtomicBoolean running = new AtomicBoolean(true);
    private static SourceDataLine speaker;  // Speaker

    public static void main(String[] args) throws InterruptedException {
        String apiKey = System.getenv("DASHSCOPE_API_KEY");
        if (apiKey == null || apiKey.isEmpty()) {
            System.err.println("Set the DASHSCOPE_API_KEY environment variable.");
            System.exit(1);
        }

        // Create connection parameters.
        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();

        // Create a callback handler.
        OmniRealtimeCallback callback = new OmniRealtimeCallback() {
            @Override
            public void onOpen() {
                System.out.println("[Connection established]");
            }

            @Override
            public void onEvent(JsonObject message) {
                String type = message.get("type").getAsString();
                switch (type) {
                    case "input_audio_buffer.speech_started":
                        System.out.println("====== Speech input detected ======");
                        break;
                    case "input_audio_buffer.speech_stopped":
                        System.out.println("====== Speech input ended ======");
                        break;
                    case "conversation.item.input_audio_transcription.completed":
                        String originalText = message.get("transcript").getAsString();
                        System.out.println("[Original text] " + originalText);
                        break;
                    case "response.audio_transcript.done":
                        String translatedText = message.get("transcript").getAsString();
                        System.out.println("[Translation result] " + translatedText);
                        break;
                    case "response.audio.delta":
                        // Decode and play the translated audio.
                        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] " + error.get("message").getAsString());
                        break;
                }
            }

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

        // Create a session.
        OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, callback);

        try {
            // Initialize the speaker (for playing the translated speech).
            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();

            // Initialize the microphone (for capturing speech input).
            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("Microphone is not available.");
                System.exit(1);
            }
            TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(micInfo);
            microphone.open(micFormat);
            microphone.start();

            // Connect to the server.
            conversation.connect();

            // Configure translation parameters.
            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);

            // Register a shutdown hook.
            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                System.out.println("\n[Exiting...]");
                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("[Starting real-time translation] Speak into the microphone. Press Ctrl+C to exit.");

            // Continuously capture and send microphone audio.
            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 Key error: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("An exception occurred: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Remplacez les espaces réservés par vos propres valeurs :

Espace réservé

Description

Exemple

<your-api-key>

Clé API Model Studio

sk-xxxxxxxx

Rubriques connexes