Terjemahkan ucapan secara real-time menggunakan DashScope Java SDK dan model qwen3.5-livetranslate-flash-realtime . SDK terhubung melalui WebSocket, mengalirkan input audio, dan mengembalikan teks terjemahan beserta ucapan hasil sintesis.
Sebelum memulai
- Instal DashScope SDK versi 2.22.5 atau yang lebih baru.
- Dapatkan Kunci API.
- Tetapkan Kunci API sebagai variabel lingkungan:
# Linux / macOS
export DASHSCOPE_API_KEY=<your-api-key>
source ~/.bashrc
# Windows
set DASHSCOPE_API_KEY=<your-api-key>
- Tinjau ikhtisar model Qwen-LiveTranslate untuk daftar bahasa dan suara yang didukung.
PentingAlibaba Cloud Model Studio telah merilis domain khusus ruang kerja untuk wilayah China (Beijing) dan Singapura. Domain khusus baru ini memberikan performa unggul dan stabilitas lebih tinggi untuk permintaan inferensi. Kami merekomendasikan migrasi ke domain baru berikut:
- China (Beijing): dari
wss://dashscope.aliyuncs.comkewss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com - Singapura: dari
wss://dashscope-intl.aliyuncs.comkewss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
{WorkspaceId} adalah ID ruang kerja Anda, yang dapat ditemukan pada halaman Detail Ruang Kerja di konsol Alibaba Cloud Model Studio. Domain lama tetap berfungsi sepenuhnya.
Mulai cepat
Hubungkan, kirim audio, dan terima teks terjemahan:
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import java.util.Arrays;
// 1. Bangun parameter koneksi
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen3.5-livetranslate-flash-realtime")
// Berikut adalah URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL bervariasi berdasarkan wilayah.
.url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
.build();
// 2. Definisikan callback untuk menangani event server
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. Buka sesi dan mulai mengalirkan audio
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, callback);
conversation.connect();
// 4. Konfigurasi bahasa target terjemahan
OmniRealtimeConfig config = OmniRealtimeConfig.builder()
.modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
.translationConfig(OmniRealtimeTranslationParam.builder()
.language("en")
.build())
.build();
conversation.updateSession(config);
// 5. Kirim chunk audio dalam format Base64 (PCM 16 kHz, 16-bit, mono)
conversation.appendAudio(audioBase64);
// 6. Akhiri sesi setelah selesai
conversation.endSession();
Parameter permintaan
OmniRealtimeParam
Buat parameter ini dengan OmniRealtimeParam.builder() untuk membuat koneksi WebSocket.
Klik untuk melihat contoh kode
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen3.5-livetranslate-flash-realtime")
// Berikut adalah URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL bervariasi berdasarkan wilayah.
.url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
// Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
// Jika variabel lingkungan tidak dikonfigurasi, ganti baris berikut dengan Kunci API Model Studio Anda: .apikey("sk-xxx")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
.build();
Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
|
| Ya | Nama model. Kami merekomendasikan |
|
| Ya | Titik akhir WebSocket. Gunakan Ganti |
|
| Tidak | Kunci API untuk otentikasi. Jika tidak ditetapkan, konfigurasikan melalui variabel lingkungan |
OmniRealtimeConfig
Buat parameter ini dengan OmniRealtimeConfig.builder(), lalu panggil conversation.updateSession(config) setelah terhubung.
Klik untuk melihat contoh kode
// Tetapkan frasa terjemahan kustom
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);
Parameter | Type | Wajib | Deskripsi |
|---|---|---|---|
|
| Tidak | Modalitas output. Default: |
|
| Tidak | Suara untuk ucapan hasil sintesis. Suara default bervariasi berdasarkan model: |
|
| Tidak | Format audio input. Default: |
|
| Tidak | Format audio output. Default: |
|
| Tidak | Model ASR untuk mentranskripsikan ucapan asli. Tetapkan ke |
|
| Tidak | Pengaturan terjemahan. Lihat OmniRealtimeTranslationParam di bawah. |
|
| Tidak | Apakah akan mengaktifkan VAD (Voice Activity Detection). Nilai default: Tetapkan ke |
OmniRealtimeTranslationParam
Tentukan bahasa target dan terminologi kustom dengan OmniRealtimeTranslationParam.builder().
Klik untuk melihat contoh kode
// Tetapkan frasa terjemahan
Map<String, Object> phrases = new HashMap<>();
phrases.put("Inteligencia Artificial", "Artificial Intelligence"); // Kata dalam bahasa sumber: Terjemahan dalam bahasa target
phrases.put("Aprendizaje Automático", "Machine Learning");
OmniRealtimeTranslationParam translationParam = OmniRealtimeTranslationParam.builder()
.language("en") // Kode bahasa target
.corpus(OmniRealtimeTranslationParam.Corpus.builder()
.phrases(phrases)
.build())
.build();
Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
|
| Tidak | Kode bahasa target. Default: |
|
| Tidak | Terminologi kustom untuk istilah spesifik domain. |
|
| Tidak | Pemetaan istilah: kunci adalah istilah sumber, nilai adalah terjemahan target. Contoh: |
Antarmuka utama
OmniRealtimeConversation
Mengelola koneksi WebSocket dan siklus hidup aliran audio.
Impor: com.alibaba.dashscope.audio.omni.OmniRealtimeConversation
Metode | Deskripsi |
|---|---|
| Membuat instans percakapan dengan parameter koneksi dan callback event. |
| Membuka koneksi WebSocket. Memicu event session.created dan session.updated. Melemparkan |
| Memperbarui konfigurasi sesi setelah terhubung. Memicu event session.updated. Hanya tetapkan parameter yang diperlukan; nilai default berlaku untuk parameter yang dihilangkan. |
| Mengirim chunk audio dalam format Base64 ke server. Server secara otomatis mendeteksi batas ucapan dan memicu terjemahan. |
| Dalam mode Manual, mengirimkan audio yang sebelumnya ditambahkan ke buffer server melalui metode |
| Menghapus data audio yang belum dikomit dari buffer server. Memicu event input_audio_buffer.cleared. |
| Mengakhiri sesi secara elegan. Server menyelesaikan terjemahan yang sedang berlangsung sebelum mengirim session.finished. Melemparkan |
| Menghentikan tugas dan menutup koneksi WebSocket. |
| Mengembalikan ID sesi. |
| Mengembalikan ID respons dari respons server terbaru. |
| Mengembalikan delay teks pertama dari respons terbaru (milidetik). |
| Mengembalikan delay audio pertama dari respons terbaru (milidetik). |
OmniRealtimeCallback
Menangani event server yang dikirimkan melalui WebSocket. Perluas kelas ini dan implementasikan metode yang sesuai untuk memproses event.
Impor: com.alibaba.dashscope.audio.omni.OmniRealtimeCallback
Metode | Parameter | Deskripsi |
|---|---|---|
| Tidak ada | Dipanggil saat koneksi WebSocket berhasil dibuat. |
|
| Dipanggil untuk setiap event server. Uraikan bidang |
|
| Dipanggil saat koneksi WebSocket ditutup. |
Jenis event umum yang diterima dalam onEvent:
Tipe Peristiwa | Deskripsi |
|---|---|
| Server mendeteksi adanya ucapan dalam aliran audio. |
| Server mendeteksi akhir segmen ucapan. |
| Transkripsi bahasa sumber siap. Baca |
| Teks terjemahan siap. Baca |
| Sebuah chunk audio terjemahan tersedia. Baca |
| Terjadi kesalahan. Baca |
Contoh lengkap
Contoh ini menangkap audio dari mikrofon, menerjemahkannya secara real-time, dan memutar ucapan hasil terjemahan melalui speaker sistem.
Apa yang dilakukan:
- Terhubung ke Qwen-LiveTranslate melalui WebSocket.
- Mengonfigurasi terjemahan dari Spanyol ke Inggris dengan terminologi kustom.
- Mengalirkan audio mikrofon dalam potongan 100 ms.
- Mencetak transkripsi asli dan teks terjemahan.
- Memutar audio terjemahan melalui speaker.
Kode contoh untuk terjemahan real-time dari mikrofon
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;
/**
* Contoh penggunaan mikrofon dengan model terjemahan audio dan video real-time.
*/
public class Main {
private static final int INPUT_CHUNK_SIZE = 3200; // 100 ms audio 16 kHz, 16-bit, mono
private static final int OUTPUT_CHUNK_SIZE = 4800; // 100 ms audio 24 kHz, 16-bit, mono
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("Setel variabel lingkungan DASHSCOPE_API_KEY.");
System.exit(1);
}
// Buat parameter koneksi.
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();
// Buat penangan callback.
OmniRealtimeCallback callback = new OmniRealtimeCallback() {
@Override
public void onOpen() {
System.out.println("[Koneksi berhasil]");
}
@Override
public void onEvent(JsonObject message) {
String type = message.get("type").getAsString();
switch (type) {
case "input_audio_buffer.speech_started":
System.out.println("====== Input ucapan terdeteksi ======");
break;
case "input_audio_buffer.speech_stopped":
System.out.println("====== Input ucapan berakhir ======");
break;
case "conversation.item.input_audio_transcription.completed":
String originalText = message.get("transcript").getAsString();
System.out.println("[Teks asli] " + originalText);
break;
case "response.audio_transcript.done":
String translatedText = message.get("transcript").getAsString();
System.out.println("[Hasil terjemahan] " + translatedText);
break;
case "response.audio.delta":
// Dekode dan putar audio terjemahan.
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("[Kesalahan] " + error.get("message").getAsString());
break;
}
}
@Override
public void onClose(int code, String reason) {
System.out.println("[Koneksi ditutup] kode: " + code + ", alasan: " + reason);
}
};
// Buat sesi.
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, callback);
try {
// Inisialisasi speaker (untuk memutar ucapan hasil terjemahan).
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();
// Inisialisasi mikrofon (untuk menangkap input ucapan).
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("Mikrofon tidak tersedia.");
System.exit(1);
}
TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(micInfo);
microphone.open(micFormat);
microphone.start();
// Hubungkan ke server.
conversation.connect();
// Konfigurasi parameter terjemahan.
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);
// Daftarkan shutdown hook.
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("\n[Keluar...]");
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("[Memulai terjemahan real-time] Bicara ke mikrofon. Tekan Ctrl+C untuk keluar.");
// Secara terus-menerus menangkap dan mengirim audio mikrofon.
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("Kesalahan Kunci API: " + e.getMessage());
} catch (Exception e) {
System.err.println("Terjadi pengecualian: " + e.getMessage());
e.printStackTrace();
}
}
}
Ganti placeholder berikut dengan nilai Anda:
Placeholder | Deskripsi | Contoh |
|---|---|---|
| Kunci API Model Studio |
|
Topik terkait
- Ikhtisar model Qwen-LiveTranslate — Bahasa, suara, dan kemampuan yang didukung
- Referensi event sisi server — Jenis event, skema JSON, dan kode kesalahan
- Instal DashScope SDK — Instalasi dan penyiapan dependensi
- Dapatkan Kunci API — Pembuatan dan manajemen