Ukrainian Pronunciation and IPA Transcription Guide

← Back to Ukrainian transcription ↑ All Languages

Table of Contents

About This Tool

This Ukrainian transcription app uses the Wiktionary Ukrainian Pronunciation Module to generate phonetic transcriptions for Ukrainian text. IPA (International Phonetic Alphabet) is a standardized system for transcribing speech sounds. This tool converts Ukrainian Cyrillic spelling into IPA, helping learners, linguists, and developers understand pronunciation.

Ukrainian spelling is close to phonemic, but the stress is not written in ordinary text, and stress decides how vowels sound (for example, unstressed а becomes /ɐ/). The transcription therefore needs to know which vowel is stressed. The app uses a comprehensive lexicon extracted from Wiktionary data dumps (a "V4" lexicon that stores the position of the stressed vowel for each word form). For words found in the lexicon, the browser chooses the stress automatically. For words that are not found, the app generates one transcription for every possible stress position, and you click the word to cycle through them.

The examples on this page show the rule path: each one is the output of the real pronunciation module called on a word with its stress marked (for example вода́). In the app, a lexicon word reaches the same module with the stress taken from the dictionary, so the result is the same transcription.

Dialects & Limitations

Phonemic vs Phonetic

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, e.g. в as /ʋ/ in ві́тер /ˈʋʲiter/ but as /w/ in вода́ /wɔˈda/.
Stress (Наголос)
The syllable pronounced with most force. In Ukrainian it is free (can fall on any syllable) and is marked in dictionaries with an acute accent, e.g. вода́. The IPA mark ˈ goes before the stressed syllable.
Acute / Grave Accent
Combining marks U+0301 (acute) and U+0300 (grave). The module turns an acute into primary stress ˈ and a grave into secondary stress ˌ, e.g. ра̀діоприйма́ч /ˌradʲiɔprei̯ˈmat͡ʃ/.
Palatalization (Softening)
A consonant pronounced with the tongue raised toward the hard palate, written ʲ. Triggered by ь and by the vowels і, є, ю, я, e.g. сі́ль /ˈsʲilʲ/.
Soft Sign (М'який знак, ь)
A letter with no sound of its own that marks the preceding consonant as soft, e.g. кінь.
Apostrophe (Апостроф)
The letter ' written before я, ю, є, ї to keep the preceding consonant hard and pronounce a separate /j/, e.g. м'я́со /ˈmjasɔ/.
Iotated Vowel
The letters є, ї, ю, я, which spell a vowel preceded by /j/ (word-initially, after a vowel, or after an apostrophe) or a softened consonant plus vowel (after a consonant).
Vowel Reduction
Change of an unstressed vowel to a weaker quality. In this module: a→ɐ, u→ʊ, ɛ, ɪ→e, and ɔ→o before a stressed u or i.
Voicing Assimilation
A voiceless obstruent becomes voiced before a voiced obstruent, e.g. вокза́л /wɔɡˈzaɫ/ (k → ɡ before z). Ukrainian has no devoicing of voiced consonants at the end of a word.
Final Devoicing
The process by which voiced consonants become voiceless at word ends (German, Russian). It does not occur in this Ukrainian transcription: зуб /zʊb/ keeps b.
Akanye
Russian-type merging of unstressed о and а. Not implemented here: unstressed о stays /ɔ/ (сторона́ /stɔrɔˈna/).
Affricate
A stop released as a fricative at the same place, written with a tie bar: /t͡s/ (ц), /t͡ʃ/ (ч), /d͡z/ (дз), /d͡ʒ/ (дж).
Tie Bar
The combining mark ͡ joining two letters into one affricate.
Hushing Consonants
The "sh-type" sounds ж, ч, ш, щ (ʒ, t͡ʃ, ʃ, ʃt͡ʃ).
Hissing Consonants
The "s-type" sounds з, с, ц, дз (z, s, t͡s, d͡z).
Geminate (Long) Consonant
A consonant held longer, written ː, e.g. ві́лла /ˈʋʲiɫːɐ/.
Glide (Non-syllabic Vowel)
A vowel-like sound that does not form a syllable, marked ̯, e.g. /i̯/ and /u̯/ in ма́йже /ˈmai̯ʒe/ and авто́ /ɐu̯ˈtɔ/.
Dark L
The velarized /ɫ/ used for non-soft л, e.g. по́ле /ˈpɔɫe/.
Lexicon (V4)
A dictionary generated from Wiktionary dumps. For Ukrainian it stores, for each word form, a stressed spelling (the V4 format records the position of the stressed vowel). One word can have several stressed forms, e.g. "замо́к,за́мок".
Foot Boundary
The symbol |. In the module, commas and dashes inside the text become |. The app removes punctuation before calling the module, so you normally never see it.
Word Boundary Marker
The module internally wraps every word in #…# so rules can refer to word beginnings and ends. It is stripped before output.

How to Read IPA Symbols

This table helps you understand the IPA symbols used in Ukrainian transcriptions. For each symbol, we provide approximate English equivalents where possible. All examples are produced by the transcription engine.

Vowel Symbols

IPA Example English Approximation Notes
/a/ ма́ма /ˈmamɐ/ "father" (short) Stressed а
/ɐ/ дава́ти /dɐˈʋate/ "cup" (UK), "sofa" Unstressed а (reduction)
/ɛ/ не́сти /ˈnɛste/ "bed" Stressed е
/e/ зеле́ний /zeˈɫɛnei̯/ "say" (short, no glide) Unstressed е and и merge here
/ɪ/ ми́ша /ˈmɪʃɐ/ "sit" Stressed и
/i/ кіно́ /kʲiˈnɔ/ "see" (short) Letter і; never reduced
/ɔ/ мо́ре /ˈmɔre/ "law" (UK) Letter о; stays open also unstressed
/o/ коні́ /koˈnʲi/ "go" (no glide) Unstressed о before a stressed /u/ or /i/
/u/ му́ха /ˈmuxɐ/ "food" (short) Stressed у
/ʊ/ суша́ /sʊˈʃa/ "put" Unstressed у

Consonant Symbols

IPA Example English Approximation Notes
/ɦ/ га́нок /ˈɦanɔk/ "ahead" (breathy h) Letter г; voiced glottal fricative
/ɡ/ ґа́нок /ˈɡanɔk/ "go" Letter ґ (rare in native words)
/x/ ху́тро /ˈxutrɔ/ Scottish "loch" Letter х
/ʋ/ ві́тер /ˈʋʲiter/ Between "v" and "w" Default sound of в
/w/ вода́ /wɔˈda/ "water" в before /ɔ, u/ and voiced consonants
/ʍ/ вкла́д /ˈʍkɫad/ "which" (voiceless w) в before a voiceless consonant
/j/ йо́го /ˈjɔɦɔ/ "yes" Letter й, and the first part of є, ї, ю, я
/ʒ/ бо́жий /ˈbɔʒei̯/ "measure" Letter ж
/ʃ/ ма́шина /ˈmaʃenɐ/ "shoe" Letter ш
/ʃt͡ʃ/ ща́стя /ˈʃt͡ʃasʲtʲɐ/ "fresh cheese" Letter щ, always two sounds
/t͡s/ ци́рк /ˈt͡sɪrk/ "cats" Letter ц
/t͡ʃ/ чо́му /ˈt͡ʃɔmʊ/ "church" Letter ч
/d͡ʒ/ дже́рело /ˈd͡ʒɛreɫɔ/ "judge" Digraph дж
/d͡z/ дзе́ркало /ˈd͡zɛrkɐɫɔ/ "adds" Digraph дз
/ɫ/ по́ле /ˈpɔɫe/ "full" (dark l) Non-soft л
/r/ ра́зом /ˈrazɔm/ Spanish "pero" (tap/trill) Letter р

Diacritical Marks

Symbol Name Meaning Example
ˈ Primary stress Main emphasis in the word вода́ /wɔˈda/
ˌ Secondary stress Weaker emphasis (from a grave accent in the input) ра̀діоприйма́ч /ˌradʲiɔprei̯ˈmat͡ʃ/
ʲ Palatalization Consonant is soft сі́ль /ˈsʲilʲ/
ː Length mark Consonant is long ві́лла /ˈʋʲiɫːɐ/
͡ Tie bar Affricate (single unit) ци́рк /ˈt͡sɪrk/
̯ Non-syllabic Glide, not a separate syllable ма́йже /ˈmai̯ʒe/, авто́ /ɐu̯ˈtɔ/
( ) Optional segment Length that appears only in slow speech ві́стці /ˈʋʲisʲt͡sʲ(ː)i/
| Foot boundary Pause between comma-separated words (module-level only) до́бре,га́зда /ˈdɔbre | ˈɦazdɐ/

Interactive Features

Multiple Pronunciation Variants

For Ukrainian, a word can show several transcriptions:

When multiple variants exist, click the word to cycle through them. The currently selected variant will be used for PDF/CSV export.

Ukrainian Pronunciation Guide

This guide explains how the module turns Ukrainian spelling into sounds. Ukrainian orthography is largely phonemic: most letters have one sound. The complications are free stress, palatalization (softening), and a few assimilations. Every example below is real engine output for a word with its stress marked.

Stress (Наголос)

Ukrainian stress is free and unmarked in ordinary writing, so the module needs it as input.

Note: For words found in the lexicon, you do not need to type any accent: the app takes the stress from the dictionary. For other words, use the click-to-cycle feature to choose the right variant.

Unstressed Vowels

Unstressed vowels change as follows (stress mark is the only trigger; there is no reduction of і):

Iotated Vowels (є, ї, ю, я) and the Apostrophe

Soft Consonants and the Soft Sign (ь)

Voicing Assimilation (and Why There Is No Final Devoicing)

A voiceless obstruent becomes voiced when a voiced obstruent (b d z ʒ ɡ ɦ) follows it:

Г and Ґ

The Letter В: [ʋ], [w], [u̯], [ʍ]

The letter в is one phoneme with four realizations. The module applies them in this order:

A one-letter word в is transcribed as /ʋ/ because words are processed one at a time; in running speech it would behave like [u̯]/[w] after a vowel.

The Letter Й: [j] and [i̯]

Affricates and Digraphs (дж, дз, ц, ч, щ)

Long (Geminate) Consonants

Consonant Cluster Changes

The module applies a few spelling-to-pronunciation simplifications that Ukrainian orthography does not show:

Dark and Soft L

Comprehensive Spelling-to-IPA Mapping

This section lists the actual correspondences used by the engine. Where a letter changes with context, the table says which. All examples are real engine output on a stress-marked word.

1. Vowels

Letter IPA (stressed) Example (stressed) IPA (unstressed) Example (unstressed)
а /a/ ма́ма /ˈmamɐ/ /ɐ/ каша́ /kɐˈʃa/
е /ɛ/ Оде́са /ɔˈdɛsɐ/ /e/ зеле́ний /zeˈɫɛnei̯/
и /ɪ/ ми́ша /ˈmɪʃɐ/ /e/ кури́ти /kʊˈrɪte/
і /i/ мі́сто /ˈmʲistɔ/ /i/ кіно́ /kʲiˈnɔ/
о /ɔ/ мо́ре /ˈmɔre/ /ɔ/, or /o/ before a stressed у/і сторона́ /stɔrɔˈna/; коні́ /koˈnʲi/
у /u/ му́ха /ˈmuxɐ/ /ʊ/ суша́ /sʊˈʃa/

2. Iotated Vowels and the Soft Sign

Letter After a vowel / at word start After a consonant Notes
є моє́ /mɔˈjɛ/ Rare; normally only after a vowel or apostrophe: п'є́са /ˈpjɛsɐ/ /jɛ/; unstressed: /je/, e.g. Євро́па /jeu̯ˈrɔpɐ/
ї ї́жа /ˈjiʒɐ/ Украї́на /ʊkrɐˈjinɐ/ Always /ji/
ю юна́к /jʊˈnak/ лю́ди /ˈlʲude/ /ju/, softens a preceding consonant
я я́блуко /ˈjabɫʊkɔ/ ля́ля /ˈlʲalʲɐ/ /ja/, unstressed /jɐ/, softens a preceding consonant
ь - сі́ль /ˈsʲilʲ/, цьо́го /ˈt͡sʲɔɦɔ/ No sound; adds ʲ to the preceding consonant
' (apostrophe) - м'я́со /ˈmjasɔ/ Hard consonant followed by /j/

3. Consonants (Single Letters)

Letter IPA Example Notes
б/b/бу́р /ˈbur/Stays voiced at word end
в/ʋ/ /w/ /u̯/ /ʍ/кра́ва /ˈkraʋɐ/See The Letter В
г/ɦ/га́зета /ˈɦazetɐ/Voiced glottal fricative
ґ/ɡ/ґа́ва /ˈɡaʋɐ/Stop
д/d/до́бре /ˈdɔbre/Stays voiced at word end
ж/ʒ/бо́жий /ˈbɔʒei̯/Voiced before voiced obstruents
з/z/ра́зом /ˈrazɔm/
й/j/ /i̯/йо́го /ˈjɔɦɔ/, ма́йже /ˈmai̯ʒe/See The Letter Й
к/k/кі́т /ˈkʲit/Becomes /ɡ/ before a voiced obstruent
л/ɫ/ /lʲ/по́ле /ˈpɔɫe/, до́ля /ˈdɔlʲɐ/Dark unless soft
м/m/мо́ре /ˈmɔre/
н/n/ні́ч /ˈnʲit͡ʃ/Soft before і
п/p/по́ле /ˈpɔɫe/Becomes /b/ before a voiced obstruent
р/r/ра́зом /ˈrazɔm/
с/s/бо́сий /ˈbɔsei̯/Becomes /z/ before a voiced obstruent
т/t/ту́ск /ˈtusk/Becomes /d/ before a voiced obstruent
ф/f/фо́рма /ˈfɔrmɐ/Becomes /v/ before a voiced obstruent
х/x/ху́тро /ˈxutrɔ/Becomes /ɦ/ before a voiced obstruent
ц/t͡s/ци́рк /ˈt͡sɪrk/Soft before і: /t͡sʲ/
ч/t͡ʃ/чо́му /ˈt͡ʃɔmʊ/
ш/ʃ/ма́шина /ˈmaʃenɐ/Voiced before voiced obstruents
щ/ʃt͡ʃ/ща́стя /ˈʃt͡ʃasʲtʲɐ/Two sounds

4. Digraphs and Special Sequences

Spelling IPA Example Notes
дж/d͡ʒ/дже́рело /ˈd͡ʒɛreɫɔ/
дз/d͡z/дзе́ркало /ˈd͡zɛrkɐɫɔ/
дзь/d͡zʲ/ґе́дзь /ˈɡɛd͡zʲ/Soft affricate
дс/d͡zs/відсо́тки /ʋʲid͡zˈsɔtke/
дш/d͡ʒʃ/підши́пник /pʲid͡ʒˈʃɪpnek/
дч/d͡ʒt͡ʃ/відчу́ти /ʋʲid͡ʒˈt͡ʃute/
дц/d͡zt͡s/ві́дцурати /ˈʋʲid͡zt͡sʊrɐte/
тс/t͡s/бра́тство /ˈbrat͡stwɔ/Single affricate
тч/t͡ʃː/ма́тч /ˈmat͡ʃː/Long
тш/t͡ʃʃ/ді́тши /ˈdʲit͡ʃʃe/
тц/t͡sː/бра́тці /ˈbrat͡sʲːi/Long (soft before і)
тьс/t͡sʲː/сміє́ться /sʲmʲiˈjɛt͡sʲːɐ/Reflexive -ться

5. Contextual Changes (Summary)

Context Change Example
Voiceless obstruent before voiced obstruentBecomes voicedвокза́л /wɔɡˈzaɫ/
Consonant before soft consonant (т д с з н л)Becomes softпі́сня /ˈpʲisʲnʲɐ/
в after vowel before consonant/end[u̯]ле́в /ˈɫɛu̯/
в before ɔ, u, voiced consonant[w]вуха́ /wʊˈxa/
в before voiceless consonant[ʍ]вкла́д /ˈʍkɫad/
й after vowel before consonant/end[i̯]мі́й /ˈmʲii̯/
Unstressed а, у, е, и, оɐ, ʊ, e, e, ɔ/oдава́ти /dɐˈʋate/
Doubled consonantLong consonantві́лла /ˈʋʲiɫːɐ/
Non-soft л[ɫ]по́ле /ˈpɔɫe/
Word-final voiced consonantNo change (no devoicing)ніж /nʲiʒ/

Using the Tool: Practical Notes

Why does one word sometimes show several transcriptions, and how do I choose?

Words found in the lexicon are transcribed with the stress stored there, and homographs with different stress give one transcription per form: за́мок /ˈzamɔk/ (castle) and замо́к /zɐˈmɔk/ (lock). A word that is not in the lexicon is transcribed once for every possible stress position, and some of those variants are not real pronunciations. Click the word to cycle through them and keep the right one; see Multiple Pronunciation Variants. Open in the converter

Should I type a stress mark myself?

Only if you know the stress. A word typed with an acute accent after the stressed vowel is transcribed exactly as marked and gives a single result: вода́ /wɔˈda/. Without a mark, a word in the lexicon gets its stress from the dictionary, and any other word is offered with one variant per stress position, which you cycle by clicking. See Stress (Наголос) for how the stress mark is placed.

Why can the output differ from a pronunciation dictionary?

Each word is transcribed on its own, so effects across words, such as the в / у and і / й alternation after vowels, are not modeled. A one-vowel word is given a stressed vowel before transcription, so не́ /ˈnɛ/ appears with a full vowel although such words are usually unstressed in speech. Dialects are not supported; see Dialects & Limitations.

Is the transcription phonemic or phonetic?

Phonetic. The Wiktionary module produces only a narrow phonetic transcription for Ukrainian, so no phonemic form is offered; see Phonemic vs Phonetic.

Implementation Details (for Developers)

The transcription is produced by lua_modules/uk-pron_wasm.lua, which is the Wiktionary Ukrainian pronunciation module (function export.pronunciation). It uses helper functions from uk-common.lua (decompose_grave, needs_accents). The module is short: it has no dictionary of its own and is one pass of ordered regular-expression replacements per word. In the tables below the Output column is the final engine output for the whole word, while the Description explains which step produced the visible effect.

Overview of the Pipeline

  1. App handler (scripts/utils.js): sanitize, lexicon lookup, stress variants.
  2. Entry checks: Cyrillic check, lowercase, grave decomposition, stress requirement.
  3. Word split and # wrapping.
  4. Orthographic cluster simplifications and geminates.
  5. Letter mapping (sequences first, single letters last).
  6. Palatalization, voicing, and sibilant assimilation.
  7. Vowel reduction.
  8. Allophones of в and й.
  9. Stress-mark placement and clean-up.

Stage 0. App Handler (Lexicon, Stress Variants)

In ipaHandlers.Ukrainian (scripts/utils.js), only the "Phonetic" form is available. The input is first cleaned by sanitize(): non-letter characters are removed, the curved apostrophe ’ is replaced by ', and the text is NFKC-normalized.

Rule Example Input Output Description
Lexicon hit: each stressed form → uk_ipa.pronunciation(form, true) "замо́к,за́мок" (record from the V4 lexicon; the browser looks it up) /zɐˈmɔk/,/ˈzamɔk/ Forms are split on a comma and joined as /ipa1/,/ipa2/. Outputs are shown here by calling the module on each form.
Not in lexicon, 0 or 1 vowel → stress the vowel сад /ˈsad/ One transcription (allow_unstressed = true is always passed).
Not in lexicon, several vowels → one variant per vowel мама /ˈmamɐ/,/mɐˈma/ U+0301 is put on each vowel in turn; results are joined with a comma. Click the word to cycle.
Non-Cyrillic letters → module error → text returned unchanged ра́ннiй (with Latin i) ра́ннiй checkScript(text, "Cyrl") throws; the handler falls back to the original text.

Stage 1. Entry Checks and Normalization

Rule Example Input Output Description
checkScript(text, "Cyrl") ра́ннiй (Latin i) error (module throws) Any alphabetic non-Cyrillic character is an error.
com.decompose_grave + mw.ustring.lower ра̀діоприйма́ч /ˌradʲiɔprei̯ˈmat͡ʃ/ ѐ and ѝ become letter + U+0300 (secondary stress); text is lower-cased.
com.needs_accents unless allow_unstressed добре (called without allow_unstressed) error: "Multisyllabic words ... must have an acute accent" The app always passes true, so this check never fires in the app.
Commas and en/em dashes → | до́бре,га́зда /ˈdɔbre | ˈɦazdɐ/ The foot-boundary marker. Whitespace is then collapsed to single spaces.
Split on spaces and hyphens, wrap each word in # ки́їв-льві́в /ˈkɪjiu̯ ˈlʲʋʲiu̯/ Each hyphen-separated part is transcribed separately and the parts are joined with a space.

Stage 2. Orthographic Cluster Simplifications

Table orthographic_replacements. These run first, on the lower-cased Cyrillic word. The table is iterated with pairs(), so the order between entries is not specified. Three overlapping rules (стськ / стс, зш / #зш, зч / #зч) therefore give different results from one run to the next; both outcomes observed in repeated runs are shown below (see Common Issues).

Rule Example Input Output Description
нтськ → ньськстуде́нтський/stʊˈdɛnʲsʲkei̯/The т is dropped; н becomes soft.
нтст → нстстуде́нтство/stʊˈdɛnstwɔ/т dropped in the cluster.
стд → здшістдеся́т/ʃʲizdeˈsʲat/Cluster simplified and voiced.
стс → сːшістсо́т/ʃʲiˈsːɔt/Long s.
стч → шчпі́стчик/ˈpʲiʃt͡ʃek/Hushing cluster.
стськ → ськжурналі́стський/ʒʊrnɐˈlʲisʲkei̯/ or /ʒʊrnɐˈlʲisʲːkei̯/Intended: short sʲk. The generic стс → сː rule can fire first and leave a long consonant (varies per run).
зш → жшбезшу́мний/beʒˈʃumnei̯/Voicing agrees with the following ш.
#зш → #шː (word start)зши́ток/ˈʃːɪtɔk/ or /ˈʒʃɪtɔk/Intended: initial зш becomes a long ш. If the generic зш → жш rule fires first, you get ʒʃ (varies per run).
зч → жчрозча́рувати/rɔʒˈt͡ʃarʊʋɐte/Voiced before ч.
#зч → #шч (word start)зчи́тати/ˈʃt͡ʃɪtɐte/ or /ˈʒt͡ʃɪtɐte/Intended: voiceless ш. If the generic зч → жч rule fires first, the result is voiced ʒ (varies per run).

Stage 3. Orthographic Geminates

Rule Example Input Output Description
([бвгґд])\1 → \1ːсуббо́та, ввечері́, ві́ддати/sʊˈbːɔtɐ/, /ʋːet͡ʃeˈrʲi/, /ˈʋʲidːɐte/Doubled б, в, г, ґ, д become long.
([йклмнпрстфхцчшщ])\1 → \1ːві́лла, ванна́, ма́ссою, пі́цца/ˈʋʲiɫːɐ/, /ʋɐˈnːa/, /ˈmasːɔjʊ/, /ˈpʲit͡sːɐ/Doubled sonorants and voiceless consonants.
жж → жː, зз → зː (not after д)ви́жжати, бе́ззубий/ˈʋɪʒːɐte/, /ˈbɛzːʊbei̯/The "not after д" test keeps дж/дз sequences from being read as geminates.
дждж → джː, дздз → дзː(rare)-Long affricates. Not demonstrated: no common word found.

Stage 4. Apostrophe Protection

Rule Example Input Output Description
' → ! (temporary) м'я́со /ˈmjasɔ/ The ! sits between the consonant and я, so the palatalization rules (Stage 6) do not match. It is removed again in Stage 11. The result keeps a hard consonant followed by /j/.
’ (U+2019) → j (letter map) м’я́со (in the raw module) - The raw module maps ’ straight to j, which then softens the previous consonant. The app replaces ’ by ' in sanitize() first, so the app output equals that of м'я́со.

Stage 5. Letter Mapping (phonetic_chars_map)

Three tables applied with ipairs in this order: first multi-letter sequences, then the two-letter digraphs, and finally single letters (the code comments label the tables in the opposite order).

Rule Example Input Output Description
дзь → d͡zʲ, тьс → t͡sʲːґе́дзь, сміє́ться/ˈɡɛd͡zʲ/, /sʲmʲiˈjɛt͡sʲːɐ/Soft affricates; reflexive ending as a long soft affricate.
дж → d͡ʒ, дз → d͡zдже́рело, дзе́ркало/ˈd͡ʒɛreɫɔ/, /ˈd͡zɛrkɐɫɔ/Digraphs.
дс, дш, дч, дц → affricate + nextвідсо́тки, підши́пник, відчу́ти, ві́дцурати/ʋʲid͡zˈsɔtke/, /pʲid͡ʒˈʃɪpnek/, /ʋʲid͡ʒˈt͡ʃute/, /ˈʋʲid͡zt͡sʊrɐte/Dental plosive assimilates to the following sibilant.
тс → t͡s; тш → t͡ʃʃ; тч → t͡ʃː; тц → t͡sːбра́тство, ді́тши, ма́тч, бра́тці/ˈbrat͡stwɔ/, /ˈdʲit͡ʃʃe/, /ˈmat͡ʃː/, /ˈbrat͡sʲːi/Same idea for т.
Single letters: а → a, б → b, в → ʋ, г → ɦ, ґ → ɡ, д → d, е → ɛ, и → ɪ, і → i, о → ɔ ...га́зета/ˈɦazetɐ/The full table is in the mapping section above.
є → jɛ, ї → ji, ю → ju, я → ja, й → j, ь → ʲє́дність/ˈjɛdʲnʲisʲtʲ/Iotated vowels become j + vowel; ь becomes the palatalization mark.
ц → t͡s, ч → t͡ʃ, ш → ʃ, щ → ʃt͡ʃща́стя/ˈʃt͡ʃasʲtʲɐ/Affricates and щ.
U+0301 → ˈ, U+0300 → ˌра̀діоприйма́ч/ˌradʲiɔprei̯ˈmat͡ʃ/Accents become IPA stress marks, still placed after the vowel.

Stage 6. Stress Mark Before the Vowel; Monosyllable Marker

Rule Example Input Output Description
([aɛiɪuɔ])([ˈˌ]) → \2\1ї́жа/ˈjiʒɐ/The stress mark moves in front of its vowel (final placement is Stage 11).
One-vowel word and allow_unstressed is false → insert ⁀ before the vowelсад (called without the flag)/sad/The marker makes the vowel count as stressed for reduction, then is deleted. With the flag set, an unmarked one-vowel word stays unstressed and gives /sɐd/. The app never sends such a word: its handler adds a stress mark to any one-vowel word first, so сад appears in the app as /ˈsad/.

Stage 7. Palatalization

Consonants in palatalizable (t d s z n l r b p ʋ f ɡ m k ɦ x ʃ ʒ, so also the s of ц and the ʃ of ч, щ) get ʲ before i, or before j (the j is then removed).

Rule Example Input Output Description
C(ː)(stress)i → Cʲ(ː)(stress)iлі́то, кі́т, ці́лий, чі́тко/ˈlʲitɔ/, /ˈkʲit/, /ˈt͡sʲiɫei̯/, /ˈt͡ʃʲitkɔ/Softening before і.
C(ː)j → Cʲ(ː)ля́ля, тя́га, лю́ди, мо́ря/ˈlʲalʲɐ/, /ˈtʲaɦɐ/, /ˈlʲude/, /ˈmɔrʲɐ/я, ю, є, ї after a consonant: the j is absorbed.
ʲːj → ʲːви́читься/ˈʋɪt͡ʃet͡sʲːɐ/Clean-up after -тьс-.
st͡sʲ(ː) → sʲt͡sʲ(ː)ві́стці/ˈʋʲisʲt͡sʲ(ː)i/The length is written in parentheses as optional.

Stage 8. Voicing Assimilation

Table voicing: p→b, f→v, t→d, tʲ→dʲ, s→z, sʲ→zʲ, ʃ→ʒ, k→ɡ, x→ɦ, t͡s→d͡z, t͡sʲ→d͡zʲ, t͡ʃ→d͡ʒ, ʃt͡ʃ→ʒd͡ʒ. Each applies when followed by one or more of [bdzʒɡɦ].

Rule Example Input Output Description
k → ɡ before zвокза́л, ру́кзак/wɔɡˈzaɫ/, /ˈruɡzɐk/Regressive voicing.
t → d before bфутбо́л/fʊdˈbɔɫ/
tʲ → dʲ, sʲ → zʲборотьба́, про́сьба/bɔrɔdʲˈba/, /ˈprɔzʲbɐ/Soft variants have their own entries.
ʃ → ʒпро́шба/ˈprɔʒbɐ/
No rule for the reverse directionві́дпустка, кі́гті/ˈʋʲidpʊstkɐ/, /ˈkʲiɦtʲi/No devoicing before voiceless consonants and none at word end.

Stage 9. Softness Assimilation and Hushing/Hissing Assimilation

Rule Example Input Output Description
([tdsznl])(.)ʲ → \1ʲ\2ʲпі́сня, ра́дість, ма́ленький/ˈpʲisʲnʲɐ/, /ˈradʲisʲtʲ/, /ˈmaɫenʲkei̯/Backward softening in a two-consonant cluster.
Labials not in the trigger set (б п в ф м)лі́пня/ˈlʲipnʲɐ/A preceding labial stays hard.
Same, with affricates (t͡s, d͡z)студе́нтці, жі́нці/stʊˈdɛnʲt͡sʲːi/, /ˈʒʲinʲt͡sʲi/Neighboring dental softens before a soft affricate.
ʒt͡sʲ → zʲt͡sʲ; ʃt͡sʲ → sʲt͡sʲ; t͡ʃt͡sʲ → t͡sʲː; ʃsʲ → sʲːножці́, дошці́, дочці́, ви́чишся/nozʲˈt͡sʲi/, /doˈsʲt͡sʲi/, /dɔˈt͡sʲːi/, /ˈʋɪt͡ʃesʲːɐ/Hushing consonants adopt the following hissing consonant.
zʒ → ʒː; sʃ → ʃː; zt͡ʃ → ʒt͡ʃ; zd͡ʒ → ʒd͡ʒзжа́ти, сши́ти, розча́рувати, розджа́рити/ˈʒːate/, /ˈʃːɪte/, /rɔʒˈt͡ʃarʊʋɐte/, /rɔʒˈd͡ʒarete/Hissing consonants adopt the following hushing consonant.
t͡ʒ → d͡ʒ; t͡z → d͡z; CʲCʲCʲ → CCʲCʲ(safety rules)-I did not find a common word that triggers these three; they guard against odd sequences created by earlier rules.

Stage 10. Vowel Reduction

Conditions use the preceding character: a vowel is "stressed" if the character before it is ˈ, ˌ or the temporary ⁀ marker. This is why the stress mark must already be placed directly before the vowel (Stage 6).

Rule Example Input Output Description
unstressed a → ɐдава́ти, каша́/dɐˈʋate/, /kɐˈʃa/Also at the start of a word.
unstressed u → ʊсуша́, узу́м/sʊˈʃa/, /ʊˈzum/
unstressed ɔ → o before a stressed u, i or ʊ (through consonants)коні́, ходжу́, подру́га/koˈnʲi/, /xoˈd͡ʒu/, /poˈdruɦɐ/Vowel harmony toward a high stressed vowel.
unstressed ɛ, ɪ → eлимо́н, зеле́ний/ɫeˈmɔn/, /zeˈɫɛnei̯/One allophone for both.
No rule for ɔ elsewhere or for iсторона́, кіно́/stɔrɔˈna/, /kʲiˈnɔ/No akanye.

Stage 11. Allophones of в and й; Final Stress Placement

Rule Example Input Output Description
Remove ⁀ (monosyllable marker)--Done before the в/й rules, which do not depend on stress.
vowel + ʋ + (consonant or #) → u̯ле́в, пра́вда, авто́/ˈɫɛu̯/, /ˈprau̯dɐ/, /ɐu̯ˈtɔ/в in a syllable coda.
ʋ + (ɔ u o ʊ b d z ʒ ɡ ɦ m n l r) → wвода́, вуха́, про́вулок/wɔˈda/, /wʊˈxa/, /ˈprɔwʊɫɔk/Before round vowels and voiced consonants.
ʋ + (p f t s k x ʃ) → ʍвкла́д, вчо́ра, вхі́д/ˈʍkɫad/, /ˈʍt͡ʃɔrɐ/, /ˈʍxʲid/Before voiceless consonants.
otherwise ʋ staysкра́ва, шви́дко/ˈkraʋɐ/, /ˈʃʋɪdkɔ/Before other vowels or soft segments.
vowel + j + (consonant or #) → i̯ма́йже, мі́й, ві́йна/ˈmai̯ʒe/, /ˈmʲii̯/, /ˈʋʲii̯nɐ/Also applies to the j of я, ю, є, ї before a consonant: Ма́йя /ˈmai̯jɐ/.
#j + consonant → #i̯йти́/ˈi̯tɪ/Word-initial й before a consonant.
Remove temporary !об'є́кт/ɔˈbjɛkt/Apostrophe marker deleted.
Stress mark 1: move before the last consonant of the onset clusterкни́жка/ˈknɪʒkɐ/Skips over ʲ and ː, then back over consonants.
Stress mark 2-3: over tie bars and "permanent onset" clusters (perm_syl_onset)сестра́, захисти́ти, зло́чин/seˈstra/, /zɐxeˈstɪte/, /ˈzɫɔt͡ʃen/Clusters such as str, st, sp, kr, pl, ɦl stay together as an onset.
Stress mark 4: affricate handlingвідчу́ти/ʋʲid͡ʒˈt͡ʃute/The mark stands between the two affricates.
Stress mark 5-6: move back over remaining word-initial consonants, and over initial u̯/i̯Дніпро́, йти́/dʲnʲiˈprɔ/, /ˈi̯tɪ/An initial cluster is never split by the mark.

Stage 12. Final Clean-up and Output

Rule Example Input Output Description
ʲ?ːʲ → ʲːзна́ння/ˈznanʲːɐ/Collapses duplicated softness marks around length.
l (not followed by ʲ) → ɫпо́ле, до́ля/ˈpɔɫe/, /ˈdɔlʲɐ/Dark l for every non-soft л.
Join words with spaces; delete #по-украї́нськи/pɔ ʊkrɐˈjinʲsʲke/The result is returned as a plain string (the template output option is unused by the app).

What the Module Does Not Implement

Common Issues & Limitations

Known Transcription Problems

This table shows issues found by running the real engine. "System Output" is what the app handler returns in the Node test environment (no lexicon loaded). "Correct IPA" is either the output of the module called directly on a correctly stress-marked word, or a description in words.

Input System Output Correct IPA Cause What to Do
не (small word) /ˈnɛ/ /ne/ (unstressed clitic, module on the bare word) Every one-vowel word is stressed by the handler, so function words get full stressed vowels. Also: на gives /ˈna/ instead of /nɐ/; у gives /ˈu/ instead of /ʊ/. Treat the vowel of a short function word as reduced in running speech.
в (preposition) /ʋ/ Usually [u̯] or [w] after a vowel, [ʋ] or [w] elsewhere (depends on neighbors; not modeled) Each word is processed alone, so a one-letter preposition never sees its neighbors. The в/у and і/й alternation is not handled. Transcribe the phrase with the preposition attached to the next word if you need the neighbor effect.
студент (not in lexicon) /ˈstudent/,/stʊˈdɛnt/ /stʊˈdɛnt/ One variant per vowel is generated; some are impossible Ukrainian stress positions. Click the word to cycle to the right variant.
Київ-Львів (hyphen) /ˈkɪjiu̯ lʲʋʲiu̯/,/keˈjiu̯ lʲʋʲiu̯/,/kejiu̯ ˈlʲʋʲiu̯/ /ˈkɪjiu̯ ˈlʲʋʲiu̯/ (module on ки́їв-льві́в) Hyphen-separated parts are transcribed separately, but the handler places only one stress mark in the whole input, so the other part is unstressed. Transcribe each part as a separate word.
ра́ннiй (typed with a Latin i) ра́ннiй (unchanged) /ˈranʲːii̯/ (module on ра́нній, Cyrillic і) Mixed Latin and Cyrillic letters raise an error in the module and the handler returns the text as is. Retype the Latin look-alike letters (i, o, a, e, p, c, x) in Cyrillic.
журналі́стський, ту́ристський, зши́ток, зчи́тати Varies between page loads: /ʒʊrnɐˈlʲisʲkei̯/ or /ʒʊrnɐˈlʲisʲːkei̯/; /ˈʃːɪtɔk/ or /ˈʒʃɪtɔk/; /ˈʃt͡ʃɪtɐte/ or /ˈʒt͡ʃɪtɐte/ The first output of each pair: short sʲk (стськ → ськ), long initial ʃː (#зш → #шː), voiceless ʃt͡ʃ (#зч → #шч) The cluster rules live in a Lua table iterated with pairs(), whose order changes between runs. Overlapping rules (стс / стськ, зш / #зш, зч / #зч) then win in random order. Observed by running the same words repeatedly. Known module quirk. If a word like this looks wrong, reload the page and transcribe it again, or check Wiktionary.
м’ясо (curved apostrophe) in the raw module /ˈmʲjasɔ/ (module alone) /ˈmjasɔ/ (also what the app gives) The module maps ’ to j without protecting the consonant; the app converts ’ to ' in sanitize() so users are not affected. No action in the app; relevant when calling the module directly.

Help pages for related languages in this tool:


For technical issues or suggestions, please visit our GitHub repository.