Todos los productos
Search
Centro de documentos

Alibaba Cloud Model Studio:SDK de Java de Qwen-LiveTranslate - Referencia de API

Última actualización: Oct 12, 2026

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

  1. Instalar DashScope SDK versión 2.22.5 o posterior.
  2. Obtener una clave de API.
  3. 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>
  1. 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.com a wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com
  • Singapur: de wss://dashscope-intl.aliyuncs.com a wss://{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

model

String

Sí

Nombre del modelo. Recomendamos qwen3.5-livetranslate-flash-realtime.

url

String

Sí

Endpoint de WebSocket. Use wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime (China (Beijing)) o wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime (Singapur).

Reemplace {WorkspaceId} con su ID de espacio de trabajo real.

apikey

String

No

Clave de API para autenticación. Si no se establece, configúrela mediante la variable de entorno DASHSCOPE_API_KEY.

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

modalities

List<OmniRealtimeModality>

No

Modalidades de salida. Predeterminado: [AUDIO, TEXT]. Use [TEXT] para salida solo de texto.

voice

String

No

La voz para el habla sintetizada. La voz predeterminada para qwen3.5-livetranslate-flash-realtime es Tina. Consulte las voces admitidas.

inputAudioFormat

OmniRealtimeAudioFormat

No

Formato de audio de entrada. Predeterminado: PCM_16000HZ_MONO_16BIT.

outputAudioFormat

OmniRealtimeAudioFormat

No

Formato de audio de salida. Predeterminado: PCM_24000HZ_MONO_16BIT.

InputAudioTranscription

String

No

Modelo ASR para transcribir el habla original. Configure como qwen3-asr-flash-realtime para recibir la transcripción en el idioma fuente junto con la traducción.

translationConfig

OmniRealtimeTranslationParam

No

Configuración de traducción. Consulte OmniRealtimeTranslationParam a continuación.

enableTurnDetection

boolean

No

Indica si se debe habilitar VAD (Detección de Actividad de Voz).

Valor predeterminado: true, que habilita el modo VAD donde el servidor detecta automáticamente el inicio y fin del habla y activa la traducción.

Configure como false para cambiar al modo Manual, donde el cliente envía audio manualmente mediante el método commit(). Para descripciones detalladas de los parámetros, consulte la descripción de turn_detection en el documento de Eventos del cliente.

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

language

String

No

Código de idioma objetivo. Predeterminado: en. Consulte los idiomas admitidos.

corpus

Corpus

No

Terminología personalizada para términos específicos del dominio.

corpus.phrases

Map<String, Object>

No

Mapeo de términos: las claves son términos fuente y los valores son traducciones objetivo. Ejemplo: {"Inteligencia Artificial": "Artificial Intelligence"}

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

OmniRealtimeConversation(OmniRealtimeParam param, OmniRealtimeCallback callback)

Crea una instancia de conversación con parámetros de conexión y una devolución de llamada de eventos.

void connect()

Abre la conexión WebSocket. Activa los eventos session.created y session.updated. Lanza NoApiKeyException, InterruptedException.

void updateSession(OmniRealtimeConfig config)

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.

void appendAudio(String audioBase64)

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.

void commit()

En modo Manual, confirma el audio previamente agregado al búfer del servidor mediante el método appendAudio. El servidor comienza automáticamente a generar una respuesta de traducción al recibir la confirmación. En modo VAD, no es necesario llamar a este método ya que el servidor confirma automáticamente. Activa el evento input_audio_buffer.committed.

void clearAppendedAudio()

Borra los datos de audio no confirmados del búfer del servidor. Activa el evento input_audio_buffer.cleared.

void endSession()

Finaliza la sesión correctamente. El servidor completa la traducción en curso antes de enviar session.finished. Lanza InterruptedException.

void close(int code, String reason)

Detiene la tarea y cierra la conexión WebSocket.

String getSessionId()

Devuelve el ID de sesión.

String getResponseId()

Devuelve el ID de respuesta de la respuesta más reciente del servidor.

long getFirstTextDelay()

Devuelve la latencia del primer texto de la respuesta más reciente (milisegundos).

long getFirstAudioDelay()

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

void onOpen()

None

Se llama cuando se establece la conexión WebSocket.

abstract void onEvent(JsonObject message)

message: Un objeto JSON que contiene un evento del lado del servidor.

Se llama para cada evento del servidor. Analice el campo type para determinar el tipo de evento.

abstract void onClose(int code, String reason)

code: Código de estado de WebSocket. reason: Descripción del cierre.

Se llama cuando se cierra la conexión WebSocket.

Tipos de eventos comunes recibidos en onEvent:

Tipo de evento

Descripción

input_audio_buffer.speech_started

El servidor detectó habla en el flujo de audio.

input_audio_buffer.speech_stopped

El servidor detectó el final del segmento de habla.

conversation.item.input_audio_transcription.completed

La transcripción en el idioma fuente está lista. Lea message.get("transcript"). Requiere que InputAudioTranscription esté configurado.

response.audio_transcript.done

El texto traducido está listo. Lea message.get("transcript").

response.audio.delta

Un fragmento de audio traducido está disponible. Lea message.get("delta") para obtener datos de audio codificados en Base64.

error

Ocurrió un error. Lea message.get("error").getAsJsonObject().get("message") para obtener detalles.

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:

  1. Se conecta a Qwen-LiveTranslate mediante WebSocket.
  2. Configura la traducción de español a inglés con terminología personalizada.
  3. Transmite audio del micrófono en fragmentos de 100 ms.
  4. Imprime la transcripción original y el texto traducido.
  5. 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

<your-api-key>

Clave de API de Model Studio

sk-xxxxxxxx

Temas relacionados