An NVDA driver for Microsoft's Neural Natural Voices (Azure Embedded Speech SDK), running fully offline once voice packages are installed.
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.
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).
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.
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.
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.
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+1 … NVDA+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:
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.
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 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 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.
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.
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.
NVDA+Alt+U works on top of any application and opens a short dialog:
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.
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.
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.
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: