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.
Alibaba 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.com ke wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com
Singapura: dari wss://dashscope-intl.aliyuncs.com ke wss://{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.
Buat parameter ini dengan OmniRealtimeParam.builder() untuk membuat koneksi WebSocket.
Klik untuk melihat contoh kode
Copy
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
model
String
Ya
Nama model. Kami merekomendasikan qwen3.5-livetranslate-flash-realtime. qwen3-livetranslate-flash-realtime adalah model lawas.
url
String
Ya
Titik akhir WebSocket. Gunakan wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime (China (Beijing)) atau wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime (Singapura).
Modalitas output. Default: [AUDIO, TEXT]. Gunakan [TEXT] untuk output hanya teks.
voice
String
Tidak
Suara untuk ucapan hasil sintesis. Suara default bervariasi berdasarkan model: Tina untuk qwen3.5-livetranslate-flash-realtime dan Cherry untuk qwen3-livetranslate-flash-realtime. Lihat suara yang didukung.
inputAudioFormat
OmniRealtimeAudioFormat
Tidak
Format audio input. Default: PCM_16000HZ_MONO_16BIT.
outputAudioFormat
OmniRealtimeAudioFormat
Tidak
Format audio output. Default: PCM_24000HZ_MONO_16BIT.
InputAudioTranscription
String
Tidak
Model ASR untuk mentranskripsikan ucapan asli. Tetapkan ke qwen3-asr-flash-realtime untuk menerima transkripsi bahasa sumber bersamaan dengan terjemahan.
translationConfig
OmniRealtimeTranslationParam
Tidak
Pengaturan terjemahan. Lihat OmniRealtimeTranslationParam di bawah.
enableTurnDetection
boolean
Tidak
Apakah akan mengaktifkan VAD (Voice Activity Detection).
Nilai default: true, yang mengaktifkan mode VAD di mana server secara otomatis mendeteksi awal/akhir ucapan dan memicu terjemahan.
Tetapkan ke false untuk beralih ke mode Manual, di mana klien secara manual mengirimkan audio melalui metode commit(). Untuk deskripsi parameter lengkap, lihat penjelasan turn_detection dalam dokumen Event klien.
Tentukan bahasa target dan terminologi kustom dengan OmniRealtimeTranslationParam.builder().
Klik untuk melihat contoh kode
Copy
// Tetapkan frasa terjemahanMap<String, Object> phrases = new HashMap<>();phrases.put("Inteligencia Artificial", "Artificial Intelligence"); // Kata dalam bahasa sumber: Terjemahan dalam bahasa targetphrases.put("Aprendizaje Automático", "Machine Learning");OmniRealtimeTranslationParam translationParam = OmniRealtimeTranslationParam.builder() .language("en") // Kode bahasa target .corpus(OmniRealtimeTranslationParam.Corpus.builder() .phrases(phrases) .build()) .build();
Membuat instans percakapan dengan parameter koneksi dan callback event.
void connect()
Membuka koneksi WebSocket. Memicu event session.created dan session.updated. Melemparkan NoApiKeyException, InterruptedException.
void updateSession(OmniRealtimeConfig config)
Memperbarui konfigurasi sesi setelah terhubung. Memicu event session.updated. Hanya tetapkan parameter yang diperlukan; nilai default berlaku untuk parameter yang dihilangkan.
void appendAudio(String audioBase64)
Mengirim chunk audio dalam format Base64 ke server. Server secara otomatis mendeteksi batas ucapan dan memicu terjemahan.
void commit()
Dalam mode Manual, mengirimkan audio yang sebelumnya ditambahkan ke buffer server melalui metode appendAudio. Server secara otomatis mulai menghasilkan respons terjemahan setelah menerima commit. Dalam mode VAD, metode ini tidak perlu dipanggil karena server melakukan commit secara otomatis. Memicu event input_audio_buffer.committed.
Mengakhiri sesi secara elegan. Server menyelesaikan terjemahan yang sedang berlangsung sebelum mengirim session.finished. Melemparkan InterruptedException.
void close(int code, String reason)
Menghentikan tugas dan menutup koneksi WebSocket.
String getSessionId()
Mengembalikan ID sesi.
String getResponseId()
Mengembalikan ID respons dari respons server terbaru.
long getFirstTextDelay()
Mengembalikan delay teks pertama dari respons terbaru (milidetik).
long getFirstAudioDelay()
Mengembalikan delay audio pertama dari respons terbaru (milidetik).
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
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
Copy
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(); } }}