Select any text, translate it, and have it read aloud — or dub a whole YouTube lecture into your language with one click. Entirely powered by Chrome's native, on-device AI; works on regular web pages and inside Chrome's built-in PDF viewer.
▶ Install from the Chrome Web Store
Everything runs locally in the browser:
- Translation → built-in
Translator+LanguageDetectorAPIs - Speech → native
chrome.ttsAPI
Settings and the toolbar popup:
The floating panel reading a translation aloud:
- Right-click → VoiceOne on any selected text:
- Auto Read Original Language — reads the selection aloud in its own language.
- Translate & Read ▸ <language> — translate into one of ~15 languages and read it.
- 🎓 YouTube dubbing (new in 1.1) — a VoiceOne button in the YouTube player re-narrates any lecture in the language you choose with one click: the original audio ducks down and the video's captions are spoken in sync by a clean TTS voice, translated on-device when needed. A small on-page panel lets you switch the dub language live, adjust how loud the original stays, and stop. No downloads, no external services, no waiting.
- Floating control panel with Pause · Resume · Repeat · Stop · Clear · ✕ and a live
status line (e.g.
Translated mixed → fr · Google français). Drag it by the header. - Toolbar popup mirrors the panel and works as a fallback control surface.
- Options for voice, rate, pitch, volume, default target language, the original-audio level while dubbing, and which languages appear in the menu — including adding your own language (name + ISO code + optional voice locale) beyond the built-in set.
The dub re-narrates the video's caption track (auto-generated or manual — virtually every instructional video has one), synchronized to the player clock. If the video already has a caption track in your chosen language, it's used directly — no translation step at all. That means:
- It's a clear neutral TTS voice, not a "de-accented" clone of the lecturer's own voice.
- A video with no captions at all can't be dubbed (you'll get a clear message).
- Caption transcription errors pass through to the narration.
- Live streams aren't supported.
- Google Chrome 138 or newer (built-in AI APIs).
- Chrome's on-device translation models download on first use of a language pair (you'll see a "Downloading model… %" status). If a model or language pair isn't available, VoiceOne tells you and (where possible) reads the original text instead.
From the Chrome Web Store (recommended): chromewebstore.google.com/detail/voiceone
Or load the source (for development):
- Download or clone this repository.
- Open
chrome://extensions. - Toggle Developer mode (top-right).
- Click Load unpacked and select the
VoiceOnefolder. - (For local PDFs via
file://) click Details on VoiceOne and enable Allow access to file URLs.
Selections (any page or PDF):
- Select text on any page (or in a PDF).
- Right-click → VoiceOne → Auto Read Original Language or Translate & Read ▸ a language.
- The floating panel appears, shows the (translated) text, and reads it aloud. Use the panel or the toolbar popup to pause/resume/repeat/stop.
YouTube dubbing:
- Open any YouTube video with captions (most lectures have auto-captions).
- Click the speaker button in the player's bottom-right controls.
- The lecturer's audio ducks down and a clear voice narrates in sync. Videos in another language show a brief on-device "Translating… %" pass first.
- Use the VoiceOne dub panel (bottom-left) to switch the dub language live, adjust how loud the original audio stays, or stop (✕). Clicking the player button again also stops. Defaults live in Settings → YouTube dubbing.
You can also click the toolbar icon to read the current selection, translate to your default language, control playback, or open Settings.
| File | Role |
|---|---|
manifest.json |
MV3 manifest, permissions, menu |
background.js |
Service worker: menus, detection, translation, chrome.tts, panel state |
panel.js |
Floating control panel injected into the page (Shadow DOM) |
youtube.js |
YouTube content script: dub button, control panel, caption fetch, synced narration |
popup.html / popup.js |
Toolbar popup + fallback controls |
options.html / options.js |
Preferences (chrome.storage.sync) |
lib/languages.js |
Language list + TTS hints |
lib/captions.js |
YouTube caption helpers: player-response extraction, track picking, json3/XML parsing |
icons/ |
Toolbar/store icons |
- "No on-device model for X → Y" — that language pair isn't supported by the built-in Translator on your Chrome build; try another target or update Chrome.
- Panel doesn't appear over a PDF — use the toolbar popup, which mirrors the same controls and status.
- No voice / wrong language voice — install or pick a voice in Settings; some languages use Chrome's online "Google" voices, which need a network connection.
- "VoiceOne was updated — reload this page" — after installing or reloading the extension, YouTube tabs that were already open keep the old script; refresh the tab once.
- "couldn't load captions" — YouTube occasionally gates caption requests; reload the page and try again, or try another video.
Released under the MIT License © 2026 Rohit Waghire.
VoiceOne is a local-first demo of Chrome's built-in AI.

