Skip to content
danifest751Public

About

Russian voiceover for English, Chinese, Korean and Japanese video: a YouTube browser extension with a self-hosted server, and a Windows desktop player. Speech recognition and voices run locally on CPU; only text goes to a translation model (OpenRouter, Kilo, OpenAI or local).

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Repository files navigation

Synchro

Russian voiceover for English, Chinese, Korean, and Japanese video. Synchro recognizes the original speech, translates it, and speaks it in Russian in sync with the picture — on YouTube through a browser extension, or for your own video files in a Windows or Apple Silicon macOS desktop player. Speech recognition and the voices run on your own hardware; only the recognized text goes to a translation model you choose, which can also be local.

MIT license Tests Extension Desktop

Two ways to use it

Synchro Desktop Browser extension + server
Watches Local files: MP4, MKV, AVI, MOV, WebM, HEVC, AV1… YouTube in its native player; other sites by tab capture
Runs on Windows (CPU with AVX2) or macOS 15+ (Apple Silicon) Chrome or Edge, plus a Synchro server you host
Speech recognition and voices Your PC's CPU, bundled in the installer Your server (CPU, optional GPU), or the viewer's PC
Translation OpenRouter, Kilo Gateway, OpenAI, or any OpenAI-compatible address The server's local model, or OpenRouter, Kilo Gateway, OpenAI
Setup Run the installer, paste a key Deploy the server, load the extension
Download Desktop 0.1.0 (.exe + .bin) Latest extension release

Features

Voiceover

  • Phrase-level timing: each Russian phrase starts with the original phrase; long phrases slow the video to fit the speech and pauses play at normal speed, so speech and picture stay together.
  • The original track stays audible between phrases and is smoothly lowered while the voice speaks.
  • Five Russian voices (Silero V5 CIS): Albina, Alfia, Roman, Eduard, Alexander, with stress marked by RUAccent.
  • Optional translated captions.

Languages

  • English recognized by GigaAM Multilingual; Chinese, Korean and Japanese by SenseVoice-Small — both run on a CPU, 20–50× faster than real time on a laptop. Whisper is an optional server fallback.
  • The whole window of speech is translated with the previous phrases as context, then aligned back to the phrases.
  • Names and numbers are rewritten for Russian speech; anything a model leaves untranslated is spelled out instead of stopping playback.

Reliability

  • Translation runs about half a minute ahead; playback waits briefly instead of skipping when it falls behind.
  • A failed window is retried without losing audio; seeking translates again from the new position.
  • YouTube audio is fetched through the viewer's browser, so a server in a data centre needs no YouTube access of its own.

Server and extension

  • Native YouTube playback with an overlay for voice, volumes, captions, zoom, fit and fill.
  • Per-viewer access keys, revocation, session isolation and a concurrency limit.
  • Local, cloud-text, or fully cloud processing per viewer; searchable model catalogs with live balance and approximate cost per minute.
  • Verified extension updates from GitHub releases, and an all-in-one CPU server image.

Quick start

Desktop player (Windows)

  1. Download Synchro-Setup-0.1.0.exe and Synchro-Setup-0.1.0-1.bin from the desktop release into one folder.
  2. Run the .exe (per-user install, no administrator rights, about 3.2 GB).
  3. Start Synchro, choose a translation provider and paste its key — or enter the address of a local OpenAI-compatible server such as LM Studio or Ollama.
  4. Open video…, or right-click a file → Open with → Synchro.

Details: desktop guide.

Desktop player (macOS)

The native Apple Silicon test build uses a self-contained .app and drag-to-install .dmg. See the macOS guide for installation, requirements and building on a Mac. The Windows release linked above does not contain the Mac build.

Browser extension with your own server

  1. git clone https://github.com/danifest751/synchro.git
  2. Deploy the server: deployment guide. The quickest route is the all-in-one CPU container with cloud text translation.
  3. Load extension/ unpacked in Chrome or Edge (Developer mode), import your .local/connection.json in the extension settings and press Save and test.
  4. Open a YouTube video, click Synchro → Translate tab.

Viewers who received a configured extension from an operator only need the user guide. The public source defaults to loopback; synchro.example.com is a placeholder you replace when you publish your own server.

How it works

flowchart LR
    subgraph Viewer[Viewer's computer]
        Video[YouTube player or local file]
        Browser[Extension or desktop player]
    end
    subgraph Engine[Synchro engine: server or bundled]
        ASR[GigaAM / SenseVoice]
        Stress[RUAccent]
        TTS[Silero voices]
    end
    Provider[Translation model: local or cloud]
    Video -- audio --> ASR
    ASR -- text --> Provider
    Provider -- Russian text --> Stress --> TTS
    TTS -- timed phrases --> Browser
    Browser -- speed, volume, pause --> Video
Loading

Audio is processed in windows of 10, then 20 seconds with a one-second overlap. Word timestamps from recognition split speech into phrases at pauses and sentence ends; the translated window is aligned back to those phrases, and each phrase is synthesized, loudness-normalized and returned with its start time and source duration. The player schedules each phrase against the video clock. For YouTube, the extension also lends its network to the server: yt-dlp's requests and the audio download run in the viewer's browser, without cookies, and only to YouTube hosts.

See architecture for the full flow, timing rules and component map.

What leaves your machine

Data Desktop Extension + your server
Video Stays on your PC Plays from YouTube in your browser
Audio Stays on your PC Goes to your server (YouTube audio is fetched through your browser)
Recognized text and two previous phrases Your translation provider, or nowhere with a local model Your server; plus your cloud provider in a cloud mode
API keys Your translation provider Your server, for the session only

In the fully cloud mode, audio and speech also go to the chosen provider. Synchro collects no telemetry.

Repository layout

Path Contents
server/ Python engine and gateway (FastAPI): recognition, translation, alignment, speech, sessions
extension/ Manifest V3 extension: YouTube overlay, tab capture player, settings, browser relay
desktop/ Rust desktop player (mpv, egui), Windows installer and Apple Silicon macOS bundle
deploy/ Inference workers, Dockerfiles, service examples, Caddy and tunnel examples
tools/ Configuration, client keys, packaging, extension updater, smoke tests
docs/ User, deployment, API, architecture, cloud, models and troubleshooting guides

Documentation

Document Contents
Desktop player Windows installer, providers, local models, troubleshooting, building
User guide Extension installation, playback, voices, controls, updates
Deployment Models, services, CPU container, configuration, HTTPS, guest keys
Cloud translation Providers, API keys, model IDs, costs, HY-MT2 behavior
Speech on the viewer's PC Running recognition and voices next to the browser
Architecture Data flow, timing, browser relay, component map
API Authentication, endpoints, retries, response schema
Models and performance Hardware, measurements, model licenses
Troubleshooting Connection failures, buffering, speech, YouTube
Extension updates Automatic GitHub releases and the updater
Roadmap · Changelog · Contributing · Security

Development

Requirements: Python 3.11+, Node.js 22+, FFmpeg; Rust stable for the desktop player. Models are not needed for the tests.

python -m pip install -r server/requirements.txt
cd server && python -m unittest discover -s tests && cd ..
node --test tests/*.test.mjs
python -m unittest discover -s tests -p 'test_*.py'
cargo test --manifest-path desktop/Cargo.toml   # Windows or macOS
python tools/package.py                          # extension ZIP

A push to main that changes extension/manifest.json publishes an extension release after the tests pass; see contributing.

Status and limitations

Synchro is a working prototype. Extension 0.4.6 is tested with recorded public YouTube videos in English, Chinese, Korean and Japanese; Desktop 0.1.0 with English video files on Windows 10. Not yet covered: live streams, private or age-restricted YouTube videos, very long sessions, and recovery from mid-video ads. Recognition and translation can make mistakes, especially with music, overlapping voices and strong accents; phrase timing is phrase alignment, not lip sync. Tab capture can be blocked by DRM. The desktop installer is not code-signed.

License and acknowledgments

Synchro's source code and documentation are licensed under MIT. The PCM resampler adapts MIT-licensed code from Avorythm.

Models, voices and runtimes keep their own licenses. The desktop installer redistributes GigaAM Multilingual (MIT), SenseVoice-Small (FunASR Model Open Source License, attribution required), Silero v5_cis_base_nostress (MIT) and RUAccent (MIT), together with mpv (GPL-2.0+), FFmpeg (GPL-3.0) and a portable CPython. Other Silero releases are under a non-commercial license and are not used. See model notes and third-party notices.

Built on GigaAM, SenseVoice via sherpa-onnx, Silero, RUAccent, yt-dlp, FFmpeg and mpv.

About

Russian voiceover for English, Chinese, Korean and Japanese video: a YouTube browser extension with a self-hosted server, and a Windows desktop player. Speech recognition and voices run locally on CPU; only text goes to a translation model (OpenRouter, Kilo, OpenAI or local).

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages