Streaming translation
I chose APIs that accept audio directly to support subtitles that update during playback. Keeping up with a speaker was the priority; the under-three-second figure was a development target.
Live translated subtitles for Windows, with a floating window that stays visible across applications and supports Traditional Chinese with Taiwanese wording.
Gemini Live API · OpenAI Realtime · Python · tkinter · OpenCC
00:00Demo
This recording shows English narration appearing as source text above live Traditional Chinese subtitles.
Turn on sound to follow the English narration alongside the translation. The subtitles were generated during the recording.
00:08Context
Long lectures and meetings take more effort to follow in English. When I miss a phrase, replaying it interrupts the rest of the session.
The tools I tried did not give me the combination I needed: desktop audio capture, streaming translation, and Traditional Chinese with wording familiar in Taiwan. That last detail mattered in everyday reading, including terms such as 人工智慧.
Yimu began as a tool for my own listening habits. Capturing system audio meant it could work with videos, calls, and other audio playing through the computer's default output device.
00:18Development
The first working version took one day. A written plan divided the work into four stages so I could check each part before connecting the full application.
Capture Windows playback through WASAPI loopback and prepare it for the translation API. I checked recorded audio by ear for changes in pitch or speed.
Stream audio to Gemini and display the translated text as it arrives. Checks covered live speech and reconnection after a dropped session.
Build a draggable, semi-transparent window that stays above other applications. Automated UI checks and screen review covered its appearance and behavior.
Connect capture, translation, and display. Subsequent work added the second engine, settings, transcript saving, and summaries.
Acceptance checks used recorded audio, live API sessions, and the running interface. Offline regression tests covered behavior that could be checked without sending API requests.
00:27How it works
Yimu sends captured audio to the selected translation engine and displays its text output as subtitles.
Capture sound from the default Windows output device through WASAPI loopback. An existing caption track is not required.
Convert stereo audio to mono PCM and resample it for the selected engine.
The selected engine receives the audio and returns translated text. Changing engines reconnects the translation session without restarting the app.
For Traditional Chinese, OpenAI output passes through OpenCC's Taiwan conversion. A local filter also suppresses repeated Chinese source text.
Show source text and translation in a floating window, with separate controls for their line counts. Transcript saving is optional.
Where processing happens
The app connects directly to the selected provider using locally configured API keys. Live translation requires sending audio to that provider. Transcript files are saved locally; sending a saved transcript for summarization requires a separate confirmation.
Connection status
Audio-device failures, invalid keys, and rate limits appear in the subtitle window's status line.
With transcript saving enabled, Finish closes the session and offers a summary in the selected target language. The confirmation shows the provider, transcript character count, and estimated number of requests.
The summary uses source-language text when available and falls back to translated text. Long transcripts are processed in sections. Each summary is saved as a separate Markdown file beside the transcript, preserving earlier summaries.
00:38Design decisions
I chose APIs that accept audio directly to support subtitles that update during playback. Keeping up with a speaker was the priority; the under-three-second figure was a development target.
Character conversion alone did not address the wording I wanted to read. OpenCC's Taiwan conversion adds regional vocabulary handling to the OpenAI output.
For this single-user desktop tool, a separate application backend was unnecessary. The app connects to the translation providers with locally stored keys.
The window uses a dark background and keeps text visually dominant. Finish and Pause remain visible, while appearance and recording options sit in Settings.
Completed transcript segments are written throughout the session. This reduces how much could be lost if the app closes unexpectedly, though an unfinished segment may still be lost.
Local voice clustering provides approximate speaker labels. Settings explains the limitation so those labels are not mistaken for verified identities.
A saved transcript may contain a private meeting. Ending a session therefore requires a separate decision about sending its text for a summary. When transcript saving is off, Finish simply stops the session.
Pricing information appears beside the engine selector. Summary requests are separate from live translation, and their estimated request count appears before confirmation.
00:47Iteration
Daily use and code review revealed several failures that needed changes beyond the initial working flow.
These fixes covered playback pauses, missing configuration, device failures, and rejected requests alongside the normal translation flow.
00:56AI collaboration
This project was built in collaboration with AI; the design decisions, content, and direction are mine.
AI tools wrote the implementation code. Claude Code helped build the initial application, and later work with Codex added the summary workflow.
My work covered the product definition, written build plan, name, and logo direction. I decided how the subtitle window should behave, which controls belonged in Settings, and when a saved transcript could be sent for summarization.
Reviewing the running app and reporting problems from daily use remained part of my role throughout development.
01:04Result
Yimu now runs on my desktop for lectures and meetings. Depending on the session, I adjust the subtitle size and line count, save a transcript, or request a summary afterward.
Continued use shaped the work beyond the first version. Pausing a video exposed the unfinished-sentence problem; reading both languages exposed the missing source-text setting. Those observations led to specific fixes in the tool I use.