Last reviewed on October 4, 2026

How voices and languages work in the browser

Browser text-to-speech can only speak a language if a voice for it is installed on your device (or, in Chrome and Edge, offered as an online voice). The page doesn't download voices. That's why the same converter might offer 5 languages on one laptop and 60 on another. Each voice reports a BCP 47 language tag such as en-GB or pt-BR; the first part is the language, the second the region.

Test the languages on your device

Press Play to hear a sample with the best matching voice your browser reports. If there's no voice for a language, you'll see a note instead — follow install system voices to add one.

LanguageTagSampleYour device
English (US)en-USThe quick brown fox jumps over the lazy dog.
English (UK)en-GBWould you like a cup of tea before the meeting?
Spanish (Spain)es-ESBuenos días, ¿cómo estás hoy?
Spanish (Mexico)es-MX¿Qué onda? Nos vemos mañana en la tarde.
Frenchfr-FRBonjour, je suis ravi de faire votre connaissance.
Germande-DEGuten Tag, wie geht es Ihnen heute?
Italianit-ITBuongiorno, come stai oggi?
Portuguese (Brazil)pt-BROlá, tudo bem com você?
Portuguese (Portugal)pt-PTOlá, como está? Hoje está um dia bonito.
Dutchnl-NLGoedemorgen, hoe gaat het met je?
Polishpl-PLDzień dobry, jak się masz?
Russianru-RUЗдравствуйте, как у вас дела?
Ukrainianuk-UAДобрий день, як справи?
Turkishtr-TRMerhaba, bugün nasılsınız?
Arabicarمرحبًا، كيف حالك اليوم؟
Hebrewhe-ILשלום, מה שלומך היום?
Hindihi-INनमस्ते, आप कैसे हैं?
Malayalamml-INനമസ്കാരം, സുഖമാണോ?
Tamilta-INவணக்கம், எப்படி இருக்கிறீர்கள்?
Thaith-THสวัสดีครับ วันนี้เป็นอย่างไรบ้าง
Vietnamesevi-VNXin chào, bạn có khỏe không?
Indonesianid-IDSelamat pagi, apa kabar?
Chinese, Mandarin (Simplified)zh-CN你好,今天天气很好。
Chinese, Mandarin (Taiwan)zh-TW你好,今天天氣很好。
Chinese, Cantonese (Hong Kong)zh-HK你好,今日天氣好好。
Japaneseja-JPこんにちは、お元気ですか?
Koreanko-KR안녕하세요, 오늘 기분이 어떠세요?

Language-specific notes

Chinese: Mandarin vs Cantonese (zh-HK)

Voices tagged zh-CN and zh-TW speak Mandarin (with simplified or traditional reading conventions). Voices tagged zh-HK on Apple devices and in Google's Android TTS are normally Cantonese — for example Apple's "Sinji" and Google's Cantonese voice — but check by listening: a few engines label a Mandarin voice with a Hong Kong region. Some systems use yue or yue-HK for Cantonese instead. When choosing a voice in code, look for zh-HK or a yue prefix.

Arabic

Arabic voices are tagged by region (ar-SA, ar-EG, ar-001 and others); any of them reads Modern Standard Arabic text. Adding short vowels (tashkeel) to ambiguous words noticeably improves pronunciation, because without them the engine has to guess. Right-to-left text works normally in the converter. Browser TTS also works when you open a saved HTML file locally, because it needs no server — only an installed Arabic voice.

Hindi, Malayalam, Tamil and other Indian languages

Android's Google TTS covers many Indian languages; on desktop, availability varies by OS and language. Write numbers and English loanwords in the script you want them pronounced in, and expect mixed Hinglish text to be read with the Hindi voice's phonetics.

Thai, Japanese and Chinese (no spaces between words)

These languages don't separate words with spaces. Engines handle that fine, but tools that split long text need to break at punctuation such as 。, !, ? or the Thai space between phrases. Our converter splits on these characters too, so long passages work.

German, French and other languages: "no voice available"

If an app reports something like "No German voice is available on this device", install the language's speech/voice pack in your OS (on Windows, add the language with the Text-to-speech feature ticked; on macOS, download a voice under Spoken Content), then restart the browser.

Portuguese and Spanish variants

pt-BR and pt-PT, or es-ES and es-MX, differ in accent and some vocabulary. Pick the voice that matches your audience; on Android, the Google TTS settings let you download each variant separately and use it offline.

Choosing a voice in code

// Prefer an exact tag, then the same language, then anything.
function pickVoice(voices, tag) {
  const norm = (s) => (s || '').toLowerCase().replace('_', '-');
  const want = norm(tag), base = want.split('-')[0];
  return voices.find(v => norm(v.lang) === want)
      || voices.find(v => norm(v.lang).split('-')[0] === base)
      || voices.find(v => v.default) || voices[0] || null;
}

Always set utterance.lang as well as utterance.voice; some engines use the tag to pick pronunciation rules. More patterns are in the speechSynthesis developer guide.