尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 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.