API Terjemahan Real-Time
Tambahkan terjemahan suara-ke-suara secara langsung ke aplikasi apa pun dalam hitungan menit. Streaming audio masuk dan terima audio serta transkrip terjemahan kembali — semuanya melalui satu koneksi WebSocket.
Mengapa API Terjemahan Real-Time?
Dibangun untuk aplikasi yang membutuhkan terjemahan instan dan berkelanjutan. Satu koneksi persisten menangani seluruh sesi — tanpa polling, tanpa jeda, dan tanpa kompleksitas.
Latensi Sangat Rendah
Audio streaming diterjemahkan dan dikembalikan secara real-time. Tidak ada perjalanan bolak-balik request-response — hasil tiba saat pembicara sedang berbicara.
Audio Masuk, Audio Keluar
Kirim audio mikrofon mentah dan terima kembali suara yang telah diterjemahkan. Transkrip input dan output juga di-streaming sehingga Anda dapat menampilkan caption secara langsung.
130+ Bahasa
Terjemahkan ke bahasa utama mana pun menggunakan kode bahasa standar BCP-47. Ganti bahasa target antar sesi tanpa perubahan SDK.
Aman Secara Default
Setiap koneksi diautentikasi menggunakan token JWT Anda. Sesi diisolasi per pengguna — audio Anda tidak pernah dibagikan atau disimpan.
Hubungkan & Autentikasi
API Terjemahan Real-Time berjalan melalui namespace Socket.IO khusus. Kirim API key Anda sebagai parameter query saat membuat koneksi — server akan memvalidasinya sebelum sesi dimulai.
wss://api.gpttranslator.co └── namespace: /api/realtime-translator
import { io } from 'socket.io-client'; // Connect to the Realtime Translation namespace const socket = io('https://api.gpttranslator.co/api/realtime-translator', { transports: ['websocket'], query: { apiKey: 'YOUR_API_KEY' // your GPT Translator API key }, });
Catatan: Dapatkan API key Anda dari dashboard GPT Translator di bagian API Keys. Koneksi tanpa API key yang valid akan langsung ditolak.
Jangan pernah mengekspos API key Anda di kode sisi klien
Contoh kode di atas hanya untuk ilustrasi. Menyematkan API key langsung di JavaScript browser akan mengeksposnya kepada siapa saja yang memeriksa source code halaman atau lalu lintas jaringan Anda — siapa pun kemudian dapat menggunakan key Anda dan menghabiskan saldo token Anda.
✅ Disarankan: gunakan proxy melalui backend Anda sendiri
Server Anda menyimpan API key dengan aman dan membuka koneksi Socket.IO atas nama browser. Browser terhubung ke server Anda, bukan langsung ke API terjemahan.
// Your backend holds the key — the browser never sees it
const socket = io('https://api.gpttranslator.co/api/realtime-translator', {
transports: ['websocket'],
query: { apiKey: process.env.GPT_TRANSLATOR_API_KEY },
});
// Proxy events between the browser client and the translation API
browserSocket.on('translation_start', (data) => socket.emit('translation_start', data));
browserSocket.on('audio_chunk', (chunk) => socket.emit('audio_chunk', chunk));
browserSocket.on('translation_stop', () => socket.emit('translation_stop'));
socket.on('output_audio', (data) => browserSocket.emit('output_audio', data));
socket.on('output_transcript', (data) => browserSocket.emit('output_transcript', data));
socket.on('input_transcript', (data) => browserSocket.emit('input_transcript', data));Siklus Hidup Sesi
Setiap sesi terjemahan mengikuti urutan sederhana lima langkah. Memahami urutan ini akan membantu Anda membangun integrasi yang andal.
Mulai sesi
Anda mengirimEmit translation_start dengan kode bahasa target. Server akan mencadangkan saldo token Anda dan mulai menginisialisasi sesi.
Tunggu sinyal kesiapan
Anda mendengarkanServer mengirim tiga event status secara berurutan: session_initializing, translation_ready, dan terakhir ready_for_audio. Mulai kirim audio hanya setelah ready_for_audio diterima.
Streaming potongan audio
Anda mengirimTerus emit event audio_chunk dengan audio PCM16 yang di-encode base64 dan ditangkap dari mikrofon. Jaga ukuran potongan tetap kecil (sekitar 100 ms) untuk mendapatkan latensi terendah.
Terima hasil terjemahan
Anda mendengarkanSaat proses terjemahan berlangsung, server melakukan streaming output_audio (suara terjemahan), output_transcript (teks terjemahan), dan input_transcript (teks sumber yang dikenali) — semuanya dalam bentuk delta bertahap.
Akhiri sesi
Anda mengirimEmit translation_stop untuk menutup sesi dengan aman. Penggunaan token akan diselesaikan dan event translation_closed mengonfirmasi bahwa sesi telah berakhir.
Referensi Event
Referensi lengkap dari setiap event di API Terjemahan Real-Time — apa yang Anda kirim dan apa yang Anda terima.
Event yang Anda Kirim
Anda mengirimtranslation_startMemulai sesi terjemahan baru. Kirim kode bahasa BCP-47 untuk bahasa target.
{
"targetLanguage": "es" // BCP-47 language code (e.g. "fr", "de", "zh", "ja")
}audio_chunkMengirim potongan audio mikrofon mentah. Field audioData harus berupa buffer audio PCM16 mono yang di-encode base64 dengan sample rate 24.000 Hz.
{
"audioData": "<base64-encoded PCM16 mono audio>"
// Sample rate: 24 000 Hz
// Encoding: 16-bit PCM, little-endian
// Send continuously while the user speaks
}translation_stopMengakhiri sesi dengan aman. Server menyelesaikan penagihan dan mengirim translation_closed.
Event yang Anda Dengarkan
Anda mendengarkansession_initializingstatusDikirim segera setelah translation_start. Menunjukkan bahwa sesi sedang disiapkan — belum siap untuk audio.
translation_readystatusDikirim setelah koneksi sisi server berhasil dibuat. Masih menunggu aktivasi akhir sesi.
ready_for_audiostatusSesi sudah sepenuhnya aktif. Mulai streaming event audio_chunk sekarang.
output_audiostreamPotongan audio suara terjemahan. Delta adalah buffer audio PCM16 yang di-encode base64. Buffer delta berturut-turut dan putar secara berurutan.
{
"delta": "<base64-encoded PCM16 audio chunk>"
// Decoded and played directly to the output speaker
// Arrives incrementally — buffer chunks for smooth playback
}output_transcriptstreamFragmen teks terjemahan. Gabungkan delta untuk membangun transkrip terjemahan lengkap di UI Anda.
{
"delta": "Hola, ¿cómo estás?" // translated text fragment
}input_transcriptstreamFragmen ucapan sumber yang dikenali. Gabungkan delta untuk membangun caption bahasa sumber.
{
"delta": "Hello, how are you?" // recognized source speech fragment
}translation_closedstatusMengonfirmasi bahwa sesi telah berakhir dengan bersih — baik setelah translation_stop atau ketika server menutup sesi karena token habis.
translation_errorerrorTerjadi kesalahan tak terduga. Field message menjelaskan apa yang salah. Sesi mungkin masih aktif — Anda dapat mencoba lagi atau memanggil translation_stop.
{
"message": "Translation session error. Please try again."
}insufficient_tokenserrorSaldo token Anda habis. Sesi otomatis ditutup. Upgrade paket Anda untuk melanjutkan.
{
"message": "You have reached the limit of words for translation...",
"remainingTokens": 0
}Contoh Integrasi Lengkap
Contoh JavaScript minimal namun lengkap yang menunjukkan cara terhubung, memulai sesi, streaming audio, menangani semua event server, dan menghentikan sesi dengan benar.
import { io } from 'socket.io-client';
const socket = io('https://api.gpttranslator.co/api/realtime-translator', {
transports: ['websocket'],
query: { apiKey: 'YOUR_API_KEY' },
});
// ─── Listen for server events ───────────────────────────────────────
socket.on('session_initializing', () => {
console.log('Session is being prepared...');
});
socket.on('translation_ready', () => {
console.log('Session connected. Waiting for activation...');
});
socket.on('ready_for_audio', () => {
console.log('Ready! Start streaming audio chunks now.');
startMicrophone(); // begin capturing and sending audio
});
socket.on('output_audio', ({ delta }) => {
// delta is a base64-encoded PCM16 audio chunk
playAudioChunk(atob(delta));
});
socket.on('output_transcript', ({ delta }) => {
// Append translated text delta to your UI
appendToTranscript('translated', delta);
});
socket.on('input_transcript', ({ delta }) => {
// Append recognized source speech to your UI
appendToTranscript('original', delta);
});
socket.on('translation_closed', () => {
console.log('Session ended.');
stopMicrophone();
});
socket.on('translation_error', ({ message }) => {
console.error('Error:', message);
stopMicrophone();
});
socket.on('insufficient_tokens', ({ message, remainingTokens }) => {
console.warn('Out of tokens:', message, 'remaining:', remainingTokens);
stopMicrophone();
showUpgradePrompt();
});
// ─── Start a session ────────────────────────────────────────────────
socket.emit('translation_start', { targetLanguage: 'es' });
// ─── Stream audio chunks ────────────────────────────────────────────
function onAudioData(pcm16Base64) {
socket.emit('audio_chunk', { audioData: pcm16Base64 });
}
// ─── Stop the session ───────────────────────────────────────────────
function stopSession() {
socket.emit('translation_stop');
}Cara Kerja Penagihan
Terjemahan real-time ditagihkan berdasarkan durasi sesi — waktu antara sesi diaktifkan hingga translation_stop atau token habis. Tidak ada perhitungan per karakter atau per kata.
Penagihan Per Detik
Penggunaan diukur dalam detik sejak sesi sepenuhnya aktif hingga berakhir. Detik parsial dibulatkan ke atas.
Token Dipotong Secara Langsung
Token dipotong dari saldo Anda di akhir setiap sesi berdasarkan durasi sebenarnya. Saldo tersedia Anda diperiksa sebelum sesi dapat dimulai.
Batas Otomatis
Sesi akan otomatis dihentikan ketika sisa saldo token Anda hampir habis. Anda akan menerima event insufficient_tokens sebelum sesi ditutup.
Perkiraan Konsumsi Token
Catatan: Perkiraan token bersifat perkiraan. Konsumsi sebenarnya bergantung pada tingkat kebisingan audio dan aktivitas sesi. Periksa dashboard Anda untuk penggunaan real-time.
Persyaratan Format Audio
API mengharapkan format audio tertentu untuk akurasi terbaik dan latensi terendah. Gunakan cuplikan kode di bawah ini untuk menangkap dan mengonversi audio mikrofon di browser.
PCM 16-bit, little-endian24 000 Hz1 (mono)Base64 string// Capture PCM16 audio from the browser microphone
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const audioContext = new AudioContext({ sampleRate: 24000 });
const source = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(4096, 1, 1);
processor.onaudioprocess = (e) => {
const float32 = e.inputBuffer.getChannelData(0);
// Convert Float32 → Int16 PCM
const int16 = new Int16Array(float32.length);
for (let i = 0; i < float32.length; i++) {
int16[i] = Math.max(-32768, Math.min(32767, float32[i] * 32768));
}
// Base64-encode and send
const base64 = btoa(String.fromCharCode(...new Uint8Array(int16.buffer)));
socket.emit('audio_chunk', { audioData: base64 });
};
source.connect(processor);
processor.connect(audioContext.destination);Pertanyaan yang Sering Diajukan
Pertanyaan umum tentang integrasi dan penggunaan API Terjemahan Real-Time.