There are two separate methods for translating words into phonemes:
The utility 'phonemes' are:
|=||put the primary stress on the preceding syllable|
|_||a shorter pause|
|||||indicates a word boundary within a phoneme string|
||||can be used to separate two adjacent characters, to prevent them from being considered as a multi-character phoneme mnemonic|
The phonemes which are used to represent a language's sounds are based loosely on the Kirshenbaum ascii character representation of the International Phonetic Alphabet www.kirshenbaum.net/IPA/ascii-ipa.pdf
To find the pronunciation of a word, the rules are searched and any which match the letters at the in the word are given a score depending on how many letters are matched. The pronunciation from the best matching rule is chosen. The pointer into the source word is then advanced past those letters which have been matched and the process is repeated until all the letters of the word have been processed.
.L01 b bl br pl pr
.group o o 0 // "o" is pronounced as  oo u: // but "oo" is pronounced as [u:] b) oo (k U"oo" is pronounced as [u:], but when also preceded by "b" and followed by "k", it is pronounced [U].
In the case of a single-letter group, the first character of <match> much be the group letter. In the case of a 2-letter group, the first two characters of <match> must be the group letters. The second and third rules above may be in either .group o or .group oo
Alphabetic characters in the <pre>, <match>, and <post> parts must be lower case, and matching is case-insensitive. Some upper case letters are used in <pre> and <post> with special meanings.
|_^_<language code>||Translate using a different language.|
th (_ _^_ENindicates that a word which ends in "th" is translated using the English translation rules and spoken with English phonemes.
|_||Beginning or end of a word (or a hyphen).|
|A||Any vowel (the set of vowel characters may be defined for a particular language).|
|B H F G Y||These may indicate other sets of characters (defined for a particular language).|
|L<nn>||Any of the sequence of characters defined as a letter group (see 4.3.1 above).|
|K||Not a vowel (i.e. a consonant or word boundary or non-alphabetic character).|
|X||There is no vowel until the word boundary.|
|Z||A non-alphabetic character.|
|%||Doubled (placed before a character in <pre> and after it in <post>.|
|/||The following character is treated literally.|
Examples of rules:
_) a // "a" at the start of a word a (CC // "a" followed by two consonants a (C% // "a" followed by a double consonant (the same letter twice) a (/% // "a" followed by a percent sign %C) a // "a" preceded by a double consonants
|&||A syllable which may be stressed (i.e. is not defined as unstressed).|
|V||Matches only if a previous word has indicated that a verb form is expected.|
@@) bi // "bi" preceded by at least two syllables @@a) bi // "bi" preceded by at least 2 syllables and following 'a'Note, that matching characters in the <pre> part do not affect the syllable counting.
|@||A vowel follows somewhere in the word.|
|+||Force an increase in the score in this rule (may be repeated for more effect).|
|S<number>||This number of matching characters are a standard suffix, remove them and retranslate the word.|
|P<number>||This number of matching characters are a standard prefix, remove them and retranslate the word.|
|Lnn||nn is a 2-digit decimal number in the range 01 to 20
Matches with any of the letter sequences which have been defined for letter group nn
|N||Only use this rule if the word is not a retranslation after removing a suffix.|
|T||Only use this rule if the word in found in the *_list file with the $alt attribute.|
|#||(English specific) change the next "e" into a special character "E"|
@) ly (_$2 lI // "ly", at end of a word with at least one other // syllable, is a suffix pronounced [lI]. Remove // it and retranslate the word. _) un (@P2 ¬Vn // "un" at the start of a word is an unstressed // prefix pronounced [Vn] _) un (i ju: // ... except in words starting "uni" _) un (inP2 ,Vn // ... but it is for words starting "unin"S and P must be at the end of the <post> string.
S<number> may be followed by additonal letters (eg. S2ei ). Some of these are probably specific to English, but similar functions could be used for other languages.
|q||query the _list file to find stress position or other attributes for the stem, but don't re-translate the word with the suffix removed.|
|t||determine the stress pattern of the word before adding the suffix|
|d||the previous letter may have been doubled when the suffix was added.|
|e||"e" may have been removed.|
|i||"y" may have been changed to "i."|
|v||the suffix means the verb form of pronunciation should be used.|
|f||the suffix means the next word is likely to be a verb.|
P<number> may be followed by additonal letters (eg. P3v ).
|t||determine the stress pattern of the word before adding the prefix|
|v||the suffix means the verb form of pronunciation should be used.|
Also the list can be used to specify the stress pattern, or other properties, of a word.
If the Pronunciation rules are applied to a word and indicate a standard prefix or suffix, then the word is again looked up in Pronunciation Dictionary List after the prefix or suffix has been removed.
Lines in the dictionary list have the form:
book bUkRather than a full pronunciation, just the stress may be given, to change where it would be otherwise placed by the Pronunciation Rules:
berlin $2 // stress on second syllable absolutely $3 // stress on third syllable for $u // an unstressed word
(de jure) deI||dZ'U@rI2 // note || used as a word break in the phoneme stringor to run them together, pronounced as a single word
(of a) @v@or to give them a flag when they occur together
(such as) sVtS||a2z $pause // precede with a pauseHyphenated words in the <language>_list file must also be enclosed within brackets, because the two parts are considered as separate words.
|_^_<language code>||Translate using a different language. See explanation in 4.3.3 above.|
|$u||The word is unstressed. In the case of a multi-syllable word, a slight stress is applied according to the default stress rules.|
|$u1||The word is unstressed, with a slight stress on its 1st syllable.|
|$u2||The word is unstressed, with a slight stress on its 2nd syllable.|
|$u3||The word is unstressed, with a slight stress on its 3rd syllable.|
|$u+ $u1+ $u2+ $u3+||As above, but the word has full stress if it's at the end of a clause.|
|$1||Primary stress on the 1st syllable.|
|$2||Primary stress on the 2nd syllable.|
|$3||Primary stress on the 3rd syllable.|
|$4||Primary stress on the 4th syllable.|
|$5||Primary stress on the 5th syllable.|
|$6||Primary stress on the 6th syllable.|
|$7||Primary stress on the 7th syllable.|
|$pause||Ensure a short pause before this word (eg. for conjunctions such as "and", some prepositions, etc).|
|$brk||Ensure a very short pause before this word, shorter than $pause (eg. for some prepositions, etc).|
|$only||The rule does not apply if a prefix or suffix has already been removed.|
|$onlys||As $only, except that a standard plural ending is allowed.|
|$stem||The rule only applies if a suffix has already been removed.|
|$strend||Word is fully stressed if it's at the end of a clause.|
|$strend2||As $strend, but the word is also stressed if followed only by unstressed word(s).|
|$unstressend||Word is unstressed if it's at the end of a clause.|
|$atend||Use this pronunciation if it's at the end of a clause.|
|$double||Cause a doubling of the initial consonant of the following word (used for Italian).|
|$capital||Use this pronunciation if the word has initial capital letter (eg. polish v Polish).|
|$allcaps||Use this pronunciation if the word is all capitals.|
|$dot||Ignore a . after this word even when followed by a capital letter (eg. Mr. Dr. ).|
|$hasdot||Use this pronunciation if the word is followed by a dot. (This attribute also implies $dot).|
|$abbrev||This has two meanings.
1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").
2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does indicate emphasis (if the "emphasize all-caps" is on).
|$accent||Used for the pronunciation of a single alphabetic character. The character name is spoken as the base-letter name plus the accent (diacritic) name. eg. It can be used to specify that "â" is spoken as "a" "circumflex".|
|$alt $alt2||These are language specific. Their use should be described in the language's **_list file|
|$verb||Use this pronunciation if it's a verb.|
|$noun||Use this pronunciation if it's a noun.|
|$past||Use this pronunciation if it's past tense.|
|$verbf||The following word is probably is a verb.|
|$verbsf||The following word is probably is a if it has an "s" suffix.|
|$nounf||The following word is probably not a verb.|
|$pastf||The following word is probably past tense.|
|$verbextend||Extend the influence of $verbf and $verbsf.|
The dictionary list is searched from bottom to top. The first match that satisfies any conditions is used (i.e. the one lowest down the list). So if we have:
to t@ // unstressed version to tu: $atend // stressed versionthen if "to" is at the end of the clause, we get [tu:], if not then we get [t@].
Use the attribute $text eg.
cough coff $textAlternatively, use the command $textmode on a line by itself to turn this on for all subsequent entries in the file, until it's turned off by $phonememode. eg.
$textmode cough coff through threw $phonememodeThis feature cannot be used for the special entries in the _list files which start with an underscore, such as numbers.
Currently "textmode" entries are only recognized for complete words, and not for for stems from which a prefix or suffix has been removed (eg. the word "coughs" would not match the example above).
Conditional rules have ? and a condition number at the start if the line in the _rules or _list file. This means that the rule only applies of that condition number is specified in a dictrules line in the voice file.
If the rule starts with ?! then the rule only applies if the condition number is not specified in the voice file. eg.
?3 can't kant // only use this if the voice has: dictrules 3 ?!3 rather rA:D3 // only use if the voice doesn't have: dictrules 3
langopts.numbersoption. This constructs spoken numbers from fragments according to various options which can be set for each language. The number fragments are given in the _list file.
|_0 to _9||The numbers 0 to 9|
|_13||etc. Any pronunciations which are needed for specific numbers in the range _10 to _99|
|_2X _3X||Twenty, thirty, etc., used to make numbers 10 to 99|
|_0C||The word for "hundred"|
|_1C _2C||Special pronunciation for one hundred, two hundred, etc., if needed.|
|_1C0||Special pronunciation (if needed) for 100 exactly|
|_0M1||The word for "thousand"|
|_0M2||The word for "million"|
|_0M3||The word for 1000000000|
|_1M1 _2M1||Special pronunciation for one thousand, two thousand, etc, if needed|
|_0and||Word for "and" when speaking numbers (eg. "two hundred and twenty").|
|_dpt||Word spoken for the decimnal point/comma|
|_dpt2||Word spoken (if any) at the end of all the digits after a decimal point.|
ô ő // (Hungarian) allow the use of o-circumflex instead of o-double-accute
cx ĉ // (Esperanto) allow "cx" as an alternative to c-circumflex
ﬁ fi // replace a single character ligature by two characters