NeuralVoicesUA (Driver for Microsoft Neural Natural Voices)

An NVDA driver for Microsoft's Neural Natural Voices (Azure Embedded Speech SDK), running fully offline once voice packages are installed.

Contents

Getting started

If you are upgrading from 1.13.0 or earlier. The add-on has been renamed from "NeuralVoices" to "NeuralVoicesUA", so that it is not confused with an unrelated driver of the same name. NVDA sees a renamed add-on as a new one, so the old copy stays installed alongside it: remove "NeuralVoices" in the Add-ons manager after installing this one. Your settings — voices, voice pairs, per-voice parameters, profiles — are carried over automatically.

  1. Install this driver, plus one or more voice-data add-ons — separate packages named something like "NeuralVoices-voice-Ostap-Natural-Ukrainian-Ukraine" or "NeuralVoices-voice-Polina-Natural-Ukrainian-Ukraine".
  2. Press Ctrl+Insert+S to open NVDA's synthesizer selection dialog, and choose "NeuralVoicesUA" from the list.

From there, the synthesizer is configured in NVDA's regular "Voice" settings dialog — Ctrl+Insert+V (the same settings are also available from the settings ring, NVDA+Ctrl+arrows):

This add-on's own settings dialog (NVDA menu → Preferences → NeuralVoicesUA Settings) has six categories: Languages (which languages show up under "Voices"), Voices (voice and settings per language), Voice pairs (below), Voice profiles (below), Word stress (below), and Miscellaneous (a "Help" button that opens this document in a browser).

Voices and voice pairs

Individual voices

The "Voices" category in the add-on's settings dialog lets you pick, for each language ticked under "Languages", which installed voice speaks it by default, and tune that voice's rate, pitch and volume independently of every other voice. A single broken voice package doesn't prevent the rest of the installed ones from loading — if a voice is missing from the list, check that particular installation first.

Voice pairs

A voice pair is a named group of "language → voice" mappings (not limited to two languages — you can create, for example, a group of three or more: English + Ukrainian + German, and so on). Switching between pairs with a single item replaces reconfiguring each language separately.

  1. Open the NVDA menu → Preferences → NeuralVoicesUA Settings, go to the "Voice pairs" category.
  2. Enter any name in the "Pair name" field (e.g. "Female voices").
  3. In the "Group members" list, add each language you want: pick a language and a voice, click "Add to pair", and repeat for every language you want in the pair.
  4. Click "Save pair".
  5. To create another pair (e.g. "Male voices"), click "New pair" first, before entering a name and adding languages — otherwise the next "Save pair" click overwrites the pair you just created instead of making a new one. To edit an existing pair instead, select it in the "Voice pairs" list.
  6. Close the dialog. The pair you just created will show up right in the "Voice" list (Ctrl+Insert+V) alongside the regular voices — selecting a pair immediately assigns all of its voices to their languages.

The settings dialog marks the currently active pair with "(active)" in the pair list, and flags any saved pair member whose voice is no longer installed right in the member list.

To switch between pairs quickly without opening the settings dialog: open the NVDA menu → Preferences → Input Gestures, find the "NeuralVoicesUA" category → "Switch to the next NeuralVoicesUA voice pair", and assign a convenient key combination. No key is assigned by default.

Voice profiles

A voice profile is a numbered slot holding one voice pair together with its speed, pitch and volume. There are ten slots, each with its own shortcut: NVDA+Ctrl+1NVDA+Ctrl+9, and NVDA+Ctrl+0 for the tenth.

A profile differs from the "next voice pair" gesture in two ways. First, it reaches the pair you want at once instead of after several presses. Second, and more importantly: a profile works even when NeuralVoicesUA is not the currently active synthesizer — the shortcut switches NVDA to it and brings it up already using the profile's voices. The "next pair" gesture merely reports that the synthesizer is not active.

To set a profile up:

  1. First create the voice pairs you need in the Voice pairs category — a profile points at an existing pair rather than replacing it.
  2. If you also want the profile to store speech parameters, set them on the Voices panel first.
  3. Open the NVDA menu → Preferences → NeuralVoicesUA Settings and go to the Voice profiles category.
  4. Pick a slot in the "Voice profiles" list. Each row shows the slot number, its shortcut and what it currently holds.
  5. Pick a pair in "Voice pair for this profile".
  6. The "Also remember the current speed, pitch and volume" checkbox (on by default) stores the current parameters of each voice in the pair separately — that is how the driver keeps them, so a three-language pair remembers three sets.
  7. Press Assign to profile.

Clear profile empties a slot; the pair itself is left alone.

The shortcuts can be changed under NVDA menu → Preferences → Input Gestures → "NeuralVoicesUA" category. NVDA+Ctrl+digit is the default rather than Ctrl+Alt+digit because the latter are heading styles in Microsoft Word.

If the pair a profile pointed at has been deleted, the slot says so in the list and pressing its key reports that the pair is gone — the profile itself stays, so assigning another pair to it is enough.

Automatic language detection

General principle

The "Use language detection based on Unicode scripts" checkbox in NVDA's voice settings (Ctrl+Insert+V) enables automatic voice switching based on character script (Latin, Cyrillic, and so on) right within a single sentence — useful combined with voice pairs so mixed-language text is immediately spoken with the right voices from the selected pair.

Ukrainian and Russian

Ukrainian and Russian are written in the same Cyrillic script, so script alone can't tell them apart. If a voice pair configures both a Ukrainian and a Russian voice, the driver automatically turns on a separate mode: Ukrainian is used by default, and text only switches to Russian when a sentence contains something specific to Russian spelling or grammar.

This mode can also be turned on separately, without setting up a voice pair: the "Auto-detect Russian text within Cyrillic (experimental)" checkbox in NVDA's voice settings (Ctrl+Insert+V, and the settings ring) works as long as at least one Ukrainian and at least one Russian voice package are installed — if either is missing, NVDA announces a message and the checkbox doesn't turn on.

What marks text as Russian:

This is a heuristic, not a guarantee: short words or phrases containing none of these markers default to Ukrainian even if they were actually written in Russian. Classification resets at each period, exclamation mark, question mark, or line break, so a marker in one sentence doesn't carry over into the next.

The full marker list lives in a separate plain-text file inside the add-on folder, synthDrivers\NeuralVoices\russianMarkers.txt — edit it with any text editor to add your own markers. Changes take effect after restarting NVDA.

Protection against false positives: if a sentence contains any of the letters і, ї, є, ґ (absent from the Russian alphabet), it always stays Ukrainian, regardless of whether it also happens to contain one of the markers above. This is a guarantee, not a heuristic: the presence of these letters means the text is definitely Ukrainian.

Exception: if such a letter only occurs in the sentence's very first word (for example, when an app glues its own Ukrainian UI label — say, "Відео" — directly onto Russian message text with no punctuation between them at all), and the rest of the sentence unambiguously reads as Russian on its own, the guarantee only applies to that first word rather than the whole sentence.

The same applies to Ukrainian words or phrases spliced into the middle of a sentence (e.g. when NVDA describes an inline emoji in Ukrainian right in the middle of an otherwise all-Russian sentence) — but for that case the guarantee only lifts when the rest of the sentence (with that inserted phrase removed) contains the letter ы, э, or ъ — not just a heuristic marker, but a hundred-percent sign of Russian spelling.

Polish and German

Polish and German detection within the Latin script works the same way. If a voice pair configures both an English and a Polish voice (or English and German), the driver automatically turns on the matching mode; each can also be turned on separately with the "Auto-detect Polish text within Latin script (experimental)" and "Auto-detect German text within Latin script (experimental)" checkboxes in NVDA's voice settings, as long as the matching voice packages are installed (English and Polish / English and German).

German's hard letters ä, ö, ü, ß unambiguously mark German text regardless of any markers — they don't occur in the Polish alphabet. The full marker lists live in synthDrivers\NeuralVoices\polishMarkers.txt and synthDrivers\NeuralVoices\germanMarkers.txt, editable the same way as the Russian markers above.

Numbers language

A number inside a sentence (e.g. "in 2024 году") is spoken in that sentence's language rather than always defaulting to Ukrainian. A number at the START of a phrase takes the language of the text that follows it: "5 з десяти" is spoken entirely in Ukrainian even when the active voice is English.

If you would rather not rely on that guess, the "Numbers language" setting in NVDA's voice settings (Ctrl+Insert+V, and in the settings ring) pins digits to one script permanently: "Automatic (from surrounding text)" is the default, plus "Always Cyrillic" and "Always Latin". Even in "Always Cyrillic" mode a number inside a Russian sentence is still spoken by the Russian voice, not Ukrainian.

The "Ignore numbers in language detection" checkbox turns off that link entirely: digits become fully neutral for detection, just like spaces or punctuation. Turning it on makes sense if numbers in the text are throwing off detection on the surrounding words.

Ukrainian word stress dictionary

Microsoft's model occasionally stresses Ukrainian words incorrectly. NeuralVoicesUA lets you fix this yourself, without waiting for a model update from Microsoft. The "Correct Ukrainian word stress from dictionary" checkbox in NVDA's voice settings turns this whole correction on or off.

Quickly adding a word

NVDA+Alt+U works on top of any application and opens a short dialog:

  1. The word is filled in automatically — from the review cursor (if you just heard the mistake, simply move to that word first) or from the clipboard; you can also type or edit it by hand.
  2. In the "Stressed vowel" list, choose which vowel should carry the stress.
  3. In the "Apply to" list, choose how broadly the correction should apply (below).
  4. Click "Preview" to hear the result — the transcription is always an approximation, so it's worth checking every time.
  5. Click "OK" to save.

The "Apply to" list

Ukrainian changes words heavily by case, so typing out every inflected form as a separate line would be tedious. The list offers four options, from narrowest to broadest:

A prefix can shift the stress — unlike endings, which almost always keep it. This is especially true of the Ukrainian prefix "ви-", which almost always pulls the stress onto itself ("ви́писати", "ви́носити", "ви́конати"). Because of that, the prefix-allowing options never apply to a word that begins with exactly "ви" right before the stem — better to leave the pronunciation uncorrected than to correct it wrongly. If you need exactly such an exception, add that specific "ви-" word as its own entry with "Only this exact word": an exact entry always takes priority over a stem. A stem that allows a prefix must be at least 4 letters long — a shorter one would match far too many unrelated words; this limit doesn't apply to the "ending only" option.

Managing the whole dictionary

The "Open dictionary settings…" button in the quick dialog (as does the "Word stress" category in the settings dialog directly) opens the full list of words: there you can review, edit or remove any entry, not just the one you just added.

The dictionary is stored in a file inside NVDA's configuration folder, so it survives add-on updates.

Other settings

Emoji

NVDA+Alt+E turns the speaking of emoji off and on. NVDA says which it is right away: "Emoji are not spoken" or "Emoji are spoken".

Why. Social feeds, messengers and web pages come with emoji by the handful, and NVDA reads a description for each one — "smiling face with smiling eyes", "skin tone 3". Reaching two words of text can mean sitting through twenty descriptions. The switch strips them before synthesis.

The same switch is also an ordinary voice setting — "Do not speak emoji" in the Voice settings dialog (Ctrl+Insert+V) and in the settings ring, so its state is kept between NVDA sessions.

The list holds about 1635 rules and covers the pictographs themselves, skin-tone modifiers and joining characters. Each emoji is replaced by a space, not by nothing: otherwise words written right up against a pictograph would run together.

For your own list, put a file named neuralVoicesEmoji.dic in the NVDA configuration folder — it fully replaces the built-in one. The format is NVDA's own speech-dictionary format: pattern, replacement, case sensitive, type, separated by tabs. Regular-expression rules (type 2) are not applied.

The filtering only applies while NeuralVoicesUA is the active synthesizer; the add-on does not touch other synthesizers' speech.

Tips

About the author and supporting the project

This add-on is developed by Oleksandr Nikolaichuk (alexandrnikolaychuk@gmail.com).

If you'd like to thank the author and support the project's development, you can do so using these details: