Text-to-Speech
Hear translations spoken aloud
Swiftin ships two TTS engines: AI voice via the backend (Gemini 2.5 Flash TTS, paid quota) and OS voice via the browser (free, always available). The speaker icon shows up next to translations in the selection popup and the history page.
Two engines
Same button, different engine depending on your plan and choice.
Browser voice (free)
Uses your OS's built-in voices through `chrome.tts` on Chromium and the Web Speech API on Firefox. Free, no quota, always available — but voice quality and language coverage depend on what your OS has installed.
AI voice (Pro / Team)
Routes through swiftin.dev backend to Gemini 2.5 Flash TTS. Returns a 24 kHz WAV. Two voices: Kore (female, clear and firm) and Orus (male, deliberate). Consistent quality across the 46 supported languages, but counts against your plan's TTS-token quota.
What you can configure
Only two TTS-related controls live in extension Options today. Settings persist via `chrome.storage.sync` so they follow you between browsers.
TTS engine
Pick between Backend (Gemini AI voice) and Browser (OS voice). Free users can choose Backend but the AI voice itself requires Pro/Team — picking it on Free opens the billing page instead.
Voice gender (AI voice only)
Female (Kore) or Male (Orus). The dropdown is only visible when the TTS engine is set to Backend AND your plan is Pro or Team. Browser voice uses whatever the OS chose for the language — no gender control on that side.
Where the speaker icon appears
Two places, the same TTS engine under the hood.
Selection popup
Two icons in the popup — one speaks the translation, one speaks the original. Auto-detects source language if you didn't pick one.
History page
Each saved history entry has a replay button. If the original synthesis cached its audio in the entry record, replay reuses that audio with no token charge; if not, the request re-runs through your current engine.
TTS token quota
AI voice spends from a separate token bucket (not your translation tokens). Quota resets monthly. Provider billing is per output audio token — short snippets cost little, long passages eat fast.
Auto-fallback when quota runs out
When AI TTS quota is exhausted, the backend signals the extension to use browser voice for the rest of the cycle. No error wall — the speaker icon just keeps working with the OS voice. UI shows a small "switched to system voice" hint.
Language support
AI voice covers 46 languages — every major European, East Asian and Indian language plus 20+ others. Browser voice depends on what voices your OS has installed. If neither engine has a voice for the target language, the speaker icon hides.
Common issues
Most TTS friction comes from quota, OS voices, or the audio-playback layer. Each row gives the fix.
NO_VOICESpeaker icon missing for some languages
No OS voice installed for that language AND your plan doesn't include AI voice. Install a system voice for the language, or upgrade to Pro/Team for AI voice.
QUOTA_EXHAUSTED"Switched to system voice" hint
AI quota for the month is gone. Either wait for the monthly reset, buy a TTS top-up addon (Pro/Team), or keep using browser voice — it's free and unlimited.
LINUX_QUALITYVoice sounds tinny / robotic on Linux
Linux falls back to espeak-ng, which is the lowest-quality default. Install a higher-quality TTS engine via your package manager, or switch to AI voice.
FIREFOX_COLDSTARTFirst playback fails on fresh Firefox session
Firefox loads voices asynchronously. Swiftin waits 1.5 s for them; if they don't arrive, the first request fails. Retry once and it usually works.
TOO_SHORT"Text too short" error
Gemini TTS rejects anything under 3 characters because it misclassifies them. No fix at the extension level — paste more text or use browser voice.
TOO_LONG"Text too long" error
Per-request char cap by plan: 1 000 Free / 5 000 Pro / 5 000 Team. Break the input into smaller chunks or upgrade the plan.
THROTTLED"Please wait before next playback"
Client-side rate limit (3 s minimum between TTS requests) to keep the quota from melting. Just wait a moment.
NO_AUDIO_DEVICENo sound coming out
Browser-level audio permission or system mixer issue, not Swiftin. Test in another tab (e.g. YouTube); if that's silent too, fix it at the OS / browser level first.