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
-
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> -
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 |
|---|---|---|---|
|
| Oui | Nom du modèle. Nous recommandons |
|
| Oui | Endpoint WebSocket. Utilisez Remplacez |
|
| Non | Clé API pour l'authentification. Si elle n'est pas définie, configurez-la via la variable d'environnement |
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 |
|---|---|---|---|
|
| Non | Modalités de sortie. Valeur par défaut : |
|
| Non | Voix utilisée pour la synthèse vocale. La voix par défaut pour |
|
| Non | Format audio d'entrée. Valeur par défaut : |
|
| Non | Format audio de sortie. Valeur par défaut : |
|
| Non | Modèle ASR servant à transcrire la parole originale. Définissez-le sur |
|
| Non | Paramètres de traduction. Reportez-vous à la section OmniRealtimeTranslationParam ci-dessous. |
|
| Non | Active ou désactive la détection d'activité vocale (VAD). Valeur par défaut : Définissez ce paramètre sur |
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 |
|---|---|---|---|
|
| Non | Code de la langue cible. Valeur par défaut : |
|
| Non | Terminologie personnalisée pour les termes spécifiques au domaine. |
|
| Non | Mappage des termes : les clés correspondent aux termes sources et les valeurs aux traductions cibles. Exemple : |
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 |
|---|---|
| Crée une instance de conversation avec les paramètres de connexion et un callback d'événements. |
| Ouvre la connexion WebSocket. Déclenche les événements session.created et session.updated. Lève les exceptions |
| 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. |
| Envoie un segment audio encodé en Base64 au serveur. Celui-ci détecte automatiquement les limites de la parole et lance la traduction. |
| En mode manuel, valide l'audio précédemment ajouté au tampon du serveur via la méthode |
| Efface les données audio non validées du tampon serveur. Déclenche l'événement input_audio_buffer.cleared. |
| Termine la session correctement. Le serveur achève la traduction en cours avant d'envoyer l'événement session.finished. Lève l'exception |
| Arrête la tâche et ferme la connexion WebSocket. |
| Retourne l'ID de session. |
| Retourne l'ID de la réponse serveur la plus récente. |
| Retourne le délai d'obtention du premier texte pour la réponse la plus récente (en millisecondes). |
| 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 |
|---|---|---|
| Aucun | Appelée lors de l'établissement de la connexion WebSocket. |
|
| Appelée pour chaque événement serveur. Analysez le champ |
|
| Appelée lors de la fermeture de la connexion WebSocket. |
Types d'événements courants reçus dans onEvent :
Type d'événement | Description |
|---|---|
| Le serveur a détecté de la parole dans le flux audio. |
| Le serveur a détecté la fin d'un segment de parole. |
| La transcription dans la langue source est prête. Lisez |
| Le texte traduit est prêt. Lisez |
| Un segment audio traduit est disponible. Lisez |
| Une erreur est survenue. Lisez |
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 :
- Connexion à Qwen-LiveTranslate via WebSocket.
- Configuration de la traduction espagnol-anglais avec une terminologie personnalisée.
- Streaming de l'audio du microphone par segments de 100 ms.
- Affichage de la transcription originale et du texte traduit.
- 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 |
|---|---|---|
| Clé API Model Studio |
|
Rubriques connexes
- Présentation du modèle Qwen-LiveTranslate -- Langues, voix et capacités prises en charge
- Référence des événements côté serveur -- Types d'événements, schémas JSON et codes d'erreur
- Installer le SDK DashScope -- Installation et configuration des dépendances
- Obtenir une clé API -- Création et gestion