Real footage — live English ↔ Traditional ChineseIBA “Train the Trainer” class · Kaohsiung
Pick your two languages and start listening. Original on the left, translation on the right; translated speech can be muted — the text never stops.
The browser streams microphone PCM straight to Gemini Live. The Worker only signs short-lived tokens — transcripts and audio are never stored.
Picture-in-picture captions float above any app, and a cumulative Markdown summary refreshes every ten minutes.
The expensive, long-running part — audio — never touches the server. The browser streams straight to Gemini Live; Cloudflare only signs tokens and writes summaries.
16kHz
mic in
24kHz
speech out
60s
token deadline
~6s
reconnect buffer
10min
summary cadence
Microphone
16 kHz PCM · AudioWorklet
Gemini Live
direct WebSocket — no proxy
Transcripts + 24 kHz speech
scheduled, gapless playback
Cloudflare Worker never touches the audio — it signs single-use 60-second tokens and writes a cumulative summary every ten minutes.
Microphone PCM streams from the browser to Gemini Live over WebSocket. The Worker issues the token but never proxies a single audio frame.
Each ephemeral token works once, must start a session within 60 seconds, and locks the model and target language server-side.
OpenCC converts Simplified to Taiwan Traditional lazily, appending only the new delta so re-conversion never duplicates text; sentences break on 。!? and .?!
Transcripts, audio and summaries live only in page memory. Refresh clears everything; localStorage keeps just UI preferences.