尚未偵測到更新。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.