Belarusian Pronunciation and IPA Transcription Guide
← Back to Belarusian transcription ↑ All Languages
Table of Contents
- Getting Started
- Quick Reference (Glossary)
- How to Read IPA Symbols
- Belarusian Pronunciation Guide
- Orthography to IPA Mapping
- Using the Tool: Practical Notes
- For Developers
- Related Pronunciation Guides
About This Tool
This Belarusian transcription app uses the Wiktionary Belarusian Pronunciation Module to generate phonemic transcriptions for Belarusian text. IPA (International Phonetic Alphabet) is a standardized system for transcribing speech sounds. This tool converts Belarusian Cyrillic spelling into IPA, helping learners, linguists, and developers see how a word is pronounced. Phonemic transcription represents the abstract sound system (phonemes), while phonetic transcription shows actual speech variations (allophones).
Unlike the German or French pages, there is no lexicon here. Every word is transcribed
purely by the module's rules: the text is split on spaces, each word is cleaned (everything except letters,
combining marks, apostrophes and hyphens is dropped) and handed to the module's toIPA function.
Because the rules only see spelling, the quality of the output depends on the spelling you type, and above all
on whether you mark the stress (see the box at the top of this page).
Belarusian spelling already records the vowel reductions of the spoken language (akanye: unstressed о is written а; yakanye: unstressed е is often written я). For that reason the module maps letters to sounds almost one-to-one and applies no vowel-reduction rules of its own. What it does model is consonant palatalization, voicing assimilation, final devoicing, sibilant assimilation, gemination, the hard/soft distinction of л, and the placement of the stress mark.
Dialects & Limitations
- Supported: Standard (literary) Belarusian as written in the official orthography, one style only: Default.
- Not supported: Dialects, and the classical orthography (Taraškievica) as such. Its soft-sign spellings (сьнег) are read through the ordinary soft-sign rule and happen to give the same result as the official spelling (снег): /sʲnʲex/ vs /sʲnʲex/.
- Cyrillic only: a word that contains any non-Cyrillic letter (for example Latin letters or the modifier-letter apostrophe U+02BC) is rejected by the module. In the web app the word is then shown unchanged.
- Edge cases: Loanwords, proper names, and compounds with more than one written о need an explicit stress mark; see Common Issues.
Phonemic vs Phonetic
- Phonemic (the only form offered for Belarusian): A broad transcription generated by rules, with no dictionary lookup. Although it is labelled phonemic, it already shows some surface detail that Wiktionary's Belarusian transcriptions include: palatalization ʲ, the non-syllabic u̯, hard ɫ and consonant length ː.
- Phonetic: not available for Belarusian.
Quick Reference (Glossary)
- Phoneme
- The smallest unit of sound in a language that distinguishes meaning (e.g., /p/ vs. /b/ in English "pat" vs. "bat").
- Allophone
- A variant pronunciation of a phoneme that doesn't change meaning.
- Palatalization (soft consonant)
- A consonant pronounced with the middle of the tongue raised towards the hard palate, written ʲ after the consonant, e.g. ліс /lʲis/. A consonant followed by е ё ю я і or ь is soft.
- Hard consonant
- A consonant with no palatalization, e.g. the ɫ in ла /ɫa/.
- Soft sign (ь)
- A letter with no sound of its own that makes the preceding consonant soft: соль /solʲ/.
- Akanye / Yakanye
- The Belarusian reduction of unstressed о to a and of unstressed е to ʲa. Belarusian spelling already writes it, so the module does not apply it: it reads а as a and я as ʲa exactly as written.
- Affricate
- A consonant that begins as a stop and ends as a fricative, e.g. t͡s (ц) and d͡z (дз).
- Tie bar
- The combining mark ͡ joining two symbols into one affricate: t͡ʂ, d͡ʐ.
- Retroflex / hard sibilant
- The symbols ʂ and ʐ are what Wiktionary uses for the hard ш and ж (and t͡ʂ for ч).
- Velar fricative
- The Belarusian г is a fricative ɣ (the voiced partner of x), not a stop. The stop ɡ is written ґ.
- Non-syllabic u
- The glide u̯ in кроў /krou̯/. It is the letter ў right after a vowel.
- Final devoicing
- Voiced obstruents become voiceless at the end of a word: зуб /zup/, горад /ˈɣorat/.
- Voicing assimilation
- Neighbouring obstruents agree in voicing: вакзал /vaɡzaɫ/ (к becomes voiced before з), лёгка /ˈlʲoxka/ (г becomes voiceless before к).
- Sibilant assimilation
- A sibilant takes over the place of a following sibilant: сшыты /ʂːɨtɨ/.
- Gemination
- Two identical consonants in a row are written as one long consonant with ː: каменне /kamʲenʲːe/.
- Primary stress
- The mark ˈ is placed before the stressed syllable. It comes from a combining acute (U+0301) after the stressed vowel, or from the automatic о rule.
- Secondary stress
- The mark ˌ, produced only from a combining grave (U+0300) typed by the user.
- Word boundary marker
- An internal
#placed around each word during processing; it never appears in the output. - Foot boundary
- A comma or dash in the module's input is converted to | (the web app removes punctuation before calling the module, so you will not normally see it).
- NFKC
- Unicode normalization applied by the app to each word before transcription; it composes letters such as й and ё and leaves the combining acute in place.
How to Read IPA Symbols
The tables below list the symbols that the Belarusian module can actually produce. Each example was generated by the real engine. English approximations are rough.
Vowel Symbols
| IPA | Example | English Approximation | Notes |
|---|---|---|---|
| /a/ | вада́ /vaˈda/ | "father" | Written а; also the vowel of я after ʲ |
| /ɛ/ | гэта /ɣɛta/ | "bed" | Written э; never softens the preceding consonant |
| /e/ | ле́с /ˈlʲes/ | "bait" (shorter) | Written е; always preceded by ʲ or j |
| /i/ | ліс /lʲis/ | "see" | Written і; always preceded by ʲ or j |
| /ɨ/ | бык /bɨk/ | No English equivalent (like the Russian ы) | Written ы; central, unrounded, normally after hard consonants |
| /o/ | го́рад /ˈɣorat/ | "more" (pure vowel) | Written о and ё (after ʲ/j) |
| /u/ | ку́бак /ˈkubak/ | "food" | Written у and ю |
| /u̯/ | кро́ў /ˈkrou̯/ | "cow" (final glide) | Non-syllabic; the letter ў after a vowel |
Consonant Symbols
| IPA | Example | English Approximation | Notes |
|---|---|---|---|
| /b/ | бык /bɨk/ | "bat" | Devoices to p at the end of a word |
| /d/ | до́бры /ˈdobrɨ/ | "dog" | Devoices to t at the end of a word |
| /f/ | фатограф /faˈtoɣraf/ | "fan" | Voices to v before a voiced obstruent |
| /ɡ/ | ґанак /ɡanak/ | "go" | Only from ґ, or from г after з ж с ш |
| /ɣ/ | га́лава /ˈɣaɫava/ | No English equivalent (voiced "h") | The normal value of г |
| /j/ | я́блык /ˈjabɫɨk/, зімо́й /zʲiˈmoj/ | "yes" | From й, from the apostrophe, and from е ё ю я і at the start of a word or after a vowel |
| /k/ | ку́бак /ˈkubak/ | "skin" | Voices to ɡ before a voiced obstruent |
| /l/ | ліс /lʲis/ | "leaf" | Soft л (written as lʲ) |
| /ɫ/ | ласка /ɫaska/ | "full" (dark l) | Hard л (any л not followed by ʲ) |
| /m/ | мама /mama/ | "mom" | |
| /n/ | нага́ /naˈɣa/ | "no" | |
| /p/ | піць /pʲit͡sʲ/ | "spin" | Voices to b before a voiced obstruent |
| /r/ | рука́ /ruˈka/ | Rolled r (Spanish "pero") | |
| /s/ | сталь /stalʲ/ | "sun" | Voices to z before a voiced obstruent |
| /t/ | тры /trɨ/ | "stop" | Voices to d before a voiced obstruent |
| /v/ | вада́ /vaˈda/ | "van" | Never devoiced by the module |
| /w/ | ўчора /ˈwt͡ʂora/ | "water" | The letter ў at the start of a word or after a consonant |
| /x/ | хле́б /ˈxlʲep/ | Scottish "loch" | Voices to ɣ before a voiced obstruent |
| /z/ | зімо́й /zʲiˈmoj/ | "zoo" | Devoices to s at the end of a word |
| /ʂ/ | шэ́сць /ˈʂɛsʲt͡sʲ/ | Like "sh", tongue curled back | Hard ш |
| /ʐ/ | жо́лты /ˈʐoɫtɨ/ | Like "measure", tongue curled back | Hard ж |
| /t͡s/ | цётка /ˈt͡sʲotka/ | "cats" | Letter ц; also in the digraph forms |
| /t͡ʂ/ | чалаве́к /t͡ʂaɫaˈvʲek/ | Hard "ch" | Letter ч |
| /d͡z/ | дзе́ці /ˈd͡zʲet͡sʲi/ | "adze" | Digraph дз |
| /d͡ʐ/ | джа́зы /ˈd͡ʐazɨ/ | Hard "j" in "judge" | Digraph дж |
Diacritical Marks
| Symbol | Name | Meaning | Example |
|---|---|---|---|
| ˈ | Primary stress | Main emphasis in the word; placed before the stressed syllable | го́рад /ˈɣorat/ |
| ˌ | Secondary stress | Weaker emphasis, only from a typed grave accent | ра̀дыёста́нцыя /ˌradɨjoˈstant͡sɨja/ |
| ʲ | Palatalization | The preceding consonant is soft | дзень /d͡zʲenʲ/ |
| ː | Length mark | The consonant is long (geminate) | жыццё /ʐɨˈt͡sʲːo/ |
| ̯ | Non-syllabic | Glide, part of a syllable with a vowel | праўда /prau̯da/ |
| ͡ | Tie bar | Affricate (single unit) | цётка /ˈt͡sʲotka/ |
| | | Foot boundary | From a comma or dash in the module's input (not reachable from the web app) | год, дзень /ɣot | d͡zʲenʲ/ |
Interactive Features
- Click words to cycle variants: not applicable here. The Belarusian module returns a single transcription for each word, so there are no alternatives to cycle through.
- Audio playback: Click the speaker icon next to any word or
line to hear text-to-speech pronunciation (Belarusian voice code
be-BY; requires browser or Edge TTS support). TTS reads the Cyrillic text, not the IPA, so it is independent of the stress marks you type. - Export results: Use PDF or CSV buttons to save transcriptions in your preferred format.
Multiple Pronunciation Variants
For some languages (such as German or Russian) a word can have several valid transcriptions, and clicking the word cycles through them. Belarusian does not. The module is a deterministic function: the same spelling always gives the same single result. If a word has two stress patterns (homographs that differ only in stress) you choose the one you want by placing the acute accent yourself.
Belarusian Pronunciation Guide
This guide explains the spelling-to-sound correspondences as the module implements them. Belarusian spelling is close to phonemic: most letters have one value, and the module's job is mainly to apply palatalization and consonant assimilation and to place the stress mark.
Stress and How to Mark It
Belarusian stress is free (it can fall on any syllable) and is not marked in ordinary text. The module cannot predict it, so it relies on what you type.
Explicit Marks
- Acute accent (U+0301) after a vowel means primary stress: вада́ /vaˈda/, чалаве́к /t͡ʂaɫaˈvʲek/, сястра́ /sʲaˈstra/.
- Grave accent (U+0300) means secondary stress: ра̀дыёста́нцыя /ˌradɨjoˈstant͡sɨja/.
- The stress mark is moved to the left so that it stands before the syllable's onset consonant(s), as in ма́ці /ˈmat͡sʲi/ and кастры́чнік /kaˈstrɨt͡ʂnʲik/.
The Automatic О Rule
When a word carries no ˈ at all, has exactly one о (the letter ё counts as an о here, because it becomes ʲo), and has at least one other vowel, the module puts the primary stress on that о. A grave accent does not prevent it.
| Input | Output | Why |
|---|---|---|
| горад | /ˈɣorat/ | One о, other vowels present: stressed automatically |
| кіно | /kʲiˈno/ | Same, о is the last vowel |
| вада | /vada/ | No о: nothing is marked |
| ёсць | /josʲt͡sʲ/ | Only one vowel: nothing is marked |
| мотоцыкл | /motot͡sɨkɫ/ | Two о: nothing is marked |
| фотагра́фія | /fotaˈɣrafʲija/ | Explicit accent present: the rule is skipped |
Because the rule only looks at the letters о/ё, it is wrong for loanwords that keep an unstressed о in spelling (фотаграфія gets its mark on фо). Always add an accent for such words.
Hard and Soft Vowel Letters (е ё ю я і)
Belarusian has five "hard" vowel letters а о у э ы and five "soft" ones я ё ю е і. A soft letter after a consonant makes that consonant soft and then gives the plain vowel; at the start of a word or after a vowel it gives the glide j plus the vowel.
| Letter | After a consonant | Word-initial / after a vowel |
|---|---|---|
| я | ля /lʲa/ | яе /jaje/ |
| ё | лёд /lʲot/ | маё /maˈjo/ |
| ю | лю /lʲu/ | юнак /junak/ |
| е | лес /lʲes/ | ёсць (for comparison: е́сць /ˈjesʲt͡sʲ/) |
| і | ліс /lʲis/ | ісці /jisʲt͡sʲi/ |
The hard letters never soften: ла /ɫa/, лы /ɫɨ/, лэ /ɫɛ/. The letter э stays ɛ; the module never produces ɔ or ʲɛ (the source comments mention them as possible alternatives but they are not implemented).
Soft Sign and Apostrophe
- Soft sign ь becomes ʲ on the preceding consonant: соль /solʲ/, сталь /stalʲ/. After a soft sign, a soft vowel letter gives j: бельё /bʲeˈlʲjo/.
- Apostrophe (straight
'or typographic’) becomes j and blocks softening: аб'ява /abjava/, п'я́ны /ˈpjanɨ/, сям'я́ /sʲaˈmja/. The modifier letter apostrophe U+02BC is not accepted (see Common Issues).
Consonant Letters
- ж, ш, ч are always hard (ʐ, ʂ, t͡ʂ) and ц is t͡s; before a soft vowel letter ц becomes soft: цяпер /t͡sʲapʲer/, чалавек /t͡ʂaɫavʲek/.
- й is j: зімо́й /zʲiˈmoj/.
- х is x: хле́б /ˈxlʲep/.
- ф is f: фатограф /faˈtoɣraf/.
Affricates: дз, дж, ц, ч
The letter pairs дз and дж are always read as one affricate with a tie bar, whenever the two letters stand next to each other (the module looks at two characters at a time): дзе́ці /ˈd͡zʲet͡sʲi/, джаз /d͡ʐas/, дзякуй /d͡zʲakuj/. Before a soft vowel or ь, дз is soft: дзень /d͡zʲenʲ/. At the end of a word or before a voiceless consonant the affricate is devoiced: будзь /but͡sʲ/, дзед /d͡zʲet/.
Г, Ґ and the Stop in зг/жг
- г is the fricative ɣ: га́лава /ˈɣaɫava/, кніга /knʲiɣa/.
- ґ is the stop ɡ: ґанак /ɡanak/.
- г directly after з, ж, с or ш is a stop ɡ: мазгі́ /mazˈɡʲi/, жгу́т /ˈʐɡut/, зго́да /ˈzɡoda/.
- At the end of a word or before a voiceless consonant, ɣ becomes x, and ɡ becomes k: лёгка /ˈlʲoxka/, снег /sʲnʲex/.
Ў (Non-syllabic U)
The letter ў is w in the middle of the module's processing and then turns into the glide u̯ when it stands after a vowel and is not followed by another vowel: праўда /prau̯da/, кроў /krou̯/, аўтобус /au̯ˈtobus/. At the start of a word or after a consonant it stays w: ўчора /ˈwt͡ʂora/, ўсход /wsxot/.
Devoicing and Voicing Assimilation
Voiced obstruents lose their voicing at the end of a word and before a voiceless consonant; voiceless obstruents gain it before a voiced one. The pairs the module knows are:
| Voiced | b | d | ɡ | z | ʐ | ɣ | |
|---|---|---|---|---|---|---|---|
| Voiceless | p | t | k | s | ʂ | x | f (voices to v only) |
| Examples: зуб /zup/, ба́бка /ˈbapka/, вакзал /vaɡzaɫ/, афганістан /avɣanʲistan/, дождж /doʂt͡ʂ/ | |||||||
The sonorants (м н л р й) and в take no part: в is neither devoiced nor does it block assimilation, so встаць comes out as /vstat͡sʲ/ with v (see Common Issues). Each word is transcribed on its own, so there is no assimilation between words: a word-final voiced consonant is always devoiced, even if the next word starts with a vowel.
Sibilant and Palatal Assimilation
- Sibilant clusters merge: сшыты /ʂːɨtɨ/, расчэска /raʂt͡ʂɛska/, бяззубы /bʲazːubɨ/.
- з, с, н before a soft consonant become soft: зняць /zʲnʲat͡sʲ/, сцяна /sʲt͡sʲana/, ланцюг /ɫanʲt͡sʲux/, слёзы /ˈsʲlʲozɨ/.
- з/с before б м п ф в + soft vowel become soft too, when at least two vowels follow in the word or the cluster is at the start of the word: размяня́ць /razʲmʲaˈnʲat͡sʲ/, свята /sʲvʲata/, звязда́ /zʲvʲazˈda/.
- ц/дз before в + soft vowel become soft: цвёрды /ˈt͡sʲvʲordɨ/.
Gemination (Long Consonants)
Two identical consonants in a row (counting a following ʲ) are shown as one long consonant: ссылка /sːɨɫka/, каменне /kamʲenʲːe/, сёння /ˈsʲonʲːa/, жыццё /ʐɨˈt͡sʲːo/, аддзел /ad͡zʲːeɫ/. The same happens when assimilation makes two consonants identical (ззад /zːat/).
Hard and Soft L
Every л that is not followed by ʲ is written as the dark (hard) ɫ: лодка /ˈɫotka/, стол /stoɫ/. Soft л (before е ё ю я і ь) stays lʲ: ліса /lʲisa/, альтанка /alʲtanka/.
Comprehensive Spelling-to-IPA Mapping
Every example below was produced by the engine. A stress mark appears in the output only if it was typed (or added by the automatic о rule).
1. Vowel Letters
| Letter | Example | IPA | Notes |
|---|---|---|---|
| а | мама | /mama/ | Always a; no vowel reduction is applied |
| о | соль | /solʲ/ | Always o; see the automatic stress rule |
| у | рука́ | /ruˈka/ | u |
| э | гэта | /ɣɛta/ | ɛ, no softening |
| ы | бык | /bɨk/ | ɨ |
| я | ля, яна́ | /lʲa/, /jaˈna/ | ʲa, or ja initially / after a vowel |
| ё | лёд, ёлка | /lʲot/, /ˈjoɫka/ | ʲo / jo; not automatically stressed |
| ю | лю, юнак | /lʲu/, /junak/ | ʲu / ju |
| е | лес, е́сць | /lʲes/, /ˈjesʲt͡sʲ/ | ʲe / je |
| і | ліс, ісці | /lʲis/, /jisʲt͡sʲi/ | ʲi / ji |
2. Simple Consonant Letters
| Letter | Example | IPA | Notes |
|---|---|---|---|
| б | бык | /bɨk/ | b |
| в | вада́ | /vaˈda/ | v |
| г | га́лава | /ˈɣaɫava/ | ɣ |
| ґ | ґанак | /ɡanak/ | ɡ |
| д | до́бры | /ˈdobrɨ/ | d |
| ж | жо́лты | /ˈʐoɫtɨ/ | ʐ |
| з | зімо́й | /zʲiˈmoj/ | z |
| й | зімо́й | /zʲiˈmoj/ | j |
| к | ку́бак | /ˈkubak/ | k |
| л | ласка, ліс | /ɫaska/, /lʲis/ | ɫ hard, lʲ soft |
| м | мама | /mama/ | m |
| н | нага́ | /naˈɣa/ | n |
| п | піць | /pʲit͡sʲ/ | p |
| р | рука́ | /ruˈka/ | r; soft before soft vowels: ряд /rʲat/ |
| с | сталь | /stalʲ/ | s |
| т | тры | /trɨ/ | t |
| ф | фатограф | /faˈtoɣraf/ | f |
| х | хле́б | /ˈxlʲep/ | x |
| ц | цётка | /ˈt͡sʲotka/ | t͡s |
| ч | чалаве́к | /t͡ʂaɫaˈvʲek/ | t͡ʂ |
| ш | шэ́сць | /ˈʂɛsʲt͡sʲ/ | ʂ |
3. Digraphs, Signs and Special Characters
| Input | Example | IPA | Notes |
|---|---|---|---|
| дз | дзякуй | /d͡zʲakuj/ | Two letters read together: d͡z |
| дж | джаз | /d͡ʐas/ | Two letters read together: d͡ʐ |
| ў | праўда, ўчора | /prau̯da/, /ˈwt͡ʂora/ | u̯ after a vowel, w elsewhere |
| ь | соль | /solʲ/ | Softens the preceding consonant |
| ' or ’ | аб'ява | /abjava/ | Becomes j |
| зг, жг | мазгі́ | /mazˈɡʲi/ | г becomes ɡ |
| U+0301 after a vowel | го́рад | /ˈɣorat/ | Primary stress |
| U+0300 after a vowel | ла̀ўка | /ˌɫau̯ka/ | Secondary stress |
| Hyphen | горад-герой | /ˈɣorat ɣʲeˈroj/ | Becomes a space: the two parts are processed as separate words |
| Capital letters | Мінск, МІНСК | /mʲinsk/, /mʲinsk/ | Lower-cased first |
4. Consonant plus Soft Vowel (Palatalization)
| Consonant | Hard (+ а) | Soft (+ я) |
|---|---|---|
| б | ба /ba/ | бя /bʲa/ |
| м | ма /ma/ | мя /mʲa/ |
| н | на /na/ | ня /nʲa/ |
| с | са /sa/ | ся /sʲa/ |
| р | ра /ra/ | ря /rʲa/ |
| л | ла /ɫa/ | ля /lʲa/ |
| ц | ца /t͡sa/ | ця /t͡sʲa/ |
| дз | дза /d͡za/ | дзя /d͡zʲa/ |
5. Final Devoicing and Assimilation Examples
| Context | Example | IPA | Notes |
|---|---|---|---|
| б at word end | боб | /bop/ | b → p |
| д at word end | горад | /ˈɣorat/ | d → t |
| г at word end | снег | /sʲnʲex/ | ɣ → x |
| з at word end | праз | /pras/ | z → s |
| ж at word end | нож | /noʂ/ | ʐ → ʂ |
| дз at word end | будзь | /but͡sʲ/ | d͡zʲ → t͡sʲ |
| Voiceless + voiced | вакзал | /vaɡzaɫ/ | k → ɡ |
| Voiced + voiceless | лёгка | /ˈlʲoxka/ | ɣ → x |
| Voiced + voiceless | ба́бка | /ˈbapka/ | b → p |
| в at word end (not devoiced) | Лев | /lʲev/ | The module has no v → f rule |
6. Letters Outside the Belarusian Alphabet
| Character | Example | IPA | Notes |
|---|---|---|---|
| щ (Russian) | борщ | /borщ/ | No mapping: the letter is passed through unchanged. Belarusian writes шч: боршч /borʂt͡ʂ/ |
| ъ (Russian) | объект | /ˈobъʲekt/ | Passed through unchanged. Belarusian writes an apostrophe: аб'ект /abjekt/ |
| и (Russian) | ино | /иno/ | Passed through unchanged; Belarusian uses і or ы |
| Latin letters | iPhone | Error in the module; the web app shows the word unchanged | |
Using the Tool: Practical Notes
Why does the output often have no stress mark?
The tool has no dictionary and cannot know where the stress falls, so it prints a stress mark only if you type one. The one automatic guess is that a word with exactly one о (or ё) and at least one other vowel is stressed on that letter: го́рад /ˈɣorat/ and горад /ˈɣorat/ give the same result, whereas вада /vada/ gets no mark. See Stress and How to Mark It. Open in the converter
How do I mark the stress?
Type a combining acute accent (U+0301) directly after the stressed vowel, as in вада́ /vaˈda/. A combining grave accent (U+0300) gives secondary stress. The letter ё is not treated as stressed by itself: ёсць /josʲt͡sʲ/ has no mark, while ё́сць /ˈjosʲt͡sʲ/ does.
Why is only one transcription shown for each word?
The Belarusian module is deterministic: the same spelling always gives the same single result, so there are no variants to cycle through. If a word has two stress patterns, choose the one you want by placing the accent yourself; see Multiple Pronunciation Variants.
Why can the output differ from a pronunciation dictionary?
Rules see only spelling, so the result depends on the spelling and stress you type. Each word is transcribed on its own, which means a word-final voiced consonant is always devoiced, even before a following vowel. The automatic о rule is wrong for loanwords that keep an unstressed о in spelling, so add an accent for such words. The output is labelled phonemic but includes some surface detail; see Phonemic vs Phonetic and Common Issues.
Implementation Details (for Developers)
The transcription is produced by lua_modules/be-pron_wasm.lua, a copy of the Wiktionary Belarusian
pronunciation module. The web app calls window.be_ipa.toIPA(cleanText) (utils.js,
group "Direct Generation"); there is no lexicon and no post-processing in JavaScript. Per word, the app first
applies sanitize() (keeps only \p{L}, \p{M}, ', ’,
‿, -; turns ’ into '; NFKC), and if the module raises an error
the original text is shown. The module's entry point is export.toIPA(term). It is a fixed pipeline:
- Script check (
checkScript(term, "Cyrl")). - convert(): punctuation, lowercasing, letter mapping, word boundaries,
ʲ → j,г → ɡafter sibilants, the о stress rule,w → u̯. - assimilate_voicing, then assimilate_sibilants, then assimilate_palatals.
- Hard
ɫ, then gemination. - move_stress, then removal of the
#markers.
Additional Key Processes
Helpers
rsub is mw.ustring.gsub keeping only the string result. do_sub_repeatedly(term, fun) and
rsub_repeatedly(term, pattern, repl) apply a rule again and again until the string stops changing, so
rules propagate along a cluster (for example through бяззубы).
Tables Used by the Pipeline
| Table / variable | Contents | Used in |
|---|---|---|
correspondences | Cyrillic letter (and the digraphs дз, дж, the accents and apostrophes) → IPA string | convert() |
devoicing | b→p d→t ɡ→k z→s ʐ→ʂ ɣ→x | assimilate_voicing |
voicing | p→b t→d k→ɡ s→z ʂ→ʐ x→ɣ f→v | assimilate_voicing |
vowel / vowel_c | aeɛiɨou | stress rules, move_stress |
consonant / consonant_c | jmnlrvwbdzʐɡɣpftskxʂ (note: no ɫ and no tie-bar affricates) | move_stress |
accent_c | ˈ and ˌ | move_stress, convert() |
perm_syl_onset | Allowed onset clusters: spr str skr spl skl sp st sk sf sx sl sm sn pr br tr dr kr ɡr ɣr fr xr pl bl kl ɡl ɣl fl xl | move_stress step 3 |
1. Entry and Script Check
| Rule | Example Input | Output | Description |
|---|---|---|---|
checkScript(term, "Cyrl") | iPhone | /iPhone/ | Any alphabetic character that is not Cyrillic raises an error. The app catches it and shows the input unchanged. |
| U+02BC counts as non-Cyrillic | пʼеса | /пʼеса/ | The module tests correspondences[u(0x2BC)] but the script check rejects the character first, so only ' and ’ work in practice. |
| Non-letter characters pass | 123 | Digits and symbols are not alphabetic, so the check passes and they stay in the output (the web app removes them beforehand). | |
2. Normalization (start of convert)
| Rule | Example Input | Output | Description |
|---|---|---|---|
%s*[,–—]%s* → " | " | год, дзень | /ɣot | d͡zʲenʲ/ | Comma, en dash and em dash become the foot boundary |. |
%- → space | горад-герой | /ˈɣorat ɣʲeˈroj/ | A hyphen becomes a space, so each part is later treated as a separate word (including final devoicing). |
| Space cleanup | (several spaces) | Runs of whitespace become one space; leading and trailing space is removed. | |
mw.ustring.lower | МІНСК | /mʲinsk/ | All input is lower-cased before mapping. |
3. Letter-by-Letter Mapping
A while loop walks along the string. At each position it first looks up the next two
characters in correspondences (this is how дз and дж are found), and
otherwise the single character. A character without an entry is copied unchanged.
| Rule | Example Input | Output | Description |
|---|---|---|---|
| Two-letter lookup first | дзякуй | /d͡zʲakuj/ | дз → d͡z, дж → d͡ʐ (with U+0361). |
Soft vowel letters carry ʲ | ля | /lʲa/ | е → ʲe, ё → ʲo, і → ʲi, ю → ʲu, я → ʲa; ь → ʲ. |
| Other consonant letters | цётка, шэсць | /ˈt͡sʲotka/, /ʂɛsʲt͡sʲ/ | ц → t͡s, ч → t͡ʂ, ш → ʂ, ж → ʐ, г → ɣ, ґ → ɡ, ў → w, ы → ɨ, э → ɛ. |
| Accents | го́рад, ла̀ўка | /ˈɣorat/, /ˌɫau̯ka/ | U+0301 → ˈ and U+0300 → ˌ, in place, right after the vowel (moved later by move_stress). |
| Apostrophes | аб'ява | /abjava/ | U+0027, U+2019 and U+02BC → j. |
| No entry: pass-through | борщ | /borщ/ | Letters the table does not know (щ ъ и) are left as they are. |
The source comments next to е and о (-- or ɛ, -- or ɔ) are only
notes: no alternative vowels are generated.
4. Word Boundaries
Every run of spaces is wrapped in # ((%s+) → #%1#) and the whole string is
wrapped in #…#. The marker lets later patterns recognise word starts and ends. It is
removed at the very end.
5. Soft Sign Becomes j Between Vowels
| Rule | Example Input | Output | Description |
|---|---|---|---|
([#w vowel ʲ] accent?) ʲ (vowel) → %1j%2 | маё, яе | /maˈjo/, /jaje/ | A ʲ that follows a word start, w, a vowel (with optional accent) or another ʲ, and precedes a vowel, is a j. |
After ь | бельё | /bʲeˈlʲjo/ | ь + ё gives ʲj through the "after another ʲ" case. |
jʲ → j | п'я́ны | /ˈpjanɨ/ | An apostrophe-derived j followed by ʲ keeps just the j. |
After ў | ўя | /wja/ | Because w is in the class, a soft vowel after ў also gets j. |
6. Stop ɡ After a Sibilant
| Rule | Example Input | Output | Description |
|---|---|---|---|
([sʂzʐ])ɣ → %1ɡ | мазгі́, жгу́т | /mazˈɡʲi/, /ˈʐɡut/ | The fricative ɣ directly after s ʂ z ʐ becomes the stop. |
| No change elsewhere | кніга | /knʲiɣa/ | After other sounds г stays ɣ. |
7. Stress Marking (the о Rule)
Two rsub_repeatedly calls place ˈ after a lone o. The character class
[^#o ˈ] excludes the word boundary, other o and an existing primary stress, so each
pattern matches only if the word has no primary stress and exactly one o.
| Rule | Example Input | Output | Description |
|---|---|---|---|
#…o…[aeɛiɨu]…# → add ˈ after o | горад | /ˈɣorat/ | o followed later in the word by another vowel. |
#…[aeɛiɨu]…o…# → add ˈ after o | кіно | /kʲiˈno/ | o preceded earlier in the word by another vowel. |
No match: no o | вада | /vada/ | Nothing is added. |
| No match: one vowel only | ёсць | /josʲt͡sʲ/ | Neither pattern finds a second vowel. |
No match: two o | мотоцыкл | /motot͡sɨkɫ/ | The class excludes o, so both patterns fail. |
No match: explicit ˈ | фотагра́фія | /fotaˈɣrafʲija/ | An existing ˈ blocks the rule. A ˌ does not: ра̀дыёста̀нцыя /ˌradɨˈjoˌstant͡sɨja/. |
This stage runs before ў is converted, so the glide does not count as a vowel: кроў
/krou̯/ has one vowel and is left unmarked, здароў /zdaˈrou̯/ gets a mark.
8. w → u̯
| Rule | Example Input | Output | Description |
|---|---|---|---|
([vowel accent]+) w ([^vowel]) → %1u̯%2 | праўда, кро́ў | /prau̯da/, /ˈkrou̯/ | w after a vowel or stress mark, and not followed by a vowel (consonant, # or accent), becomes u̯. |
Stays w | ўчора | /ˈwt͡ʂora/ | At a word start or after a consonant there is no preceding vowel. |
9. assimilate_voicing
A loop (do_sub_repeatedly) that applies two rules until nothing changes. Characters in
[ʲː͡]* (softness, length, tie bar) are skipped between the two consonants.
| Rule | Example Input | Output | Description |
|---|---|---|---|
[bdɡɣzʐ] + [ptkfxsʂ#] → devoice via devoicing | зуб, лёгка, ба́бка | /zup/, /ˈlʲoxka/, /ˈbapka/ | Includes #, which is how final devoicing works; this is why every word-final voiced obstruent is devoiced, even in a hyphenated part. |
[ptkfxsʂ] + (v) + [bdɡɣzʐ] → voice via voicing | вакзал, афганістан | /vaɡzaɫ/, /avɣanʲistan/ | ф becomes v, not b. An optional v in between is transparent (a nonsense test word such as ксвдо gives /ɡzvdo/). |
| Chain of changes | дождж | /doʂt͡ʂ/ | The loop repeats until stable, so a whole cluster is reassigned. |
Not covered: v, sonorants | встаць | /vstat͡sʲ/ | v is in neither table: it is never devoiced. |
| Affricates | будзь | /but͡sʲ/ | The tie bar is skipped, so final z devoices first, which then devoices the d in the next iteration. |
10. assimilate_sibilants
| Rule | Example Input | Output | Description |
|---|---|---|---|
[sʂzʐ]([td]?͡?)([sʂzʐ]) → %2%1%2 | сшыты | /ʂːɨtɨ/ | The first sibilant is replaced by the second one (and later merged to a long consonant). |
| With an affricate in between | расчэска | /raʂt͡ʂɛska/ | The optional t͡/d͡ is kept in the middle. |
| Identical sibilants | бяззубы | /bʲazːubɨ/ | Gives a double consonant, shown as a long one after the gemination step. |
11. assimilate_palatals
Another do_sub_repeatedly loop. Its sub-rules, in the order they appear in the code:
| Rule | Example Input | Output | Description |
|---|---|---|---|
([bzɡɣpfskxmnlv])%1ʲ → both soft | каменне, ззяць | /kamʲenʲːe/, /zʲːat͡sʲ/ | A doubled consonant before ʲ: both halves become soft (later joined into ʲː). |
([szn])j → %1ʲj | з'ява, сін'я | /zʲjava/, /sʲinʲja/ | s z n before the apostrophe-j become soft. |
([sn]) + soft t͡s/d͡z | сцяна, ланцюг | /sʲt͡sʲana/, /ɫanʲt͡sʲux/ | s or n before a soft affricate becomes soft. |
([sz])([nl])ʲ → %1ʲ%2ʲ | зняць, слёзы | /zʲnʲat͡sʲ/, /ˈsʲlʲozɨ/ | s/z before a soft n or l. |
([sz])([bmpfv])ʲ with two or more vowels after it | размяня́ць, бяспека | /razʲmʲaˈnʲat͡sʲ/, /bʲasʲpʲeka/ | Both consonants become soft. The "no assimilation in a final, non-initial syllable" comment means that when fewer than two vowels follow, nothing happens: узмя /uzmʲa/ (a made-up word to show the contrast). |
#…([sz])([bmpfv])ʲ at the word start | свята, звязда́ | /sʲvʲata/, /zʲvʲazˈda/ | At the start of a word the rule always applies. The replacement string omits the leading #, so this marker is consumed. |
([td]͡[sz])vʲ → %1ʲvʲ | цвёрды | /ˈt͡sʲvʲordɨ/ | An affricate before vʲ becomes soft. |
tsʲ → t͡sʲsʲ (and dzʲ → d͡zʲzʲ, tt͡sʲ, dd͡zʲ) | ватсяп (made-up) | /vat͡sʲsʲap/ | Handles the sequences written with separate т + с before a soft vowel. Normal ц and дз already carry a tie bar, so ordinary words do not reach these four lines. |
12. Hard ɫ
| Rule | Example Input | Output | Description |
|---|---|---|---|
l([^ʲ]) → ɫ%1 | лодка, стол | /ˈɫotka/, /stoɫ/ | Any l not followed by ʲ (including before #) becomes dark. |
Soft l kept | ліса, альтанка | /lʲisa/, /alʲtanka/ | lʲ is not touched. |
13. Gemination
| Rule | Example Input | Output | Description |
|---|---|---|---|
([td]͡[szʂʐ]ʲ?)%1 → %1ː | аддзел, жыццё | /ad͡zʲːeɫ/, /ʐɨˈt͡sʲːo/ | A repeated affricate becomes long. |
([^͡])([consonant]ʲ?)%2 → %1%2ː | ссылка, каменне, тт | /sːɨɫka/, /kamʲenʲːe/, /tː/ | Any identical consonant pair (with the same softness) is shortened to one symbol plus ː. Applied repeatedly. |
14. move_stress
Up to this point the stress mark sits after its vowel. move_stress shifts it to the syllable
boundary. Its six rsub steps run in this order:
| Step | Example Input | Output | Description |
|---|---|---|---|
1. Move before the single preceding consonant (with its ʲː) | вада́, ле́с | /vaˈda/, /ˈlʲes/ | The mark jumps back over the onset consonant of its syllable. |
| 2. Continue over an affricate's tie bar | ця́пер | /ˈt͡sʲapʲer/ | A stress mark that landed inside t͡s is moved in front of the whole affricate. |
3. Cluster handling with perm_syl_onset | сястра́, пітво́, ста́лы | /sʲaˈstra/, /pʲitˈvo/, /ˈstaɫɨ/ | For a cluster a b c before the vowel: if abc is an allowed onset the mark goes before a; else if bc is allowed (or c is j) it goes before b; otherwise it stays before c. |
| 4. Affricate safety net | (none) | - | Handles a mark still stranded inside a tie-bar affricate: moved back before the affricate if a consonant plus j follows, otherwise forward past the affricate. No ordinary word is known to need it. |
| 5. Word-initial consonants | мно́га | /ˈmnoɣa/ | The mark is moved to the very start of the word, in front of all initial consonants. |
6. u̯/i̯ at a word start | (none) | - | Effectively unused here: the module never produces i̯, and u̯ cannot start a word. |
Known limitation of step 3: consonant does not contain ɫ, and
perm_syl_onset lists kl/pl/bl with plain l, but hard
л has already been converted to ɫ at this point. Clusters ending in hard л are therefore not
recognised as onsets: прыкла́д /prɨkˈɫat/, апла́та /apˈɫata/.
15. Finish
All # markers are removed and the string is returned. The app displays it between slashes
(phonemic form). Two other functions in the file are not used by the app:
export.remove_pron_notations(text, remove_grave) (strips grave accents from annotations) and
export.show(frame) (the Wiktionary template entry point, which adds brackets and formatting). The
file also contains a leftover print(export.toIPA("Злу́чаныя Шта́ты Аме́рыкі")) that runs when the
module is loaded.
Not Implemented in the Module
- No dictionary lookup, no stress dictionary, no stress prediction beyond the single-о rule.
- No vowel reduction (akanye/yakanye), no
ɔ, no alternativeʲɛ. - No devoicing of
v, no voicing assimilation across word boundaries. - No special handling of loanwords, proper names, Russian letters (щ ъ и pass through unchanged) or numerals.
- No clitic handling: every space-separated word is transcribed on its own, so prepositions and particles get their own stress logic and their own final devoicing.
Common Issues & Limitations
Known Transcription Problems
This table shows known issues where the automatic transcription may be incorrect. "Correct IPA" is the engine's output for the corrected input shown in brackets, unless it is a description.
| Input | System Output | Correct IPA | Cause | What to Do |
|---|---|---|---|---|
| вада | /vada/ | /vaˈda/ (input вада́) | Stress is not inferred; the word has no о | Add an acute accent after the stressed vowel |
| ён | /jon/ | /ˈjon/ (input ё́н) | ё is not treated as inherently stressed; one-vowel words get no mark | Type ё followed by U+0301 |
| ёсць | /josʲt͡sʲ/ | /ˈjosʲt͡sʲ/ (input ё́сць) | Same as above | Type ё followed by U+0301 |
| фотаграфія | /ˈfotaɣrafʲija/ | /fotaˈɣrafʲija/ (input фотагра́фія) | The automatic rule stresses the only written о, but loanwords keep unstressed о | Always accent loanwords |
| мотоцыкл | /motot͡sɨkɫ/ | /motoˈt͡sɨkɫ/ (input мотоцы́кл) | Two о: the automatic rule does not fire | Add an accent to compounds and loanwords |
| прыкла́д | /prɨkˈɫat/ | Stress mark before the whole kɫ cluster (before k) | move_stress does not know ɫ as a consonant, so the onset cluster is split | Ignore the mark position; the stressed syllable is still the right one |
| горад-герой | /ˈɣorat ɣʲeˈroj/ | /ˈɣoradɣʲeˈroj/ (input го́радгеро́й, no hyphen) | The hyphen splits the compound into two words, so the final д is devoiced | Write compounds without a hyphen if you need assimilation across the join |
| встаць | /vstat͡sʲ/ | Speakers normally devoice в to [f] before a voiceless consonant | The module's devoicing table has no entry for v | Mentally read the initial v as [f] |
| пʼеса (with U+02BC) | /пʼеса/ (word shown unchanged) | /pjesa/ (input with the ordinary apostrophe) | U+02BC is a letter, not Cyrillic, so the script check fails | Use ' or ’ |
| iPhone | /iPhone/ (word shown unchanged) | /ajˈfon/ (input айфо́н) | Latin letters are rejected | Respell foreign words in Cyrillic |
| борщ | /borщ/ | /borʂt͡ʂ/ (input боршч) | The Russian letter щ has no mapping and is copied through | Use Belarusian spelling (шч) |
| объект | /ˈobъʲekt/ | /abjekt/ (input аб'ект) | The Russian hard sign ъ is copied through, and о is read literally | Use Belarusian spelling (apostrophe, а) |
Related Pronunciation Guides
Help pages for related languages in this tool:
For technical issues or suggestions, please visit our GitHub repository.