NeuralVoicesUA Help

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.

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 itself, 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 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).

Voices and voice pairs

Individual voices

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.

Voice pairs

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.

  1. Open the NeuralVoicesUA Settings dialog and go to the "Voice pairs" category.
  2. In the "Pair name" field, type any name you like.
  3. In the "Group members" list, pick a language and a voice, click "Add to pair" — repeat for every language you want in the group (not necessarily just two).
  4. Click "Save pair".
  5. To create another pair, be sure to click "New pair" first, before typing a name and adding languages — otherwise the next save will overwrite the pair you just created.
  6. Close the dialog. The pair you just created will show up right in the "Voice" list (Ctrl+Insert+V) alongside the regular voices: picking a pair instantly assigns all of its voices to their languages.

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.

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) 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

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 and German

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.

Numbers language

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.

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.

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 (see 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 — 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.

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 "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.

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: