Menjelaskan cara menghubungkan ke Realtime API di browser menggunakan WebRTC dan JavaScript untuk mengaktifkan panggilan audio/video real-time dengan model qwen3.5-omni-plus-realtime.
WebRTC cocok untuk skenario voice berbasis browser dengan latensi rendah. Audio ditransmisikan langsung melalui UDP dengan pembatalan gema (echo cancellation) dan pengurangan noise bawaan. WebRTC hanya mendukung mode VAD sisi server (
server_vad atau semantic_vad). Mode manual tidak didukung.Prasyarat dan catatan
- Konfigurasikan Kunci API dan tetapkan sebagai variabel lingkungan.
- Gunakan browser modern yang mendukung WebRTC (Chrome, Edge, Firefox, Safari, dan sebagainya).
- Browser harus memiliki izin mikrofon. Untuk panggilan video, izin kamera juga diperlukan.
- Browser tidak dapat langsung mengirim permintaan pertukaran SDP ke server karena pembatasan CORS. Dalam demo, jalankan perintah curl di terminal untuk menyelesaikan koneksi. Di lingkungan produksi, pembatasan ini tidak berlaku ketika permintaan diproksi melalui AppServer.
Implementasikan panggilan audio/video AI
Diagram urutan berikut menunjukkan alur lengkap panggilan audio/video WebRTC:
Diagram urutan panggilan audio/video WebRTC

Buat RTCPeerConnection
Panggil konstruktor RTCPeerConnection bawaan browser untuk membuat instans koneksi. Tidak perlu mengonfigurasi ICE server (server menangani Penelusuran NAT).
Ambil aliran media lokal
Gunakan satu panggilan getUserMedia untuk meminta audio (wajib) dan video (opsional). Aktivasi video ditentukan oleh centang pengguna pada kotak Enable video.
Audio dan video keduanya diperoleh dalam satu panggilan
getUserMedia, bukan secara terpisah. Pratinjau video berjalan pada 30 fps (untuk pratinjau lokal yang lancar); laju frame pengiriman dikurangi menjadi 2 fps melalui Canvas.Tambahkan track media ke PeerConnection
Tambahkan track audio:
session.created:
Ini setara dengan
enableSendMediaStream(false) di SDK lain. Pengiriman tidak boleh dipulihkan hingga menerima session.created.Buat DataChannel
Buat DataChannel bernama oai-events untuk bertukar event kontrol sesi dengan server AI.
Hasilkan Offer SDP
Panggil createOffer() dan atur deskripsi lokal. Tunggu hingga pengumpulan ICE selesai sebelum menggunakan Offer SDP lengkap.
Tunggu hingga
iceGatheringState === "complete" sebelum menggunakan SDP. Pada titik tersebut, SDP berisi semua informasi kandidat ICE.Pertukaran SDP (melalui perintah curl atau AppServer)
Kirim Offer SDP ke server dan peroleh Answer SDP. Dalam demo, langkah ini dilakukan melalui perintah curl:
Di lingkungan produksi, proksi langkah ini melalui AppServer untuk menghindari pengeksposan Kunci API di front end.
{endpoint} adalah Titik akhir Realtime API.Atur Answer SDP untuk menetapkan koneksi
Atur Answer SDP yang dikembalikan server sebagai deskripsi remote untuk menetapkan koneksi WebRTC. Normalisasi format SDP sebelum mengaturnya:
Spesifikasi SDP mengharuskan akhiran baris
\r\n. normalizeSdpForSetRemote menangani kompatibilitas akhiran baris dari berbagai sumber.Konfigurasi sesi AI (session.update)
Setelah koneksi ditetapkan, server mengirim event session.created melalui DataChannel. Saat menerimanya:
- Lepaskan pemblokiran media untuk memulihkan pengiriman audio/video
- Kirim
session.updateuntuk mengonfigurasi parameter sesi
turn_detection.type dapat diatur ke server_vad (deteksi berbasis volume) atau semantic_vad (deteksi semantik). VAD manual tidak didukung dalam mode WebRTC.Percakapan real-time
Setelah koneksi ditetapkan, audio/video ditransmisikan secara real-time melalui RTP. Tanggapan suara AI remote diterima melalui callback ontrack dan diputar kembali. MediaRecorder digunakan untuk merekam tanggapan guna diunduh.
Menerima dan Merekam Audio Jarak Jauh:
session.created, response.audio_transcript.done, dan sebagainya) ditampilkan di panel event dengan dukungan ekspansi untuk melihat JSON lengkap:
Akhiri sesi dan lepaskan sumber daya
Lepaskan semua sumber daya secara berurutan saat mengakhiri panggilan. Urutan ini penting:
Setelah sesi berakhir, gunakan tombol Download remote audio untuk menyimpan rekaman tanggapan AI dalam format WebM.
Catatan penting
- Pemblokiran media harus dilepas setelah session.created: Data media yang dikirim sebelum server mengirim
session.createdakan dibuang. GunakanreplaceTrack(null)untuk sepenuhnya memblokir pengiriman hingga saat itu. - Pengurangan frame video diimplementasikan melalui Canvas: Pratinjau lokal berjalan pada 30 fps; hanya 2 fps yang dikirim ke server, dikendalikan oleh
captureStream(2). Ini menghemat bandwidth. - Normalisasi format SDP: Pastikan akhiran baris adalah
\r\nsebelum mengatur Answer SDP. Jika tidak,setRemoteDescriptionmungkin gagal. - Video bersifat opsional: Jika pengguna tidak mengaktifkan video, hanya izin mikrofon yang diminta — tidak muncul prompt izin kamera.
- Audio remote direkam secara otomatis: MediaRecorder merekam aliran audio tanggapan AI. File WebM tersedia untuk diunduh setelah sesi berakhir.
- WebRTC hanya mendukung VAD sisi server: Mode
manualtidak didukung. Gunakanserver_vad(deteksi volume) atausemantic_vad(deteksi semantik).
Unduh demo lengkap
Unduh kode contoh lengkap: webrtc_demo.html.
Dokumen terkait
- WebRTC API (MDN)
- RTCPeerConnection (MDN)
- Event client model qwen3.5-omni-plus-realtime: Client events
- Event server model qwen3.5-omni-plus-realtime: Server events