Traduzca el habla en tiempo real utilizando DashScope Java SDK y el modelo qwen3.5-livetranslate-flash-realtime. El SDK se conecta mediante WebSocket, transmite la entrada de audio y devuelve texto traducido y habla sintetizada.
Antes de comenzar
- Instalar DashScope SDK versión 2.22.5 o posterior.
- Obtener una clave de API.
- Configure la clave de API como una variable de entorno:
# Linux / macOS
export DASHSCOPE_API_KEY=<your-api-key>
source ~/.bashrc
# Windows
set DASHSCOPE_API_KEY=<your-api-key>
- Revise la descripción general del modelo Qwen-LiveTranslate para conocer los idiomas y voces admitidos.
ImportanteAlibaba Cloud Model Studio ha lanzado dominios específicos de espacio de trabajo para las regiones de China (Beijing) y Singapur. Los nuevos dominios dedicados ofrecen un rendimiento superior y una mayor estabilidad para las solicitudes de inferencia. Recomendamos migrar a los nuevos dominios:
- China (Pekín): de
wss://dashscope.aliyuncs.comawss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com - Singapur: de
wss://dashscope-intl.aliyuncs.comawss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
{WorkspaceId} es su ID de espacio de trabajo, que se encuentra en la página Workspace Details de la consola de Alibaba Cloud Model Studio. El dominio existente permanece totalmente funcional.
Inicio rápido
Conectar, enviar audio y recibir texto traducido:
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();
Parámetros de solicitud
OmniRealtimeParam
Construya estos con OmniRealtimeParam.builder() para establecer la conexión WebSocket.
Haga clic para ver el código de ejemplo
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/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();
Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Nombre del modelo. Recomendamos |
|
| Sí | Endpoint de WebSocket. Use Reemplace |
|
| No | Clave de API para autenticación. Si no se establece, configúrela mediante la variable de entorno |
OmniRealtimeConfig
Construya estos con OmniRealtimeConfig.builder() y luego llame a conversation.updateSession(config) después de conectarse.
Haga clic para ver el código de ejemplo
// 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);
Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| No | Modalidades de salida. Predeterminado: |
|
| No | La voz para el habla sintetizada. La voz predeterminada para |
|
| No | Formato de audio de entrada. Predeterminado: |
|
| No | Formato de audio de salida. Predeterminado: |
|
| No | Modelo ASR para transcribir el habla original. Configure como |
|
| No | Configuración de traducción. Consulte OmniRealtimeTranslationParam a continuación. |
|
| No | Indica si se debe habilitar VAD (Detección de Actividad de Voz). Valor predeterminado: Configure como |
OmniRealtimeTranslationParam
Construya el idioma objetivo y la terminología personalizada con OmniRealtimeTranslationParam.builder().
Haga clic para ver el código de ejemplo
// 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();
Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| No | Código de idioma objetivo. Predeterminado: |
|
| No | Terminología personalizada para términos específicos del dominio. |
|
| No | Mapeo de términos: las claves son términos fuente y los valores son traducciones objetivo. Ejemplo: |
Interfaces clave
OmniRealtimeConversation
Gestiona la conexión WebSocket y el ciclo de vida de la transmisión de audio.
Importar: com.alibaba.dashscope.audio.omni.OmniRealtimeConversation
Método | Descripción |
|---|---|
| Crea una instancia de conversación con parámetros de conexión y una devolución de llamada de eventos. |
| Abre la conexión WebSocket. Activa los eventos session.created y session.updated. Lanza |
| Actualiza la configuración de la sesión después de conectarse. Activa el evento session.updated. Configure solo los parámetros que necesite; se aplican los valores predeterminados para los parámetros omitidos. |
| Envía un fragmento de audio codificado en Base64 al servidor. El servidor detecta automáticamente los límites del habla y activa la traducción. |
| En modo Manual, confirma el audio previamente agregado al búfer del servidor mediante el método |
| Borra los datos de audio no confirmados del búfer del servidor. Activa el evento input_audio_buffer.cleared. |
| Finaliza la sesión correctamente. El servidor completa la traducción en curso antes de enviar session.finished. Lanza |
| Detiene la tarea y cierra la conexión WebSocket. |
| Devuelve el ID de sesión. |
| Devuelve el ID de respuesta de la respuesta más reciente del servidor. |
| Devuelve la latencia del primer texto de la respuesta más reciente (milisegundos). |
| Devuelve la latencia del primer audio de la respuesta más reciente (milisegundos). |
OmniRealtimeCallback
Gestiona los eventos del servidor entregados a través de WebSocket. Extienda esta clase e implemente cada método para procesar eventos.
Importar: com.alibaba.dashscope.audio.omni.OmniRealtimeCallback
Método | Parámetros | Descripción |
|---|---|---|
| None | Se llama cuando se establece la conexión WebSocket. |
|
| Se llama para cada evento del servidor. Analice el campo |
|
| Se llama cuando se cierra la conexión WebSocket. |
Tipos de eventos comunes recibidos en onEvent:
Tipo de evento | Descripción |
|---|---|
| El servidor detectó habla en el flujo de audio. |
| El servidor detectó el final del segmento de habla. |
| La transcripción en el idioma fuente está lista. Lea |
| El texto traducido está listo. Lea |
| Un fragmento de audio traducido está disponible. Lea |
| Ocurrió un error. Lea |
Ejemplo completo
Este ejemplo captura audio del micrófono, lo traduce en tiempo real y reproduce el habla traducida a través del altavoz del sistema.
Qué hace:
- Se conecta a Qwen-LiveTranslate mediante WebSocket.
- Configura la traducción de español a inglés con terminología personalizada.
- Transmite audio del micrófono en fragmentos de 100 ms.
- Imprime la transcripción original y el texto traducido.
- Reproduce el audio traducido a través del altavoz.
Código de ejemplo para traducción de micrófono en tiempo real
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();
}
}
}
Reemplace los marcadores de posición con sus valores:
Marcador de posición | Descripción | Ejemplo |
|---|---|---|
| Clave de API de Model Studio |
|
Temas relacionados
- Descripción general del modelo Qwen-LiveTranslate -- Idiomas, voces y capacidades admitidas
- Referencia de eventos del lado del servidor -- Tipos de eventos, esquemas JSON y códigos de error
- Instalar DashScope SDK -- Instalación y configuración de dependencias
- Obtener una clave de API -- Creación y gestión