explainroo
explainroo is a free, open source tool that lets your AI agent make explainer videos with a voice. It runs on your own computer and needs no API key.
Real-time Indonesian and Russian voice translation with dubbed audio.
MediaTypeScript · PythonGitHub @yosuahresOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Offline Russian <-> Indonesian voice translation prototype. Everything runs locally on CPU.
Pipeline: Whisper (speech to text) -> Qwen3 4B instruct via Ollama (translation) -> Supertonic 3 (text to speech).
macOS:
brew install ffmpeg ollama
python3.12 -m venv .venv && .venv/bin/pip install -r requirements.txt
ollama serve & # or start the Ollama app
ollama pull qwen3:4b-instruct
Windows (the demo box):
winget install Gyan.FFmpeg Ollama.Ollama Python.Python.3.12
py -3.12 -m venv .venv ; .venv\Scripts\pip install -r requirements.txt
ollama pull qwen3:4b-instruct
First run downloads Whisper (~500 MB for small, ~1.5 GB for medium) and Supertonic (~400 MB).
.venv/bin/python cli.py --selftest # synthesises test sentences, runs both directions
.venv/bin/python cli.py recording.m4a --direction ru-id # any audio file; writes out/result.wav
.venv/bin/python -m app.server # http://localhost:8000
| Method | Path | Body | Returns |
|---|---|---|---|
| GET | /health | model info | |
| POST | /translate | multipart file (audio), direction = ru-id or id-ru | JSON: transcript, translation, audio_base64 (wav), timings |
| POST | /translate/wav | same | audio/wav body, text in X-Transcript / X-Translation headers |
| POST | /youtube | form url, direction, voice | NDJSON stream, one event per line: status, video (title), phrase (same fields as /translate), error, done |
| POST | /tts | form text, lang (ru/id) | audio/wav |
Example:
curl -F file=@out/selftest-input-ru-id.wav -F direction=ru-id http://localhost:8000/translate
In a second terminal, while the API is running:
cd frontend
npm install
npm run dev
Open http://localhost:3000, choose Indonesian → Russian or Russian → Indonesian,
select a dubbing voice, then press the mic once and keep talking. The browser
sends what you said to /translate as soon as you stop talking (0.5 s of quiet).
If you talk non-stop, it also sends at the next short breath once you have spoken
for 3 s (or at 12 s at the latest), so translations keep coming. Each dubbed
translation plays as soon as it is ready, one after another. Press the mic again
to stop; any unfinished phrase is still translated. Turn on "Using headphones" to
keep the mic listening while translations play. Click the language
pill at the bottom to switch direction mid-conversation.
To translate a YouTube video instead, choose the languages and voice, paste the link under
"or translate a YouTube video" and press Translate. The same two-column view opens, without the mic:
the server downloads the audio, and each translated phrase appears and plays as soon as it is
ready. Go Back stops the translation.
Set NEXT_PUBLIC_API_URL in frontend/.env.local if the API is not at
http://localhost:8000 (see frontend/.env.example).
To run the API on a Windows PC and the frontend on Vercel through a Cloudflare tunnel, follow DEPLOY.md.
| Variable | Default | Notes |
|---|---|---|
WHISPER_MODEL | small | use medium on the 16 GB Windows box |
WHISPER_COMPUTE | int8 | |
MT_MODEL | qwen3:4b-instruct | must be a non-thinking model |
OLLAMA_URL | http://127.0.0.1:11434 | |
TTS_VOICE_RU / TTS_VOICE_ID | M1 / F1 | presets M1-M5, F1-F5 |
TTS_SPEED | 1.0 | 0.7 to 2.0 |
YOUTUBE_MAX_MINUTES | 30 | longer videos are refused |
PORT | 8000 |
yt-dlp and, for best results, Deno or Node on PATH. If downloads
start failing, run pip install -U "yt-dlp[default]".qwen3:4b tag: it is a thinking model and ignores the no-think flag, so it rambles and is 10x slower.