NeuralVoicesUA is an NVDA driver for Microsoft's neural natural voices (Azure Embedded Speech SDK). Once the voice packages are installed, it works fully offline, with no internet connection required.
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 itself 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). That's where you'll find:
To have different languages spoken by different voices automatically, set up a voice pair or automatic language detection (see below).
NVDA menu → Preferences → NeuralVoicesUA Settings opens this add-on's own settings dialog with six categories: Languages (tick which languages you plan to configure — ticked languages show up under "Voices"; the rest stay hidden, so a long list of installed languages doesn't get in the way), Voices (below), Voice pairs (below), Voice profiles (below), Word stress (below), and Miscellaneous (a "Help" button that opens this page in a browser).
For each language ticked under "Languages", the "Voices" category lets you choose which installed voice speaks it by default, and tune that voice's rate, pitch and volume independently of every other voice.
A voice pair is a named group of "language → voice" mappings (for example, "Female voices": English spoken by Jenny, Ukrainian by Polina; not limited to two languages). A pair can be switched as one unit instead of changing every language separately.
To switch between pairs quickly without opening the settings dialog, assign a key combination to "Switch to the next NeuralVoicesUA voice pair" via NVDA menu → Preferences → Input Gestures (category "NeuralVoicesUA"). 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) switches voices by character script (Latin, Cyrillic, and so on) right within a single sentence — handy together with voice pairs, so mixed-language text is immediately spoken with the right voices.
Ukrainian and Russian share the very same Cyrillic script, so script alone can't tell them apart. If a voice pair configures both languages, the driver turns on a dedicated mode: Ukrainian takes priority by default, and text switches to Russian only when it actually contains something characteristic of Russian spelling or grammar (specific letters, words, grammatical patterns). This mode can also be turned on separately — the "Auto-detect Russian text within Cyrillic" checkbox right there in voice settings (Ctrl+Insert+V), as long as at least one Ukrainian and one Russian voice package are installed.
This is a heuristic, so a rare misfire is possible; the full list of markers, and how to add your own, lives in the russianMarkers.txt file inside the driver's folder, documented in detail right there. Protection against false positives: if a sentence contains any of the letters і, ї, є, ґ (absent from the Russian alphabet), it always stays Ukrainian, regardless of any markers.
Polish detection within Latin script ("Auto-detect Polish text within Latin script" checkbox) and German detection ("Auto-detect German text within Latin script" checkbox) work the same way, each as long as the matching voice packages are installed. German's hard letters ä, ö, ü, ß unambiguously mark German text regardless of markers. The full lists live in the polishMarkers.txt and germanMarkers.txt files.
By default, digits count as part of the text they sit in for language detection: a number inside a sentence is spoken in that sentence's language, and 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.
The "Numbers language" setting lets you skip that guess and pin digits to one script permanently: "Automatic (from surrounding text)" is the default, plus "Always Cyrillic" and "Always Latin" (in "Always Cyrillic" mode a number inside a Russian sentence is still spoken by the Russian voice).
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.
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 — this is deliberate: it's 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 "Correct Ukrainian word stress from the dictionary" checkbox turns this whole correction on or off.
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: