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
- Instale o SDK do DashScope. Certifique-se de que a versão do SDK do DashScope seja 2.22.5 ou posterior.
- 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
- Qwen-LiveTranslate visão geral do modelo – Idiomas, vozes e recursos suportados
- Eventos do cliente -- Tipos e parâmetros de eventos do cliente
- Referência de eventos do servidor -- Tipos de eventos, esquemas JSON e códigos de erro
- Instale o SDK do DashScope - Instalação e configuração de dependências
- Obtenha uma chave de API - Criação e gerenciamento de chave de API