Browse Source

Merge remote-tracking branch 'jaacoppi/maintainability'

master
Reece H. Dunn 7 years ago
parent
commit
a61a0e6523
79 changed files with 159 additions and 96 deletions
  1. 21
    1
      docs/voices.md
  2. 1
    0
      espeak-ng-data/lang/aav/vi
  3. 1
    0
      espeak-ng-data/lang/art/eo
  4. 1
    0
      espeak-ng-data/lang/art/ia
  5. 2
    0
      espeak-ng-data/lang/art/jbo
  6. 1
    1
      espeak-ng-data/lang/azc/nci
  7. 1
    0
      espeak-ng-data/lang/bat/lt
  8. 1
    0
      espeak-ng-data/lang/bat/lv
  9. 1
    0
      espeak-ng-data/lang/bnt/sw
  10. 1
    0
      espeak-ng-data/lang/bnt/tn
  11. 1
    0
      espeak-ng-data/lang/ccs/ka
  12. 3
    0
      espeak-ng-data/lang/cel/cy
  13. 1
    0
      espeak-ng-data/lang/cel/ga
  14. 1
    0
      espeak-ng-data/lang/cel/gd
  15. 1
    0
      espeak-ng-data/lang/cus/om
  16. 1
    0
      espeak-ng-data/lang/dra/kn
  17. 1
    0
      espeak-ng-data/lang/dra/ml
  18. 1
    0
      espeak-ng-data/lang/dra/ta
  19. 1
    0
      espeak-ng-data/lang/dra/te
  20. 1
    0
      espeak-ng-data/lang/esx/kl
  21. 1
    0
      espeak-ng-data/lang/eu
  22. 2
    0
      espeak-ng-data/lang/gmq/da
  23. 2
    0
      espeak-ng-data/lang/gmq/is
  24. 2
    0
      espeak-ng-data/lang/gmq/nb
  25. 2
    0
      espeak-ng-data/lang/gmq/sv
  26. 2
    0
      espeak-ng-data/lang/gmw/af
  27. 3
    0
      espeak-ng-data/lang/gmw/de
  28. 1
    0
      espeak-ng-data/lang/gmw/en
  29. 2
    0
      espeak-ng-data/lang/gmw/nl
  30. 1
    0
      espeak-ng-data/lang/grk/el
  31. 1
    0
      espeak-ng-data/lang/grk/grc
  32. 2
    0
      espeak-ng-data/lang/inc/as
  33. 1
    0
      espeak-ng-data/lang/inc/bn
  34. 1
    0
      espeak-ng-data/lang/inc/bpy
  35. 1
    0
      espeak-ng-data/lang/inc/gu
  36. 1
    0
      espeak-ng-data/lang/inc/hi
  37. 1
    0
      espeak-ng-data/lang/inc/mr
  38. 1
    0
      espeak-ng-data/lang/inc/ne
  39. 1
    0
      espeak-ng-data/lang/inc/or
  40. 1
    0
      espeak-ng-data/lang/inc/pa
  41. 1
    0
      espeak-ng-data/lang/inc/si
  42. 1
    1
      espeak-ng-data/lang/inc/ur
  43. 1
    0
      espeak-ng-data/lang/ine/hy
  44. 2
    1
      espeak-ng-data/lang/ine/sq
  45. 1
    1
      espeak-ng-data/lang/ira/ku
  46. 1
    1
      espeak-ng-data/lang/itc/la
  47. 1
    0
      espeak-ng-data/lang/ko
  48. 1
    1
      espeak-ng-data/lang/poz/id
  49. 2
    0
      espeak-ng-data/lang/poz/ms
  50. 1
    0
      espeak-ng-data/lang/roa/an
  51. 1
    0
      espeak-ng-data/lang/roa/ca
  52. 1
    0
      espeak-ng-data/lang/roa/es
  53. 2
    0
      espeak-ng-data/lang/roa/fr
  54. 1
    1
      espeak-ng-data/lang/roa/fr-BE
  55. 1
    0
      espeak-ng-data/lang/roa/fr-CH
  56. 2
    0
      espeak-ng-data/lang/roa/it
  57. 1
    1
      espeak-ng-data/lang/roa/pap
  58. 2
    0
      espeak-ng-data/lang/roa/pt
  59. 1
    1
      espeak-ng-data/lang/roa/pt-BR
  60. 1
    0
      espeak-ng-data/lang/sai/gn
  61. 1
    0
      espeak-ng-data/lang/sem/am
  62. 1
    0
      espeak-ng-data/lang/sem/mt
  63. 1
    0
      espeak-ng-data/lang/trk/az
  64. 1
    0
      espeak-ng-data/lang/trk/tr
  65. 1
    0
      espeak-ng-data/lang/trk/tt
  66. 2
    0
      espeak-ng-data/lang/urj/fi
  67. 2
    2
      espeak-ng-data/lang/urj/hu
  68. 1
    0
      espeak-ng-data/lang/zle/ru
  69. 3
    0
      espeak-ng-data/lang/zls/bg
  70. 3
    0
      espeak-ng-data/lang/zls/bs
  71. 3
    0
      espeak-ng-data/lang/zls/hr
  72. 1
    0
      espeak-ng-data/lang/zls/mk
  73. 1
    0
      espeak-ng-data/lang/zls/sl
  74. 4
    0
      espeak-ng-data/lang/zls/sr
  75. 3
    0
      espeak-ng-data/lang/zlw/cs
  76. 2
    0
      espeak-ng-data/lang/zlw/pl
  77. 3
    0
      espeak-ng-data/lang/zlw/sk
  78. 0
    82
      src/libespeak-ng/tr_languages.c
  79. 29
    2
      src/libespeak-ng/voices.c

+ 21
- 1
docs/voices.md View File

- [dictionary](#dictionary) - [dictionary](#dictionary)
- [dictrules](#dictrules) - [dictrules](#dictrules)
- [replace](#replace) - [replace](#replace)
- [stressRule](#stressrule)
- [stressLength](#stresslength) - [stressLength](#stresslength)
- [stressAdd](#stressadd) - [stressAdd](#stressadd)
- [stressAmp](#stressamp) - [stressAmp](#stressamp)
- [intonation](#intonation) - [intonation](#intonation)
- [dictmin](#dictmin) - [dictmin](#dictmin)
- [letterVowel](#letterVowel)
---------- ----------


A Voice file specifies a language (and possibly a language variant or A Voice file specifies a language (and possibly a language variant or
The phoneme mnemonics can be defined for each language, but some are The phoneme mnemonics can be defined for each language, but some are
listed in [Phonemes](phonemes.md). listed in [Phonemes](phonemes.md).


### stressRule

stressRule <4 integer values>

Four integer parameters. These correspond to:

1. langopts->stress_rule (values in translate.h)
2. langopts->stress_flags
3. langopts->unstressed_wd1 (stress for $u word of 1 syllable)
4. langopts->unstressed_wd2 (stress for $u word of >1 syllable)

All parameters are not required. For example, "stressRule 2 1" is valid.

### stressLength ### stressLength


stressLength <8 integer values> stressLength <8 integer values>
installed. If the size of the compiled dictionary data for the language installed. If the size of the compiled dictionary data for the language
(the file `espeak-ng-data/*_dict`) is less than this size then a (the file `espeak-ng-data/*_dict`) is less than this size then a
warning is given. warning is given.

### letterVowel

letterVowel <letter>

Used for some languages to handle a certain letter as a vowel instead of consonant.

+ 1
- 0
espeak-ng-data/lang/aav/vi View File



words 1 words 1
pitch 80 118 pitch 80 118
stressRule 0

+ 1
- 0
espeak-ng-data/lang/art/eo View File

language eo language eo


apostrophe 2 apostrophe 2
stressRule 2

+ 1
- 0
espeak-ng-data/lang/art/ia View File

name Interlingua name Interlingua
language ia language ia
stressRule 2

+ 2
- 0
espeak-ng-data/lang/art/jbo View File

language jbo language jbo


speed 80 // speed adjustment, percentage speed 80 // speed adjustment, percentage
letterVowel y
stressRule 2

+ 1
- 1
espeak-ng-data/lang/azc/nci View File

language nci language nci


intonation 3 intonation 3
stressrule 2
stressRule 2
stressLength 190 190 200 200 0 0 220 240 stressLength 190 190 200 200 0 0 220 240

+ 1
- 0
espeak-ng-data/lang/bat/lt View File

name Lithuanian name Lithuanian
language lt language lt
stressRule 2

+ 1
- 0
espeak-ng-data/lang/bat/lv View File

tone 150 220 450 255 750 20 3500 255 tone 150 220 450 255 750 20 3500 255
stressAmp 12 10 8 8 0 0 18 15 stressAmp 12 10 8 8 0 0 18 15
stressLength 160 140 200 140 0 0 240 180 stressLength 160 140 200 140 0 0 240 180
stressRule 0

+ 1
- 0
espeak-ng-data/lang/bnt/sw View File

language sw language sw


status testing status testing
stressRule 2

+ 1
- 0
espeak-ng-data/lang/bnt/tn View File

language tn language tn


status testing status testing
stressRule 2

+ 1
- 0
espeak-ng-data/lang/ccs/ka View File

name Georgian name Georgian
language ka language ka
stressRule 0

+ 3
- 0
espeak-ng-data/lang/cel/cy View File

language cy language cy


intonation 4 intonation 4
letterVowel w
letterVowel y
stressRule 2

+ 1
- 0
espeak-ng-data/lang/cel/ga View File

language ga language ga


dictrules 1 // fix for eclipsis dictrules 1 // fix for eclipsis
stressRule 0

+ 1
- 0
espeak-ng-data/lang/cel/gd View File

language gd language gd


status testing status testing
stressRule 0

+ 1
- 0
espeak-ng-data/lang/cus/om View File

language om language om


status testing status testing
stressRule 2

+ 1
- 0
espeak-ng-data/lang/dra/kn View File



intonation 2 intonation 2
//consonants 80 //consonants 80
stressRule 0

+ 1
- 0
espeak-ng-data/lang/dra/ml View File



intonation 2 intonation 2
//consonants 80 //consonants 80
stressRule 13

+ 1
- 0
espeak-ng-data/lang/dra/ta View File



intonation 2 intonation 2
consonants 80 consonants 80
stressRule 0

+ 1
- 0
espeak-ng-data/lang/dra/te View File



intonation 2 intonation 2
//consonants 80 //consonants 80
stressRule 0

+ 1
- 0
espeak-ng-data/lang/esx/kl View File

name Greenlandic name Greenlandic
language kl language kl


stressRule 12

+ 1
- 0
espeak-ng-data/lang/eu View File

language eu language eu


status testing status testing
stressRule 1

+ 2
- 0
espeak-ng-data/lang/gmq/da View File

language da language da


tunes s2 c2 q2 e2 tunes s2 c2 q2 e2
letterVowel y
stressRule 0

+ 2
- 0
espeak-ng-data/lang/gmq/is View File

name Icelandic name Icelandic
language is language is
letterVowel y
stressRule 0

+ 2
- 0
espeak-ng-data/lang/gmq/nb View File

dictionary no dictionary no


intonation 4 intonation 4
letterVowel y
stressRule 0

+ 2
- 0
espeak-ng-data/lang/gmq/sv View File

name Swedish name Swedish
language sv language sv
letterVowel y
stressRule 0

+ 2
- 0
espeak-ng-data/lang/gmw/af View File



roughness 0 roughness 0
pitch 63 120 pitch 63 120
letterVowel y
stressRule 0

+ 3
- 0
espeak-ng-data/lang/gmw/de View File

name German name German
language de language de

letterVowel y
stressRule 0

+ 1
- 0
espeak-ng-data/lang/gmw/en View File

status mature status mature


tunes s1 c1 q1 e1 tunes s1 c1 q1 e1
stressRule 0

+ 2
- 0
espeak-ng-data/lang/gmw/nl View File

name Dutch name Dutch
language nl language nl
letterVowel y
stressRule 0

+ 1
- 0
espeak-ng-data/lang/grk/el View File

name Greek name Greek
language el language el
stressRule 2

+ 1
- 0
espeak-ng-data/lang/grk/grc View File

language grc language grc


stressLength 170 170 190 190 0 0 230 240 stressLength 170 170 190 190 0 0 230 240
stressRule 2
dictrules 1 dictrules 1
words 3 words 3

+ 2
- 0
espeak-ng-data/lang/inc/as View File

language as language as


status testing status testing

stressRule 0

+ 1
- 0
espeak-ng-data/lang/inc/bn View File

name Bengali name Bengali
language bn language bn
stressRule 0

+ 1
- 0
espeak-ng-data/lang/inc/bpy View File

name Bishnupriya Manipuri name Bishnupriya Manipuri
language bpy language bpy
stressRule 0

+ 1
- 0
espeak-ng-data/lang/inc/gu View File

language gu language gu


status testing status testing
stressRule 2

+ 1
- 0
espeak-ng-data/lang/inc/hi View File

name Hindi name Hindi
language hi language hi
stressRule 6

+ 1
- 0
espeak-ng-data/lang/inc/mr View File

language mr language mr


status testing status testing
stressRule 6

+ 1
- 0
espeak-ng-data/lang/inc/ne View File

language ne language ne


dictrules 1 dictrules 1
stressRule 6

+ 1
- 0
espeak-ng-data/lang/inc/or View File

language or language or


status testing status testing
stressRule 6

+ 1
- 0
espeak-ng-data/lang/inc/pa View File

name Punjabi name Punjabi
language pa language pa
stressRule 6

+ 1
- 0
espeak-ng-data/lang/inc/si View File

status testing status testing


intonation 2 intonation 2
stressRule 0

+ 1
- 1
espeak-ng-data/lang/inc/ur View File

maintainer Ejaz Shah <[email protected]> maintainer Ejaz Shah <[email protected]>
status testing status testing


stressrule 6
stressRule 6



+ 1
- 0
espeak-ng-data/lang/ine/hy View File

name Armenian (East Armenia) name Armenian (East Armenia)
language hy language hy
language hy-arevela language hy-arevela
stressRule 3

+ 2
- 1
espeak-ng-data/lang/ine/sq View File

name Albanian name Albanian
language sq language sq

letterVowel y
stressRule 3
// add this line to remove 'ë' at the end of words // add this line to remove 'ë' at the end of words
// replace 00 @/ NULL // replace 00 @/ NULL

+ 1
- 1
espeak-ng-data/lang/ira/ku View File

language ku language ku


//words 1 48 //words 1 48
stressRule 7

+ 1
- 1
espeak-ng-data/lang/itc/la View File

name Latin name Latin
language la language la
stressrule 2 33 0 2
stressRule 2 33 0 2
// rule=penultimate // rule=penultimate
// flags=0100001 (no automatic secondary stress + don't stres monosyllables) // flags=0100001 (no automatic secondary stress + don't stres monosyllables)
// unstressed_wd1=0 // unstressed_wd1=0

+ 1
- 0
espeak-ng-data/lang/ko View File

pitch 80 118 pitch 80 118
intonation 2 intonation 2


stressRule 8

+ 1
- 1
espeak-ng-data/lang/poz/id View File



stressLength 160 200 180 180 0 0 220 240 stressLength 160 200 180 180 0 0 220 240
stressAmp 16 18 18 18 0 0 22 21 stressAmp 16 18 18 18 0 0 22 21
stressRule 2
consonants 80 80 consonants 80 80

+ 2
- 0
espeak-ng-data/lang/poz/ms View File



stressLength 160 200 180 180 0 0 220 240 stressLength 160 200 180 180 0 0 220 240
stressAmp 16 18 18 18 0 0 22 21 stressAmp 16 18 18 18 0 0 22 21
stressRule 2
intonation 3 // Less intonation, and comma does not raise the pitch. intonation 3 // Less intonation, and comma does not raise the pitch.


// Nuance - Peninsula Malaysia // Nuance - Peninsula Malaysia
// (only the last phoneme of a word, only in unstressed syllables) // (only the last phoneme of a word, only in unstressed syllables)
consonants 80 80 consonants 80 80


+ 1
- 0
espeak-ng-data/lang/roa/an View File

name Aragonese name Aragonese
language an language an
stressRule 2

+ 1
- 0
espeak-ng-data/lang/roa/ca View File

name Catalan name Catalan
language ca language ca
stressRule 2

+ 1
- 0
espeak-ng-data/lang/roa/es View File

language es language es
dictrules 1 dictrules 1
tunes s6 c6 q6 e6 tunes s6 c6 q6 e6
stressRule 2

+ 2
- 0
espeak-ng-data/lang/roa/fr View File



dictrules 1 dictrules 1
tunes s3 c3 q3 e3 tunes s3 c3 q3 e3
letterVowel y
stressRule 3

+ 1
- 1
espeak-ng-data/lang/roa/fr-BE View File



dictrules 2 dictrules 2
tunes s3 c3 q3 e3 tunes s3 c3 q3 e3
letterVowel y



+ 1
- 0
espeak-ng-data/lang/roa/fr-CH View File



dictrules 3 dictrules 3
tunes s3 c3 q3 e3 tunes s3 c3 q3 e3
letterVowel y

+ 2
- 0
espeak-ng-data/lang/roa/it View File

status mature status mature


tunes s4 c4 q4 e4 tunes s4 c4 q4 e4
letterVowel y
stressRule 2

+ 1
- 1
espeak-ng-data/lang/roa/pap View File

status testing status testing


phonemes base2 phonemes base2
stressRule 3

+ 2
- 0
espeak-ng-data/lang/roa/pt View File



dictrules 1 dictrules 1
intonation 2 intonation 2
letterVowel y
stressRule 3

+ 1
- 1
espeak-ng-data/lang/roa/pt-BR View File



dictrules 2 dictrules 2
stressLength 200 115 230 230 0 0 250 270 stressLength 200 115 230 230 0 0 250 270
stressRule 3

+ 1
- 0
espeak-ng-data/lang/sai/gn View File

language gn language gn
dictrules 1 dictrules 1
words 0 1 words 0 1
stressRule 3

+ 1
- 0
espeak-ng-data/lang/sem/am View File

language am language am


status testing status testing
stressRule 0

+ 1
- 0
espeak-ng-data/lang/sem/mt View File

language mt language mt


status testing status testing
stressRule 2

+ 1
- 0
espeak-ng-data/lang/trk/az View File

language az language az


status testing status testing
stressRule 7

+ 1
- 0
espeak-ng-data/lang/trk/tr View File

name Turkish name Turkish
language tr language tr
stressRule 7

+ 1
- 0
espeak-ng-data/lang/trk/tt View File

name Tatar name Tatar
language tt language tt
stressRule 3

+ 2
- 0
espeak-ng-data/lang/urj/fi View File

name Finnish name Finnish
language fi language fi
letterVowel y
stressRule 0

+ 2
- 2
espeak-ng-data/lang/urj/hu View File

language hu language hu
option bracket 0 0 option bracket 0 0
pitch 81 117 pitch 81 117
letterVowel y
stressRule 0

+ 1
- 0
espeak-ng-data/lang/zle/ru View File

replace 03 a a# replace 03 a a#


dict_min 20000 dict_min 20000
stressRule 5

+ 3
- 0
espeak-ng-data/lang/zls/bg View File



stressAmp 13 12 17 17 20 22 22 21 stressAmp 13 12 17 17 20 22 22 21
stressLength 180 170 200 200 200 200 210 220 stressLength 180 170 200 200 200 200 210 220
stressRule 2
letterVowel 0x2a


+ 3
- 0
espeak-ng-data/lang/zls/bs View File



stressAdd 10 10 0 0 0 0 -30 -30 stressAdd 10 10 0 0 0 0 -30 -30
dictrules 3 4 dictrules 3 4
letterVowel y
letterVowel r
stressRule 0

+ 3
- 0
espeak-ng-data/lang/zls/hr View File



stressAdd 10 10 0 0 0 0 -30 -30 stressAdd 10 10 0 0 0 0 -30 -30
dictrules 1 dictrules 1
letterVowel y
letterVowel r
stressRule 0

+ 1
- 0
espeak-ng-data/lang/zls/mk View File

name Macedonian name Macedonian
language mk language mk
stressRule 4

+ 1
- 0
espeak-ng-data/lang/zls/sl View File

language sl language sl


status testing status testing
stressRule 2

+ 4
- 0
espeak-ng-data/lang/zls/sr View File



stressAdd 10 10 0 0 0 0 -30 -30 stressAdd 10 10 0 0 0 0 -30 -30
dictrules 2 4 dictrules 2 4

letterVowel y
letterVowel r
stressRule 0

+ 3
- 0
espeak-ng-data/lang/zlw/cs View File

name Czech name Czech
language cs language cs
letterVowel y
letterVowel r
stressRule 0

+ 2
- 0
espeak-ng-data/lang/zlw/pl View File

language pl language pl


intonation 2 intonation 2
letterVowel y
stressRule 2

+ 3
- 0
espeak-ng-data/lang/zlw/sk View File

name Slovak name Slovak
language sk language sk
letterVowel y
letterVowel r
stressRule 0

+ 0
- 82
src/libespeak-ng/tr_languages.c View File



static void Translator_Russian(Translator *tr); static void Translator_Russian(Translator *tr);


static void SetLetterVowel(Translator *tr, int c)
{
tr->letter_bits[c] = (tr->letter_bits[c] & 0x40) | 0x81; // keep value for group 6 (front vowels e,i,y)
}

static void ResetLetterBits(Translator *tr, int groups) static void ResetLetterBits(Translator *tr, int groups)
{ {
// Clear all the specified groups // Clear all the specified groups
static const short stress_lengths_af[8] = { 170, 140, 220, 220, 0, 0, 250, 270 }; static const short stress_lengths_af[8] = { 170, 140, 220, 220, 0, 0, 250, 270 };
SetupTranslator(tr, stress_lengths_af, NULL); SetupTranslator(tr, stress_lengths_af, NULL);


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.vowel_pause = 0x30; tr->langopts.vowel_pause = 0x30;
tr->langopts.param[LOPT_DIERESES] = 1; tr->langopts.param[LOPT_DIERESES] = 1;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
SetLetterVowel(tr, 'y'); // add 'y' to vowels


tr->langopts.numbers = NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_SINGLE_AND | NUM_ROMAN | NUM_1900; tr->langopts.numbers = NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_SINGLE_AND | NUM_ROMAN | NUM_1900;
tr->langopts.accents = 1; tr->langopts.accents = 1;
{ {
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); SetupTranslator(tr, stress_lengths_fr, stress_amps_fr);
tr->letter_bits_offset = OFFSET_ETHIOPIC; tr->letter_bits_offset = OFFSET_ETHIOPIC;
tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM; // don't use secondary stress tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM; // don't use secondary stress
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words
case L('b', 'g'): // Bulgarian case L('b', 'g'): // Bulgarian
{ {
SetCyrillicLetters(tr); SetCyrillicLetters(tr);
SetLetterVowel(tr, 0x2a);
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_5; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_5;
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x107; // devoice at end of word, and change voicing to match a following consonant (except v) tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x107; // devoice at end of word, and change voicing to match a following consonant (except v)
tr->langopts.param[LOPT_REDUCE] = 2; tr->langopts.param[LOPT_REDUCE] = 2;
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_SINGLE_AND | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_SINGLE_AND | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS;
tr->langopts.thousands_sep = ' '; // don't allow dot as thousands separator tr->langopts.thousands_sep = ' '; // don't allow dot as thousands separator
} }
SetupTranslator(tr, stress_lengths_bn, stress_amps_bn); SetupTranslator(tr, stress_lengths_bn, stress_amps_bn);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_MID_DIM | S_FINAL_DIM; // use 'diminished' for unstressed final syllable tr->langopts.stress_flags = S_MID_DIM | S_FINAL_DIM; // use 'diminished' for unstressed final syllable
tr->letter_bits_offset = OFFSET_BENGALI; tr->letter_bits_offset = OFFSET_BENGALI;
SetIndicLetters(tr); // call this after setting OFFSET_BENGALI SetIndicLetters(tr); // call this after setting OFFSET_BENGALI
SetupTranslator(tr, stress_lengths_cy, stress_amps_cy); SetupTranslator(tr, stress_lengths_cy, stress_amps_cy);


tr->encoding = ESPEAKNG_ENCODING_ISO_8859_14; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_14;
tr->langopts.stress_rule = STRESSPOSN_2R;


// 'diminished' is an unstressed final syllable // 'diminished' is an unstressed final syllable
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2;


tr->langopts.numbers = NUM_OMIT_1_HUNDRED; tr->langopts.numbers = NUM_OMIT_1_HUNDRED;


SetLetterVowel(tr, 'w'); // add letter to vowels and remove from consonants
SetLetterVowel(tr, 'y');
} }
break; break;
case L('d', 'a'): // Danish case L('d', 'a'): // Danish
static const short stress_lengths_da[8] = { 160, 140, 200, 200, 0, 0, 220, 230 }; static const short stress_lengths_da[8] = { 160, 140, 200, 200, 0, 0, 220, 230 };
SetupTranslator(tr, stress_lengths_da, NULL); SetupTranslator(tr, stress_lengths_da, NULL);


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
SetLetterVowel(tr, 'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL;
} }
break; break;
static const short stress_lengths_de[8] = { 150, 130, 200, 200, 0, 0, 270, 270 }; static const short stress_lengths_de[8] = { 150, 130, 200, 200, 0, 0, 270, 270 };
static const unsigned char stress_amps_de[] = { 20, 20, 20, 20, 20, 22, 22, 20 }; static const unsigned char stress_amps_de[] = { 20, 20, 20, 20, 20, 22, 22, 20 };
SetupTranslator(tr, stress_lengths_de, stress_amps_de); SetupTranslator(tr, stress_lengths_de, stress_amps_de);
tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.word_gap = 0x8; // don't use linking phonemes tr->langopts.word_gap = 0x8; // don't use linking phonemes
tr->langopts.vowel_pause = 0x30; tr->langopts.vowel_pause = 0x30;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
tr->langopts.param[LOPT_LONG_VOWEL_THRESHOLD] = 175/2; tr->langopts.param[LOPT_LONG_VOWEL_THRESHOLD] = 175/2;


tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_ALLOW_SPACE | NUM_ORDINAL_DOT | NUM_ROMAN; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_ALLOW_SPACE | NUM_ORDINAL_DOT | NUM_ROMAN;
SetLetterVowel(tr, 'y');
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use de_rules for unpronouncable rules tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use de_rules for unpronouncable rules
} }
break; break;
static const short stress_lengths_en[8] = { 182, 140, 220, 220, 0, 0, 248, 275 }; static const short stress_lengths_en[8] = { 182, 140, 220, 220, 0, 0, 248, 275 };
SetupTranslator(tr, stress_lengths_en, NULL); SetupTranslator(tr, stress_lengths_en, NULL);


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = 0x08; tr->langopts.stress_flags = 0x08;
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900; tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900;
tr->langopts.param[LOPT_COMBINE_WORDS] = 2; // allow "mc" to cmbine with the following word tr->langopts.param[LOPT_COMBINE_WORDS] = 2; // allow "mc" to cmbine with the following word
SetLetterBits(tr, LETTERGP_Y, el_fvowels); // front vowels: ε η ι υ _ SetLetterBits(tr, LETTERGP_Y, el_fvowels); // front vowels: ε η ι υ _


tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY; // mark unstressed final syllables as diminished tr->langopts.stress_flags = S_FINAL_DIM_ONLY; // mark unstressed final syllables as diminished
tr->langopts.unstressed_wd1 = 0; tr->langopts.unstressed_wd1 = 0;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;
tr->char_plus_apostrophe = eo_char_apostrophe; tr->char_plus_apostrophe = eo_char_apostrophe;


tr->langopts.vowel_pause = 2; tr->langopts.vowel_pause = 2;
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;


SetupTranslator(tr, stress_lengths_es, stress_amps_es); SetupTranslator(tr, stress_lengths_es, stress_amps_es);


tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.stress_rule = STRESSPOSN_2R;


// stress last syllable if it doesn't end in vowel or "s" or "n" // stress last syllable if it doesn't end in vowel or "s" or "n"
// 'diminished' is an unstressed final syllable // 'diminished' is an unstressed final syllable
tr->langopts.roman_suffix = utf8_ordinal; tr->langopts.roman_suffix = utf8_ordinal;
} else if (name2 == L_pap) { } else if (name2 == L_pap) {
// stress last syllable unless word ends with a vowel // stress last syllable unless word ends with a vowel
tr->langopts.stress_rule = STRESSPOSN_1R;
tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED | S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2; tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED | S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2;
} else } else
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use es_rules for unpronouncable rules tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use es_rules for unpronouncable rules
static const short stress_lengths_eu[8] = { 200, 200, 200, 200, 0, 0, 210, 230 }; // very weak stress static const short stress_lengths_eu[8] = { 200, 200, 200, 200, 0, 0, 210, 230 }; // very weak stress
static const unsigned char stress_amps_eu[8] = { 16, 16, 18, 18, 18, 18, 18, 18 }; static const unsigned char stress_amps_eu[8] = { 16, 16, 18, 18, 18, 18, 18, 18 };
SetupTranslator(tr, stress_lengths_eu, stress_amps_eu); SetupTranslator(tr, stress_lengths_eu, stress_amps_eu);
tr->langopts.stress_rule = STRESSPOSN_2L; // ?? second syllable, but not on a word-final vowel
tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED; tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED;
tr->langopts.param[LOPT_SUFFIX] = 1; tr->langopts.param[LOPT_SUFFIX] = 1;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_VIGESIMAL; tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_VIGESIMAL;


SetupTranslator(tr, stress_lengths_fi, stress_amps_fi); SetupTranslator(tr, stress_lengths_fi, stress_amps_fi);


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_2_TO_HEAVY; // move secondary stress from light to a following heavy syllable tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_2_TO_HEAVY; // move secondary stress from light to a following heavy syllable
tr->langopts.param[LOPT_IT_DOUBLING] = 1; tr->langopts.param[LOPT_IT_DOUBLING] = 1;
tr->langopts.long_stop = 130; tr->langopts.long_stop = 130;


tr->langopts.numbers = NUM_DECIMAL_COMMA + NUM_ALLOW_SPACE; tr->langopts.numbers = NUM_DECIMAL_COMMA + NUM_ALLOW_SPACE;
SetLetterVowel(tr, 'y');
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;
tr->langopts.intonation_group = 3; // less intonation, don't raise pitch at comma tr->langopts.intonation_group = 3; // less intonation, don't raise pitch at comma
} }
case L('f', 'r'): // french case L('f', 'r'): // french
{ {
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); SetupTranslator(tr, stress_lengths_fr, stress_amps_fr);
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable
tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM; // don't use secondary stress tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM; // don't use secondary stress
tr->langopts.param[LOPT_IT_LENGTHEN] = 1; // remove lengthen indicator from unstressed syllables tr->langopts.param[LOPT_IT_LENGTHEN] = 1; // remove lengthen indicator from unstressed syllables
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.accents = 2; // Say "Capital" after the letter. tr->langopts.accents = 2; // Say "Capital" after the letter.


tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_AFTER | NUM_VIGESIMAL | NUM_DFRACTION_4; tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_AFTER | NUM_VIGESIMAL | NUM_DFRACTION_4;
SetLetterVowel(tr, 'y');
} }
break; break;
case L('g', 'a'): // irish case L('g', 'a'): // irish
tr->encoding = ESPEAKNG_ENCODING_ISCII; tr->encoding = ESPEAKNG_ENCODING_ISCII;
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = 6; // stress on last heaviest syllable, excluding final syllable
tr->langopts.stress_flags = S_MID_DIM | S_FINAL_DIM; // use 'diminished' for unstressed final syllable tr->langopts.stress_flags = S_MID_DIM | S_FINAL_DIM; // use 'diminished' for unstressed final syllable
tr->langopts.numbers = NUM_SWAP_TENS; tr->langopts.numbers = NUM_SWAP_TENS;
tr->langopts.break_numbers = 0x14aa8; // for languages which have numbers for 100,000 and 100,00,000, eg Hindi tr->langopts.break_numbers = 0x14aa8; // for languages which have numbers for 100,000 and 100,00,000, eg Hindi
else if (name2 == L('g', 'u')) { else if (name2 == L('g', 'u')) {
SetupTranslator(tr, stress_lengths_equal, stress_amps_equal); SetupTranslator(tr, stress_lengths_equal, stress_amps_equal);
tr->letter_bits_offset = OFFSET_GUJARATI; tr->letter_bits_offset = OFFSET_GUJARATI;
tr->langopts.stress_rule = STRESSPOSN_2R;
} else if (name2 == L('n', 'e')) { } else if (name2 == L('n', 'e')) {
SetupTranslator(tr, stress_lengths_equal, stress_amps_equal); SetupTranslator(tr, stress_lengths_equal, stress_amps_equal);
tr->langopts.break_numbers = 0x2aaaa8; tr->langopts.break_numbers = 0x2aaaa8;
SetupTranslator(tr, stress_lengths_hr, stress_amps_hr); SetupTranslator(tr, stress_lengths_hr, stress_amps_hr);
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2;


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_NO_2;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3;
tr->langopts.max_initial_consonants = 5; tr->langopts.max_initial_consonants = 5;
tr->langopts.replace_chars = replace_cyrillic_latin; tr->langopts.replace_chars = replace_cyrillic_latin;
tr->langopts.our_alphabet = OFFSET_CYRILLIC; // don't say "cyrillic" before letter names tr->langopts.our_alphabet = OFFSET_CYRILLIC; // don't say "cyrillic" before letter names


SetLetterVowel(tr, 'y');
SetLetterVowel(tr, 'r');
} }
break; break;
case L('h', 't'): // Haitian Creole case L('h', 't'): // Haitian Creole
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2;


tr->langopts.vowel_pause = 0x20; tr->langopts.vowel_pause = 0x20;
tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2 | 0x8000 | S_HYPEN_UNSTRESS; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2 | 0x8000 | S_HYPEN_UNSTRESS;
tr->langopts.unstressed_wd1 = 2; tr->langopts.unstressed_wd1 = 2;
tr->langopts.param[LOPT_IT_DOUBLING] = 1; tr->langopts.param[LOPT_IT_DOUBLING] = 1;
tr->langopts.decimal_sep = ','; tr->langopts.decimal_sep = ',';
tr->langopts.max_roman = 899; tr->langopts.max_roman = 899;
tr->langopts.min_roman = 1; tr->langopts.min_roman = 1;
SetLetterVowel(tr, 'y');
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;
SetLengthMods(tr, 3); // all equal SetLengthMods(tr, 3); // all equal
} }
static const char hy_consonants2[] = { 0x45, 0 }; static const char hy_consonants2[] = { 0x45, 0 };


SetupTranslator(tr, stress_lengths_hy, NULL); SetupTranslator(tr, stress_lengths_hy, NULL);
tr->langopts.stress_rule = STRESSPOSN_1R; // default stress on final syllable


tr->letter_bits_offset = OFFSET_ARMENIAN; tr->letter_bits_offset = OFFSET_ARMENIAN;
memset(tr->letter_bits, 0, sizeof(tr->letter_bits)); memset(tr->letter_bits, 0, sizeof(tr->letter_bits));
static const unsigned char stress_amps_id[8] = { 16, 18, 18, 18, 20, 22, 22, 21 }; static const unsigned char stress_amps_id[8] = { 16, 18, 18, 18, 20, 22, 22, 21 };


SetupTranslator(tr, stress_lengths_id, stress_amps_id); SetupTranslator(tr, stress_lengths_id, stress_amps_id);
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_ROMAN; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_ROMAN;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2;
tr->langopts.accents = 2; // "capital" after letter name tr->langopts.accents = 2; // "capital" after letter name
static const wchar_t is_lettergroup_B[] = { 'c', 'f', 'h', 'k', 'p', 't', 'x', 0xfe, 0 }; // voiceless conants, including 'þ' ?? 's' static const wchar_t is_lettergroup_B[] = { 'c', 'f', 'h', 'k', 'p', 't', 'x', 0xfe, 0 }; // voiceless conants, including 'þ' ?? 's'


SetupTranslator(tr, stress_lengths_is, NULL); SetupTranslator(tr, stress_lengths_is, NULL);
tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_NO_2;
tr->langopts.param[LOPT_IT_LENGTHEN] = 0x11; // remove lengthen indicator from unstressed vowels tr->langopts.param[LOPT_IT_LENGTHEN] = 0x11; // remove lengthen indicator from unstressed vowels
tr->langopts.param[LOPT_REDUCE] = 2; tr->langopts.param[LOPT_REDUCE] = 2;
SetLetterBits(tr, 4, "kpst"); // Letter group F SetLetterBits(tr, 4, "kpst"); // Letter group F
SetLetterBits(tr, 3, "jvr"); // Letter group H SetLetterBits(tr, 3, "jvr"); // Letter group H
tr->letter_groups[1] = is_lettergroup_B; tr->letter_groups[1] = is_lettergroup_B;
SetLetterVowel(tr, 'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SINGLE_AND | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_1900; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SINGLE_AND | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_1900;
tr->langopts.numbers2 = 0x2; tr->langopts.numbers2 = 0x2;
} }
static const unsigned char stress_amps_it[8] = { 17, 15, 18, 16, 20, 22, 22, 22 }; static const unsigned char stress_amps_it[8] = { 17, 15, 18, 16, 20, 22, 22, 22 };
SetupTranslator(tr, stress_lengths_it, stress_amps_it); SetupTranslator(tr, stress_lengths_it, stress_amps_it);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM_ONLY | S_PRIORITY_STRESS; tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM_ONLY | S_PRIORITY_STRESS;
tr->langopts.vowel_pause = 1; tr->langopts.vowel_pause = 1;
tr->langopts.unstressed_wd1 = 0; tr->langopts.unstressed_wd1 = 0;
tr->langopts.numbers2 = NUM2_NO_TEEN_ORDINALS; tr->langopts.numbers2 = NUM2_NO_TEEN_ORDINALS;
tr->langopts.roman_suffix = utf8_ordinal; tr->langopts.roman_suffix = utf8_ordinal;
tr->langopts.accents = 2; // Say "Capital" after the letter. tr->langopts.accents = 2; // Say "Capital" after the letter.
SetLetterVowel(tr, 'y');
} }
break; break;
case L_jbo: // Lojban case L_jbo: // Lojban
static const wchar_t jbo_punct_within_word[] = { '.', ',', '\'', 0x2c8, 0 }; // allow period and comma within a word, also stress marker (from LOPT_CAPS_IN_WORD) static const wchar_t jbo_punct_within_word[] = { '.', ',', '\'', 0x2c8, 0 }; // allow period and comma within a word, also stress marker (from LOPT_CAPS_IN_WORD)


SetupTranslator(tr, stress_lengths_jbo, NULL); SetupTranslator(tr, stress_lengths_jbo, NULL);
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant
tr->punct_within_word = jbo_punct_within_word; tr->punct_within_word = jbo_punct_within_word;
tr->langopts.param[LOPT_CAPS_IN_WORD] = 2; // capitals indicate stressed syllables tr->langopts.param[LOPT_CAPS_IN_WORD] = 2; // capitals indicate stressed syllables
SetLetterVowel(tr, 'y');
tr->langopts.max_lengthmod = 368; tr->langopts.max_lengthmod = 368;
} }
break; break;
SetLetterBits(tr, LETTERGP_C, ka_consonants); SetLetterBits(tr, LETTERGP_C, ka_consonants);
SetLetterBits(tr, LETTERGP_VOWEL2, ka_vowels); SetLetterBits(tr, LETTERGP_VOWEL2, ka_vowels);


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_NO_2;
tr->letter_bits_offset = OFFSET_GEORGIAN; tr->letter_bits_offset = OFFSET_GEORGIAN;
tr->langopts.max_initial_consonants = 7; tr->langopts.max_initial_consonants = 7;
case L('k', 'l'): // Greenlandic case L('k', 'l'): // Greenlandic
{ {
SetupTranslator(tr, stress_lengths_equal, stress_amps_equal); SetupTranslator(tr, stress_lengths_equal, stress_amps_equal);
tr->langopts.stress_rule = 12;
tr->langopts.stress_flags = S_NO_AUTO_2; tr->langopts.stress_flags = S_NO_AUTO_2;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL;
} }
SetLetterBits(tr, LETTERGP_Y, ko_ivowels); SetLetterBits(tr, LETTERGP_Y, ko_ivowels);
SetLetterBits(tr, LETTERGP_G, (const char *)ko_voiced); SetLetterBits(tr, LETTERGP_G, (const char *)ko_voiced);


tr->langopts.stress_rule = 8; // ?? 1st syllable if it is heavy, else 2nd syllable
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words
tr->langopts.numbers = NUM_OMIT_1_HUNDRED; tr->langopts.numbers = NUM_OMIT_1_HUNDRED;
tr->langopts.numbers2 = NUM2_MYRIADS; tr->langopts.numbers2 = NUM2_MYRIADS;
SetupTranslator(tr, stress_lengths_ku, stress_amps_ku); SetupTranslator(tr, stress_lengths_ku, stress_amps_ku);
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_9; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_9;


tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable

tr->langopts.numbers = NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_AND_HUNDRED; tr->langopts.numbers = NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_AND_HUNDRED;
tr->langopts.max_initial_consonants = 2; tr->langopts.max_initial_consonants = 2;
} }
case L('l', 'a'): // Latin case L('l', 'a'): // Latin
{ {
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; // includes a,e,i,o,u-macron tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; // includes a,e,i,o,u-macron
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_NO_AUTO_2;
tr->langopts.unstressed_wd1 = 0;
tr->langopts.unstressed_wd2 = 2;
tr->langopts.param[LOPT_DIERESES] = 1; tr->langopts.param[LOPT_DIERESES] = 1;
tr->langopts.numbers = NUM_ROMAN; tr->langopts.numbers = NUM_ROMAN;
tr->langopts.max_roman = 5000; tr->langopts.max_roman = 5000;
case L('l', 't'): // Lithuanian case L('l', 't'): // Lithuanian
{ {
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4;
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_NO_AUTO_2; tr->langopts.stress_flags = S_NO_AUTO_2;
tr->langopts.unstressed_wd1 = 0; tr->langopts.unstressed_wd1 = 0;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;


SetupTranslator(tr, stress_lengths_lv, stress_amps_lv); SetupTranslator(tr, stress_lengths_lv, stress_amps_lv);


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_4 | NUM_ORDINAL_DOT; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_4 | NUM_ORDINAL_DOT;
tr->letter_groups[0] = tr->letter_groups[7] = vowels_cyrillic; tr->letter_groups[0] = tr->letter_groups[7] = vowels_cyrillic;
tr->letter_bits_offset = OFFSET_CYRILLIC; tr->letter_bits_offset = OFFSET_CYRILLIC;


tr->langopts.stress_rule = STRESSPOSN_3R; // antipenultimate
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_2; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_2;
tr->langopts.numbers2 = 0x8a; // variant numbers before thousands,milliards tr->langopts.numbers2 = 0x8a; // variant numbers before thousands,milliards
} }
{ {
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_3; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_3;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word
tr->langopts.stress_rule = STRESSPOSN_2R; // penultimate
tr->langopts.numbers = 1; tr->langopts.numbers = 1;
} }
break; break;
{ {
static const short stress_lengths_nl[8] = { 160, 135, 210, 210, 0, 0, 260, 280 }; static const short stress_lengths_nl[8] = { 160, 135, 210, 210, 0, 0, 260, 280 };


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.vowel_pause = 0x30; // ?? tr->langopts.vowel_pause = 0x30; // ??
tr->langopts.param[LOPT_DIERESES] = 1; tr->langopts.param[LOPT_DIERESES] = 1;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word
SetLetterVowel(tr, 'y');


tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT;
tr->langopts.ordinal_indicator = "e"; tr->langopts.ordinal_indicator = "e";
static const short stress_lengths_no[8] = { 160, 140, 200, 200, 0, 0, 220, 230 }; static const short stress_lengths_no[8] = { 160, 140, 200, 200, 0, 0, 220, 230 };


SetupTranslator(tr, stress_lengths_no, NULL); SetupTranslator(tr, stress_lengths_no, NULL);
tr->langopts.stress_rule = STRESSPOSN_1L;
SetLetterVowel(tr, 'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT;
} }
break; break;
static const short stress_lengths_om[8] = { 200, 200, 200, 200, 0, 0, 200, 200 }; static const short stress_lengths_om[8] = { 200, 200, 200, 200, 0, 0, 200, 200 };


SetupTranslator(tr, stress_lengths_om, stress_amps_om); SetupTranslator(tr, stress_lengths_om, stress_amps_om);
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | 0x80000; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | 0x80000;
tr->langopts.numbers = NUM_OMIT_1_HUNDRED | NUM_HUNDRED_AND; tr->langopts.numbers = NUM_OMIT_1_HUNDRED | NUM_HUNDRED_AND;
tr->langopts.numbers2 = 0x200; // say "thousands" before its number tr->langopts.numbers2 = 0x200; // say "thousands" before its number
SetupTranslator(tr, stress_lengths_pl, stress_amps_pl); SetupTranslator(tr, stress_lengths_pl, stress_amps_pl);


tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2;
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY; // mark unstressed final syllables as diminished tr->langopts.stress_flags = S_FINAL_DIM_ONLY; // mark unstressed final syllables as diminished
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x9; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x9;
tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :)
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_2; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_2;
tr->langopts.numbers2 = NUM2_THOUSANDS_VAR3; tr->langopts.numbers2 = NUM2_THOUSANDS_VAR3;
tr->langopts.param[LOPT_COMBINE_WORDS] = 4 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable (and 2-syllable) words (marked with $alt) tr->langopts.param[LOPT_COMBINE_WORDS] = 4 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable (and 2-syllable) words (marked with $alt)
SetLetterVowel(tr, 'y');
} }
break; break;
case L('p', 't'): // Portuguese case L('p', 't'): // Portuguese
SetupTranslator(tr, stress_lengths_pt, stress_amps_pt); SetupTranslator(tr, stress_lengths_pt, stress_amps_pt);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_INITIAL_2 | S_PRIORITY_STRESS; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_INITIAL_2 | S_PRIORITY_STRESS;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN_CAPITALS; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN_CAPITALS;
tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS | NUM2_ORDINAL_NO_AND; tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS | NUM2_ORDINAL_NO_AND;
tr->langopts.max_roman = 5000; tr->langopts.max_roman = 5000;
SetLetterVowel(tr, 'y');
ResetLetterBits(tr, 0x2); ResetLetterBits(tr, 0x2);
SetLetterBits(tr, 1, "bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y SetLetterBits(tr, 1, "bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y
tr->langopts.param[LOPT_ALT] = 2; // call ApplySpecialAttributes2() if a word has $alt or $alt2 tr->langopts.param[LOPT_ALT] = 2; // call ApplySpecialAttributes2() if a word has $alt or $alt2


SetupTranslator(tr, stress_lengths_ro, stress_amps_ro); SetupTranslator(tr, stress_lengths_ro, stress_amps_ro);


tr->langopts.stress_rule = STRESSPOSN_1R;
tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED | S_FINAL_DIM_ONLY; tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED | S_FINAL_DIM_ONLY;


tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2;
SetupTranslator(tr, stress_lengths_sk, stress_amps_sk); SetupTranslator(tr, stress_lengths_sk, stress_amps_sk);
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2;


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3;
tr->langopts.max_initial_consonants = 5; tr->langopts.max_initial_consonants = 5;
if (name2 == L('c', 's')) if (name2 == L('c', 's'))
tr->langopts.numbers2 = 0x108; // variant numbers before milliards tr->langopts.numbers2 = 0x108; // variant numbers before milliards


SetLetterVowel(tr, 'y');
SetLetterVowel(tr, 'r');
ResetLetterBits(tr, 0x20); ResetLetterBits(tr, 0x20);
SetLetterBits(tr, 5, sk_voiced); SetLetterBits(tr, 5, sk_voiced);
} }
SetupTranslator(tr, stress_lengths_ta, stress_amps_ta); SetupTranslator(tr, stress_lengths_ta, stress_amps_ta);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2;
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;


break; break;
case L('s', 'l'): // Slovenian case L('s', 'l'): // Slovenian
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2;
tr->langopts.stress_rule = STRESSPOSN_2R; // Temporary
tr->langopts.stress_flags = S_NO_AUTO_2; tr->langopts.stress_flags = S_NO_AUTO_2;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x103; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x103;
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x76; // [v] don't count this character at start of word tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x76; // [v] don't count this character at start of word


SetupTranslator(tr, stress_lengths_sq, stress_amps_sq); SetupTranslator(tr, stress_lengths_sq, stress_amps_sq);


tr->langopts.stress_rule = STRESSPOSN_1R;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_FINAL_VOWEL_UNSTRESSED; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_FINAL_VOWEL_UNSTRESSED;
SetLetterVowel(tr, 'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_DFRACTION_4; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_DFRACTION_4;
tr->langopts.accents = 2; // "capital" after letter name tr->langopts.accents = 2; // "capital" after letter name
} }
static const short stress_lengths_sv[8] = { 160, 135, 220, 220, 0, 0, 250, 280 }; static const short stress_lengths_sv[8] = { 160, 135, 220, 220, 0, 0, 250, 280 };
SetupTranslator(tr, stress_lengths_sv, stress_amps_sv); SetupTranslator(tr, stress_lengths_sv, stress_amps_sv);


tr->langopts.stress_rule = STRESSPOSN_1L;
SetLetterVowel(tr, 'y');
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_1900; tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_1900;
tr->langopts.accents = 1; tr->langopts.accents = 1;
} }
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.vowel_pause = 1; tr->langopts.vowel_pause = 1;
tr->langopts.stress_rule = STRESSPOSN_2R;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2;
tr->langopts.max_initial_consonants = 4; // for example: mwngi tr->langopts.max_initial_consonants = 4; // for example: mwngi


SetupTranslator(tr, stress_lengths_ta2, stress_amps_ta); SetupTranslator(tr, stress_lengths_ta2, stress_amps_ta);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; // use 'diminished' for unstressed final syllable tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; // use 'diminished' for unstressed final syllable
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;
tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000 tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000
tr->letter_bits_offset = OFFSET_MALAYALAM; tr->letter_bits_offset = OFFSET_MALAYALAM;
tr->langopts.numbers = NUM_OMIT_1_THOUSAND | NUM_OMIT_1_HUNDRED; tr->langopts.numbers = NUM_OMIT_1_THOUSAND | NUM_OMIT_1_HUNDRED;
tr->langopts.numbers2 = NUM2_OMIT_1_HUNDRED_ONLY; tr->langopts.numbers2 = NUM2_OMIT_1_HUNDRED_ONLY;
tr->langopts.stress_rule = 13; // 1st syllable, unless 1st vowel is short and 2nd is long
} else if (name2 == L('k', 'n')) { } else if (name2 == L('k', 'n')) {
tr->letter_bits_offset = OFFSET_KANNADA; tr->letter_bits_offset = OFFSET_KANNADA;
tr->langopts.numbers = 0x1; tr->langopts.numbers = 0x1;
SetupTranslator(tr, stress_lengths_tr, stress_amps_tr); SetupTranslator(tr, stress_lengths_tr, stress_amps_tr);
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_9; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_9;


tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable
tr->langopts.stress_flags = S_NO_AUTO_2; // no automatic secondary stress tr->langopts.stress_flags = S_NO_AUTO_2; // no automatic secondary stress
tr->langopts.dotless_i = 1; tr->langopts.dotless_i = 1;
tr->langopts.param[LOPT_SUFFIX] = 1; tr->langopts.param[LOPT_SUFFIX] = 1;
{ {
SetCyrillicLetters(tr); SetCyrillicLetters(tr);
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); SetupTranslator(tr, stress_lengths_fr, stress_amps_fr);
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable
tr->langopts.stress_flags = S_NO_AUTO_2; // no automatic secondary stress tr->langopts.stress_flags = S_NO_AUTO_2; // no automatic secondary stress
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_4; tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_4;
} }
SetupTranslator(tr, stress_lengths_vi, stress_amps_vi); SetupTranslator(tr, stress_lengths_vi, stress_amps_vi);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word
tr->letter_groups[0] = tr->letter_groups[7] = vowels_vi; tr->letter_groups[0] = tr->letter_groups[7] = vowels_vi;
tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches()
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 1; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 1;
tr->langopts.param[LOPT_REDUCE] = 2; tr->langopts.param[LOPT_REDUCE] = 2;
tr->langopts.stress_rule = 5;
tr->langopts.stress_flags = S_NO_AUTO_2; tr->langopts.stress_flags = S_NO_AUTO_2;


tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED;

+ 29
- 2
src/libespeak-ng/voices.c View File



// these need a phoneme table to have been specified // these need a phoneme table to have been specified
V_REPLACE, V_REPLACE,
V_CONSONANTS
V_CONSONANTS,

// these are alpha features that need to be tested and categorized
V_LETTER_VOWEL

}; };


static MNEM_TAB options_tab[] = { static MNEM_TAB options_tab[] = {
{ "intonation", V_INTONATION }, { "intonation", V_INTONATION },
{ "tunes", V_TUNES }, { "tunes", V_TUNES },
{ "dictrules", V_DICTRULES }, { "dictrules", V_DICTRULES },
{ "stressrule", V_STRESSRULE },
{ "stressRule", V_STRESSRULE },
{ "stressopt", V_STRESSOPT }, { "stressopt", V_STRESSOPT },
{ "replace", V_REPLACE }, { "replace", V_REPLACE },
{ "words", V_WORDGAP }, { "words", V_WORDGAP },
{ "l_length_mods", 0x100+LOPT_LENGTH_MODS }, { "l_length_mods", 0x100+LOPT_LENGTH_MODS },
{ "apostrophe", 0x100+LOPT_APOSTROPHE }, { "apostrophe", 0x100+LOPT_APOSTROPHE },


// these are alpha features that need to be tested and categorized
{ "letterVowel", V_LETTER_VOWEL },
{ NULL, 0 } { NULL, 0 }
}; };


case V_MAINTAINER: case V_MAINTAINER:
case V_STATUS: case V_STATUS:
break; break;

case V_LETTER_VOWEL: {
char str[5] = "";
char c = '0';
char *endptr = NULL;
sscanf(p, "%s", str);
// assume a hex value if string starts with "0x"
if (str[0] == '0' && str[1] == 'x') {
c = strtoul(str, &endptr, 16);
if (errno == ERANGE)
fprintf(stderr, "letterVowel out of range.\n");
}
else {// otherwise, assume a single letter
c = str[0];
if (c < 97 || c > 122) // valid values are a-z, ascii 97-122
fprintf(stderr, "letterVowel out of range.\n");
}
new_translator->letter_bits[c] = (new_translator->letter_bits[c] & 0x40) | 0x81; // keep value for group 6 (front vowels e,i,y)
break;
}

default: default:
if ((key & 0xff00) == 0x100) { if ((key & 0xff00) == 0x100) {
if (langopts) if (langopts)

Loading…
Cancel
Save