Balabolka (Text-To-Speech)

Balabolka

Balabolka is a Text-To-Speech (TTS) program. All computer voices installed on your system are available to Balabolka. Any plain text documents on your system can be opened for reading and editing via the "File | Open" menu. To create a new document, simply select "New" from the "File" menu.

Speech can be controlled using the standard play-pause-stop buttons found on the toolbar near the top of Balabolka. The program can read the clipboard content, view the text from documents, customize font and background colour, control reading from the system tray or by the global hotkeys.

Supported file formats: AZW, AZW3, CHM, DjVu (DjVu+OCR), DOC, DOCX, EML, EPUB, FB2 (FB2.ZIP, FBZ), FB3, HTML, LIT, MD, MOBI, ODP, ODS, ODT, PDB, PDF, PPT, PPTX, PRC, RTF, TCR, WPD, XLS, XLSX. The IFilter interface can be used for files with unknown extensions.

The on-screen text can be saved as an audio file by selecting "File | Save Audio File" or "File | Split and Convert to Audio Files" from the "File" menu. Supported audio file formats: WAV, MP3, MP4, OGG, OPUS, WMA.

Balabolka can save the synchronized text in external LRC files or in MP3 tags inside the audio files. When an audio file is played with players on a computer or on modern digital audio players, the text is displayed synchronously (at the same way, as lyrics for songs).

The program can use various versions of Microsoft Speech API (SAPI) and Microsoft Speech Platform. It allows to alter a voice's parameters, including rate and pitch.

The user can apply a special replacement list to improve the quality of the voice's articulation. This feature is useful when you want to change the spelling of words or separating syllables. Balabolka uses three kinds of substitution lists:

  • the rules for the pronunciation correction use the syntax of regular expressions and can be saved in the files with the extension *.rex;
  • files with the extension *.dic; this format is popular in Eastern Europe; the syntax of rules is simple, so the file can contain thousands of rules;
  • files with the extension *.bxd combine the options of two other formats.

The application stores files for pronunciation correction in the folder Documents\Balabolka (or My Documents\Balabolka in Windows XP). If any dictionary is used, the program highlights the whole sentence or paragraph during reading; otherwise, the current word is highlighted.

Note. The portable version stores files for pronunciation correction in the subfolder Dictionaries.

* Balabolka is a Russian word, it can be translated as "chatterer".

WWW: balabolka.site

E-mail: crossa@list.ru

© 2006-2020 Ilya Morozov


Voices

The Speech Application Programming Interface or SAPI was developed by Microsoft to allow the use of speech synthesis within Windows applications. There are two major SAPI versions (SAPI 4 and SAPI 5), which are not compatible between each other.

SAPI 4 (Microsoft Speech API 4.0)

All voices for SAPI 4 became obsolete; they are not recommended for installing anymore. Use the fresh versions of speech engines.

SAPI 5 (Microsoft Speech API 5.x)

RHVoice - free and open source speech synthesizer (it supports English, Esperanto, Georgian, Kyrgyz, Portuguese, Russian, Tatar and Ukrainian):

  • RHVoice

UkrVox - free Ukrainian voice created by Yaroslav Kozak (Lviv, Ukraine):

  • UkrVox Igor

Ekho - free TTS engine (it supports Cantonese, Mandarin and Zhaoan Hakka):

  • Echo (Chinese)

To get better voice quality, you can purchase Acapela Group, Cepstral or IVONA voices. They are a new generation of TTS engines that use large speech databases so the speech quality is excellent.

High quality commercial voices:

  • Acapela Group (demo)
  • Alfanum (demo)
  • Cepstral (demo)
  • IVONA (demo)
  • Nuance/Cerence (demo)
  • ReadSpeaker (demo)

Microsoft Speech Platform

The Microsoft Speech Platform allows developers to build and deploy Text-to-Speech applications. The Microsoft Speech Platform consists of a Runtime, and Runtime Languages (engines for speech recognition and text-to-speech). There are separate Runtime Languages for speech recognition and speech synthesis. The version of the Runtime Languages must match the version of the Speech Platform that you installed.

Use the following steps to install the Microsoft Speech Platform:

  1. Download and install the Speech Platform Runtime
    (the file 'x86_SpeechPlatformRuntime\SpeechPlatformRuntime.msi').
  2. Download and install Runtime Languages for use with the Speech Platform
    (files with names starting with 'MSSpeech_TTS_').

The Microsoft Speech Platform (version 11.0) provides support for 26 languages for speech synthesis. XML tags can be used both for SAPI 5 and Speech Platform.


Command Line

Balabolka accepts the parameters at the command line:

balabolka.exe [-options] [filename] [audio_file] [voice]

The parameter voice must be defined in next way:

voice_name [rRate] [pPitch]

filename
open file

-c
read clipboard aloud

-c voice_name
choose voice and read clipboard aloud

-m
run minimized

-r filename
open file and read aloud from the beginning

-r filename voice_name
open file, choose voice and read aloud from the beginning

-s filename audio_file
open file and read the text to audio file (WAV, MP3, MP4, OGG or WMA)

-s filename audio_file voice_name
open file, choose voice and read the text to audio file

-q
quit after the reading's completion

The name of the voice may be defined by only one word; for example: Peter. The program will choose the appropriate name from the list of voices (SAPI 5 and SAPI 4).

Few options may be set at once:

-rm filename
run minimized and read the specified file

-rq filename
read the specified file and quit after the reading's completion

For example:

balabolka.exe book.txt

balabolka.exe book.txt "Cepstral Callie"

balabolka.exe -rmq book.txt

balabolka.exe -sq "c:\my books\book.txt" "c:\my files\book.wav"

balabolka.exe -r "c:\text\book.txt" Peter r180 p85

balabolka.exe -c "VW Kate"

If it is necessary to define not a name of a text file, but a line of text, the options must contain a special modifier:

-n [text_line]
this parameter means that the command line contains a line of text instead of a file name

For example:

balabolka.exe -n "Example of text."

balabolka.exe -rn "The program will read this text." Emily

balabolka.exe -snq "This text will be saved to an audio file." "c:\my files\book.mp3"


Spell Checking

Balabolka implements the spell checking engine Common Speller API (CSAPI) for spell checking. The CSAPI is designed for use with all Microsoft applications that include spell-checking. CSAPI is currently provided by many vendors and used by the Microsoft Office 97/2000 and many other applications. The CSAPI engine is not shipped as a part of Balabolka installation package, but if you have Microsoft Office installed, Balabolka will automatically detect the presence of CSAPI and uses it.

While in the window of description's editing, you can use the Spell Checker menu. Right-click on a highlighted word and a popup menu displays, allowing you to choose from a list of suggestions for the correct spelling of the word. Or, choose Add Word to Dictionary to add the word to the user dictionary. If there are no suggestions in the dictionary for the correct spelling of the misspelled word, no suggestions will be listed in the popup menu.

It is also possible to check the text using the Spell Checking dialog box (click the menu item "Text | Spell Checking"). Below is the description of Spell Checking dialog box buttons:

  • Change - replaces the current word with the correct word taken from the "Suggestions" field.
  • Change All - replaces all occurrences of the selected word in the description with the correct word taken from the "Suggestions" field.
  • Ignore - skips the current word without changing it and goes on to the next misspelled word.
  • Ignore All - skips all occurrences of the current word in the descriptin without changing it and goes on to the next misspelled word. This word will then be treated as spelled correctly during the entire current Balabolka session.
  • Add - adds the current word to the user dictionary.

A "User dictionary" is a file with a set of words in text form, it has the extension *.dic. The main purpose of the user dictionary is allowing user to add custom words to it for spell checking. Microsoft Office 97/2000 holds the user dictionary here: c:\Program Files\Common Files\Microsoft Shared\Proof\custom.dic.

Balabolka allows to define two languages for spell checking (check box Second Language). In this case the Spell Checking dialog box is disabled; you can use the Spell Checker menu only.

Balabolka can use Hunspell (hunspell.github.io). Hunspell is the default spell checker of OpenOffice.org and Mozilla Firefox.

Spell checker dictionaries for Windows are available for download from the Balabolka website.

The application allows to use the spell checking built in operating system. The Spell Checking API is available beginning with the Windows 8.


Find and Replace Text

The program allows to search for text in the current document and replace it with different text. Most of special codes from Microsoft Word are supported for the non-printing characters (codes are case-sensitive):

^p
Paragraph mark
^t
Tab character
^nnn
ASCII character (where nnn is the character code)
^0 nnn
ANSI character (where 0 is zero and nnn is the character code)
^U nnnnn
Unicode character (where nnnnn is the character code)
^+
Em dash ( — )
^=
En dash ( – )
^^
Caret character
^s
Nonbreaking space
^?
Any character (in the Find what box only)
^#
Any digit (in the Find what box only)
^$
Any letter (in the Find what box only)
^c
Microsoft Windows Clipboard contents (in the Replace with box only)
^&
Contents of the Find what box (in the Replace with box only)


Frequently Asked Questions

Question

I'm getting the error message "OLE error 80045042". What does that mean?

Answer

This error means: "The XML parser failed due to bad syntax." You must verify the syntax of the XML tags inside the text. Or, some part of the text looks like the start of an XML tag, and it is confusing SAPI. If you don't want to use XML tags, remove the symbols "<" and ">" from the text (or replace them by words "less than" and "greater than").

Question

Where can I get SAPI 4?

Answer

To use SAPI 4 voices, download and install the redistributable Microsoft Speech API file (824 KB). Also, you may download and install the Microsoft Speech Control Panel (840 KB); the Speech Control Panel will add an icon to your Control Panel to enable you to list the compatible text-to-speech engines installed on your system and customize their settings for your use.

Question

Where can I get SAPI 5?

Answer

Windows XP (and later versions) comes with SAPI 5.

Question

How do I know what Text-To-Speech voices have been installed on the computer?

Answer

You can view all the voices available on the computer by following Control Panel -> Speech -> Speech Properties -> Text To Speech -> Voice selection.

Question

How can I make a silent installation of Balabolka?

Answer

To install Balabolka in silent mode without dialogs you may use a silent installation. A silent installation is available by using -silent command-line switch.

Question

I open a DjVu file, but the program doesn't show any text. What is wrong?

Answer

DjVu format was designed to store scanned documents. A DjVu file contains images of pages for books, magazines, etc. Also, DjVu can contain an OCR text layer.

Balabolka can extract data from a text layer of DjVu only. If such layer is not available, the only way to get text is to use a text recognition system (for example, FineReader).

Question

My computer contains two sound cards. How can I choose an audio device for text-to-speech playback?

Answer

You may select Speech in Control Panel of Windows and click the Audio Output button in the Speech Properties dialog box. Also, Balabolka contains the main menu item "Options | Audio Output".

Question

My computer is running the 64-bit version of Windows. I have installed the 64-bit Runtime package for Microsoft Speech Platform and the English voices. But the list of available voices is still empty. Where is a problem?

Answer

Balabolka is the 32-bit application. You need to install the 32-bit Runtime package for Microsoft Speech Platform also.

Question

The voice says "space" every time, when a text contains a no-break space (ALT+0160). How to fix this?

Answer

The program can replace no-break spaces by usual spaces automatically during reading. Choose the main menu item "Options | Settings", in the window "Settings" (tab "Reading") check the box Ignore characters during reading. Add the no-break space to the list of ignorable symbols: press ALT and type "0160" on the num pad.

Question

How can I remove dashes in the beginning of paragraphs?

Answer

You should use the main menu item "Edit | Replace". Type ^p— in the Find what box and ^p in the Replace with box. You can find more information about the special codes here.

Question

What is Google Text-To-Speech?

Answer

In Google Translate you can find a "Listen" button that converts text to speech. After pressing of this button a browser starts to download MP3 file. The service supports converting to speech texts not longer than 100 symbols. Balabolka allows to divide big text on small parts, create an audio file for each part and merge them together (WAV, MP3 and OGG formats are supported).

Question

I use the voices eSpeak for converting of subtitles to audio files. But the result audio file contains speech without pauses. Where is a problem?

Answer

I strongly recommend not to use eSpeak for subtitle converting. These voices don't support the XML tag "silence"; the same problem was in the old versions of some other voices. It is recommended to use the latest versions of commercial software (Cepstral, CereProc, IVONA, etc.).

Question

I am not satisfied, how Balabolka extracts text from PDF files. Can I use the other way for processing of PDF?

Answer

The process of text extracting from PDF files is complicated enough, because PDF files do not contain plain text. You may use an external command-line utility for text extracting: for example, the program pdftotext.exe from the Xpdf project. Copy pdftotext.exe to the subfolder "utils" in the folder of Balabolka, choose the main menu item "Options | Text Import", the tab "Custom Text Import", and click the Add button. Define the command for using of pdftotext.exe:

%BFolder%\utils\pdftotext.exe -q -nopgbrk -enc UTF-8 %Input% %Output%

Define the name of the converter (for example, "Xpdf Converter"), file extension ("PDF") and output encoding ("UTF-8"). After activating of the option Use instead of default extracting method for this file type the program will be able to use the external utility for text extracting from PDF files.

Question

What is Spritz-Reader?

Answer

Spritz is a new speed-reading technology. It allows to speed reading rates anywhere from 100 to 1000 words per minute. The time consuming part of usual reading lies mainly in the actual eye movements from word to word and sentence to sentence. Spritz positions words in a spot on a display where you can recognize the word, without moving your eyes.

Question

Windows 10 has the new voices Microsoft Mark Mobile and Microsoft Zira Mobile, but they are not available in text-to-speech software. Is it possible to unlock the new voices?

Answer

By default, the Microsoft mobile voice is locked for using in text-to-speech software via SAPI 5. You can unlock it with a simple registry tweak. Download the archive, extract the file for your language and for your version of the operating system ("mobile_x86.reg" for 32-bit and "mobile_x64.reg" for 64-bit), click the right mouse button on the file's name and choose the context menu item "Merge". The Microsoft mobile voice will appear in the list of the available voices in Balabolka.

Question

Some documents contain long URLs. How to make Balabolka to read a web address in a short way?

Answer

The problem can be solved by using of the dictionary for pronunciation correction. Add this rule to the REX-file:

((http|ftp|https)://)?(www\.)?([-a-zA-Z0-9@:%._\+~#\=]{2,256}\.[a-z]{2,6}\b)([-a-zA-Z0-9@:%_\+.~#?&//\=]*)=$4

The regular expression will replace the web address by the domain name ("example.com").

Question

Can I use the first line of text as the name of the audio file (for example, "01 Chapter One.mp3", "02 Chapter Two.mp3")?

Answer

Type %FirstLine% in the "Base Output Filename" box in the window "Split and Convert to Audio Files". The application will replace this variable by the first line of each text part. To change the position of the sequence number inside the filename, use the %Number% variable.

Question

What is the IFilter interface?

Answer

The IFilter interface works with documents. It provides filters to extract information from proprietary file formats. Full-text search engines call the methods of the IFilter interface. IFilters are available for Adobe PDF, WordPerfect and many other popular file formats. You can get IFilter installers from respective vendors. IFilter.org is a good place to get started. Note that because Balabolka is the 32-bit application you may need to install the 32-bit version of IFilters.

Question

How do I change a voice during reading aloud?

Answer

Use the XML tags. It is recommended to write the opening and closing tags inside the same paragraph. For example:

<voice required="Name=Microsoft Zira Desktop">Hello, how are you?</voice>
<voice required="Name=IVONA 2 Amy">I am good.</voice>

Question

Can I use media files generated with Balabolka in YouTube videos?

Answer

Balabolka is freeware, so you may create audio files for free. But if you use the commercial voices, you need to contact the developers of the voice and purchase the license for commercial use/audio broadcast. The audio distribution license will allow you to use speech in YouTube videos.

For example, the information from the Cepstral web-site: "Cepstral Personal voices are for personal use only and are NOT licensed for audio distribution. This means the audio you create is for your use only and cannot be shared with others or used in videos, presentations, or webpages. If you are interested in an audio distribution license, please contact sales."


Using Replacement Lists

Replacement Rules

Panel of Dictionaries

The application allows to use a special text file with replacement rules ("dictionary"), to improve pronunciation of words. Each line of the file contains one substitution rule. Rules can be regular expressions (filenames with extension *.rex) or templates (filenames with extension *.dic). Files with the extension *.bxd combine the options of two other formats.

When the user tells the program to read the text aloud, Balabolka checks against the dictionary what words in the text require correction of pronunciation, and applies the respective substitution rule from the dictionary. The altered text is sent to computer voice clipboard, and the voice reads the text aloud.

To see the list of dictionaries used by the program, choose the menu item "View | Show | Panel of Dictionaries" or press F11. On the right of the main window, list of filenames will be displayed; it is divided into two parts:

  • top part - files with replacement lists;
  • bottom part - files with lists of homographs (heteronyms).

Different computer voices can use different replacement lists. The user can select necessary files from the list.

To create a new dictionary, right-click on dictionaries panel and in context menu select "New" and then type filename of the new dictionary. The file will be created on disk, and its name will appear in the list on the panel.

If the user wants to modify the replacement list, he should select the file name from the list and click "Edit". This will open a window for editing replacement list. To add a new replacement rule it is necessary to fill in "Read this:" and "like this:" fields, then click "Add". After the editing process is finished, click "Save" and exit the editor.

General List of Rules

If several filenames from the list are selected, rules from these dictionaries are automatically merged by the application into a single list stored in computer's memory. To see this list, click the right mouse button on the panel of dictionaries and choose "Show List" from the popup menu.

When the rules from different files are united into a shared list, it happens as follows:

  • rules from *.bxd files are added one after another, as they are located within the vocabulary; the files are processed in alphabetical order;
  • the same order to process rules from *.rex files;
  • all rules of the *.dic files are sorted in such a way that first come case-sensitive rules, then non-case-sensitive rules, then the rules are sorted again by template length - those with the longest symbols pattern are placed closer to the top.

Order of rules in the list is important in cases where several rules can be applied to the same word in the text. Balabolka performs the replacement sequentially, that is, the second rule will be applied to the text that already has been modified by the first rule in the list. In this case, the order of rules is important.

Rules from files with *.rex extension will be applied first. To check the result of rules' applying to the current document, use the main menu items "Options | Pronunciation Correction | View Modified Text" and "Options | Pronunciation Correction | Replacement Statistics".

Additional Tools

To find a pair of rules that influence the same text, choose the menu item "Options | Pronunciation Correction | Find Pairs of Rules". This allows to find the rules that never be used: another rule has already modified this expression in text.

Most frequently correction is required for pronunciation of people's names, places names, animals’ nicknames, names of organizations, etc. Searching for these words in the current document can be facilitated by means of the main menu item "Options | Pronunciation Correction | Find Names in Text". Balabolka makes it possible to view three lists of found words:

  • names (words that always start with a capital letter in the current document);
  • all words with initial capital letter;
  • all words found in document text.

As you move through the list of words, the application will automatically read the word aloud. If a word is read incorrectly, you can correct pronunciation, adding a new rule to the dictionary. List of the found names can be sorted either alphabetically or by frequency of the word use in the text. Also, you can disable showing words that appear in the text only several times; this will speed up checking the list of names found in the current document.

Profiles

The current state of the panel settings can be stored as a "profile". To create and edit profiles, use the menu item "Options | Pronunciation Correction | Profiles".


REX-Files with Pronunciation Corrections

On each line, the second set of letters is the phonetic pronunciation replacement for the first set of letters. Be aware that the replacements occur in the order they appear. For instance, these two lines:

rat=mouse
mouse=hamster

rat becomes hamster. This may not be what was intended.

Comment lines start with the pound sign (#) and are ignored.

The left hand string can contain a regular expression pattern. Regular expression patterns are case-insensitive. If you want to define the case-sensitive pattern, you must add the symbol "@" at the beginning of the line; for example:

@DOT=Department of Transport

Below are the characters and sequences that can be used.

Character | Description
\ | Marks the next character as either a special character or a literal. For example, "n" matches the character "n". "\n" matches a newline character. The sequence "\\" matches "\", "\(" matches "(" and "\=" matches "=".
^ | Matches the beginning of input.
$ | Matches the end of input.
* | Matches the preceding character zero or more times. For example, "zo*" matches either "z" or "zoo".
+ | Matches the preceding character one or more times. For example, "zo+" matches "zoo" but not "z".
? | Matches the preceding character zero or one time. For example, "a?ve?" matches the "ve" in "never".
. | Matches any single character except a newline character.
(pattern) | Matches pattern and remembers the match. The matched substring can be retrieved using the special character $N, where N is the Nth parenthetical statement in the regular expression. To match parentheses characters ( ), use "\(" or "\)".
x|y | Matches either x or y. For example, "z|food" matches "z" or "food". "(z|f)oo" matches "zoo" or "foo".
{n} | n is a nonnegative integer. Matches exactly n times. For example, "o{2}" does not match the "o" in "Bob," but matches the first two o's in "foooood".
{n,} | n is a nonnegative integer. Matches at least n times. For example, "o{2,}" does not match the "o" in "Bob" and matches all the o's in "foooood." "o{1,}" is equivalent to "o+". "o{0,}" is equivalent to "o*".
{n,m} | m and n are nonnegative integers. Matches at least n and at most m times. For example, "o{1,3}" matches the first three o's in "fooooood." "o{0,1}" is equivalent to "o?".
[xyz] | A character set. Matches any one of the enclosed characters. For example, "[abc]" matches the "a" in "plain".
[^xyz] | A negative character set. Matches any character not enclosed. For example, "[^abc]" matches the "p" in "plain".
[a-z] | A range of characters. Matches any character in the specified range. For example, "[a-z]" matches any lowercase alphabetic character in the range "a" through "z".
[^m-z] | A negative range characters. Matches any character not in the specified range. For example, "[m-z]" matches any character not in the range "m" through "z".
\b | Matches a word boundary, that is, the position between a word and a space. For example, "er\b" matches the "er" in "never" but not the "er" in "verb".
\B | Matches a nonword boundary. "ea*r\B" matches the "ear" in "never early".
\d | Matches a digit character. Equivalent to [0-9].
\D | Matches a nondigit character. Equivalent to [^0-9].
\f | Matches a form-feed character.
\n | Matches a newline character.
\r | Matches a carriage return character.
\s | Matches any white space including space, tab, form-feed, etc. Equivalent to "[ \f\n\r\t\v]".
\S | Matches any nonwhite space character. Equivalent to "[^ \f\n\r\t\v]".
\t | Matches a tab character.
\v | Matches a vertical tab character.
\w | Matches any word character including underscore. Equivalent to "[A-Za-z0-9_]".
\W | Matches any nonword character. Equivalent to "[^A-Za-z0-9_]".
\num | Matches num, where num is a positive integer. A reference back to remembered matches. For example, "(.)\1" matches two consecutive identical characters.
\n | Matches n, where n is an octal escape value. Octal escape values must be 1, 2, or 3 digits long. For example, "\11" and "\011" both match a tab character. "\0011" is the equivalent of "\001" & "1". Octal escape values must not exceed 256. If they do, only the first two digits comprise the expression. Allows ASCII codes to be used in regular expressions.
\xn | Matches n, where n is a hexadecimal escape value. Hexadecimal escape values must be exactly two digits long. For example, "\x41" matches "A". Allows ASCII codes to be used in regular expressions.
\x{n} | Matches n, where n is a hexadecimal escape value. Hexadecimal escape values must be exactly four digits long. For example, "\x{00dc}" matches "Ü". Allows Unicode codes to be used in regular expressions.

Balabolka supports the special operators for text converting to uppercase or lowercase.

Operator | Description
\U | Converts all following chars to the next \L or \E to uppercase.
\L | Converts all following chars to the next \U or \E to lowercase.
\E | Turns off case conversion.
\u | Converts the next character to uppercase.
\l | Converts the next character to lowercase.

For example, the expression:

(test)=\U$1\E

will convert "test" to "TEST".


DIC-Files with Pronunciation Corrections

On each line, the second set of letters is the phonetic pronunciation replacement for the first set of letters. Comment lines start with the pound sign (#) and are ignored.

Patterns are case-insensitive. If you want to define a case-sensitive pattern, you must add the symbol "$" at the beginning of the line; for example:

$DOT=Department of Transport

As default, the pattern matches to whole word (or few words). If there are any letters before or after the pattern, the symbol "*" is used. For example:

auto*=avto

This pattern matches to "autobiography", "autocatalysis", "autogenesis", etc. Two sequential special symbols ("#", "*", "=", "$") denote a single character; for example:

**=asterisk


Homographs

Some words, called homographs or homograms, cause maybe the most difficult problems in TTS systems. Homographs are spelled the same way but they differ in meaning and usually in pronunciation (e.g. fair, lives). The word lives is for example pronounced differently in sentences "Three lives were lost" and "One lives to eat". Some words, e.g. lead, has different pronunciations when used as a verb or noun, and between two noun senses (He followed her lead / He covered the hull with lead). With these kind of words some semantical information is necessary to achieve correct pronunciation.

The pronunciation of a certain word may also be different due to contextual effects. This is easy to see when comparing phrases the end and the beginning. The pronunciation of the depends on the initial phoneme in the following word. Compound words are also problematic. For example the characters 'th' in mother and hothouse is pronounced differently. Some sounds may also be either voiced or unvoiced in different context. For example, phoneme /s/ in word dogs is voiced, but unvoiced in word cats.

Heteronyms are a type of homograph. They are words that are spelled the same but differ in meaning and pronunciation. All heteronyms are also homographs, but not all homographs are heteronyms. Many heteronyms are similar in meaning (especially a related noun and verb are spelled the same but pronounced differently), while others are wholly unrelated.

Finding correct pronunciation for proper names, especially when they are borrowed from other languages, is usually one of the most difficult tasks for any TTS system. Some common names, such as Nice and Begin, are ambiguous in capitalized context, including sentence initial position, titles and single text. For example, the sentence Nice is a nice place is very problematic because the word Nice may be pronounced as /niis/ or /nais/. Some names and places have also special pronunciation, such as Leicester and Arkansas. For correct pronunciation, these kinds of words may be included in specific exception dictionaries (files with the extension *.hmg, for example English.hmg).

On each line, the second set of letters contains the phonetic pronunciation replacements for the first set of letters, enumerated via commas. For example:

lead=leed,led

Patterns are case-insensitive. If you want to define a case-sensitive pattern, you must add the symbol "$" at the beginning of the line:

$Nice=Niis,Nais

The program Balabolka allows to add the list of expressions for each homograph (tab "Expressions with Homograph" in the editor of homographs); these expressions will be replaced automatically during the search of homographs (the main menu item "Text | Find Homographs"). For example:

close=close,cloze

too close=close
to close his eyes=cloze

If the expression is case-sensitive, you must add the symbol "$" at the beginning of the text:

$Nice=Niis,Nais

$city Nice=Niis
nice to have=nais

The wildcard character "*" can be used instead of any word or instead of few letters inside a word (at the beginning or at the end of a word):

close=close,cloze

to close * eyes=cloze


Control Tags (SAPI 4)

This section describes the text-to-speech control tags that can be embedded in the source text to improve the prosody of text-to-speech translation:

  • Syntax
  • Conventions
  • Chr
  • Com
  • Ctx (some speech engines may not support this tag)
  • Dem (new for SAPI 4.0 -- some speech engines may not support this tag)
  • Emp (some speech engines may not support this tag)
  • Eng
  • Mrk
  • Pau
  • Pit
  • Pra (new for SAPI 4.0 -- some speech engines may not support this tag)
  • Prn (some speech engines may not support this tag)
  • Pro (some speech engines may not support this tag)
  • Prt (some speech engines may not support this tag)
  • RmS (new for SAPI 4.0 -- some speech engines may not support this tag)
  • RmW (new for SAPI 4.0 -- some speech engines may not support this tag)
  • RPit (new for SAPI 4.0 -- some speech engines may not support this tag)
  • RPrn (new for SAPI 4.0 -- some speech engines may not support this tag)
  • RSpd (new for SAPI 4.0 -- some speech engines may not support this tag)
  • Rst (new for SAPI 4.0)
  • Spd
  • Vce (some speech engines may not support this tag)
  • Vol

A text-to-speech engine can usually translate individual words to speech successfully. However, as soon as the engine speaks a sentence, the perceived quality of its translation decreases because the engine cannot correctly synthesize human prosody -- the inflection, accent, and timing of human speech.

The prosody of translated speech can be improved by using text-to-speech control tags to better simulate human speech.

This section describes control tags that you can use to alter the prosody of text translated into speech. All tags are optional except the bookmark (Mrk) tag, which must be supported.

Syntax

Text-to-speech control tags follow these general rules of syntax:

  • All tags begin and end with a backslash character (\).
  • The backslash character is not allowed within a tag.
  • An odd number of backslash characters in tagged text produce undefined behavior in the engine.
  • Tags are case-insensitive. For example, \vce\ is the same as \VCE\.
  • Tags are white-space -- dependent. For example, \Rst\ is not the same as \ Rst \.

To include a backslash character in tagged text, but outside a tag, use a double backslash (\\).

If the application has the tagged text bit on and wishes to speak a filename, such as "c:\windows\system\test.txt", then it should double up the backslashes (e.g., "c:\\windows\\system\\test.txt").

Samples:

  • code\ ctx="e-mail" \ - Should be parsed as an "e-mail" tag.
  • \ctx="e-mail" - Should be ignored since it's an unclosed tag at the end of a document.
  • \\ctx="e-mail"\\ - Speaks "back-slash c t x equals e-mail back-slash"
  • \\\\\\\\ctx="e-mail"\\\\\\\\ - Speaks "backslash backslash backslash backslash c t x equals e-mail backslash backslash backslash backslash"
  • \ctm="e-mail"\ - Ignored because it's an unknown tag.

When the text-to-speech engine encounters a tag it does not understand, the tag is ignored.

Conventions

This section uses the following typographic conventions.

Example | Description
Chr | Bold type indicates speech-inflection keywords.
string | Italic indicates placeholders for information you supply, such as a character or context string.
[[option]] | Double square brackets indicate items that are optional.
[[option...]] | Three dots (an ellipsis) following an item indicate that more items having the same form may appear.
"C" | Quotation marks are required to delimit strings.

Chr

\Chr=string[[,string...]]\

Sets the character of the voice.

Example: \Chr="Angry"\

Parameter | Description
string | String that specifies the characteristics of the voice.

The default characteristic is "Normal," which produces a normal tone of voice. Although the Chr tag is less specific than setting the inflection, stress, attack, and whispering qualities individually, it is easier to use and allows the engine more flexibility and intelligence in its response.

Several characteristics can be specified in the same tag, separated by commas. Depending on its capabilities, an engine may not support all of the characteristics listed here, or it may support additional characteristics. Some common characteristics are the following:

"Angry"
"Business"
"Calm"
"Depressed"
"Excited"
"Falsetto"
"Happy"
"Loud"
"Monotone"
"Perky"
"Quiet"
"Sarcastic"
"Scared"
"Shout"
"Tense"
"Whisper"

Com

\Com=string\

Embeds a comment in the text. Comments are not translated into speech.

Example: \com="This is a comment."\

Parameter | Description
string | Text of the comment.

Ctx

\Ctx=string\
Note: Some speech engines may not support this tag.

Sets the context for the text that follows, which determines how symbols are spoken.

Example: \ctx="Unknown"\

Parameter | Description
string | String that specifies the context.

This parameter can be one of these strings:

Context string | Description
"Address" | Addresses and/or phone numbers
"C" | Code in the C or C++ programming language
"Document" | Text document
"E-Mail" | Electronic mail
"Numbers" | Numbers, dates, times, and so on
"Spreadsheet" | Spreadsheet document
"Unknown" | Context is unknown (default)
"Normal" | Normal/default speech mode.

Dem

\Dem\
Note: Some speech engines may not support this tag.

De-emphasizes the next word.

Emp

\Emp\
Note: Some speech engines may not support this tag.

Emphasizes the next word to be spoken.

Example: the \Emp\truth, the \Emp\whole truth, and nothing \Emp\but the truth.

Eng

\Eng;GUID:command\
\Eng:command\

Embeds an engine-specific command that affects only the engine with the specified globally unique identifier (GUID). Subsequent engine-specific tags for that engine can omit the GUID until an engine-specific tag for a different engine is used.

Parameter | Description
GUID | Globally unique identifier of the engine.
command | Engine-specific command.

Mrk

\Mrk=number\

Indicates a bookmark in the text.

Example: \Mrk=75000\

Parameter | Description
number | Number of the bookmark.

The Mrk tag accepts a decimal representation. Bookmark number zero (\Mrk=0\) is reserved.

Pau

\Pau=number\

Pauses speech for the specified number of milliseconds.

Example: \Pau=1000\

Parameter | Description
number | Number of milliseconds to pause.

Pit

\Pit=number\

Sets the baseline pitch of the text-to-speech mode to the specified value in hertz.

Example: \Pit=90\

Parameter | Description
number | Pitch, in hertz.

The actual pitch fluctuates above and below this baseline.

Pra

\Pra=value\
Note: Some speech engines may not support this tag.

Sets the pitch range.

Parameter | Description
value | Pitch range in Hz.

Prn

\Prn=text=pronunciation\
Note: Some speech engines may not support this tag.

Indicates how to pronounce text by passing the phonetic equivalent to the engine.

Example: \Prn=tomato=tomaato\

Parameter | Description
text | Text to pronounce.
pronunciation | Phonetic equivalent for pronouncing the text.

Using the Prn tag without specifying the word pronunciation (\Prn=text\) will undo the changes to the pronunciation; that is, it will return the word to the original pronunciation.

This tag is valid only for engines that support the International Phonetic Alphabet. The engine should continue to use this pronunciation for the current text-to-speech mode and should store the pronunciation in its lexicon for later use. If a lexicon entry already exists for a particular word, the Prn tag should be ignored for that word.

Pro

\Pro=number\
Note: Some speech engines may not support this tag.

Activates and deactivates prosodic rules, which affect pitch, speaking rate, and volume of words independently of control tags embedded in the text. Prosodic rules are applied by the engine.

Example: \Pro=0\

Parameter | Description
number | Number that indicates whether to activate or deactivate prosodic rules. Setting number to 1, the default, activates prosodic rules. Setting number to 0 deactivates prosodic rules.

Prt

\Prt=string\
Note: Some speech engines may not support this tag.

Indicates the part of speech of the next word.

Example: \prt="Abbr"\

Parameter | Description
string | String that indicates the part of speech.

This parameter can be one of these strings:

String | Description
"Abbr" | Abbreviation
"Adj" | Adjective
"Adv" | Adverb
"Card" | Cardinal number
"Conj" | Conjunction
"Cont" | Contraction
"Det" | Determiner
"Interj" | Interjection
"N" | Noun
"Ord" | Ordinal number
"Prep" | Preposition
"Pron" | Pronoun
"Prop" | Proper noun
"Punct" | Punctuation
"Quant" | Quantifier
"V" | Verb

RmS

\RmS=number\
Note: Some speech engines may not support this tag.

Sets reading mode to spelling out each letter of each word, or turns it off. Not all engines support this tag, so an application can get more consistent results by normalizing the text itself and putting spaces between letters.

Parameter | Description
number | Number that indicates whether to spell out each letter of each word. Setting number to 1 sets reading mode to spelling out each letter of each word. Setting number to 0, the default, turns it off.

RmW

\RmW=number\
Note: Some speech engines may not support this tag.

Sets reading mode to leaving audible pauses between each word, or turns it off. Not all engines support this tag, so an application can get more consistent results by normalizing the text itself and putting periods between words.

Parameter | Description
number | Number that indicates whether to leave audible pauses between each word. Setting number to 1 sets reading mode to leave audible pauses between each word. Setting number to 0, the default, turns it off.

RPit

\RPit=value\
Note: Some speech engines may not support this tag.

Sets the relative pitch.

Parameter | Description
value | Relative pitch. 100 is the default/original for the voice.

RPrn

\RPrn=value\
Note: Some speech engines may not support this tag.

Set the relative pitch range.

Parameter | Description
value | Relative pitch range. 100 is the default/original for the voice.

RSpd

\RSpd=value\
Note: Some speech engines may not support this tag.

Sets the relative speed. 100 is the default/original for the voice.

Parameter | Description
value | Relative speed. 100 is the default/original for the voice.

Rst

\Rst\

Resets the engine to the default settings for the current mode, as though the mode had just been re-created.

Spd

\Spd=number\

Sets the baseline average talking speed of the text-to-speech mode to the specified number of words per minute.

Example: \Spd=120\

Parameter | Description
number | Baseline average talking speed, in words per minute.

Vce

\Vce=charact=value[[,charact=value]]\
Note: Some speech engines may not support this tag.

Instructs the engine to change its speaking voice to one that has the specified characteristics.

Parameter | Description
charact | One of the characteristics listed in the table below.
value | String that specifies the characteristic.

Characteristics are specified in the order of importance. The engine selects a voice that most closely matches the characteristics specified at the beginning of the list.

The charact=value argument can be any of the following:

  • Language=language. Requests the engine speak in the specified language
  • Accent=accent. Requests the engine speak in the specified accent. For example, if language="English" and Accent="French" the engine will speak English with a French accent.
  • Dialect=dialect. Requests the engine speak in the specified dialect
  • Gender=gender. Specifies the gender of the voice: "Male", "Female", or "Neutral".
  • Speaker=speakername. Specifies the name of the voice, or NULL if the name is unimportant
  • Age=age. Specifies the age of the voice, which can be one of the values shown below
  • Style=style. The personality of the voice -- for example: "Business", "Casual", "Computer", "Excited", or "Singsong".
Age string | Description
"Baby" | About 1 year old
"Toddler" | About 3 years old
"Child" | About 6 years old
"Adolescent" | About 14 years old
"Adult" | Between 20 and 60 years old
"Elderly" | Over 60 years old

Vol

\Vol=number\

Sets the baseline speaking volume for the text-to-speech mode.

Example: \Vol=32768\

Parameter | Description
number | Baseline speaking volume.

The volume level is a linear range from 0 for absolute silence to 65535 for the maximum monaural volume. The default is 65535.

If you specify a value greater than 65535, the engine assumes that you want to set the left and right channels separately and converts the value to a double word, using the low word for the left channel and the high word for the right channel. For example, a value of 65536 sets the left channel to the maximum baseline speaking volume and the right channel to the minimum.


XML Tags (SAPI 5)

SAPI 5 synthesis markup is the collection of extensible markup language (XML) tags inserted into text to modify the speech synthesis of that text. These XML tags, which provide functionality such as volume control and word emphasis, are inserted into text. By default, the SAPI XML parser auto-detects XML. In the case of an invalid XML structure, a speak error may be returned by the program.

Every XML element consists of a start tag <Some_tag> and an end tag </Some_tag> with a case-insensitive tag name and contents between these tags. If the element is empty, it has no contents <Some_tag></Some_tag> and the start tag and the end tag might be the same <Some_tag/>.

All XML elements must be properly nested within each other.

INCORRECT:

<tag1><tag2> text </tag1></tag2>

CORRECT:

<tag1><tag2> text </tag2></tag1>

Since the <tag2> element is opened inside the <tag1> element, it must be closed inside the <tag1> element.

Use the main menu item "Text | Insert XML Tag" to add tags to the selected text. A start tag will be inserted at the beginning of the selected text, an end tag - at the end of text.

SAPI text-to-speech (TTS) XML tags fall into several categories.

  • Voice state control
  • Direct item insertion
  • Voice context control
  • Voice selection
  • Custom Pronunciation

Voice state control tags

SAPI TTS XML supports five tags that control the state of the current voice: Volume, Rate, Pitch, Emph, and Spell.

Volume

The Volume tag controls the volume of a voice. The tag can be empty, in which case it applies to all subsequent text, or it can have content, in which case it only applies to that content.

The Volume tag has one required attribute: Level. The value of this attribute should be an integer between zero and one hundred. Values outside of this range will be truncated.

<volume level="50"> This text should be spoken at volume level fifty. <volume level="100"> This text should be spoken at volume level one hundred. </volume> </volume>
<volume level="80"/> All text which follows should be spoken at volume level eighty.

One hundred represents the default volume of a voice. Lower values represent percentages of this default. That is, 50 corresponds to 50% of full volume.

Rate

The Rate tag controls the rate of a voice. The tag can be empty, in which case it applies to all subsequent text, or it can have content, in which case it only applies to that content.

The Rate tag has two attributes, Speed and AbsSpeed, one of which must be present. The value of both of these attributes should be an integer between negative ten and ten. Values outside of this range may be truncated by the engine (but are not truncated by SAPI). The AbsSpeed attribute controls the absolute rate of the voice, so a value of ten always corresponds to a value of ten, a value of five always corresponds to a value of five.

<rate absspeed="5">This text should be spoken at rate five. <rate absspeed="-5"> This text should be spoken at rate negative five. </rate> </rate>
<rate absspeed="10"/> All text which follows should be spoken at rate ten.

The Speed attribute controls the relative rate of the voice. The absolute value is found by adding each Speed to the current absolute value.

<rate speed="5"> This text should be spoken at rate five. <rate speed="-5"> This text should be spoken at rate zero. </rate> </rate>

Zero represents the default rate of a voice, with positive values being faster and negative values being slower.

Pitch

The Pitch tag controls the pitch of a voice. The tag can be empty, in which case it applies to all subsequent text, or it can have content, in which case it only applies to that content.

The Pitch tag has two attributes, Middle and AbsMiddle, one of which must be present. The value of both of these attributes should be an integer between negative ten and ten. Values outside of this range may be truncated by the engine (but are not truncated by SAPI).

The AbsMiddle attribute controls the absolute pitch of the voice, so a value of ten always corresponds to a value of ten, a value of five always corresponds to a value of five.

<pitch absmiddle="5"> This text should be spoken at pitch five. <pitch absmiddle="-5"> This text should be spoken at pitch negative five. </pitch> </pitch>
<pitch absmiddle="10"/> All text which follows should be spoken at pitch ten.

The Middle attribute controls the relative pitch of the voice. The absolute value is found by adding each Middle to the current absolute value.

<pitch middle="5">This text should be spoken at pitch five. <pitch middle="-5">This text should be spoken at pitch zero.</pitch> </pitch>

Zero represents the default middle pitch for a voice, with positive values being higher and negative values being lower.

Emph

The Emph tag instructs the voice to emphasize a word or section of text. The Emph tag cannot be empty. The following word should be emphasized.

<emph> boo </emph>!

The method of emphasis may vary from voice to voice.

Spell

The Spell tag forces the voice to spell out all text, rather than using its default word and sentence breaking rules, normalization rules, and so forth. All characters should be expanded to corresponding words (including punctuation, numbers, and so forth). The Spell tag cannot be empty.

<spell> These words should be spelled out. </spell>
These words should not be spelled out.

Direct item insertion tags

Three tags are supported that applications the ability to insert items directly at some level: Silence, Pron, and Bookmark.

Silence

The Silence tag inserts a specified number of milliseconds of silence into the output audio stream. This tag must be empty, and must have one attribute, Msec.

Five hundred milliseconds of silence <silence msec="500"/> just occurred.

Pron

The Pron tag inserts a specified pronunciation. The voice will process the sequence of phonemes exactly as they are specified. This tag can be empty, or it can have content. If it does have content, it will be interpreted as providing the pronunciation for the enclosed text. That is, the enclosed text will not be processed as it normally would be.

The Pron tag has one attribute, Sym, whose value is a string of white space separated phonemes.

<pron sym="h eh l l ow & w er l l d "/>
<pron sym="h eh l l ow & w er l l d"> hello world </pron>

The using of phonems is described here.

Bookmark

The Bookmark tag inserts a bookmark event into the output audio stream. Use this event to signal the application when the audio corresponding to the text at the Bookmark tag has been reached. The Bookmark tag must be empty.

The Bookmark tag has one attribute, Mark, whose value is a string. This value can then be used to differentiate between bookmark events (each of which will contain the string value from their corresponding tag).

The application will receive an event here,

<bookmark mark="bookmark_one"/>

and another one here

<bookmark mark="bookmark_two"/>

Voice context control tags

Two tags provide context to the current voice: PartOfSp and Context. Those tags enable the voice to determine how to deal with the text it is processing. With both of these tags, the extent to which voices use the context may vary.

PartOfSp

The PartOfSp tag provides the voice with the part of speech of the enclosed word(s). Use this tag to enable the voice to pronounce a word with multiple pronunciations correctly depending on its part of speech. The PartOfSp tag cannot be empty.

The PartOfSp tag has one attribute, Part, which takes a string corresponding to a SAPI part of speech as its attribute. Only SAPI defined parts of speech are supported: "Unknown", "Noun", "Verb", "Modifier", "Function", "Interjection".

<partofsp part="noun"> A </partofsp> is the first letter of the alphabet.

Did you <partofsp part="verb"> record </partofsp> that <partofsp part="noun"> record </partofsp>?

Context

The Context tag provides the voice with information which the voice may then use to determine how to normalize special items, like dates, numbers, and currency. Use this tag to enable the voice to distinguish between confusable date formats (see the example, below). The Context tag cannot be empty.

The Context tag has one attribute, Id, which takes a string corresponding to the context of the enclosed text. Several contexts are defined by SAPI and are more likely to be recognized by SAPI compliant voices, but any string may be used. See documentation for a particular voice for more details.

<context id="date_mdy"> 03/04/01 </context> should be March fourth, two thousand one.
<context id="date_dmy"> 03/04/01 </context> should be April third, two thousand one.
<context id="date_ymd"> 03/04/01 </context> should be April first, two thousand three.

The predefined context types are described here.

Voice Selection Tags

There are two tags which can be used (potentially) to change the current voice: Voice and Lang.

Voice

The Voice tag selects a voice based on its attributes, Age, Gender, Language, Name, Vendor, and VendorPreferred. The tag can be empty, in which case it changes the voice for all subsequent text, or it can have content, in which case it only changes the voice for that content.

The Voice tag has two attributes: Required and Optional. The attributes of the current voice are always added as optional attributes when the Voice tag is used. This means that, a voice which is more similar to the current voice will be selected over one which is less similar.

If no voice is found that matches all of the required attributes, no voice change will occur.

The default voice should speak this sentence. <voice required="Gender=Female;Age!=Child"> A female non-child should speak this sentence, if one exists. <voice required="Age=Teen"> A teen should speak this sentence - if a female, non-child teen is present, she will be selected over a male teen, for example. </voice> </voice>

Lang

The Lang tag selects a voice based solely on its Language attribute. The tag can be empty, in which case it changes the voice for all subsequent text; or it can have content, in which case it only changes the voice for that content.

The Lang tag has one attribute, LangId. This attribute should be a LANGID, such as 409 (U.S. English) or 411 (Japanese). Note that these numbers are hexadecimal, but without the typical "0x".

The Lang tag is a shortened version of the Voice tag with the Required attribute containing "Language=xxx". So the following examples should produce exactly the same results:

<voice required="Language=409"> A U.S. English voice should speak this. </voice>
<lang langid="409"> A U.S. English voice should speak this. </lang>

Custom Pronunciation

An alternative to using the <P> tag with the DISP and PRON attributes is to use custom pronunciation. Using custom pronunciation, tags in the form of the following.

<p disp="disp" pron="pron">word</p>

can be written as

<p>/disp/word/pron;</p>

More specifically, if you want to recognize the word hello only when it is pronounced as ah and display greeting when recognized, you would normally use something like the following.

<p disp="greeting" pron="ah">hello</p>

Using custom pronunciation, the above would translate to the following.

<p>/greeting/hello/ah;</p>


Context Tag Definitions (SAPI 5)

The XML CONTEXT tag specifies the normalization of a block of text. This specification defines the SAPI predefined attributes (ID) for the CONTEXT tag. These IDs are strings. SAPI does not perform any parameter validation on the string passed to the engine, hence, the application can specify engine-specific normalization IDs to the engine. Engine-specific strings begin with the engine vendor's name to avoid confusion between engines.

For example:

<context id="My_Context"> text </context>

The exact implementation of some of these values is dependent on the engine used in SAPI 5. In order to force a certain normalization, application developers can choose to normalize the text, or use another SAPI tag or engine-specific ID. Each context tag can contain more than one string.

For example:

<context id="date_mdy"> 12/21/99 11/21/99 10/21/99 </context>

would be normalized to "December twenty first nineteen ninety nine November twenty first nineteen ninety nine October twenty first nineteen ninety nine."

The following predefined context types are supported:

  • Date
  • Time
  • Number
  • Web
  • E-mail
  • Address

Date

This context specifies that the number passed to the engine is a date. Dates will generally have the format of number [delimiter] number [delimiter] number or number [delimiter] number where the delimiter can be a '.', '/' or '-', and numbers are typically between 01 and 12 for months, 01 and 31 for days. A year is generally a two or four-digit number.

The following are valid string types:

date_mdy

This will normalize the date so that the first group of numbers is the month, the second group is the day, and the third group is the year. In the case where the year is a two-digit number, the engine reads it as a two-digit number or a four-digit number.

For example:

<context id="date_mdy">12/21/99</context>

will be normalized to "December twenty first ninety nine"
or "December twenty first nineteen ninety nine"

<context id="date_mdy">12/21/1999</context>

will be normalized to "December twenty first nineteen ninety nine"

date_dmy

This will normalize the date so that the first group of numbers is the day, the second group is the month, and the third group is the year. In the case where the year is a two-digit number, the engine reads it as a two-digit number. If the year is represented as a four-digit number, it is represented as a four-digit year.

For example:

<context id="date_dmy">21.12.99</context>

will be normalized to "December twenty first ninety nine"
or "December twenty first nineteen ninety nine"

<context id="date_dmy">21-12-1999</context>

will be normalized to "December twenty first nineteen ninety nine"

date_ymd

This will normalize the date so that the first group of numbers is the year, the second group is the month, and the third group is the day. In the case where the year is a two-digit number, the engine reads it as a two-digit number. If the year is represented as a four-digit number, it is represented as a four-digit year.

For example:

<context id="date_ymd">99-12-21</context>

will be normalized to "December twenty first ninety nine"
or "December twenty first nineteen ninety nine"

<context id="date_ymd">1999.12.21</context>

will be normalized to "December twenty first nineteen ninety nine"

date_ym

This will normalize the date so that the first group of numbers is the year, and the second group is the month. In the case where the year is a two-digit number, the engine reads it as a two-digit number. If the year is represented as a four-digit number, it is represented as a four-digit year.

For example:

<context id="date_ym">99-12</context>

will be normalized to "December ninety nine"
or "December nineteen ninety nine"

<context id="date_ym">1999.12</context>

will be normalized to "December nineteen ninety nine"

date_my

This will normalize the date so that the first group of numbers is the month, and the second group is the year. In the case where the year is a two-digit number, the engine reads it as a two-digit number. If the year is represented as a four-digit number, it is represented as a four-digit year.

For example:

<context id="date_my">12/99</context>

will be normalized to "December ninety nine"
or "December nineteen ninety nine"

<context id="date_my">12/1999</context>

will be normalized to "December nineteen ninety nine"

date_dm

This will normalize the date so that the first group of numbers is the day and the second group is the month.

For example:

<context id="date_dm">21.12</context>

will be normalized to "December twenty first"

date_md

This will normalize the date so that the first group of numbers is the month and the second group is the day.

For example:

<context id="date_md">12/21</context>

will be normalized to "December twenty first"

date_year

This will normalize the date so that the number is read as a year.

For example:

<context id="date_year">1999</context>

will be normalized to "nineteen ninety nine"

<context id="date_year">2001</context>

will be normalized to "Two thousand one"

chs_date_ymdhm

The text specifying the date is normalized so that the first group of numbers is the year, the second group is the month, the third group is the day, the fourth group is the hour and the fifth group is the minute. In the case where the year is a two-digit number, the engine reads it as a two-digit number. If the year is represented as a four-digit number, it is represented as a four-digit year. The text format for time needs to specify the hour as a number between 00 and 23 (in case of with PM/AM before, between 01 and 12), and the minute as a number between 01 and 59.

This is a Chinese specific context tag.

Time

This context specifies that the number passed to the engine is a time. Times will generally have the format of number [delimiter] number [delimiter] number or number [delimiter] number where the delimiter is ':' or ' ' ' or ' " ' and numbers are typically between 01 and 24 for hours, 01 and 59 for minutes and seconds.

When a zero is present in numbers between 01 and 09, the engine can ignore this, or normalize it as "oh". The engine can place an "and" in the normalized time.

time

For example:

<context id="time">12:30</context>

will be normalized to "twelve thirty"

<context id="time">01:21</context>

is normalized as "one twenty one"
or "oh one twenty one"

<context id="time">1'21"</context>

is normalized as "one minute twenty one seconds"
or "one minute and twenty one seconds"

chs_time_hms

The text specifying the time is normalized so that the first group of numbers is the hour, the second group is the minute and the third group is the second.

This is a Chinese engine specific context tag.

chs_time_hm

The text specifying the time is normalized so that the first group of numbers is the hour and the second group is the minute.

This is a Chinese engine specific context tag.

Number

number_cardinal

The text is normalized as a number using the regular format of ones, tens, etc. The engine can place "and" in the normalized text.

For example:

<context id="number_cardinal">3432</context>

will be normalized to "three thousand four hundred thirty two"

<context id="number_cardinal">3432</context>

will be normalized to "three thousand four hundred and thirty two"

number_digit

The text is normalized digit by digit.

For example:

<context id="number_digit">3432</context>

will be normalized to "three four three two"

number_fraction

The text is normalized as a fraction.

For example:

<context id="number_fraction">3/15</context>

will be normalized to "three fifteenths" or "three over fifteen"

number_decimal

The text is normalized as a decimal value.

For example:

<context id="number_decimal">423.1243</context>

will be normalized to "four hundred and twenty three point one two four three"

phone_number

The text is normalized as a phone number. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

currency

The text is normalized as a currency. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

For example:

<context id="currency">$34.90</context>

will be normalized to "thirty four dollars and ninety cents"

chs_number_percentage

The text is normalized as a percentage value.

This is a Chinese engine specific context tag.

chs_number_scientific

The text is normalized as a scientific value.

This is a Chinese engine specific context tag.

chs_phone_postal

The phone number and address postal is almost the same as that of number_cardinal; the only difference is that "1" is read as "yao1".

This is a Chinese engine specific context tag.

Web

The text is normalized as a URL. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

web_url

For example:

<context id="web_url">www.Microsoft.com</context>

will be normalized to "w w w dot Microsoft dot com"

E-mail

The text is normalized as e-mail. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

e-mail_address

The text is normalized as an e-mail address. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

For example:

<context id="e-mail_address">someone@microsoft.com</context>

will be normalized to "Someone at Microsoft dot com"

Address

The text is normalized as an address. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

address

For example:

<context id="address">One Microsoft Way, Redmond, WA, 98052</context>

will be normalized to "One Microsoft Way Redmond Washington nine eight zero five two"

address_postal

The text is normalized as a postal address. The exact implementation of this is left to the engine developer and may be defined in a future release of SAPI.

For example:

<context id="address_postal">A2C 4X5</context>

will be normalized to "A 2 C 4 X 5"


Universal Tags

It is recommended to use the control tags for SAPI 4 and the XML tags for SAPI 5 and Microsoft Speech Platform. But in addition Balabolka supports its own universal tags to modify the speech synthesis.

Audio

The program allows to insert links to external audio files (audio clips) into text of documents. Use the main menu item "Text | Audio Clip" to choose an audio file name. Supported formats: WAV, MP3, OGG.

An audio clip tag will look like:

{{Audio=C:\Sounds\ring.wav}}

Also a relative path to audio clips is allowed. A relative path is the location of a file in relation to the current document:

{{Audio=..\My Sounds\ring.mp3}}

When speaking text aloud, Balabolka will pause when the audio clip tag is reached, play the audio clip and resume speaking. When converting to audio files, the audio clip will be embedded in the audio file created by the program.

Voice

If it is necessary to change a voice or its properties during reading aloud, a special tag can be used for SAPI 5 and Microsoft Speech Platform (SAPI 4 voices will ignore this tag).

The tag format:

{{Voice=Name;Rate;Pitch;Volume}}

  • Name - the name of a voice (one word or the part of a word is enough);
  • Rate - the rate of a voice (values range from -10 to 10);
  • Pitch - the pitch of a voice (values range from -10 to 10);
  • Volume - the volume (values range from 0 to 100).

A tag applies to all subsequent text. The values are separated by semicolons. For example:

This text will be spoken by the default voice of Balabolka. {{Voice=Kimberly;0;0;100}} The voice 'Kimberly' will read the other text.

The tag's content is case insensitive. Values for some properties can be omitted:

{{voice=eric;;;50}}

{{Voice=Hans;-1}}

{{Voice=Rachel}}

To return to the default voice, use this tag:

{{Voice=}}

Warning! It is impossible to switch between SAPI 5 voices and voices of the Microsoft Speech Platform.

Pause

A specified number of milliseconds of silence can be inserted into the output audio file. For example:

One hundred twenty milliseconds of silence {{Pause=120}} just occurred.


Phonetic Alphabets

A phonetic alphabet contains combinations of letters, numbers, and characters which are known as "phones". A phone represents a discrete sound in a spoken language. Phones are used to create phonetic spellings that determine how a word should be pronounced to be spoken. Speech engines support three phonetic alphabets:

  • International Phonetic Alphabet (IPA)
  • Speech API (SAPI) Phone Set
  • Universal Phone Set (UPS)

International Phonetic Alphabet is a system of phonetic notation based primarily on the Latin alphabet, devised as a standardized representation of the sounds of spoken language. You can use this phonetic alphabet to specify pronunciations for any language.

The first languages created by Microsoft for text-to-speech on computers specified pronunciations of words using the SAPI Phone Set. A phone consists of one or more characters from a phonetic alphabet that describe a discreet sound in a spoken language. The following languages use the SAPI Phone Set to describe the sounds of each language: Chinese, English, French, German, Japanese, Spanish.

More recently, Microsoft developed the Universal Phone Set, a machine-readable phonetic alphabet that is based on the International Phonetic Alphabet. UPS is a more powerful phonetic alphabet than the SAPI Phone Set, can be used to describe the sounds of any new language, and is easier to map to other machine-readable phonetic alphabets such as X-SAMPA, SAMPA or ASCII-IPA.

The user creates the pronunciation using the XML PRON tag. For example, here are two phonetic spellings that a speech engine can use to speak the word "hello" in US English:

<pron sym="h eh - l ow 1"/>

<pron sym="H EH S1 L O"/>

The first example uses phones from the SAPI phone set. The "1" is a stress symbol that indicates which syllable should be accented. The phones are space-delimited, and the "-" separates the syllables in the word. The second example uses phones from the Universal Phone Set. Letters indicate spoken segments that make up a word. The "S1" is a stress symbol that indicates which syllable should be accented.

The current versions of IVONA voices do not support SAPI phonemes. The PRON tag is ignored. It is recommended to use the Speech Synthesis Markup Language (SSML) tag to provide a phonetic pronunciation for the specific text.

<phoneme alphabet="ipa" ph="təˈmeɪtoʊ">tomato</phoneme>

The PHONEME tag can be shortened:

<phoneme alphabet="ipa" ph="pəˈteɪtoʊ"/>

The SSML tag supports phonetic alphabets:

  • International Phonetic Alphabet (IPA)
  • Extended Speech Assessment Methods Phonetic Alphabet (X-SAMPA)

IPA symbols are difficult to enter from the keyboard. Balabolka allows to choose characters from the list of IPA symbols. Also the application can convert words to IPA symbols. The phonetic transcriptions are supported for languages:

  • English
  • French
  • German
  • Italian
  • Polish
  • Portuguese
  • Russian
  • Spanish
  • Turkish
  • Ukrainian

Text should be written in lower case; the capital vowels can be used to indicate a primary stress in words.


SAPI Phone Set

Microsoft Speech API uses a phonetic alphabet to express speech in phonemes. A phonetic alphabet defines all the phonemes which are used by a language, together with their properties and the data for their production as sounds. Users can create pronunciations for words that are not currently in the lexicon by using the phonemes represented in the following tables. The phoneme set is composed of a symbolic phonetic representation (SYM).

The user will be able to enter the SYM representation to create the pronunciation using the XML PRON tag. Each phoneme entry should be space delimited.

Example. Pronunciation for "hello":

<pron sym="h eh l ow"/>

For improved accuracy, the primary (1), secondary (2) stress markers, and the syllabic markers (-) can be added to the pronunciation.

Example. Pronunciation for "hello" using the primary stress (1) and the syllabic marker (-):

<pron sym="h eh - l ow 1"/>

SAPI Phone Set used for the following languages:

  • English (United States)
  • French
  • German
  • Italian
  • Spanish
  • Chinese
  • Japanese

US English Phonemes

Phoneme Symbol | Example | Transcription
1 | Primary stress |
2 | Secondary stress |
- | Syllable boundary (hyphen) |
& | Word boundary |
! | Sentence terminator (exclamation mark) |
, | Sentence terminator (comma) |
. | Sentence terminator (period) |
? | Sentence terminator (question mark) |
_ | Silence (underscore) |
aa | father | f aa 1 dh er
ae | cat | k ae 1 t
ah | but | b ah 1 t
ao | bought | b ao 1 t
aw | house | h aw 1 s
ax | about | ax b aw 1 t
ay | bite | b ay 1 t
b | book | b uh 1 k
ch | catch | k eh 1 ch
d | done | d ah 1 n
dh | breathe | b r i dh
eh | bet | b eh 1 t
er | bird | b er 1 d
ey | ate | ey 1 t
e@ | fairly | f e@ 1 l i
f | fog | f ao 1 g
g | good | g uh 1 d
h | hello | h eh l ow 1
ih | bit | b ih 1 t
iy | beat | b iy 1 t
i@ | here | h i@ 1
jh | jump | jh ah 1 mp
k | cat | k ae 1 t
l | lot | l aa 1 t
m | Mom | m aa 1 m
n | nod | n aa 1 d
ng | sing | s ih 1 ng
ow | boat | b ow 1 t
oy | boy | b oy 1
p | pot | p aa 1 t
r | rat | r ae 1 t
s | sit | s ih 1 t
sh | shut | sh ah 1 t
t | top | t aa 1 p
th | thick | th ih 1 k
uh | book | b uh 1 k
uw | boot | b uw 1 t
v | various | v eh 1 r i ih s
w | won | w ah 1 n
y | you | y uw 1
z | zoo | z uw 1
zh | casual | k ae 1 zh uw ah l

French Phonemes

Phoneme Symbol | Example | Transcription
1 | Primary stress |
2 | Secondary stress |
- | Syllable boundary (hyphen) |
& | Word boundary |
! | Sentence terminator (exclamation mark) |
, | Sentence terminator (comma) |
. | Sentence terminator (period) |
? | Sentence terminator (question mark) |
_ | Silence (underscore) |
a | patte | p a 1 t
aan | abandon | a b aan d aon 1
ao | comme | k ao 1 m
aon | bon | b aon 1
ax | le | l ax 1
b | bouche | b u 1 sh
ch | charlie | ch a 1 r l i
d | dame | d a 1 m
dz | jeudi | j oe dz i 1
e | marché | m a r sh e 1
eh | chère | sh eh 1 r
ehn | main | m ehn 1
eo | feu | f eo 1
f | fille | f i 1 j
g | garde | g a 1 r d
i | libre | l i 1 b r
j | pierre | p j e 1 r
jh | George | jh ao 1 r jh
k | chique | sh i k
l | langage | l aan g a 1 zh
m | mois | m w a 1
n | nonne | n ao 1 n
ng | shopping | sh ao p i 1 ng
nj | campagne | k aan p a 1 nj
o | animaux | a n i m o 1
oe | leur | l oe 1 r
oen | parfum | p a r f oen 1
p | pile | p i 1 l
q | hacher | q a sh e 1
r | route | r u t
s | adresser | a d r e s e 1
sh | chaise | sh eh 1 z
t | technique | t eh k n i 1 k
ts | énergétique | e n eh r zh e ts i 1 k
u | doux | d u 1
ue | une | ue 1 n
uh | Bush | b uh 1 sh
v | vive | v i 1 v
w | boire | b w a 1 r
yw | huile | yw i 1 l
z | zone | z ao 1 n
zh | juste | zh ue 1 s t

German Phonemes

Phoneme Symbol | Example | Transcription
1 | Primary stress |
2 | Secondary stress |
- | Syllable boundary (hyphen) |
& | Word boundary |
! | Sentence terminator (exclamation mark) |
, | Sentence terminator (comma) |
. | Sentence terminator (period) |
? | Sentence terminator (question mark) |
_ | Silence (underscore) |
a | Achtung | q a 1 x t uh ng
A | Name | n A 1 m ah
aan | Chance | sh aan 1 s ah
ah | bitte | b ih 1 t ah
ao | Hoffnung | h ao 1 f n uh ng
aon | Pompon | p aon 1 p aon 1
aw | Raum | rq aw 1 m
ay | Zeit | ts ay 1 t
b | besonders | b ah z ao 1 n d e@ s
c | China | c i 1 n A
ch | deutsch | d oy 1 ch
d | das | d a 1 s
e | mehr | m e 1 r
eh | Enkel | q eh 1 ng k el
EH | erklären | q eh r k l EH 1 rq en
ehn | Bassin | b a s ehn 1
el | Einzelnen | q ay 1 n ts el n en
em | einem | q ay 1 n em
en | einen | q ay 1 n en
er | Surfer | s er 1 f e@
ey | Display | d ih s p l ey 1
e@ | Kindern | k ih 1 n d e@ n
f | Fall | f a 1 l
g | glaube | g l aw 1 b ah
h | Haupt | h aw 1 p t
i | sieben | z i 1 b en
ih | immer | q ih 1 m e@
j | ja | j A 1
jh | Dschungel | jh uh 1 ng el
k | Kultur | k uh l t u 1 r
l | lieber | l i 1 b e@
m | mein | m ay 1 n
n | Name | n A 1 m ah
ng | Junge | j uh 1 ng ah
o | oder | q o 1 d e@
oe | öffnete | q oe 1 f n ah t ah
OE | Österreich | q OE 1 s t ah rq ay c
oen | Parfum | p a r f oen 1
oy | Europa | q oy rq o 1 p A
p | Parlament | p a r l a m eh 1 n t
pf | Pflicht | pf l ih 1 c t
q | aber | q A 1 b e@
r | Berliner | b eh r l i 1 n e@
rq | Runde | rq uh 1 n d ah
s | Szene | s ts e 1 n ah
sh | sprach | sh p rq A 1 x
t | tol | t ao 1 l
ts | Zimmer | ts ih 1 m e@
u | Uhren | q u 1 rq en
ue | hübsch | h ue 1 p sh
UE | über | q UE 1 b e@
uh | Schutz | sh uh 1 ts
v | wichtig | v ih 1 c t ih c
w | Mademoiselle | m a d ah m w a z eh 1 l
x | Buch | b u 1 x
z | selbst | z eh 1 l p s t
zh | Spionage | sh p i o n A 1 zh ah

Italian Phonemes

Phoneme Symbol | Example | Transcription
1 | Primary stress |
2 | Secondary stress |
- | Syllable boundary (hyphen) |
& | Word boundary |
! | Sentence terminator (exclamation mark) |
, | Sentence terminator (comma) |
. | Sentence terminator (period) |
? | Sentence terminator (question mark) |
_ | Silence (underscore) |
a | campo | k a 1 m p o
ao | nove | n ao 1 v e
b | barra | b a 1 rr a
ch | percento | p e r ch eh 1 n t o
d | mondo | m o 1 n d o
dz | zeta | dz eh 1 t a
e | venire | v e n i 1 r e
eh | lento | l eh 1 n t o
f | fine | f i 1 n e
g | gruppi | g r u 1 p i
i | si | s i
j | funzione | f u n ts j o 1 n e
jh | generazione | jh e n e r a ts j o 1 n e
k | economia | e k o n o m i 1 a
l | libri | l i 1 b r i
ll | gli | ll i
m | mai | m a 1 i
n | nord | n ao r d
nj | signor | s i 1 nj ao r
o | otto | ao 1 t t o
p | primo | p r i 1 m o
r | arrivederci | a rr i v e d e 1 r ch i
rr | arrivederci | a rr i v e d e 1 r ch i
s | sinistra | s i n i 1 s t r a
sh | scienza | sh eh 1 n ts a
t | tre | t r eh
ts | grazie | g r a 1 ts j e
u | punto | p u 1 n t o
v | venti | v e 1 n t i
w | Washington | w a 1 sh i ng t o n
z | svolta | z v o 1 l t a

Spanish Phonemes

Phoneme Symbol | Example | Transcription
1 | Primary stress |
2 | Secondary stress |
- | Syllable boundary (hyphen) |
& | Word boundary |
! | Sentence terminator (exclamation mark) |
, | Sentence terminator (comma) |
. | Sentence terminator (period) |
? | Sentence terminator (question mark) |
_ | Silence (underscore) |
a | aquí | a k i 1
b | Brasil | b r a s i 1 l
ch | Chile | ch i 1 l e
d | grande | g r a 1 n d e
e | este | e 1 s t e
f | función | f u n s xi o 1 n
g | segundo | s e g u 1 n d o
i | identidad | i d e n t i d a 1 d
j | yo | j o 1
k | casa | k a 1 s a
l | los | l o 1 s
ll | llamada | ll a m a 1 d a
m | manos | m a 1 n o s
n | no | n o 1
nj | año | a 1 nj o
o | bueno | b xu e 1 n o
p | para | p a 1 r a
r | para | p a 1 r a
rr | radio | rr a 1 d xi o
s | solo | s o 1 l o
sh | Bush | b u 1 sh
t | importante | i m p o r t a 1 n t e
u | uno | u 1 n o
w | Hollywood | o 1 l i w u d
x | general | x e n e r a 1 l
xi | iogur | xi o g u 1 r
xu | puedo | p xu e 1 d o

Chinese Phonemes

Phoneme Symbol | Example
- | Syllable boundary (hyphen)
! | Sentence terminator (exclamation mark)
& | Word boundary
, | Sentence terminator (comma)
. | Sentence terminator (period)
? | Sentence terminator (question mark)
_ | Silence (underscore)
+ | Primary stress
* | Secondary stress
1 | Tone 1
2 | Tone 2
3 | Tone 3
4 | Tone 4
5 | Tone 5
a | a 1 fei 1 (rogue)
ai | ai 4 ren 2 (lover)
an | an 1 quan 2 (safe)
ang | ang 1 zang 1 (dirty)
ao | jiao 1 ao 4 (proud)
ba | ba 4 ba 5 (dad)
bai | bai 2 se 4 (white)
ban | mu 4 ban 3 (board)
bang | bang 3 jia 4 (kidnap)
bao | yong 1 bao 4 (embrace)
bei | bei 3 fang 1 (north)
ben | ben 4 dan 4 (fool)
beng | beng 4 tiao 4 (jump)
bi | bi 2 zi 5 (nose)
bian | bian 4 hua 5 (change)
biao | biao 3 ge 2 (table)
bie | li 2 bie 2 (part with)
bin | bin 1 ke 4 (guest)
bing | shi 4 bing 1 (soldier)
bo | bo 2 dou 4 (wrestle)
bu | bu 4 xing 2 (walk)
ca | ca 1 gan 1 (wipe)
cai | cai 1 ce 4 (guess)
can | can 1 jia 1 (join)
cang | cang 1 ying 5 (fly)
cao | cao 1 chang 3 (playground)
ce | ce 4 liang 2 (measure)
cen | cen 1 ci 1 (uneven)
ceng | ceng 2 jing 1 (once)
cha | jian 3 cha 2 (check)
chai | chai 1 hui 3 (demolish)
chan | chan 3 ye 4 (industry)
chang | jing 1 chang 2 (often)
chao | chao 1 yue 4 (exceed)
che | qi 4 che 1 (automobile)
chen | chen 2 jiu 4 (old)
cheng | cheng 2 che 1 (ride)
chi | chi 2 dao 4 (late for)
chong | chong 1 man 3 (full of)
chou | chou 2 hen 4 (hatred)
chu | chu 2 fa 3 (division)
chuai | chuai 3 ce 4 (guess)
chuan | lun 2 chuan 2 (ship)
chuang | chuang 4 ye 4 (carve out)
chui | tie 3 chui 2 (hammer)
chun | chun 1 tian 1 (spring)
chuo | wo 4 chuo 4 (dirty)
ci | ci 2 qi 4 (porcelain)
cong | cong 2 lin 2 (thicket)
cou | jin 3 cou 4 (compact)
cu | cu 4 xiao 1 (sales promotion)
cuan | tao 2 cuan 4 (run away)
cui | cui 1 cu 4 (press)
cun | xiang 1 cun 1 (country)
cuo | cuo 4 wu 4 (error)
da | da 4 (big)
dai | dai 4 biao 3 (delegate)
dan | dan 4 shi 4 (but)
dang | dang 1 ran 2 (sure)
dao | dao 1 (knife)
de | de 5 (function word)
dei | dei 3 (must)
den | den 4 (yank)
deng | ban 3 deng 4 (wooden stool)
di | di 2 que 4 (certainly)
dia | dia 3 (coquetry voice)
dian | dian 3 (dot)
diao | diao 4 (hang)
die | die 1 dao 3 (tumble)
ding | jue 2 ding 4 (decide)
diu | diu 1 qi 4 (discard)
dong | dong 1 fang 1 (east)
dou | zhan 4 dou 4 (struggle)
du | du 4 jue 2 (stop)
duan | duan 3 (short)
dui | dui 4 (right)
dun | ting 2 dun 4 (halt)
duo | duo 1 yu 2 (unnecessary)
e | e 4 (hungry)
ei | ei 4 (yes)
en | en 1 hui 4 (favor)
er | er 3 (ear)
fa | fa 1 zhan 3 (development)
fan | fan 4 (rice)
fang | fang 2 jian 1 (room)
fei | fei 1 (fly)
fen | fen 1 bie 2 (separate)
feng | feng 1 (wind)
fo | fo 2 (buddha)
fou | fou 3 ding 4 (denial)
fu | fu 4 qin 1 (father)
ga | gan 1 ga 4 (awkward)
gai | ying 1 gai 1 (should)
gan | gan 1 jing 4 (neatness)
gang | gang 1 cai 2 (just)
gao | gao 1 (tall)
ge | pin 3 ge 2 (character)
gei | gei 3 yu 3 (give)
gen | gen 1 (root)
geng | geng 4 jia 1 (much more)
gong | gong 1 ren 2 (worker)
gou | zu 2 gou 4 (enough)
gu | gu 4 xiang 1 (hometown)
gua | xi 1 gua 1 (watermelon)
guai | qi 2 guai 4 (oddness)
guan | guan 1 bi 4 (close)
guang | guang 1 (light)
gui | gui 3 (ghost)
gun | gun 4 (stick)
guo | guo 4 qu 4 (past)
ha | ha 1 (sound of laugh)
hai | hai 2 zi 5 (child)
han | chu 1 han 4 (sweat)
hang | hang 2 xing 2 (sail)
hao | hao 3 (good)
he | he 2 (river)
hei | hei 1 (black)
hen | hen 3 (very)
heng | heng 2 xiang 4 (landscape orientation)
hong | hong 2 (red)
hou | hou 2 zi 5 (monkey)
hu | hu 2 xu 1 (beard)
hua | hua 4 (picture)
huai | huai 4 (bad)
huan | huan 2 jing 4 (environment)
huang | huang 2 se 4 (yellow)
hui | hui 1 huang 2 (refulgence)
hun | hun 2 zhuo 2 (muddy)
huo | huo 3 (fire)
ji | ji 2 shi 2 (in time)
jia | jia 4 qi 1 (holiday)
jian | jian 3 dan 1 (simple)
jiang | jiang 1 (river)
jiao | jiao 1 tong 1 (traffic)
jie | jie 2 ri 4 (feast)
jin | jin 3 zhang 1 (strain)
jing | gan 1 jing 4 (neatness)
jiong | jiong 3 po 4 (embarrassed)
jiu | jiu 3 (nine)
ju | ju 4 zi 5 (sentence)
juan | juan 3 qu 1 (curl)
jue | jue 2 ding 4 (decide)
jun | jun 1 dui 4 (army)
ka | ka 3 che 1 (truck)
kai | kai 3 xuan 2 (triumph)
kan | kan 4 (see)
kang | di 3 kang 4 (resist)
kao | kao 3 shi 4 (test)
ke | ke 3 (thirsty)
kei | kei 1 (scold)
ken | ken 3 ding 4 (affirm)
keng | keng 1 hai 4 (entrap)
kong | kong 1 qi 4 (air)
kou | kou 3 (mouth)
ku | jian 1 ku 3 (trial)
kua | kua 1 jiang 3 (praise)
kuai | kuai 4 (fast)
kuan | kuan 1 kuo 4 (openness)
kuang | kong 1 kuang 4 (void)
kui | kui 1 qian 4 (owe)
kun | kun 4 nan 2 (hard)
kuo | kuo 4 da 4 (enlarge)
la | la 4 jiao 1 (hot pepper)
lai | lai 2 (come)
lan | lan 2 se 4 (blue)
lang | lang 2 (wolf)
lao | lao 3 (old)
le | kuai 4 le 4 (happy)
lei | lei 2 (thunder)
leng | leng 3 ku 4 (steeliness)
li | li 2 (pear)
lia | lia 2 (two)
lian | lian 3 (face)
liang | li 4 liang 4 (power)
liao | zuo 2 liao 4 (seasoning)
lie | lin 3 lie 4 (severe)
lin | lin 3 lie 4 (severe)
ling | ling 2 mu 4 (mausoleum)
liu | liu 2 dong 4 (flow)
lo | lo 5 (function word)
long | long 2 (dragon)
lou | lou 4 (leak)
lu | lu 4 di 4 (land)
luan | hun 4 luan 4 (chaos)
lue | ce 4 lue 4 (tactic)
lun | yi 4 lun 4 (discuss)
luo | xia 4 luo 4 (whereabouts)
lv | lv 4 se 4 (green)
ma | ma 3 (horse)
mai | mai 2 zang 4 (bury)
man | man 3 zu 2 (satisfy)
mang | cong 1 mang 2 (hurry)
mao | mao 1 (cat)
me | shen 2 me 5 (what)
mei | mei 2 you 3 (no)
men | wo 3 men 2 (we)
meng | meng 4 (dream)
mi | hun 1 mi 2 (coma)
mian | mian 4 ji 5 (area)
miao | miao 4 (temple)
mie | mie 4 jue 2 (annihilation)
min | ren 2 min 2 (people)
ming | ming 2 bai 2 (clearness)
miu | huang 1 miu 4 (absurd)
mo | mo 4 shui 3 (ink)
mou | mou 2 lue 4 (trick)
mu | mu 4 biao 1 (target)
na | na 4 li 3 (there)
nai | nai 3 nai 5 (grandmother)
nan | nan 2 fang 1 (south)
nang | nang 2 kuo 4 (include)
nao | re 4 nao 4 (liveliness)
ne | mu 4 ne 4 (numb)
nei | nei 4 bu 4 (inside)
nen | nen 4 lv 4 (light green)
neng | neng 2 gou 4 (be capable of)
ni | ni 3 (you)
nian | nian 2 (year)
niang | gu 1 niang 5 (girl)
niao | niao 3 (bird)
nie | nie 4 (bite)
nin | nin 2 (you)
ning | an 1 ning 2 (peace)
niu | niu 2 (bull)
nong | nong 2 min 2 (farmer)
nou | nou 4 (weeding)
nu | nu 3 li 4 (try hard)
nuan | wen 1 nuan 3 (warm)
nue | nue 4 dai 4 (abuse)
nuo | nuo 4 yan 2 (promise)
nv | nv 3 zi 3 (woman)
o | o 5 (function word)
ou | ou 1 yang 2 (Chinese first name)
pa | hai 4 pa 4 (scare)
pai | pai 4 qian 3 (send)
pan | pan 4 tu 2 (betrayer)
pang | pang 2 da 4 (huge)
pao | pao 3 (run)
pei | pei 2 ban 4 (accompany)
pen | pen 2 di 4 (pan)
peng | peng 2 pai 4 (surge)
pi | pi 2 fu 1 (skin)
pian | qi 1 pian 4 (cheat)
piao | piao 4 liang 4 (pretty)
pie | pie 1 kai 1 (put aside)
pin | pin 2 fan 2 (frequency)
ping | ping 2 zi 5 (bottle)
po | po 4 huai 4 (damage)
pou | pou 2 (hold something with cupped hand)
pu | pu 2 tao 5 (grape)
qi | qi 3 qiu 2 (beg)
qia | qia 4 dang 4 (proper)
qian | qian 1 xu 1 (humility)
qiang | qiang 2 da 4 (powerful)
qiao | qiao 3 miao 4 (artifice)
qie | xiu 1 qie 4 (shyness)
qin | qin 1 zi 4 (oneself)
qing | qing 1 song 1 (easy)
qiong | qiong 2 (poverty)
qiu | qiu 2 fan 4 (prisoner)
qu | qu 1 dong 4 (drive)
quan | quan 2 bu 4 (all)
que | que 4 ding 4 (ensure)
qun | qun 2 zhong 4 (crowd)
ran | ran 2 hou 4 (then)
rang | tu 3 rang 3 (soil)
rao | wei 2 rao 4 (surround)
re | re 4 (hot)
ren | ren 2 lei 4 (human being)
reng | reng 2 ran 2 (all the same)
ri | ri 4 chu 1 (sunrise)
rong | rong 2 yao 4 (glory)
rou | niu 2 rou 4 (beef)
ru | ru 2 guo 3 (if)
ruan | rou 2 ruan 3 (soft)
rui | rui 4 zhi 4 (smart)
run | shi 1 run 4 (wetness)
ruo | ruo 4 xiao 3 (puniness)
sa | sa 1 (three)
sai | bi 3 sai 4 (compete)
san | fen 1 san 4 (disperse)
sang | sang 4 (die)
sao | da 3 sao 3 (sweep)
se | yan 2 se 4 (color)
sen | sen 1 lin 2 (forest)
seng | seng 1 lv 3 (monk)
sha | sha 1 chang 3 (battlefield)
shai | ri 4 shai 4 (be exposed to the sun)
shan | shan 4 liang 2 (goodness)
shang | shang 4 mian 4 (top)
shao | shao 4 nian 2 (youth)
she | she 2 (snake)
shei | shei 2 (who)
shen | shen 2 me 5 (what)
sheng | sheng 1 yin 1 (voice)
shi | shi 4 fei 1 (dispute)
shou | shou 3 (hand)
shu | shu 4 mu 4 (tree)
shua | shua 1 zi 5 (brush)
shuai | shuai 1 da 3 (beat)
shuan | men 2 shuan 1 (latch)
shuang | shuang 1 (pair)
shui | shui 3 (water)
shun | shun 4 li 4 (all right)
shuo | shuo 1 (say)
si | si 4 (four)
song | song 4 bie 2 (send-off)
sou | sou 1 cha 2 (search)
su | su 4 du 4 (speed)
suan | suan 4 fa 3 (arithmetic)
sui | sui 1 ran 2 (though)
sun | sun 3 shi 1 (loss)
suo | suo 3 yi 3 (so)
ta | ta 1 men 2 (they)
tai | tai 4 (too)
tan | tan 2 hua 4 (talk)
tang | tang 2 (sugar)
tao | tao 2 pao 3 (flee)
te | te 4 bie 2 (special)
tei | tei 1 (very)
teng | ben 1 teng 2 (riot)
ti | ti 1 zi 5 (ladder)
tian | tian 1 (sky)
tiao | tiao 4 yue 4 (jump)
tie | tie 3 (iron)
ting | ting 1 (listen)
tong | tong 3 yi 1 (unify)
tou | tou 2 (head)
tu | tu 3 di 4 (earth)
tuan | tuan 2 jie 2 (solidify)
tui | tui 1 dong 4 (push)
tun | tun 2 ji 1 (store up)
tuo | tuo 1 yi 1 (undress)
wa | qing 1 wa 1 (frog)
wai | wai 4 mian 4 (outside)
wan | wan 4 (ten thousands)
wang | si 3 wang 2 (death)
wei | wei 3 da 4 (great)
wen | wen 2 hua 4 (culture)
weng | lao 3 weng 1 (oldman)
wo | wo 3 (I)
wu | wu 2 lun 4 (no matter what)
xi | xi 1 fang 1 (west)
xia | xia 4 mian 4 (bottom)
xian | xian 4 zai 4 (now)
xiang | xiang 4 (like)
xiao | xiao 3 (small)
xie | xie 3 (write)
xin | xin 1 (new)
xing | xing 2 dong 4 (act)
xiong | xiong 2 (bear)
xiu | xiu 1 xi 5 (break)
xu | xu 1 yao 4 (need)
xuan | xuan 1 bu 4 (declare)
xue | xue 3 (snow)
xun | xun 2 wen 4 (ask for)
ya | ya 4 zhou 1 (Asia)
yan | yan 4 zi 5 (swallow)
yang | tai 4 yang 2 (sun)
yao | yao 1 qiu 2 (require)
ye | ye 2 ye 5 (grandfather)
yi | yi 1 (one)
yin | yin 1 yue 4 (music)
ying | ying 1 gai 1 (should)
yo | yo 5 (function word)
yong | yong 3 yuan 3 (forever)
you | you 2 yu 2 (due to)
yu | yu 2 (fish)
yuan | yuan 2 lai 2 (formerly)
yue | yue 4 (month)
yun | yun 2 (cloud)
za | za 2 luan 4 (disorder)
zai | zai 4 jian 4 (farewell)
zan | zan 2 men 5 (our)
zang | ang 1 zang 1 (dirty)
zao | zao 3 chen 2 (morning)
ze | ze 2 ren 4 (response)
zei | zei 2 (thief)
zen | zan 4 yang 2 (praise)
zeng | zeng 1 jia 1 (add)
zha | zha 4 dan 4 (bomb)
zhai | qian 4 zhai 4 (owe)
zhan | zhan 4 li 4 (stand)
zhang | zhang 1 kai 1 (open)
zhao | zhao 1 huan 4 (summon)
zhe | zhe 4 li 3 (here)
zhei | zhei 5 (this)
zhen | zhen 1 zheng 4 (real)
zheng | zheng 4 yi 4 (justice)
zhi | yi 4 zhi 4 (restrain)
zhong | zhong 1 guo 2 (China)
zhou | si 4 zhou 1 (around)
zhu | zhu 1 (pig)
zhua | zhua 1 (grab)
zhuai | zhuai 4 (pull)
zhuan | zhuan 1 (brick)
zhuang | zhuang 1 (pretend)
zhui | zhui 1 (chase)
zhun | zhun 3 (precise)
zhuo | zhuo 1 (table)
zi | zi 4 (character)
zong | zong 3 (total)
zou | zou 3 (walk)
zu | zu 1 (rent)
zuan | zuan 4 (diamond)
zui | zui 4 (most)
zun | zun 1 (respect)
zuo | zuo 4 (sit)

Japanese Phonemes (Katakana)

Symbol | Phonetic | Unicode | Remarks
' |  | U+0027 | Accent position
+ |  | U+002B | Accent boundary
| |  | U+007C | Phrase boundary
. |  | U+002E | Sentence end (standard)
? |  | U+003F | Sentence end (interrogative)
! |  | U+0021 | Sentence end (exclamation)
_ |  | U+005F | One mora pause
゜ |  | U+309C | Semi-voiced sound
ァ | a | U+30A1 | Modifier
ア | a | U+30A2 |
ィ | i | U+30A3 | Modifier
イ | i | U+30A4 |
ゥ | u | U+30A5 |
ウ | u | U+30A6 |
ェ | e | U+30A7 | Modifier
エ | e | U+30A8 |
ォ | o | U+30A9 | Modifier
オ | o | U+30AA |
カ | ka | U+30AB |
ガ | ga | U+30AC |
キ | ki | U+30AD |
ギ | gi | U+30AE |
ク | ku | U+30AF |
グ | gu | U+30B0 |
ケ | ke | U+30B1 |
ゲ | ge | U+30B2 |
コ | ko | U+30B3 |
ゴ | go | U+30B4 |
サ | sa | U+30B5 |
ザ | za | U+30B6 |
シ | shi | U+30B7 |
ジ | ji | U+30B8 |
ス | su | U+30B9 |
ズ | zu | U+30BA |
セ | se | U+30BB |
ゼ | ze | U+30BC |
ソ | so | U+30BD |
ゾ | zo | U+30BE |
タ | ta | U+30BF |
ダ | da | U+30C0 |
チ | chi | U+30C1 |
ヂ | di | U+30C2 | Deprecated - use 30B8
ッ | q | U+30C3 |
ツ | tsu | U+30C4 |
ヅ | du | U+30C5 | Deprecated - use 30BA
テ | te | U+30C6 |
デ | de | U+30C7 |
ト | to | U+30C8 |
ド | do | U+30C9 |
ナ | na | U+30CA |
ニ | ni | U+30CB |
ヌ | nu | U+30CC |
ネ | ne | U+30CD |
ノ | no | U+30CE |
ハ | ha | U+30CF |
バ | ba | U+30D0 |
パ | pa | U+30D1 |
ヒ | hi | U+30D2 |
ビ | bi | U+30D3 |
ピ | pi | U+30D4 |
フ | hu | U+30D5 |
ブ | bu | U+30D6 |
プ | pu | U+30D7 |
ヘ | he | U+30D8 |
ベ | be | U+30D9 |
ペ | pe | U+30DA |
ホ | ho | U+30DB |
ボ | bo | U+30DC |
ポ | po | U+30DD |
マ | ma | U+30DE |
ミ | mi | U+30DF |
ム | mu | U+30E0 |
メ | me | U+30E1 |
モ | mo | U+30E2 |
ャ | ya | U+30E3 | Modifier
ヤ | ya | U+30E4 |
ュ | yu | U+30E5 | Modifier
ユ | yu | U+30E6 |
ョ | yo | U+30E7 | Modifier
ヨ | yo | U+30E8 |
ラ | ra | U+30E9 |
リ | ri | U+30EA |
ル | ru | U+30EB |
レ | re | U+30EC |
ロ | ro | U+30ED |
ヮ | wa | U+30EE | Modifier
ワ | wa | U+30EF |
ヰ | wi | U+30F0 | Deprecated - use 30A4
ヱ | we | U+30F1 | Deprecated - use 30A8
ヲ | wo | U+30F2 |
ン | nn | U+30F3 |
ヴ | vu | U+30F4 |
ヵ | ka | U+30F5 |
ヶ | ke | U+30F6 |
ヷ | va | U+30F7 |
ヸ | vi | U+30F8 |
ヹ | ve | U+30F9 |
ヺ | vo | U+30FA |
・ |  | U+30FB | Middle dot
ー |  | U+30FC | Prolonged sound
ヽ |  | U+30FD | Iteration
ヾ |  | U+30FE | Voiced iteration


Universal Phone Set

The Speech API (SAPI) Universal Phone Set (UPS) is a machine-readable phone set that is based on the International Phonetic Alphabet (IPA).

UPS Design Principles

The following design principles were used to select SAPI labels and phone IDs for UPS.

  1. UPS covers the IPA 1993 Unicode character set, plus some extra SAPI phones including some suprasegmental labels that are used in speech synthesis markup but are not found in IPA.
    • In most cases there is a one-to-one mapping between UPS and IPA. In these cases, the SAPI Phone ID can simply use the IPA hex Unicode value.
    • In some cases UPS is a superset of IPA. For example, UPS includes some unique phone labels for commonly used sounds such as diphthongs and nasalized vowels, which the IPA treats as compounds. These compounds are represented using the compounding symbol "+". This symbol is treated just like any other phone, and so must be space delimited in a lexicon: the compound of A and B is written A + B, not AB or A+B. The SAPI Phone IDs of such compounds are formed from the sequence of phone IDs making up the compound.
  2. UPS pronunciations consist of a string of UPS phones, each separated by whitespace. SAPI makes no distinction between segmental phones and diacritics, suprasegmentals, and tones, and so these must also be separated by whitespace like any other SAPI phone.
  3. The UPS phone labels are not restricted to use the SAPI phone labels from US English, Spanish, French, German, Japanese, or Chinese; however, where possible, existing SAPI labels were re-used. Two sets of guidelines were used in creating the phone label names:
    • The UPS phone set reflects orthography where possible but is not biased too heavily towards English.
    • Phone labels adhere to labeling conventions that apply across phonetic classes (e.g., lax vowels use the character 'H' as in 'IH', 'UH' and 'AH').
  4. The UPS phone set is case-sensitive. UPS phone labels are all defined using ASCII character strings.
    • Segmental phones (Consonants, Vowels, Clicks and Ejectives) are represented by upper-case alphabetic symbols. These may vary in length from one to three characters. In general, shorter symbols are used for more frequent phones.
    • Diacritics are represented by three-character, lower-case, alphabetic symbols.
    • Suprasegmentals and Tones may vary in length and contain non-alphabetic characters.

The Universal Phone Set should be used for all Microsoft-supported languages except the seven languages currently supported by SAPI: Chinese, English (United States), French, German, Italian, Japanese, Spanish.

Compound Tying Symbol

UPS provides unique phone labels for common compound sounds such as affricates and nasal vowels. However, less frequent compound sounds may also exist in some languages and need to be represented in SAPI lexicons. The Universal Phone Set provides a compounding or tying symbol “+” that can be used to describe composite sounds from any two phones.

The German affricate "PF", diphthong "AI", and nasal vowel "AN" exist as unique phones in UPS. However, they could also be represented as compounds. The following example shows that "PF" and "P + F" are equivalent and are distinct from the phone sequence "P F".

Unique Phone | Compound
PF | P + F
AI | A + I

The nasal vowel "AN" can be described as the "A" vowel with a nasal diacritic. All diacritics must follow a segmental phone, so "A nas" and "A + nas" are equivalent. The former is preferred, though SAPI does not enforce any particular use of "+" or diacritics.

Unique Phone | Compound
AN | A nas
AN | A + nas

Consonants

This is a listing and cross reference of the consonant phones that are used by the three phonetic alphabets.

UPS Consonant Labeling Conventions

Consonant symbols are one, two, or three characters in length. Single character labels are used for highly frequent, language-universal consonants. In general the first character signifies place plus voicing, and the second signifies manner. Labeling conventions carry across phonetic classes in the following ways:

Conventions for place of articulation and voicing labeling:

  • Dentals and alveloars use D for voiced and T for voiceless
  • Alveolars use N for nasal and R for approximant
  • Labiodentals use V for voiced and F for voiceless
  • Velars use G for voiced and K for voiceless, NG for nasal
  • Bilabials use B for voiced and P for voiceless stops, M for nasal
  • Laterals use L
  • Uvulars use Q
  • Pharyngeals use H
  • Palatals use X for voiceless and Y for voiced

Conventions for manner of articulation labeling:

  • Single-character labels have manner encapsulated in choice of symbol: for example, M is nasal
  • Trills double up the first symbol
  • Fricatives use H
  • Approximants use X
  • Retroflex uses R

Consonant Tables

There are two tables, each listing a different category of consonant phones:

  • Consonants
  • Affricates

The table columns contain the following information:

  • UPS. The phone label specified in Microsoft’s Universal Phone Set (UPS).
  • IPA. The phone label specified in the International Phonetic Alphabet (IPA) phone set.
  • Unicode. The Unicode value from the IPA phone set.
  • IPA Description. This column describes the features of the phone, such as place of articulation, manner of articulation, phonation type, and airstream mechanism.
  • ASCII-IPA. The equivalent phone in ASCII-IPA phone set for reference.
  • X-SAMPA. The equivalent phone in X-SAMPA for reference.
  • Example. A word that uses the phone and illustrates its sound.
  • Language. The language of the example word.

Consonant Phones

Consonants are speech sounds that are articulated with complete (voiceless) or partial closure of the vocal tract.

UPS | IPA | Unicode | IPA Description | ASCII-IPA | X-SAMPA | Example | Language
P | p | U+0070 | {blb,stp,vls} | p | p | put | English
B | b | U+0062 | {blb,stp,vcd} | b | b | big | English
M | m | U+006D | {blb,nas} | m | m | mat | English
BB | ʙ | U+0299 | {blb,trl,vcd} | B<trl> | B\ |  |
PH | ɸ | U+0278 | {blb,frc,vls} | P | p\ |  |
BH | β | U+03B2 | {blb,frc,vcd} | B | B | kabra | Spanish
MF | ɱ | U+0271 | {lbd,nas} | M | F |  |
F | f | U+0066 | {lbd,frc,vls} | f | f | fork | English
V | v | U+0076 | {lbd,frc,vcd} | v | v | vat | English
VA | ʋ | U+028B | {lbd,apr,vcd} | r<lbd> | v\ |  |
TH | θ | U+03B8 | {dnt,frc,vls} | T | T | thin | English
DH | ð | U+00F0 | {dnt,frc,vcd} | D | D | then | English
T | t | U+0074 | {alv,stp,vls} | t | t | talk | English
D | d | U+0064 | {alv,stp,vcd} | d | d | dig | English
N | n | U+006E | {alv,nas} | n | n | no | English
RR | r | U+0072 | {alv,trl,vcd} | r<trl> | r | torre, rojo | Spanish
DX | ɾ | U+027E | {alv,flp,vcd} | * | 4 | butter | US English
S | s | U+0073 | {alv,frc,vls} | s | s | sit | US English
Z | z | U+007A | {alv,frc,vcd} | z | z | zap | US English
LSH | ɬ | U+026C | {alv,lat,frc,vls} |  | K |  |
LH | ɮ | U+026E | {alv,lat,frc,vcd} | z<lat> | K\ | caballo | Spanish/Zulu
RA | ɹ | U+0279 | {alv,apr} | r | r\ | puro | Spanish
L | l | U+006C | {alv,lat,apr,vcd} | l | l | lid | US English
L vel | ɫ | U+026B | {alv,lat,apr,vcd} vel |  | 5 |  |
SH | ʃ | U+0283 | {pla,frc,vls} | S | S | she | US English
SH pal | ʆ | U+0286 | {pla,frc,vls} pal |  |  |  |
ZH | ʒ | U+0292 | {pla,frc,vcd} | Z | Z | pleasure | US English
ZH pal | ʓ | U+0293 | {pla,frc,vcd} pal |  |  |  |
TR | ʈ | U+0288 | {rfx,stp,vls} | t. | t` |  |
DR | ɖ | U+0256 | {rfx,stp,vcd} | d. | d` |  |
NR | ɳ | U+0273 | {rfx,nas,vcd} | n. | n` |  |
DXR | ɽ | U+027D | {rfx,flp,vcd} | *. | r` |  |
SR | ʂ | U+0282 | {rfx,frc,vls} | s. | s` |  |
ZR | ʐ | U+0290 | {rfx,frc,vcd} | z. | z` |  |
R | ɻ | U+027B | {rfx,apr,vcd} | r. | r\` | red | US English
LR | ɭ | U+026D | {rfx,lat,vcd} | l. | l` |  |
RR rho | ɼ | U+027C | {rfx,trl} |  |  |  |
CT | c | U+0063 | {pal,stp,vls} | c | c |  |
JD | ɟ | U+025F | {pal,stp,vcd} | J | J\ |  |
NJ | ɲ | U+0272 | {pal,nas,vcd} | J |  | oignon | French
C | ç | U+00E7 | {pal,frc,vls} | C | C | sicher | German
CJ | ʝ | U+029D | {pal,frc,vcd} | C<vcd> | j\ |  |
J | j | U+006A | {pal,apr,vcd} | j | j | yard | US English
LJ | ʎ | U+028E | {pal,lat,apr,vcd} | l^ | L | gli | Italian
W | w | U+0077 | {lbv,apr,vcd} | w | w | with | US English
K | k | U+006B | {vel,stp,vls} | k | k | cut | US English
G | g | U+0067 | {vel,stp,vcd} | g | g | gut | US English
NG | ŋ | U+014B | {vel,nas} | N | N | sing | US English
X | x | U+0078 | {vel,frc,vls} | x | x | mujer | Spanish
GH | ɣ | U+0263 | {vel,frc,vcd} | Q | G | luego | Spanish
GA | ɰ | U+0270 | {vel,apr,vcd} | j<vel> | M\ |  |
GL | ʟ | U+029F | {vel,lat,vcd} | L | L\ |  |
QT | q | U+0071 | {uvl,stp,vls} | q | q |  |
QD | ɢ | U+0262 | {uvl,stp,vcd} | G | G\ |  |
QN | ɴ | U+0274 | {uvl,nas,vcd} | n" | N\ |  |
QQ | ʀ | U+0280 | {uvl,trl,vcd} | - | R\ |  |
QH | χ | U+03C7 | {uvl,frc,vls} | X | X |  |
RH | ʁ | U+0281 | {uvl,frc,vcd} | g" | R | rond | French
HH | ħ | U+0127 | {phr,frc,vls} | H | X\ |  |
HG | ʕ | U+0295 | {phr,frc,vcd} | H<vcd> | ?\ |  |
GT | ʔ | U+0294 | {glt,stp,vls} | ? | ? |  |
H | h | U+0068 | {glt,frc,vls} | h | h | help | US English
WJ | ɥ | U+0265 | {lbp,apr,vcd} | j<rnd> | H | huit;juin | French

Affricates

Affricates are consonants that begin as stops but release as a fricative.

The SAPI UPS includes explicit phones for the most frequent affricates in the highest priority languages. The IPA Unicode specification includes some of these phones, though not all of them.

The table shows the constituent phones (UPS Compound) that were combined to create the resulting explicit phone (UPS).

UPS | UPS Compound | IPA | Unicode | IPA Description | Example | Language
PF | P + F | p.f |  | {lbd,aff,vls} | Pfahl | German
TS | T + S | t.s / ʦ | U+02A6 | {den,aff,vls} | Zahl | German
CH | T + SH | t.ʃ / ʧ | U+02A7 | {pla,aff,vls} | chin | English
JH | D + ZH | d.ʒ / ʤ | U+02A4 | {pla,aff,vcd} | joy | English
JJ | J + J | j.j |  | {pal,aff,vcd} | hielo | Spanish
DZ | D + Z | d.z / ʣ | U+02A3 | {den,aff,vcd} | zona | Italian
CC | T + SC | t.ɕ / ʨ | U+02A8 | {pla,aff,vls} |  | Mandarin
TSR | T + SR | t.ʂ |  | {rfx,aff,vls} |  | Mandarin
JC | D + ZC | d.ʑ / ʥ | U+02A5 | {pla,aff,vcd} |  |

Many other affricates or compound consonants exist and may be required by other languages. For example, there are about 20 Italian geminate consonants (doubled consonants). UPS does not include dedicated phones for these, but allows them to be defined using the + symbol, or the length diacritic 'lng' in the case of geminates.

Vowels

This is a listing and cross reference of the vowel phones that are used by the three phonetic alphabets.

UPS Labeling Conventions for Vowels

The UPS labeling conventions for vowels were designed to make the phones more intuitive and maintain phonetic similarity across each class. The labels follow these conventions:

  • Cardinal or main vowels use single character labels
  • Non-cardinal vowels and common diphthongs use two characters
  • Maximum label length is three characters
  • Centralized vowel labels use X, as in AX, IX, UX
  • Checked vowel (usually must be followed by a consonant in a stressed syllable) labels use H, as in IH, UH
  • U or O signifies lip rounding, as in AU, AO, EU

Vowel Tables

There are four tables, each listing a different category of vowel phones:

  • Monophthong
  • Diphthong
  • German Diphthong
  • Nasal

Monophthong Vowel Phones

Monophthong (literally "one sound" or "one tone") vowels are those whose articulation at both beginning and end is relatively fixed, and which does not glide up or down towards a new position of articulation.

UPS | IPA | Unicode | IPA Description | ASCII-IPA | X-SAMPA | Example | Language
I | i | U+0069 | {hgh,fnt,unr,vwl} | I | i | feel | English
Y | y | U+0079 | {hgh,fnt,rnd,vwl} | Y | y | du | French
IX | ɨ | U+0268 | {hgh,cnt,unr,vwl} | i" | I\ |  |
YX | ʉ | U+0289 | {hgh,cnt,rnd,vwl} | U" | } |  |
UU | ɯ | U+026F | {hgh,bck,unr,vwl} | u- | M |  |
U | u | U+0075 | {hgh,bck,rnd,vwl} | u | u | too | English
IH | ɪ | U+026A | {smh,fnt,unr,vwl} | I | I | fill | English
YH | ʏ | U+028F | {smh,fnt,rnd,vwl} | I. | Y | hübsch | German
UH | ʊ | U+028ª | {smh,bck,rnd,vwl} | U | U | book | English
E | e | U+0065 | {umd,fnt,urd,vwl} | e | e | ses | French
EU | ø | U+00F8 | {umd,fnt,rnd,vwl} | Y | 2 | blöd | German
EX | ɘ | U+0258 | {umd,cnt,urd,vwl} | @<umd> | @\ |  |
OX | ɵ | U+0275 | {umd,cnt,rnd,vwl} |  | 8 |  |
OU | ɤ | U+0264 | {umd,bck,urd,vwl} | o- | 7 |  |
O | o | U+006F | {umd,bck,rnd,vwl} | o | o | go | English
AX | ə | U+0259 | {mid,cnt,unr,vwl} | @ | @ | ago | English
AX rho | ɚ | U+025ª | {mid,cnt,rho,vwl} | R |  | forensic | English
EH | ɛ | U+025B | {lmd,fnt,unr,vwl} | E | E | pet | English
OE | œ | U+0153 | {lmd,fnt,rnd,vwl} | W | 9 | plötzlich | German
ER | ɜ | U+025C | {lmd,cnt,unr,vwl} | V" | 3 | bird | UK English
ER rho | ɝ | U+025D | {lmd,cnt,unr,rho,vwl} | @. |  | bird | US English
UR | ɞ | U+025E | {lmd,cnt,rnd,vwl} | O" | 3\ |  |
H | ʌ | U+028C | {lmd,bck,unr,vwl} | V | V | cut | English
AO | ɔ | U+0254 | {lmd,bck,rnd,vwl} | O | O | dog | English
AE | æ | U+00E6 | {sml,fnt,unr,vwl} | & | { | cat | English
AEX | ɐ | U+0250 | {sml,cnt,unr,vwl} | 6 |  | Besser | German
A | a | U+0061 | {low,fnt,unr,vwl} | a | a | valle | Spanish
AOE | ɶ | U+0276 | {low,fnt,rnd,vwl} | &. | & |  |
AA | ɑ | U+0251 | {low,bck,unr,vwl} | A | A | father | English
Q | ɒ | U+0252 | {low,bck,rnd,vwl} | A. | Q | hot | English

Diphthong Vowel Phones

In addition to monophthongs, many languages contain diphthongs or even triphthongs. Diphthong (literally "two sounds" or "two tones") vowels are those that change quality during their pronunciation, or "glide", with a smooth movement of the tongue from one articulation to another, as in the English words eye, boy, and cow.

Diphthongs and triphthongs can be represented in UPS as vowel compounds, using the + symbol. However to make lexicons more readable, UPS also contains phones for common diphthongs. The table below shows both the compounding of two phones using the + symbol and the resultant UPS phone.

UPS Compound | UPS | IPA | X-SAMPA | Example | Language | Example | Language
E + I | EI | e.ɪ | eI | late | English | late | English
A + UH | AU | ɑ.ʊ | aU | foul | English | Haus | German
AO + I | OI | ɔ.ɪ | OI | toy | English | Kreuz | German
A + I | AI | ɑ.ɪ | ai | bite | English | Eis | German
I + AX | IYX | i.ə | i:6 | Tier | German | fear | English
Y + AX | UYX | y.ə | y:6 | Tür | German |  |
EH + AX | EHX | ɛ.ə | E6 | Berg | German | stairs | English
U + AX | UWX | u.ə | u:6 | Kur | German | lure | English
O + AX | OWX | o.ə | o:6 | Ohr | German | boa | English
AO + AX | AOX | ɔ.ə | O6 | dort | German | four | English

German Diphthong Vowels

The German language has several more centering diphthongs that must be represented as phone compounds and do not have explicit UPS phones assigned to them. The 'lng' diacritic is included for phonetic completeness.

UPS Compound | IPA | X-SAMPA | Example | Language
IH + AX | ɪ.ə | I6 | Wirt | German
YH + AX | ʏ.ə | Y6 | Türke | German
EY lng + AX | e.ə | e:6 | schwer | German
EH lng + AX | ɛ:.ə | E:6 | Bär | German
EU lng + AX | ø.ə | 2:6 | Föhr | German
OE + AX | œ.ə | 96 | Wörter | German
A lng + AX | a.ə | a:6 | Haar | German
A + AX | a.ə | a6 | hart | German
UH + AX | ʊ.ə | U6 | kurz | German

Nasal Vowel Phones

UPS contains phones for four nasal vowels. These are shown in the following table with French examples.

Compound | UPS | X-SAMPA | Example | Language
E nas | EN | e~ | vin | French
A nas | AN | a~ | vent | French
O nas | ON | o~ | bon | French
OE nas | OEN | 9~ | brun | French

Diacritics

This is a listing and cross reference of the diacritic phones that are used by the three phonetic alphabets.

Diacritic Phones

Diacritics are used to modify segmental phones (vowels, consonants, clicks, and ejectives) with additional phonetic detail. A diacritic cannot stand-alone. Diacritics must modify the preceding segmental phone. Any number of diacritics can follow a segmental symbol.

UPS | IPA | Unicode | IPA Description | ASCII-IPA | X-SAMPA
+ | ͡ | U+0361 | Tie bar |  | _
adv | o̟ | U+031F | Advanced |  | _+
api | t̺ | U+033A | Apical |  | _a
asp | tʰ | U+02B0 | Aspirated | ^lt;h> {asp} | _h
atr | e̘ | U+0318 | Advanced tongue root |  | _A
bvd | b̤ | U+0324 | Breathy voiced |  | _t
cen | ë | U+0308 | Centralized | " | _"
cvd | b̰ | U+0330 | Creaky voiced |  | _k
den | t̪ | U+032A | Dental | [ / {dnt} | _d
ejc | pʼ | U+02BC | Ejective | {ejc} | _>
lab | tʷ | U+02B7 | Labialised | <w> {lzd} | _w
lam | t̻ | U+033B | Laminal |  | _m
lar | dˡ | U+02E1 | Lateral release |  | _l
lla | n̼ | U+033C | Linguolabial |  | _N
low | e̞ | U+031E | Lowered |  | _o
lrd | o̜ | U+031C | Less rounded |  | _c
mcn | e̽ | U+033D | Mid-centralized |  | _x
mrd | o̹ | U+0339 | More rounded |  | _O
nar | d̚ | U+031A | No audible release |  | _}
nas | ñ | U+0303 | Nasalized | ~ / <nzd> | ~ / _~
nsr | oⁿ | U+207F | Nasal release |  | _n
nsy | n̯ | U+032F | Non-syllabic |  | _^
pal | tʲ | U+02B2 | Palatalized | ; / {pzd} | '
phr | nˤ | U+02E4 | Pharyngealized |  | _?\
rai | e̝ | U+031D | Raised |  | _r
ret | o̱ | U+0331 | Retracted |  | _-
rho | ə˞ | U+02DE | Rhoticity |  | `
rtr | e̙ | U+0319 | Retracted tongue root |  | _q
syl | n̩ | U+0329 | Syllabic | {syl} | = / _=
vcd | s̬ | U+032C | Voiced |  | _v
vel | tˠ | U+02E0 | Velarized | {vzd} | _G
vls | n̊ | U+030A | Voiceless |  | _0
vph | l̴ | U+0334 | Velarized or pharyngealized | {fzd} | _e

Suprasegmentals

This is a listing and cross reference of the suprasegmental phones that are used by the three phonetic alphabets.

Suprasegmental Phones

Suprasegmentals describe the features of a language above the level of individual consonants and vowels, such as prosody, tone, length, and stress.

The first set of suprasegmental symbols, up to and including “linking”, map directly to the IPA suprasegmental set and therefore have the IPA Unicode value. This set includes length diacritics for long, half-long, and extra-short. Length is often used phonemically, so length markers could also belong in the diacritics table. For this reason they are given the lower case label format of a diacritic.

The remaining suprasegmental symbols are used in UPS to describe intonation contours in text-to-speech markup (SSML prompt documents). These UPS symbols were formed by prefixing the original SAPI labels with an underscore. This makes them more easily identifiable as a class and removes any ambiguity with other IPA symbols. For example the old SAPI symbol '!' sentence terminator is the IPA symbol for an alveolar click.

UPS | IPA | Unicode | IPA Description | X-SAMPA | SAPI Equivalent
S1 | ˈ | U+02C8 | Primary stress | " | 1
S2 | ˌ | U+02CC | Secondary stress | % | 2
. | . | U+002E | Syllable break | . |
_| | | | U+007C | Minor (foot) group | | |
_|| | ‖ | U+2016 | Major (intonation) group | || |
lng | ː | U+02D0 | Long | : |
hlg | ˑ | U+02D1 | Half-long | :\ |
xsh | ˘ | U+02D8 | Extra-short | _X |
_^ | ‿ | U+203F | Linking (absence of a break) | -\ |
_! |  |  | Intonation - exclamation |  | ! Sentence terminator (exclamation mark)
_& |  |  | Intonation - continue |  | & Word boundary
_, |  |  | Intonation - incompletion rise |  | , Sentence terminator (comma)
_s |  |  | Silence |  | _ Silence (underscore)
_. | ↘ | U+2198 | Intonation – fall | <F> | . Sentence terminator (period)
_? | ↗ | U+2197 | Intonation - question rise | <R> | ? Sentence terminator (question mark)

Clicks and Ejectives

This is a listing and cross reference of the click and ejective phones that are used by the three phonetic alphabets.

Click and Ejective Phones

IPA uses a diacritic to describe ejectives, but has specific phones for clicks and implosives. Clicks and ejectives are voiceless consonants, although implosives may be partially voiced.

UPS | IPA | Unicode | IPA Description | X-SAMPA
PCK | ʘ | U+0298 | blb,clk | O\
TCK | ǀ | U+01C0 | dnt,clk | |\
NCK | ! | U+0021 | alv,clk | !\
CCK | ǂ | U+01C2 | pla,clk | =\
LCK | ǁ | U+01C1 | alv,lat,clk | |\|\
BIM | ɓ | U+0253 | blb,imp,vcd | b_<
DIM | ɗ | U+0257 | dnt-alv,imp,vcd | d_<
QIM | ʛ | U+029B | uvl,imp,vcd |
QIM vls | ʠ | U+02A0 | uvl,imp,vls |
GIM | ɠ | U+0260 | vel,imp,vcd | g_<
JIM | ʄ | U+0284 | pal,imp,vcd |
P ejc | pʼ | 0070 02BC | blb,ej | b_>
T ejc | tʼ | 0074 02BC | dnt-alv, ej | t_>
K ejc | kʼ | 006B 02BC | vel ej | g_>
S ejc | sʼ | 0073 02BC | alv fric ej | s_>
QT ejc | qʼ | 0071 02BC | uvl,ej |

Tones

This is a listing and cross reference of the tone phones that are used by the three phonetic alphabets.

Tone Phones

Tone describes the use of pitch in speech sounds to distinguish lexical or grammatical meaning. Lexical tones can follow a vowel or syllabic consonant. They can be made up of simple levels, on a universal scale which has a maximum of five level contrasts, or they can be contours composed of sequences of tones. A sequence of three tones should be sufficient to describe any tone contour.

IPA contains a mixture of lexical tones and contour tones. UPS covers the five lexical tones found in IPA, plus upstep and downstep. All contour tones can be represented in UPS by compound tones.

UPS does not include tonal symbols for the following IPA symbols: Rising, Falling, High Rising, Low Rising and Rising-Falling. These can all be defined in UPS using tone sequences. Global Rise and Global Fall are equivalent to "intonation – fall" and "intonation – question rise" in UPS ("Suprasegmentals").

UPS | IPA | Unicode | IPA Description | X-SAMPA
T5 | e̋ | U+030B | Extra high Level | _T
T4 | é | U+0301 | High Level | _H
T3 | ē | U+0304 | Mid Level | _M
T2 | è | U+0300 | Low Level | _L
T1 | ȅ | U+030F | Extra Low Level | _B
T- | ↓ | U+2193 | Downstep | !
T+ | ↑ | U+2191 | Upstep | ^

Other Phones

This is a listing and cross reference of the uncommon phones that are not listed in the other phone tables, but are used by the three phonetic alphabets.

Other Phones

UPS | IPA | Unicode | IPA Description | ASCII-IPA | X-SAMPA
WH | ʍ | U+028D | lbv,frc,vls | w<vls> | W
ESH | ʜ | U+029C | epl,frc,vls |  | H\
EZH | ʢ | U+02A2 | epl,frc,vcd |  | <\
ET | ʡ | U+02A1 | epl,stp |  | >\
SC | ɕ | U+0255 | pla,frc,vls |  | s\
ZC | ʑ | U+0291 | pla,frc,vcd |  | z\
LT | ɺ | U+027A | alv,lat,flp | *<lat> | l\
SHX | ɧ | U+0267 | simultaneous SH and X |  | x\
HZ | ɦ | U+0266 | glt,frc,vcd |  | h\