QwenCloudBRASIL
Tradução de apoio para consulta. Código e identificadores técnicos preservados. Consultar referência original ↗

SDK Java do LiveTranslate

SDK Java do LiveTranslate

Guia do usuário: Para tutoriais e exemplos completos, consulte Tradução em tempo real.

Antes de começar

  1. Instale o SDK do DashScope. Certifique-se de que a versão do SDK do DashScope seja 2.22.5 ou posterior.
  2. Obtenha uma chave API.

Visão geral da configuração

Três objetos construtores controlam uma sessão de tradução:

OmniRealtimeParam          --> Connection: model, endpoint, API key
  +-- OmniRealtimeConfig   --> Session: audio formats, voice, modalities
       +-- OmniRealtimeTranslationParam  --> Translation: target language, custom terminology

Passe OmniRealtimeParam para o construtor. Depois de conectar, ligue updateSession() com OmniRealtimeConfig para definir opções de áudio e tradução. Os padrões se aplicam se você pular updateSession().

Início rápido

Conecte-se, envie áudio e receba texto traduzido:

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")
  .url("wss://maas.qwencloudapi.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 solicitação

OmniRealtimeParam

Crie parâmetros de conexão com OmniRealtimeParam.builder().

Código de amostra.

OmniRealtimeParam param = OmniRealtimeParam.builder()
  .model("qwen3.5-livetranslate-flash-realtime")
  .url("wss://maas.qwencloudapi.com/api-ws/v1/realtime")
  // If no environment variable is set, replace the next line with your API key: .apikey("YOUR_API_KEY")
  .apikey(System.getenv("DASHSCOPE_API_KEY"))
  .build();
Parâmetro Tipo Obrigatório Descrição
model String Sim Nome do modelo. Recomendamos qwen3.5-livetranslate-flash-realtime.
url String Sim Ponto de extremidade WebSocket. Usar wss://maas.qwencloudapi.com/api-ws/v1/realtime.
apikey String Não Chave de API. O padrão é o DASHSCOPE_API_KEY variável de ambiente.

OmniRealtimeConfig

Crie parâmetros de sessão com OmniRealtimeConfig.builder(), então ligue conversation.updateSession(config).

Código de amostra.

// 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("Tina")
  .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 Obrigatório Descrição
modalities List<OmniRealtimeModality> Não Modalidades de saída. Padrão: [AUDIO, TEXT]. Definir [TEXT] apenas para texto.
voice String Não Voz para fala sintetizada. Padrão: Tina. Consulte vozes suportadas.
inputAudioFormat OmniRealtimeAudioFormat Não Formato de áudio de entrada. Padrão: PCM_16000HZ_MONO_16BIT.
outputAudioFormat OmniRealtimeAudioFormat Não Formato de áudio de saída. Padrão: PCM_24000HZ_MONO_16BIT.
InputAudioTranscription String Não Modelo ASR para transcrever fala de entrada. Definir como qwen3-asr-flash-realtime para receber transcrição no idioma de origem com tradução.
translationConfig OmniRealtimeTranslationParam Não Configurações de tradução. Consulte OmniRealtimeTranslationParam abaixo.
enableTurnDetection boolean Não Se deve ativar VAD (detecção de atividade de voz). Valor padrão: true, que ativa o modo VAD, onde o servidor detecta automaticamente o início/fim da fala e aciona a tradução. Definir como false para mudar para o modo Manual, onde o cliente envia áudio manualmente por meio do commit() método. Para descrições detalhadas dos parâmetros, consulte o turn_detection descrição em Eventos do cliente documento.

OmniRealtimeTranslationParam

Crie parâmetros de tradução com OmniRealtimeTranslationParam.builder().

Código de amostra.

// 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 Obrigatório Descrição
language String Não Código do idioma de destino. Padrão: en. Consulte idiomas suportados.
corpus Corpus Não Terminologia personalizada para termos específicos de domínio.
corpus.phrases Map<String, Object> Não Mapeamentos de termos. Chaves: termos fonte; valores: traduções de destino. Exemplo: {"Inteligencia Artificial": "Artificial Intelligence"}

Interfaces principais

OmniRealtimeConversation

Gerencia a conexão WebSocket e o streaming de áudio.

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

Método Descrição
OmniRealtimeConversation(OmniRealtimeParam param, OmniRealtimeCallback callback) Cria uma conversa com parâmetros de conexão e um retorno de chamada de evento.
void connect() Abre a conexão WebSocket. Gatilhos session.created e session.atualizado. Lança NoApiKeyException, InterruptedException.
void updateSession(OmniRealtimeConfig config) Atualiza a configuração da sessão. Gatilhos session.updated. Parâmetros omitidos usam padrões.
void appendAudio(String audioBase64) Envia um pedaço de áudio codificado em Base64. O servidor detecta limites de fala e aciona a tradução automaticamente.
void commit() No modo Manual, confirma o áudio previamente anexado ao buffer do servidor por meio do appendAudio método. O servidor começa automaticamente a gerar uma resposta de tradução ao receber o commit. No modo VAD, este método não precisa ser chamado, pois o servidor é confirmado automaticamente. Aciona input_audio_buffer.committed evento.
void clearAppendedAudio() Limpa dados de áudio não confirmados do buffer do servidor. Aciona input_audio_buffer.cleared evento.
void endSession() Termina a sessão. O servidor termina as traduções em andamento antes de enviar session.finished. Lança InterruptedException.
void close(int code, String reason) Interrompe a tarefa e fecha a conexão WebSocket.
String getSessionId() Retorna o ID da sessão.
String getResponseId() Retorna o ID de resposta da resposta mais recente do servidor.
long getFirstTextDelay() Retorna o primeiro atraso de texto da última resposta em milissegundos.
long getFirstAudioDelay() Retorna o primeiro atraso de áudio da última resposta em milissegundos.

OmniRealtimeCallback

Lida com eventos do servidor via WebSocket. Estenda esta classe e implemente cada método.

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

Método Parâmetros Descrição
void onOpen() Nenhum Chamado quando a conexão WebSocket é aberta.
abstract void onEvent(JsonObject message) message: um objeto JSON contendo um evento de servidor. Chamado para cada evento do servidor. Analise o type campo para identificar o evento.
abstract void onClose(int code, String reason) code: código de status do WebSocket. reason: Descrição do fechamento. Chamado quando o WebSocket é fechado.

Tipos de eventos comuns em onEvent:

Tipo de evento Descrição
input_audio_buffer.speech_started Fala detectada no fluxo de áudio.
input_audio_buffer.speech_stopped Fim de um segmento de fala detectado.
conversation.item.input_audio_transcription.completed Transcrição no idioma de origem pronta. Ler message.get("transcript"). Requer InputAudioTranscription.
response.audio_transcript.done Texto traduzido pronto. Leia message.get("transcript").
response.audio.delta Pedaço de áudio traduzido disponível. Leia message.get("delta") para áudio codificado em Base64.
error Ocorreu um erro. Leia message.get("error").getAsJsonObject().get("message") para obter detalhes.

Exemplo completo

Este exemplo grava o áudio do microfone e o traduz em tempo real.

Exemplo de código para tradução em tempo real a partir do microfone

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;
  private static final int OUTPUT_CHUNK_SIZE = 4800;
  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("Set the DASHSCOPE_API_KEY environment variable.");
      System.exit(1);
    }

    OmniRealtimeParam param = OmniRealtimeParam.builder()
      .model("qwen3.5-livetranslate-flash-realtime")
      .url("wss://maas.qwencloudapi.com/api-ws/v1/realtime")
      .apikey(apiKey)
      .build();

    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":
            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);
      }
    };

    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("Microphone is not available.");
        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[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.");

      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();
    }
  }
}

Referências