Browse Source

[1.43.52]

espeakedit --compile  also compiles the intonation data

Added feature to produce phonemes as International Phonetic Alphabet.
phoneme definitions: Added "ipa" instruction to specify IPA phoneme name.

When spelling as individual characters, calculate the stress position for each character name.


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@249 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 15 years ago
parent
commit
3bf61040b9
76 changed files with 1077 additions and 464 deletions
  1. 1
    1
      dictsource/cs_list
  2. 2
    2
      dictsource/da_rules
  3. 8
    1
      dictsource/de_rules
  4. 16
    6
      dictsource/dict_phonemes
  5. 4
    0
      dictsource/en_list
  6. 2
    1
      dictsource/fr_list
  7. 3
    1
      dictsource/fr_rules
  8. 4
    0
      dictsource/hu_list
  9. 5
    0
      dictsource/hu_rules
  10. 30
    21
      dictsource/nl_list
  11. 44
    1
      dictsource/nl_rules
  12. 1
    1
      dictsource/ta_list
  13. 36
    17
      dictsource/ta_rules
  14. 57
    48
      phsource/compile_report
  15. BIN
      phsource/l/L1_@L
  16. BIN
      phsource/l/L1_aL
  17. BIN
      phsource/l/L1_iL
  18. BIN
      phsource/l/L1_oL
  19. BIN
      phsource/l/L1_uL
  20. 1
    0
      phsource/ph_croatian
  21. 1
    0
      phsource/ph_danish
  22. 3
    0
      phsource/ph_dutch
  23. 25
    8
      phsource/ph_english
  24. 10
    0
      phsource/ph_english_n
  25. 15
    1
      phsource/ph_english_rp
  26. 18
    0
      phsource/ph_english_sc
  27. 42
    2
      phsource/ph_english_us
  28. 15
    2
      phsource/ph_english_wm
  29. 1
    0
      phsource/ph_finnish
  30. 9
    3
      phsource/ph_french
  31. 33
    26
      phsource/ph_german
  32. 4
    0
      phsource/ph_hindi
  33. 7
    0
      phsource/ph_icelandic
  34. 1
    0
      phsource/ph_latin
  35. 1
    0
      phsource/ph_latvian
  36. 3
    0
      phsource/ph_norwegian
  37. 3
    0
      phsource/ph_polish
  38. 13
    2
      phsource/ph_portugal
  39. 9
    1
      phsource/ph_pt_brazil
  40. 2
    0
      phsource/ph_romanian
  41. 2
    0
      phsource/ph_serbian
  42. 6
    0
      phsource/ph_slovak
  43. 1
    0
      phsource/ph_spanish
  44. 5
    6
      phsource/ph_tamil
  45. 8
    0
      phsource/ph_welsh
  46. 45
    5
      phsource/phonemes
  47. BIN
      phsource/vowel/V_4
  48. BIN
      phsource/vowel/aa_7
  49. BIN
      phsource/vowel/o_5
  50. BIN
      phsource/vowel/o_6
  51. BIN
      phsource/vowel/oo
  52. 37
    35
      platforms/windows/windows_dll/src/speak_lib.h
  53. 61
    0
      src/compiledata.cpp
  54. 104
    20
      src/dictionary.cpp
  55. 19
    14
      src/espeak.cpp
  56. 19
    2
      src/espeakedit.cpp
  57. 1
    1
      src/intonation.cpp
  58. 9
    9
      src/klatt.cpp
  59. 5
    2
      src/main.h
  60. 89
    62
      src/mbrowrap.cpp
  61. 4
    1
      src/menus.cpp
  62. 23
    29
      src/numbers.cpp
  63. 4
    1
      src/prosodydisplay.cpp
  64. 6
    6
      src/readclause.cpp
  65. 10
    4
      src/setlengths.cpp
  66. 17
    12
      src/speak.cpp
  67. 7
    5
      src/speak_lib.cpp
  68. 1
    0
      src/speak_lib.h
  69. 17
    19
      src/synth_mbrola.cpp
  70. 22
    7
      src/synthdata.cpp
  71. 19
    16
      src/synthesize.cpp
  72. 8
    3
      src/synthesize.h
  73. 15
    4
      src/tr_languages.cpp
  74. 24
    12
      src/translate.cpp
  75. 4
    4
      src/translate.h
  76. 56
    40
      src/transldlg.cpp

+ 1
- 1
dictsource/cs_list View File

@@ -229,7 +229,7 @@ místo $pause // instead of
i $u $brk // ???

// Conjunctions
a $u $pause // and
a $u $brk $pause // and
nebo $u $pause // or
však $pause // but
krom $pause // except

+ 2
- 2
dictsource/da_rules View File

@@ -1,4 +1,4 @@

// This file is UTF8 encoded
// Spelling-to-phoneme rules for Danish

@@ -1537,7 +1537,7 @@ L06L06) er V // PB klipper
år) ede (_+ 3D@ // PB sårede
odr) ede (_+ 3D@ // PB fodrede
obr) ede (_ 3D@ // PB erobrede
tr) ede (_+ 3D-@ // PB splintrede
tr) ede (_+ 3D@ // PB splintrede
hundr) ed (+ @:D // PB hundred
rn) ed (e eD // PB dernede
&k) ede (+ eD@ // PB dødkede

+ 8
- 1
dictsource/de_rules View File

@@ -115,6 +115,7 @@
r) al (_ 'A:l
t) al (_ 'A:l
m) a (lt_ A:l
ker) am (ik 'A:m
@) an (_ 'A:n
ein) an (der 'an
@) ant (_ 'ant
@@ -444,6 +445,7 @@
_) farb (C@P4 f'arp
_) farb (l@P4 f'arb
_) fein (@P4 f'aIn
_) fertig (CP6 f'ErtiC
_) fest (@P4 f'Est
_) flug fl'u:g
foto fo:to:
@@ -577,7 +579,7 @@
i (d_ 'i:
i (dee %i:
i (erin =i:
ig (+ Ig# // [ig] or [iC]
&) ig (+ Ig# // [ig] or [iC]
igh aI

i (i i:_!
@@ -685,6 +687,7 @@ formal) ie =I@
// @) keit (_S4 kaIt
// @) keiten (_S6 kaIt@n

ka (rtoff k%a
ko (e@ ko:
kolleg k%Ole:g
_) komme (C@ k%OmE
@@ -818,6 +821,9 @@ formal) ie =I@
o (lsam o:
o (m_ 'o:
@A) o (n_ 'o:
one (_ 'o:n@
onen (_ 'o:n@n
zitr) on 'on
@) oo (_ u:
r) oo (m u:
z) oo (m u:
@@ -858,6 +864,7 @@ formal) ie =I@
pool _^_EN
power paU@r
_) preß (@P4 pr'Es
_) primär (P6 pri:m'E:r
_) prinzipien (@P9 prInts'i:pI@
_) privat (@P6 pri:v'A:t
problem pr%o:ble:m

+ 16
- 6
dictsource/dict_phonemes View File

@@ -79,9 +79,9 @@ t tS ts v z Z
Dictionary de_dict

3 3: @ @- a A A: aI
aU E E2 E: e: EI I i2
i: n- O o: OY U u: W
y y: Y:
aU E E2 E: e: EI i I
i2 i: n- o O o: OY U
u: W y y: Y:

* : ; b C d D dZ
f g g# h j k l m
@@ -507,9 +507,9 @@ uei uo y y& y@ yE yi yu

; C f h j k kh l
l# m n N p ph Q q
Q" Q^ r R r" R2 R3 s
s. S; t th ts ts. ts. tS;
tS; tsh v w x X z.
Q" Q^ r R R2 R3 s s.
S; t th ts ts. ts. tS; tS;
tsh v w x X z.


Dictionary zhy_dict
@@ -626,3 +626,13 @@ u
h j J k l l# m n
N n^ p Q r R R3 s
S t T tS v w x z


Dictionary ht_dict

a A~ e E E~ i o O
O~ u w y

; b d f g j k l
m n N p r s S t
tS v z Z

+ 4
- 0
dictsource/en_list View File

@@ -2307,6 +2307,7 @@ workstation w'3:kst,eIS@n
?5 workstation w'VRkst,eIS@n
wound wu:nd
wound waUnd $past
(wound down) w,aUnd||'daUn
(wound up) w,aUnd||'Vp
wounded wu:ndI2d
wretched rEtSI2d
@@ -2554,6 +2555,7 @@ Taipei t,aIp'eI
Taiwan taI'wan
(tel aviv) t,El||a#v'i:v
Tenerife tEn3r'i:f
Texas tEks@s
Toronto t@r0ntoU
Timor ti:mo@
Tokyo toUkIoU
@@ -3154,6 +3156,8 @@ while w,aIl $pause $strend
whilst w,aIlst $pause


(do so) du:||soU $atend

//some adverbs
just $verbf
never $verbf

+ 2
- 1
dictsource/fr_list View File

@@ -24,7 +24,7 @@

// 2006-11-18 Gilles Casse <[email protected]>
//
// Updated 2010-06-15 Michel Such <[email protected]>
// Updated 2010-06-22 Michel Such <[email protected]>
//
// * Numbers, a few abbreviations and exceptions.
//
@@ -667,6 +667,7 @@ couscous kuskus
delete _^_en
dernier dErnjer2
doppler doplEr
dot dOt
éloquent elokA~t2
enfer A~fEr
fahrenheit far@najt

+ 3
- 1
dictsource/fr_rules View File

@@ -23,7 +23,7 @@
// 2006-11-18 Gilles Casse <[email protected]>
//
// Updated: 2010-06-18 Michel Such <[email protected]>
// Updated: 2010-06-29 Michel Such <[email protected]>
//
// Letter classes:
@@ -77,6 +77,7 @@
an (n_ a
_h) an (_ an
_) anti (@@P4 A~ti
_) anti (CAXP4 A~ti
_) arché (@P5 arke // archéologue
_) archéo (@P6 arkeo // archéologue
_) arch (aP4 ark // archange
@@ -1087,6 +1088,7 @@ _quatrevin) gts (_ z2
ss s // assez
ai) s (em s // vraisemblable
_al) s (ac z // Alsace
aCè) s (_ s
nè) s (_ s
kansa) s (_ s // Kansas, Arkansas

+ 4
- 0
dictsource/hu_list View File

@@ -990,6 +990,10 @@ kulcs $unstressend
nyit $unstressend
lő $unstressend
támad $unstressend
halt $unstressend
ész $unstressend
kapta $unstressend
kaptak $unstressend

// word pairs


+ 5
- 0
dictsource/hu_rules View File

@@ -207,6 +207,7 @@ menetren) dsz (erű d|s
honvé) d (sereg d
va) d (szeder d
twee) d (sapk d
fe) dd (hetetlen d

.group dz
fogó) dz (kod ts
@@ -399,6 +400,7 @@ tizene) gy (en J:
_e) gy (oldal J:
_e) gy (év J:
_e) gy (órá J:
_e) gy (se J

.group h
h h
@@ -424,6 +426,7 @@ tizene) gy (en J:
sz) í (ve i
t) í (zes i
sz) í (vel i:
_t) í (zük i

.group j
j j
@@ -582,6 +585,8 @@ tulajdo) n (jog n
teljesítmé) ny (javu n^
törvé) ny (java n^
ajá) nl l:
_feddhetetle) n (jelle n
állomá) ny (jel n^

.group o
o o

+ 30
- 21
dictsource/nl_list View File

@@ -100,7 +100,7 @@ _17 z'e:f@ntin
_18 'Axtin
_19 n'e:x@ntin
_2X tv#'Int@x
_3X d'e:rt@x
_3X d'Ert@x
_4X f'e:rt@x
_5X f'EIft@x
_6X z'Est@x
@@ -183,27 +183,27 @@ er $u
waar $pause

// prepositions
in $u+ $brk // in
op $u+ $brk // in
aan $u+ $brk // at, on
bij $u+ $pause // at, near
om $u+ $brk // at
met $u+ $brk // with, by
over $u+ $pause // about
na $u+ $pause // after
naar $u+ // to
door $u+ $brk // through, by
te $u+ $brk // to
tot $u+ $pause // until
uit $u+ $brk // from, out of
voor $u+ $pause // for, in front of
van $u+ // from, of
zonder $u+ $pause // without
in $only $u+ $brk // in
op $only $u+ $brk // in
aan $only $u+ $brk // at, on
bij $only $u+ $pause // at, near
om $only $u+ $brk // at
met $only $u+ $brk // with, by
over $only $u+ $pause // about
na $only $u+ $pause // after
naar $only $u+ // to
door $only $u+ $brk // through, by
te $only $u+ $brk // to
tot $only $u+ $pause // until
uit $only $u+ $brk // from, out of
voor $only $u+ $pause // for, in front of
van $only $u+ // from, of
zonder $only $u+ $pause // without

// adverbs, etc.
ook $u+ // any
zo $u+
sommige $u+ // some
ook $only $u+ // any
zo $only $u+
sommige $only $u+ // some


// conjunctions
@@ -308,10 +308,11 @@ the _^_EN
up _^_EN


// words where -eren is not a verb ending
// words where -eren is not a stressed verb ending
ander $alt
kinder $alt
ouder $alt
sputter $alt

// pronunciation exceptions
aangrijpend $2
@@ -327,6 +328,7 @@ ingevolge $3
ingrediënt $4
ingenieur Inzj@nj'Y:r
journaal Surn'a:l
natuur na:t'yr
ongastvrij OnQAstv@-*'EI
ongelooflijk $3
ongemakkelijk $3
@@ -335,6 +337,13 @@ ongerieflijk $3
ongrondwettig $3
proces $2
renaissance rEne:s'A~s@
tegenaan $3
tegenin $3
tegenover $3
tegendraads $3
tegennatuur $4
tegenstrijdig $3
tegenwoordig $3
waarschijnlijk $2



+ 44
- 1
dictsource/nl_rules View File

@@ -25,6 +25,7 @@
_) be (ren bI:
_) be (ter be:
_) beu bY:
&) baar (_ =ba:r


.group c
@@ -88,7 +89,7 @@


.group g
g Q // ph_dutch changes this to [x] before unvoiced
g Q // ph_dutch changes to [x] before unvoiced, NULL after [x]
gg Q

_) ge (@P2 Q@
@@ -114,9 +115,17 @@
ie i
ieuw iw

d) ie (_ 'i
g) ie (_ 'i
m) ie (_ 'i
p) ie (_ 'i

ie (r_ 'i
ie (rd_ 'i
@) ig (_ @x
_) in (gP2 'In
@) isch (_ =is
@) ische (_ =is@


.group j
@@ -133,6 +142,7 @@
ll l
@) lijk (_S4 l@k
&) laan (_S4 la:n
@) loog (_ lo:x


.group m
@@ -159,9 +169,14 @@
oei uj
ou VU

telef) oo (n 'o:


.group on
_) onaan (@P5 On'a:n
_) onge (@P4 ,OnQ@
_) ont (@P3 Ont
_) on (te@P2 On // ontegecht
_) onder Ond@r

_) ong (aarn ,OnQ'
@@ -214,6 +229,34 @@
c) tie (_ si
tj t;
tsj tS
_) th t
th t
t (haar t // th is not [t]
t (hav t

.group te
_) tegen (P5 t'e:Q@n
_) terug (P5 t@r'8x
_) te (gelijk t@
_) te (gemoetP2 t@
_) te (goed t@
_) te (hui t@ // tehuis
_) te (keer t@
_) te (kort t@
_) te (leur t@
_) te (loor t@
_) te (meer t@
_) te (midd t@ // temidden
_) te (na t@
_) te (neer t@
_) te (recht t@
_) te (sam t@ // tesamen
_) te (veel t@
_) te (vergreefP2 t@
_) te (voorschijn t@
_) te (vor t@ // tevoren
_) te (vred t@ // tevreden
_) teweeg (P6 t@v#'e:x


.group u

+ 1
- 1
dictsource/ta_list View File

@@ -356,4 +356,4 @@ tamil தமிழ் $text
ஆகா a:Ha:
ஓகோ o:Ho:
கப் kVp
செட் set.

+ 36
- 17
dictsource/ta_rules View File

@@ -191,6 +191,7 @@

//sort
அலை) க (டல kV
சமையல்) க (ட் kV
_கல்) க (ண்ட kV
_நற்) க (தி gV
வீண்) க (தை kV
@@ -248,8 +249,11 @@
க (ுல k
_அங்) க (ுல g
_) குல்க (ந்த gulkV
நீல) க (ேசி k
புலி) க (ேசி k
குண்டல) க (ேசி k
ம) க (ேசுவர H // need to restrict to _ம) and _வீரம) ??
சீர்) க (ேட k
ம) க (ேந்திர H
ம) க (ேஷ்வ H
ம) க (ேஸ்வர H
@@ -269,6 +273,7 @@
ஆரோ) க்க (ிய gg
வைரா) க்க (ிய gg
_வி) க்க (ிரக gg
கு) க்கி (ராம gg
ஜன) க்க (ும்பல gg
வி) க்ட (ோரியா kt. // victoria
வி) க (்ரம k
@@ -394,6 +399,7 @@
_) ட (வர t.V
_) ட (ேப t.
_) டாக (்ஸி t.a:k
_ல) ட்ட d.d.V#

.group ண
ண n.V
@@ -552,6 +558,7 @@
_) த (ுச்சம d
_) த (ுச்சாதனன d
_) த (ுட்ட d
_) த (ுபாய d
_) த (ுரதிர்ஷ்ட d
_) த (ுராசை d
_) த (ுரியோதனன d
@@ -597,12 +604,12 @@
_) த (ொம் d
_) த (ோசை d
_) த (ோஷ d
_) த (ுபாய d
//endsort

//sort

_வசந்) த tV#
_ப) த (ஞ்சலி tV
_கீழ்) த (ட்ட tV
_மேல்) த (ட்ட tV
முட்டாள்) த (ன tV
@@ -672,7 +679,6 @@ _பார்வ) த (ி t
ச) த (்ரு t
த) த (்ரூப t
பா) த (்ரூம t
_ப) த (ஞ்சலி tV
//endsort


@@ -854,6 +860,7 @@ _முகத்தின்_) ப (ாவ b
_) ப (ிக்கு b
_) ப (ிக்ஷு b
_) ப (ிக்ஷூ b
_) ப (ிம்ப b
_) ப (ிரகதீ b
_) ப (ிரகஸ்பதி b
_) ப (ிரம்ம b
@@ -947,6 +954,7 @@ _முகத்தின்_) ப (ாவ b
சீதா) பதி pVti
சேது) பதி pVti
தரணி) பதி pVti
திரௌ) ப (தி pV
பிரஜா) பத (ி pVt
மகுட) பதி pVti
பிரகஸ்) பதி pVti
@@ -965,6 +973,7 @@ _முகத்தின்_) ப (ாவ b
அனு) ப (மா pV
_க) ப (ம்_ bV
_ஊடு) ப (யிர pV
நாகா) ப (ரண bV
கரம்) ப (ற் pV
ப (ற்றி_ pV
பல) ப (ல pV
@@ -986,8 +995,11 @@ _முகத்தின்_) ப (ாவ b
அடி) ப (ாவி p
கோ) ப (ி p
_முன்) ப (ின்_ p
_) ப (ிப்ரவரி f
உடன்) ப (ிற p
ப (ிறகு+ p
தேய்) ப (ிறை p
வளர்) ப (ிறை p
சிறு) ப (ிள்ளை p
ஆண்) ப (ிள்ளை p
பெண்) ப (ிள்ளை p
@@ -1146,9 +1158,10 @@ _முகத்தின்_) ப (ாவ b
_) பி (ரே p
_) பி (ரோகிதர p
_) பி (ளாட்பார p
_) பி (ளாஸ்க் f
_) பி (ளாஸ்க் f // flask
_) பீ (ராமண b
அதிக) ப்பி (ரசங்க pp
_பர) ப்பி (ரம்ம pb
//endsort

// musical notes
@@ -1273,27 +1286,32 @@ _முகத்தின்_) ப (ாவ b

// vowel letters

.group 0xe0ae // characters which start with UTF-8 bytes: [e0 ae]

ஂ // anusvara

அ a

ஆ a:

.group இ
//sort
இ i
_) இ (லட்சிய // silent
_) இ (ரகசிய // silent
_) இ (லேச // silent
_) இ (ரசாயன
_) இ (ரத்த
_) இ (ராம
_) இ (ராவண
_) இ (ராத்த
_) இ (ராஜ
_) இ (ராணி
_) இ (ராணுவ
_) இ (ராத்த
_) இ (ராம
_) இ (ராவண
_) இ (லகுவாக
_) இ (ராணி
_) இ (லட்சண
_) இ (லட்சிய // silent
_) இ (லவங்க
_) இ (லேச // silent
//endsort

.group 0xe0ae // characters which start with UTF-8 bytes: [e0 ae]

ஂ // anusvara

அ a

ஆ a:

ஈ i:

@@ -1303,6 +1321,7 @@ _முகத்தின்_) ப (ாவ b

எ e
_) எ ;e // add a short [j] sound at start of word ?
எப (்ரல ;e:p

ஏ e:
_) ஏ ;e: // add a short [j] sound at start of word ?

+ 57
- 48
phsource/compile_report View File

@@ -1,4 +1,4 @@
63 phoneme tables
64 phoneme tables
new total
base 107 107
consonants 9 115
@@ -20,7 +20,7 @@ consonants 9 115
fr 56 138
fr-ca 11 138
hi 58 149
ta 21 152
ta 20 151
hu 24 121
lv 29 125
nl 24 125
@@ -63,6 +63,7 @@ consonants 9 115
gd 6 107
bg 10 119
nso 8 107
ht 11 138

Data file Used by
b/b [b] base
@@ -340,8 +341,8 @@ l/l_ [l/] base
[l/] fr
l/l_@ [l/3] base
[l/] fr
l/l@ [l#] base
[߸ ] base
l/l@ [á3m] base
[l#] base
[l] fr
[l/2] fr
l/L1_aL [l/] base
@@ -366,14 +367,14 @@ l/L2_oL [l/2] base
l/L2_uL [l/2] base
l/l_3 [l/] de
l/l_4 [ll] sq
l/la [l#] base
[߸ ] base
l/la [á3m] base
[l#] base
[l] fr
[l/2] fr
l/l_a [l/3] base
[l/] fr
l/le [l#] base
[߸ ] base
l/le [á3m] base
[l#] base
[l] fr
[l/2] fr
l/l_e [l/3] base
@@ -382,8 +383,8 @@ l/L_eL_af [&] af
[&:] af
l/l_front [L] sq
l/l_front_ [l/4] sq
l/li [l#] base
[߸ ] base
l/li [á3m] base
[l#] base
[l] fr
[l/2] fr
[l] zh
@@ -394,15 +395,15 @@ ll/ll [L] bg
ll/_ll [L] bg
l/l_long [l] base
[l] fr
l/lo [l#] base
[߸ ] base
l/lo [á3m] base
[l#] base
[l] fr
[l/2] fr
l/l_o [l/3] base
[l/] fr
l^/l_rfx [l.] base
l/lu [l#] base
[߸ ] base
l/lu [á3m] base
[l#] base
[l] fr
[l/2] fr
l/l_u [l/3] base
@@ -1083,6 +1084,7 @@ vnasal/aa_n [a~] hi
vnasal/aa_n2 [A~] en
vnasal/aa_n3 [A~] af
vnasal/aa_n4 [A~] fr
[A~] ht
vnasal/a#_n [&~] pt
vnasal/a#u_n [&U~] pt
[&U~] pt-pt
@@ -1100,6 +1102,7 @@ vnasal/i_n2 [i~] hi
vnasal/oi_n [oI~] pt
vnasal/o_n [o~] hi
[o~] pt
[O~] ht
vnasal/o_n2 [o~] af
[O~] fr
vnasal/oo_n2 [O~] en
@@ -1113,6 +1116,7 @@ vnasal/u_n [U~] hi
vnasal/V_n [V~] hi
vnasal/W_n [E~] fr
[W~] fr
[E~] ht
voc/bh [B] base
voc/dh [D] base
voc/dh_ [D] base
@@ -1180,7 +1184,6 @@ voc/z_pzd [Z;] base
voc/z_pzd_ [Z;] base
[z;] base
vowel/@ [@] base
[3] en
[@] en
[@2] en
[@5] en
@@ -1233,8 +1236,7 @@ vowel/@_4 [@] en-us
[@] de
[@] nl
[@] no
vowel/@_6 [3] en
[@] en
vowel/@_6 [@] en
[W] fr
vowel/8 [o-] zh
vowel/8_2 [U] en-us
@@ -1335,6 +1337,7 @@ vowel/a_6 [a] ca
[a:] vi
vowel/a_7 [a] en
[a] fr
[a] ht
vowel/aa [A] fr-ca
[A] no
[A:] no
@@ -1416,7 +1419,9 @@ vowel/e_3 [i] en-n
[e:] hu
[e] ku
vowel/e_5 [i] en-sc
vowel/e_8 [e] fr
vowel/e_6 [e] ht
vowel/e_8 [E:] de
[e] fr
vowel/e_9 [E2] fr
vowel/ee [E] en-n
[E] sv
@@ -1474,10 +1479,10 @@ vowel/e_mid [E] en-rp
[e] hy
[E] prs
[e] bg
[E] ht
vowel/e_mid2 [E] af
[E] de
[E2] de
[E:] de
[e] jbo
[e] nci
[e] fi
@@ -1557,6 +1562,7 @@ vowel/i_7 [i] pl
[i] sq
vowel/i#_7 [i[] zh
vowel/i_8 [i] fr
[i] ht
vowel/i_en [i:] en
[i:] en-us
vowel/i_fnt [i:] en-wi
@@ -1671,6 +1677,7 @@ vowel/o_6 [O:] nl
vowel/o_7 [o] ku
vowel/o_8 [o] fr
[o2] fr
[o] ht
vowel/oe [W] af
[W] de
[W] hy
@@ -1684,6 +1691,7 @@ vowel/o_mid [U@] en-rp
[o] bg
vowel/o_mid2 [O] fr
[o] fr
[O] ht
vowel/oo [o] base
[O:] en-sc
[O] en-wi
@@ -1772,8 +1780,7 @@ vowel/u_2 [u1] fi
[u] is
[u] tr
[u] bg
vowel/u#_2 [u-] ta
[u-] sv
vowel/u#_2 [u-] sv
vowel/u#_3 [U] ta
[U:] ta
vowel/u#_4 [U] en-sc
@@ -1818,7 +1825,10 @@ vowel/u_bck [u] base2
[u] bg
vowel/u_bck2 [u] fr
[u:] fr
[u] ta
[u:] ta
[u:] la
[u] ht
vowel/uu [U] en
[U] en-n
[U] en-wm
@@ -1937,57 +1947,56 @@ vwl_en_us/aU@ [aU@] en-us
vwl_en_us/ee [E] en-us
vwl_en_us/er [e@] en-us
vwl_en_us/ir [i@3] en-us
vwl_en_us/oor [0] en-us
[O:] en-us
vwl_en_us/oor [O:] en-us
[O@] en-us
vwl_en_us/or [o@] en-us
[O:] en-sc
vwl_en_us/ur [U@] en-us
vwl_fr/@2r [߸ ] fr
vwl_fr/a2r [߸ ] fr
vwl_fr/aa2r [߸ ] fr
vwl_fr/@2r [�æ] fr
vwl_fr/a2r [�æ] fr
vwl_fr/aa2r [�æ] fr
vwl_fr/br [r/2] fr
vwl_fr/e2r [߸ ] fr
vwl_fr/e_2r [߸ ] fr
vwl_fr/ee2r [߸ ] fr
vwl_fr/i2r [߸ ] fr
vwl_fr/e2r [�æ] fr
vwl_fr/e_2r [�æ] fr
vwl_fr/ee2r [�æ] fr
vwl_fr/i2r [�æ] fr
vwl_fr/j [j/] fr
vwl_fr/o2r [߸ ] fr
vwl_fr/oo2r [߸ ] fr
vwl_fr/o2r [�æ] fr
vwl_fr/oo2r [�æ] fr
vwl_fr/r [r] fr
[r/2] fr
vwl_fr/r_ [r/] fr
vwl_fr/r_@ [r/] fr
vwl_fr/r@ [߸ ] fr
vwl_fr/r@ [�æ] fr
vwl_fr/@R [x] pt-pt
vwl_fr/r@2 [߸ ] fr
vwl_fr/r@2 [�æ] fr
vwl_fr/@R2 [R] fr-ca
vwl_fr/ra [߸ ] fr
vwl_fr/ra [�æ] fr
vwl_fr/r_a [r/] fr
vwl_fr/raa [߸ ] fr
vwl_fr/re [߸ ] fr
vwl_fr/raa [�æ] fr
vwl_fr/re [�æ] fr
vwl_fr/r_e [r/] fr
vwl_fr/re2 [߸ ] fr
vwl_fr/ree [߸ ] fr
vwl_fr/ri [߸ ] fr
vwl_fr/re2 [�æ] fr
vwl_fr/ree [�æ] fr
vwl_fr/ri [�æ] fr
vwl_fr/r_i [r/] fr
vwl_fr/rj [߸ ] fr
vwl_fr/rj [�æ] fr
vwl_fr/r_n [r/] fr
vwl_fr/ro [߸ ] fr
vwl_fr/ro [�æ] fr
vwl_fr/r_o [r/] fr
vwl_fr/roo [߸ ] fr
vwl_fr/roo [�æ] fr
vwl_fr/rr [r/] fr
vwl_fr/ru [߸ ] fr
vwl_fr/ru [�æ] fr
vwl_fr/r_u [r/] fr
vwl_fr/rw [߸ ] fr
vwl_fr/ry [߸ ] fr
vwl_fr/rw [�æ] fr
vwl_fr/ry [�æ] fr
vwl_fr/r_y [r/] fr
vwl_fr/tr [r/2] fr
vwl_fr/trr [r/] fr
vwl_fr/u2r [߸ ] fr
vwl_fr/u2r [�æ] fr
vwl_fr/wa [w] fr
[w/] fr
vwl_fr/y2r [߸ ] fr
vwl_fr/y2r [�æ] fr
vwl_hi/l-voc [l-] base
[l-] sk
[l:] sk

BIN
phsource/l/L1_@L View File


BIN
phsource/l/L1_aL View File


BIN
phsource/l/L1_iL View File


BIN
phsource/l/L1_oL View File


BIN
phsource/l/L1_uL View File


+ 1
- 0
phsource/ph_croatian View File

@@ -243,6 +243,7 @@ endphoneme
phoneme r*
vowel nonsyllabic
unstressed
ipa r
length 50
starttype #@ endtype #@
AppendPhoneme(*)

+ 1
- 0
phsource/ph_danish View File

@@ -149,6 +149,7 @@ endphoneme
phoneme R
lengthmod 7
liquid
ipa ʁ
FMT(r/aa)
endphoneme


+ 3
- 0
phsource/ph_dutch View File

@@ -169,6 +169,9 @@ phoneme Q
Vowelin f1=2 f2=2300 200 300 f3=-300 80
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk

IF prevPhW(x) THEN
ChangePhoneme(NULL)
ENDIF
IF nextPhW(isVoiced) THEN
ELSE
ChangePhoneme(x)

+ 25
- 8
phsource/ph_english View File

@@ -6,6 +6,7 @@ endphoneme

phoneme t# // reduced [t] as in "city"
vcd alv stop
ipa ɾ
lengthmod 5
Vowelin f1=1 f2=1700 -300 300 f3=-100 80
Vowelout f1=2 f2=1700 -300 300 f3=-100 80
@@ -28,7 +29,8 @@ phoneme l // use dark [l/2] before not-vowel
liquid
lengthmod 7

IF nextPh(isNotVowel) THEN
IF nextPhW(isVowel) THEN
ELSE
IF prevPh(isNotVowel) THEN
ChangePhoneme(l/)
ELSE
@@ -59,6 +61,7 @@ endphoneme

phoneme r- // linking r, used in English between certain vowels and a following vowel
liquid rhotic
ipa ɹ
lengthmod 0

NextVowelStarts
@@ -113,11 +116,8 @@ phoneme 3 // Schwa, used for rhotic schwa in American
vowel starttype #@ endtype #@
unstressed
length 140
IfNextVowelAppend(r-)
IF thisPh(isWordEnd) THEN
FMT(vowel/@_6)
ENDIF
FMT(vowel/@)
ipa ə
CALL @
endphoneme


@@ -165,6 +165,7 @@ endphoneme

phoneme a#
vowel starttype #@ endtype #@
ipa ɐ
unstressed
length 150
FMT(vowel/a#_3)
@@ -173,7 +174,8 @@ endphoneme

phoneme aa // 'bath' etc.
vowel starttype #a endtype #a
length 190
ipa a
length 185
IfNextVowelAppend(r-)
FMT(vowel/a)
endphoneme
@@ -246,6 +248,7 @@ endphoneme

phoneme A@ // Used for [A:] when followed by 'r'
vowel starttype #a endtype #a
ipa ɑː
length 230
IfNextVowelAppend(r-)
FMT(vowel/aa_2)
@@ -263,7 +266,7 @@ endphoneme

phoneme i:
vowel starttype #i endtype #i
length 175 long
length 175
IfNextVowelAppend(;)
IF prevPh(w) THEN
VowelStart(w/wi2)
@@ -290,6 +293,7 @@ endphoneme

phoneme O@
vowel starttype #o endtype #o
ipa ɔː
length 240
IfNextVowelAppend(r-)
FMT(vowel/oo_en)
@@ -298,6 +302,7 @@ endphoneme

phoneme o@
vowel starttype #o endtype #o
ipa ɔː
length 250
IfNextVowelAppend(r-)
FMT(vowel/oo_en)
@@ -323,6 +328,7 @@ endphoneme

phoneme oU
vowel starttype #@ endtype #u
ipa əʊ
length 220
FMT(vdiph/@u_en)
endphoneme
@@ -331,6 +337,9 @@ endphoneme
phoneme aI
vowel starttype #a endtype #i
length 240
IF nextPh(#a) OR nextPh(#o) THEN
AppendPhoneme(;)
ENDIF
FMT(vdiph/ai_2)
endphoneme

@@ -402,6 +411,10 @@ endphoneme
phoneme IR // used for "ir" when [3:] is split (Scottish)
vowel starttype #@ endtype #@
length 190
ipa əɹ
IF nextPhW(r-) THEN
ipa ə
ENDIF
IfNextVowelAppend(r-)
FMT(vowelr/V_r)
endphoneme
@@ -410,6 +423,10 @@ endphoneme
phoneme VR // used for "or"/"ur" when [3:] is split (Scottish)
vowel starttype #@ endtype #@
length 210
ipa ʌɹ
IF nextPhW(r-) THEN
ipa ʌ
ENDIF
IfNextVowelAppend(r-)
FMT(vowelr/V3_r)
endphoneme

+ 10
- 0
phsource/ph_english_n View File

@@ -14,6 +14,7 @@ endphoneme

phoneme 3 // Schwa, used for rhotic schwa in American
vowel starttype #@ endtype #@
ipa ə
unstressed
length 140
IfNextVowelAppend(r-)
@@ -72,6 +73,7 @@ endphoneme

phoneme V
vowel starttype #o endtype #o
ipa ʊ
length 140
ChangeIfDiminished(@)
FMT(vowel/o-_2)
@@ -88,6 +90,7 @@ endphoneme

phoneme a#
vowel starttype #@ endtype #@
ipa ɐ
unstressed
length 140
IfNextVowelAppend(r-)
@@ -105,6 +108,7 @@ endphoneme

phoneme A@
vowel starttype #a endtype #@
ipa ɑː
length 250
IfNextVowelAppend(r-)
FMT(vowel/aa_5)
@@ -113,6 +117,7 @@ endphoneme

phoneme aa // 'bath' etc.
vowel starttype #a endtype #a
ipa a
length 150
FMT(vowel/a)
endphoneme
@@ -149,6 +154,7 @@ endphoneme

phoneme O@
vowel starttype #o endtype #@
ipa ɔː
length 240
IfNextVowelAppend(r-)
FMT(vwl_en_n/O@)
@@ -157,6 +163,7 @@ endphoneme

phoneme o@
vowel starttype #o endtype #@
ipa ɔː
length 240
IfNextVowelAppend(r-)
FMT(vwl_en_n/O@)
@@ -180,6 +187,7 @@ endphoneme

phoneme aU
vowel starttype #e endtype #u
ipa æʊ
length 230
FMT(vdiph/eeu_3)
endphoneme
@@ -187,6 +195,7 @@ endphoneme

phoneme oU
vowel starttype #o endtype #o
ipa oː
length 220
FMT(vowel/o)
endphoneme
@@ -201,6 +210,7 @@ endphoneme

phoneme eI
vowel starttype #i endtype #i
ipa eː
length 210
FMT(vowel/e)
endphoneme

+ 15
- 1
phsource/ph_english_rp View File

@@ -17,7 +17,11 @@ endphoneme


phoneme 3 // Schwa, used for rhotic schwa in American
import_phoneme @
vowel starttype #@ endtype #@
unstressed
length 140
ipa ə
CALL @
endphoneme


@@ -45,6 +49,7 @@ endphoneme

phoneme a
vowel starttype #a endtype #a
ipa æ
length 175
ChangeIfDiminished(a#)
FMT(vowel/&)
@@ -109,6 +114,7 @@ endphoneme

phoneme a#
vowel starttype #@ endtype #@
ipa ɐ
unstressed
length 150
IfNextVowelAppend(r-)
@@ -126,6 +132,7 @@ endphoneme

phoneme A@
vowel starttype #a endtype #a
ipa ɑː
length 240
IfNextVowelAppend(r-)
FMT(vwl_en_rp/aa)
@@ -134,6 +141,7 @@ endphoneme

phoneme aa // 'bath' etc.
vowel starttype #a endtype #a
ipa ɑː
length 200
FMT(vwl_en_rp/aa)
endphoneme
@@ -170,6 +178,7 @@ endphoneme

phoneme O@
vowel starttype #o endtype #@
ipa ɔː
length 230
IfNextVowelAppend(r-)
FMT(vowel/oo_1)
@@ -200,6 +209,7 @@ endphoneme

phoneme oU
vowel starttype #@ endtype #u
ipa əʊ
length 220
FMT(vdiph/@u_2)
endphoneme
@@ -208,6 +218,9 @@ endphoneme
phoneme aI
vowel starttype #a endtype #i
length 230
IF nextPh(#a) OR nextPh(#o) THEN
AppendPhoneme(;)
ENDIF
FMT(vdiph/ai_6)
endphoneme

@@ -244,6 +257,7 @@ endphoneme

phoneme U@
vowel starttype #u endtype #@
ipa ɔː
length 230
IfNextVowelAppend(r-)
FMT(vowel/o_mid)

+ 18
- 0
phsource/ph_english_sc View File

@@ -79,6 +79,7 @@ endphoneme

phoneme aa // 'bath' etc.
vowel starttype #a endtype #a
ipa a:
length 220
IfNextVowelAppend(r-)
FMT(vowel/a_3)
@@ -114,6 +115,7 @@ endphoneme

phoneme i // optional variant of [I] for end of words
vowel starttype #i endtype #e
ipa e
length 150
IfNextVowelAppend(;)
FMT(vowel/e_5)
@@ -138,6 +140,7 @@ endphoneme

phoneme U
vowel starttype #u endtype #u
ipa ʉ
length 140
FMT(vowel/u#_4)
endphoneme
@@ -146,6 +149,7 @@ endphoneme
phoneme A:
vowel starttype #a endtype #a
length 220
ipa a:
IfNextVowelAppend(r-)
IF nextPh(r) THEN
FMT(vowelr/aa_r, 30)
@@ -157,6 +161,7 @@ endphoneme
phoneme A@ // Used for [A:] when followed by 'r', becomes [A:]+[r] in American
vowel starttype #a endtype #@
length 250
ipa aː
AppendPhoneme(r)
FMT(vowelr/aa_r)
endphoneme
@@ -166,6 +171,7 @@ phoneme 3:
vowel starttype #e endtype #@
length 210
ChangeIfNotStressed(VR) // also need "replace 02 3: VR" in voice file
ipa e
AppendPhoneme(r)
FMT(vdiph2/e@)
endphoneme
@@ -199,6 +205,7 @@ endphoneme
phoneme O@
vowel starttype #o endtype #@
length 230
ipa ɔ
AppendPhoneme(r)
FMT(vowelr/oo_r)
endphoneme
@@ -206,6 +213,7 @@ endphoneme
phoneme o@
vowel starttype #o endtype #@
length 230
ipa o
AppendPhoneme(r)
FMT(vowelr/o_r)
endphoneme
@@ -221,6 +229,7 @@ endphoneme

phoneme u:
vowel starttype #u endtype #u
ipa ʉː
length 160
IF nextPh(isVFricative) THEN
Length 200
@@ -234,6 +243,7 @@ endphoneme

phoneme aU
vowel starttype #a endtype #u
ipa ʌʉ
length 200
FMT(vdiph/au#)
endphoneme
@@ -241,6 +251,7 @@ endphoneme

phoneme oU
vowel starttype #o endtype #u
ipa oː
length 190
FMT(vowel/o_3)
endphoneme
@@ -271,6 +282,7 @@ endphoneme

phoneme eI
vowel starttype #e endtype #i
ipa eː
length 190
FMT(vowel/e_2)
endphoneme
@@ -286,6 +298,7 @@ endphoneme
phoneme e@
vowel starttype #e endtype #@
length 220
ipa e
AppendPhoneme(r)
FMT(vdiph2/e@)
endphoneme
@@ -293,6 +306,7 @@ endphoneme

phoneme i@3
vowel starttype #i endtype #@
ipa ɪ
length 220
AppendPhoneme(r)
FMT(vowelr/i_r)
@@ -301,6 +315,10 @@ endphoneme

phoneme U@
vowel starttype #u endtype #@
ipa ʉɹ
IF nextPh(r-) THEN
ipa ʉ
ENDIF
length 240
IfNextVowelAppend(r-)
FMT(vdiph2/u#@)

+ 42
- 2
phsource/ph_english_us View File

@@ -6,6 +6,7 @@

phoneme 3 // Schwa, used for rhotic schwa in American
vowel starttype #@ endtype #@
ipa ɚ
unstressed
length 210
IfNextVowelAppend(r-)
@@ -50,6 +51,7 @@ endphoneme

phoneme a
vowel starttype #e endtype #@
ipa æ
length 210

ChangeIfDiminished(a#)
@@ -68,6 +70,7 @@ endphoneme

phoneme a#
vowel starttype #@ endtype #@
ipa ɐ
unstressed
length 150
FMT(vowel/a#_3)
@@ -112,9 +115,11 @@ endphoneme
phoneme 0
vowel starttype #a endtype #a
length 200
ipa ɑː
ChangeIfDiminished(@)
IF nextPh(r) THEN
FMT(vwl_en_us/oor)
ChangePhoneme(O:)
// FMT(vwl_en_us/oor)
ENDIF
FMT(vowel/aa_8)
endphoneme
@@ -147,6 +152,10 @@ endphoneme

phoneme A@ // Used for [A:] when followed by 'r', becomes [A:]+[r] in American
vowel starttype #a endtype #a
ipa ɑːɹ
IF nextPh(r-) THEN
ipa ɑː
ENDIF
length 260
IfNextVowelAppend(r-)
FMT(vwl_en_us/ar)
@@ -183,6 +192,10 @@ endphoneme
phoneme O@
vowel starttype #o endtype #@
length 250
ipa ɔːɹ
IF nextPhW(r) THEN
ipa ɔː
ENDIF
IfNextVowelAppend(r)
FMT(vwl_en_us/oor)
endphoneme
@@ -191,6 +204,10 @@ endphoneme
phoneme o@
vowel starttype #o endtype #@
length 250
ipa oːɹ
IF nextPhW(r) THEN
ipa oː
ENDIF
IfNextVowelAppend(r)
FMT(vwl_en_us/or)
endphoneme
@@ -228,6 +245,9 @@ endphoneme
phoneme aI
vowel starttype #a endtype #i
length 250
IF nextPh(#a) OR nextPh(#o) THEN
AppendPhoneme(;)
ENDIF
FMT(vdiph/aae)
endphoneme

@@ -249,6 +269,10 @@ endphoneme
phoneme e@
vowel starttype #e endtype #@
length 280
ipa ɛɹ
IF nextPhW(r) THEN
ipa ɛ
ENDIF
IfNextVowelAppend(r)
FMT(vwl_en_us/er)
endphoneme
@@ -257,6 +281,10 @@ endphoneme
phoneme i@3
vowel starttype #i endtype #@
length 280
ipa ɪɹ
IF nextPhW(r) THEN
ipa ɪ
ENDIF
IfNextVowelAppend(r)
FMT(vwl_en_us/ir)
endphoneme
@@ -265,6 +293,10 @@ endphoneme
phoneme U@
vowel starttype #@ endtype #@
length 250
ipa ʊɹ
IF nextPhW(r-) THEN
ipa ʊ
ENDIF
IfNextVowelAppend(r-)
FMT(vwl_en_us/ur)
endphoneme
@@ -273,6 +305,10 @@ endphoneme
phoneme aI@
vowel starttype #a endtype #@
length 300
ipa aɪəɹ
IF nextPhW(r-) THEN
ipa aɪə
ENDIF
IfNextVowelAppend(r-)
FMT(vwl_en_us/ai@)
endphoneme
@@ -281,7 +317,11 @@ endphoneme
phoneme aU@
vowel starttype #a endtype #@
length 300
IfNextVowelAppend(r-)
ipa aɪʊɹ
IF nextPhW(r) THEN
ipa aɪʊ
ENDIF
IfNextVowelAppend(r)
FMT(vwl_en_us/aU@)
endphoneme


+ 15
- 2
phsource/ph_english_wm View File

@@ -18,7 +18,7 @@ endphoneme

phoneme a
vowel starttype #a endtype #a
length 170
length 160
ChangeIfDiminished(a#)
FMT(vowel/a)
endphoneme
@@ -67,6 +67,7 @@ endphoneme

phoneme V
vowel starttype #o endtype #o
ipa ʊ
length 140
ChangeIfDiminished(@)
FMT(vowel/o-_2)
@@ -83,6 +84,7 @@ endphoneme

phoneme a#
vowel starttype #@ endtype #@
ipa ɐ
unstressed
length 140
FMT(vowel/a#_3)
@@ -99,6 +101,7 @@ endphoneme

phoneme A@
vowel starttype #a endtype #a
ipa ɑː
length 240
IfNextVowelAppend(r-)
FMT(vowel/aa_5)
@@ -107,7 +110,8 @@ endphoneme

phoneme aa // 'bath' etc.
vowel starttype #a endtype #a
length 150
ipa a
length 160
FMT(vowel/a)
endphoneme

@@ -123,6 +127,7 @@ endphoneme

phoneme i:
vowel starttype #e endtype #i
ipa ei
length 220
IfNextVowelAppend(;)
FMT(vdiph2/ei_3)
@@ -140,6 +145,7 @@ endphoneme

phoneme O@
vowel starttype #o endtype #@
ipa ɔː
length 240
IfNextVowelAppend(r-)
FMT(vowel/oo_1)
@@ -156,6 +162,7 @@ endphoneme

phoneme u:
vowel starttype #u endtype #u
ipa əu
length 200
FMT(vdiph/@u)
endphoneme
@@ -163,6 +170,7 @@ endphoneme

phoneme aU
vowel starttype #a endtype #u
ipa æʊ
length 230
FMT(vdiph/eeu_3)
endphoneme
@@ -170,6 +178,7 @@ endphoneme

phoneme oU
vowel starttype #@ endtype #u
ipa ʌʊ
length 220
FMT(vdiph/Vu_2)
endphoneme
@@ -177,6 +186,7 @@ endphoneme

phoneme aI
vowel starttype #o endtype #i
ipa ɔɪ
length 240
FMT(vdiph/ooi_3)
endphoneme
@@ -184,6 +194,7 @@ endphoneme

phoneme eI
vowel starttype #@ endtype #i
ipa eː
length 240
FMT(vdiph/@i_3)
endphoneme
@@ -191,6 +202,7 @@ endphoneme

phoneme OI
vowel starttype #o endtype #i
ipa oɪ
length 230
FMT(vdiph/oi)
endphoneme
@@ -198,6 +210,7 @@ endphoneme

phoneme e@
vowel starttype #@ endtype #@
ipa ɜː
length 240
IfNextVowelAppend(r-)
FMT(vowel/3_en)

+ 1
- 0
phsource/ph_finnish View File

@@ -241,6 +241,7 @@ phoneme R2 // this is [R2], but shorter
liquid
trill
lengthmod 6
ipa r
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
FMT(r3/r_trill_short) addWav(r3/r_trill.wav, 50)

+ 9
- 3
phsource/ph_french View File

@@ -1,7 +1,7 @@
//====================================================
// French
//====================================================
// Updated 2010-06-16 Michel Such <[email protected]>
// Updated 2010-06-22 Michel Such <[email protected]>

phoneme #l virtual
// Used for l and l/
@@ -82,6 +82,7 @@ phoneme r
starttype #r endtype #r
Vowelin f1=0 f2=1500 -400 400 f3=-400 80
lengthmod 7
ipa U+0281

IF nextPh(isNotVowel) THEN
ChangePhoneme(r/)
@@ -100,6 +101,7 @@ phoneme r2 // silent unless followed by vowel
vcd uvl frc
rhotic
starttype #r endtype #r
ipa U+0281

IF nextPh(isNotVowel) THEN
ChangePhoneme(NULL)
@@ -115,6 +117,7 @@ phoneme r/ // variant of [r] when not preceding a vowel
starttype #r endtype #r
Vowelout f1=1 f2=1200 -400 800 f3=200 100 len=30
lengthmod 7
ipa U+0281

IF prevPhW(t) OR prevPhW(p) OR prevPhW(k) THEN
FMT(vwl_fr/trr) addWav(r3/rx, 15)
@@ -148,6 +151,7 @@ phoneme r/2
liquid rhotic uvl nopause
starttype #r endtype #r
Vowelin f1=0 f2=1500 -400 400 f3=-400 80
ipa U+0281

CALL post_r
IF prevPhW(f) OR prevPhW(k) OR prevPhW(p) OR prevPhW(s) OR prevPhW(t) OR prevPhW(S) THEN
@@ -349,6 +353,7 @@ phoneme I // longer than i
vowel starttype #i endtype #i
palatal
length 240
ipa i

IfNextVowelAppend(;)

@@ -470,12 +475,13 @@ endphoneme

phoneme y
vowel starttype #u endtype #u
length 170

IF nextPhW(E~) OR nextPhW(#i) THEN
FMT(vowel/y, -40)
length 110
FMT(vowel/y)
ENDIF

length 180
FMT(vowel/y)
endphoneme


+ 33
- 26
phsource/ph_german View File

@@ -175,7 +175,7 @@ endphoneme
phoneme E:
vowel starttype #e endtype #e
length 200
FMT(vowel/e_mid2)
FMT(vowel/e_8)
endphoneme


@@ -202,6 +202,7 @@ endphoneme

phoneme y
vowel starttype #u endtype #u
ipa ʏ
length 110
FMT(vowel/yy_4)
endphoneme
@@ -232,6 +233,7 @@ endphoneme

phoneme pF
vls blb afr
ipa pf
Vowelout f1=0 f2=1000 -500 -350 f3=-200 80
lengthmod 2
WAV(ufric/f) // could replace this with a [pf] wav file
@@ -300,10 +302,9 @@ endphoneme



// TESTING

phoneme r // uvular trill
phoneme r // uvular trill or fricative
vcd uvl frc
ipa ʀ
lengthmod 6
length 110
IF nextPhW(isVowel) THEN
@@ -318,32 +319,16 @@ phoneme r // uvular trill
endphoneme


phoneme UR
vowel starttype #u endtype #@
flag1
length 180
FMT(vwl_de/uu_@)
endphoneme



phoneme V2# // used for 'r' after a vowel (to create a diphthong)
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/V_2_)
endphoneme


phoneme V# // used for 'r' after a vowel (to create a diphthong)
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ChangePhoneme(r)
ENDIF

ipa ɐ
IF prevPh(#a) OR prevPh(E) THEN
FMT(r/V_2_)
ENDIF
@@ -353,20 +338,42 @@ phoneme V# // used for 'r' after a vowel (to create a diphthong)
FMT(r/V_)
endphoneme

phoneme V3#

// TESTING

phoneme V1#
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/@_)
FMT(r/V_)
endphoneme

phoneme V1#
phoneme V2# // used for 'r' after a vowel (to create a diphthong)
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/V_)
FMT(r/V_2_)
endphoneme

phoneme V3#
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/@_)
endphoneme

phoneme UR
vowel starttype #u endtype #@
ipa ʊɐ
flag1
length 180
FMT(vwl_de/uu_@)
endphoneme



+ 4
- 0
phsource/ph_hindi View File

@@ -346,6 +346,7 @@ endphoneme
phoneme t.
vls rfx stop
lengthmod 2
ipa ʈ
voicingswitch d.
Vowelin f1=0 f2=1800 -300 300 f3=-400 80
Vowelout f1=0 f2=1800 -300 250 f3=-400 80 rms=20 colr=2
@@ -355,6 +356,7 @@ endphoneme
phoneme th.
vls rfx stop
lengthmod 2
ipa ʈh
voicingswitch dh.
Vowelin f1=0 f2=1800 -300 300 f3=-400 80
Vowelout f1=0 f2=1800 -300 250 f3=-400 80 rms=20 colr=2
@@ -366,6 +368,7 @@ phoneme d.
vcd rfx stop
lengthmod 5
voicingswitch t.
ipa ɖ
Vowelin f1=1 f2=1800 -300 300 f3=-400 80
Vowelout f1=1 f2=1800 -300 300 f3=-400 80 colr=2

@@ -384,6 +387,7 @@ endphoneme
phoneme dh.
vcd rfx stop
lengthmod 5
ipa ɖh
voicingswitch th.
Vowelin f1=1 f2=1800 -300 300 f3=-400 80
Vowelout f1=1 f2=1800 -300 300 f3=-400 80 colr=2

+ 7
- 0
phsource/ph_icelandic View File

@@ -223,6 +223,7 @@ endphoneme
phoneme m#
vcd blb nasal
lengthmod 6
ipa m#
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk
FMT(m/m#_)
endphoneme
@@ -231,6 +232,7 @@ endphoneme
phoneme n#
vcd alv nasal
lengthmod 6
ipa n#
Vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk

NextVowelStarts
@@ -249,6 +251,7 @@ endphoneme
phoneme n^#
vcd pal nasal palatal
lengthmod 6
ipa ɲ#
Vowelout f1=3 f2=2300 300 400 f3=100 80 brk rate
FMT(n^/n^#_)
endphoneme
@@ -258,6 +261,7 @@ endphoneme
phoneme N#
vcd vel nasal
lengthmod 6
ipa ŋ#
Vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk

NextVowelStarts
@@ -276,6 +280,7 @@ endphoneme
phoneme l#
vls alv frc
lengthmod 3
ipa l#
WAV(ufric/l#, 25)
endphoneme

@@ -283,6 +288,7 @@ endphoneme
phoneme tl#
vls alv stop
lengthmod 2
ipa tl#
Vowelin f1=0 f2=1700 -300 300 f3=-100 80
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
WAV(ufric/tl#, 50)
@@ -292,6 +298,7 @@ endphoneme
phoneme r# // used for [r] when not preceding a vowel
liquid
lengthmod 2 //
ipa r#
FMT(r3/r#_) addWav(r3/rx)
// before n r3/r_n+r3/rx
endphoneme

+ 1
- 0
phsource/ph_latin View File

@@ -141,6 +141,7 @@ phoneme <h>
vls glt apr
length 50
lengthmod 3
ipa ʰ

IF nextPh(#@) THEN
WAV(h/h@)

+ 1
- 0
phsource/ph_latvian View File

@@ -61,6 +61,7 @@ endphoneme

phoneme a#
vowel starttype #a endtype #a
ipa ɐ
length 120
FMT(vowel/V_6)
endphoneme

+ 3
- 0
phsource/ph_norwegian View File

@@ -135,12 +135,14 @@ endphoneme

phoneme u-
vowel starttype #u endtype #u
ipa ʉ
length 120
FMT(vwl_no/u#)
endphoneme

phoneme u-:
vowel starttype #u endtype #u
ipa ʉː
length 260
FMT(vwl_no/u#2)
endphoneme
@@ -171,6 +173,7 @@ endphoneme

phoneme u-I
vowel starttype #u endtype #i
ipa ʉɪ
length 270
IfNextVowelAppend(;)
FMT(vdiph/yi)

+ 3
- 0
phsource/ph_polish View File

@@ -13,6 +13,7 @@ endphoneme

phoneme a#
vowel starttype #a endtype #a
ipa ɐ
length 170
FMT(vowel/a#_2)
endphoneme
@@ -60,6 +61,7 @@ endphoneme

phoneme y // close central unrounded (i-bar)
vowel starttype #i endtype #i
ipa ɨ
length 180
FMT(vowel/ii#_2)
endphoneme
@@ -85,6 +87,7 @@ endphoneme
phoneme R
liquid
trill
ipa r
lengthmod 6
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk

+ 13
- 2
phsource/ph_portugal View File

@@ -8,6 +8,7 @@
phoneme &
vowel starttype #@ endtype #@
length 180
ipa ɐ
FMT(vowel/a#_3)
unstressed
endphoneme
@@ -15,6 +16,7 @@ endphoneme
phoneme &/ // Used for final "a" when next word starts with "a"
vowel starttype #@ endtype #@
length 180
ipa ɐ
IF nextPh(isVowel) THEN
ChangePhoneme(NULL)
ENDIF
@@ -30,12 +32,14 @@ endphoneme

phoneme &~
vowel starttype #e endtype #@
ipa ɐU+0303
length 240
FMT(vnasal/ee_n2)
endphoneme

phoneme &U~
vowel starttype #@ endtype #u
ipa ɐU+0303ʊU+0303
length 240
FMT(vnasal/a#u_n)
endphoneme
@@ -59,6 +63,7 @@ endphoneme
phoneme y
vowel starttype #@ endtype #@
length 110
ipa ɨ
FMT(vowel/i#_5)
endphoneme

@@ -74,6 +79,7 @@ endphoneme
phoneme i/ // changes to NULL before a vowel
vowel starttype #i endtype #i
length 100
ipa ɨ
IF nextPh(isVowel) THEN
ChangePhoneme(NULL)
ENDIF
@@ -131,6 +137,7 @@ endphoneme
phoneme x // [r] for Portugal
liquid
trill
ipa ʁ
lengthmod 7
Vowelin f1=0 f2=1500 -400 400 f3=-400 80
IF nextPh(isNotVowel) THEN
@@ -145,8 +152,12 @@ phoneme R // for Portugal this is same the as [r]
endphoneme


phoneme s# // This is [s] for Brazi;, [S] for Portugal
import_phoneme base/S
phoneme s# // This is [s] for Brazil, [S] for Portugal
vls pla frc sibilant
lengthmod 3
ipa ʃ
CALL base/S
// import_phoneme base/S
endphoneme



+ 9
- 1
phsource/ph_pt_brazil View File

@@ -37,6 +37,7 @@ endphoneme

phoneme &~
vowel starttype #@ endtype #@
ipa ɐU+0303
length 180
// ChangeIfNotStressed(&)
FMT(vnasal/a#_n)
@@ -44,12 +45,14 @@ endphoneme

phoneme &U~
vowel starttype #@ endtype #u
ipa ɐU+0303ʊU+0303
length 240
FMT(vnasal/a#u_n)
endphoneme

phoneme oI~
vowel starttype #o endtype #i
ipa oU+0303ɪU+0303
length 260
FMT(vnasal/oi_n)
endphoneme
@@ -183,6 +186,7 @@ endphoneme
phoneme x // this is [R] from Slovak/Czech
liquid
trill
ipa r
lengthmod 6
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
@@ -196,13 +200,17 @@ endphoneme


phoneme s# // This is [s] for Brazi;, [S] for Portugal
import_phoneme base/s
vls alv frc sibilant
lengthmod 3
ipa s
CALL base/s
endphoneme


phoneme *
vcd alv stop
lengthmod 6
ipa ɾ
Vowelin f1=1 f2=1700 -300 300 f3=0 80
Vowelout f1=2 f2=1700 -300 300 f3=0 80
IF PreVoicing THEN

+ 2
- 0
phsource/ph_romanian View File

@@ -9,6 +9,7 @@
phoneme I^ // "silent i", palatilizes the preceding consonant
vowel starttype #i endtype #i
unstressed
ipa ʲ
length 70
IF nextPh(isVowel) THEN
ChangePhoneme(;)
@@ -41,6 +42,7 @@ endphoneme

phoneme y
vowel starttype #@ endtype #@
ipa ɨ
length 180
FMT(vowel/i#_5)
endphoneme

+ 2
- 0
phsource/ph_serbian View File

@@ -13,6 +13,7 @@ endphoneme

phoneme &
vowel starttype #a endtype #a
ipa ɐ
length 140
FMT(vowel/a#)
endphoneme
@@ -21,6 +22,7 @@ endphoneme
phoneme r* // this is [R] from Slovak/Czech
liquid
trill
ipa r
lengthmod 6
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk

+ 6
- 0
phsource/ph_slovak View File

@@ -104,12 +104,14 @@ endphoneme

phoneme r-
vowel starttype #@ endtype #@
ipa rU+0329
length 220
FMT(vowelr/r-voc)
endphoneme

phoneme r:
vowel starttype #@ endtype #@
ipa rU+0329ː
length 300
FMT(vowelr/r-voc)
endphoneme
@@ -118,6 +120,7 @@ endphoneme

phoneme R^ // Czech r-caron
vcd pla frc sibilant
ipa rU+031d
lengthmod 6
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
@@ -126,6 +129,7 @@ endphoneme

phoneme R^/ // Czech r-caron (weaker, for after p,f,t,k)
vcd pla frc sibilant
ipa rU+031dU+030a
lengthmod 6
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
@@ -135,6 +139,7 @@ endphoneme

phoneme l-
vowel starttype #@ endtype #@
ipa lU+0329
length 140
FMT(vwl_hi/l-voc)
endphoneme
@@ -142,6 +147,7 @@ endphoneme

phoneme l:
vowel starttype #@ endtype #@
ipa lU+0329ː
length 250
FMT(vwl_hi/l-voc)
endphoneme

+ 1
- 0
phsource/ph_spanish View File

@@ -71,6 +71,7 @@ endphoneme

phoneme v# // a shorter [v], a little towards [b]
vcd lbd frc
ipa v
lengthmod 6
voicingswitch f
Vowelin f1=1 f2=1000 -300 -200 f3=-300 100

+ 5
- 6
phsource/ph_tamil View File

@@ -13,6 +13,7 @@ endphoneme

phoneme V
vowel starttype #@ endtype #@
ipa ɐ
length 130
FMT(vowel/V_3)
endphoneme
@@ -81,6 +82,7 @@ phoneme u
vowel starttype #u endtype #u
length 110
IF prevPhW(isVel) THEN
FMT(vowel/u_bck2)
ELSE
ChangeIfNotStressed(U)
ENDIF
@@ -90,6 +92,7 @@ endphoneme
phoneme U
vowel starttype #u endtype #u
length 110
ipa ʉ
FMT(vowel/u#_3)
endphoneme

@@ -97,6 +100,7 @@ phoneme u:
vowel starttype #u endtype #u
length 260
IF prevPhW(isVel) THEN
FMT(vowel/u_bck2)
ELSE
ChangeIfNotStressed(U:)
ENDIF
@@ -105,16 +109,11 @@ endphoneme

phoneme U:
vowel starttype #u endtype #u
ipa ʉː
length 240
FMT(vowel/u#_3)
endphoneme

phoneme u-
vowel starttype #u endtype #u
length 130
FMT(vowel/u#_2)
endphoneme


phoneme aI
vowel starttype #a endtype #i

+ 8
- 0
phsource/ph_welsh View File

@@ -23,6 +23,7 @@ endphoneme

phoneme I
vowel starttype #i endtype #i
ipa ɨ
length 150
FMT(vowel/ii_3)
endphoneme
@@ -69,6 +70,7 @@ endphoneme

phoneme y: // symbol used in place of i" (i bar)
vowel starttype #i endtype #i
ipa ɨː
length 180
ChangeIfNotStressed(Y)
FMT(vowel/i#)
@@ -112,6 +114,7 @@ endphoneme

phoneme AY
vowel starttype #a endtype #i
ipa ɑɨ
length 250
FMT(vdiph/aai_2)
endphoneme
@@ -126,6 +129,7 @@ endphoneme

phoneme aY
vowel starttype #a endtype #i
ipa aɨ
length 210
FMT(vdiph/ai_2)
endphoneme
@@ -147,6 +151,7 @@ endphoneme

phoneme @Y
vowel starttype #@ endtype #i
ipa əɨ
length 210
FMT(vdiph/@i_2)
endphoneme
@@ -168,6 +173,7 @@ endphoneme

phoneme Yu
vowel starttype #i endtype #u
ipa ɨu
length 210
FMT(vdiph2/iu_4)
endphoneme
@@ -182,6 +188,7 @@ endphoneme

phoneme OY
vowel starttype #o endtype #i
ipa ɔɨ
length 210
FMT(vdiph/ooi)
endphoneme
@@ -196,6 +203,7 @@ endphoneme

phoneme uY
vowel starttype #u endtype #i
ipa uɨ
length 210
FMT(vdiph/ui_3)
endphoneme

+ 45
- 5
phsource/phonemes View File

@@ -145,9 +145,13 @@ endphoneme


phoneme @- // very short schwa
vowel nonsyllabic
starttype #@ endtype #@
unstressed
vowel starttype #@ endtype #@
unstressed nonsyllabic

ipa ə
IF nextPhW(*) THEN
ipa NULL
ENDIF
length 50
FMT(vowel/@-)
endphoneme
@@ -267,6 +271,7 @@ endphoneme

phoneme r- // syllabic r
vowel starttype #@ endtype #@
ipa rU+0329
unstressed
length 220
FMT(vowelr/r-voc)
@@ -274,6 +279,7 @@ endphoneme

phoneme l- // syllabic l
vowel starttype #@ endtype #@
ipa lU+0329
unstressed
length 200
FMT(vwl_hi/l-voc)
@@ -282,6 +288,7 @@ endphoneme

phoneme r
liquid rhotic
ipa ɹ
lengthmod 7

IF nextPh(isNotVowel) THEN
@@ -337,6 +344,10 @@ phoneme R
liquid
trill
lengthmod 6
ipa r
IF nextPhW(R2) THEN
ipa NULL
ENDIF
Vowelin f1=0 f2=1600 -300 300 f3=-200 80
Vowelout f1=2 f2=1600 -300 300 f3=-200 80 brk
FMT(r3/r_trill2) addWav(r3/r_trill2.wav, 65)
@@ -346,6 +357,7 @@ phoneme R2 // this is [R] from Slovak/Czech
liquid
trill
lengthmod 6
ipa r
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
FMT(r3/r_trill) addWav(r3/r_trill.wav, 50)
@@ -356,6 +368,7 @@ phoneme R3 // Afrikaans
trill
lengthmod 6
length 60
ipa r
Vowelin f1=2 f2=2700 -300 -200 f3=-1300 80
Vowelout f1=2 f2=1700 -300 -200 f3=-1300 80

@@ -379,6 +392,7 @@ endphoneme

phoneme r" // uvular trill
vcd uvl frc
ipa ʀ
lengthmod 6
IF nextPh(isNotVowel) THEN
FMT(r3/r_uvl) addWav(r3/r_uvl.wav, 50)
@@ -497,6 +511,7 @@ endphoneme

phoneme l^ // palatal l
liquid
ipa ʎ
lengthmod 7
Vowelout len=60 lenadd rate
length 100
@@ -520,6 +535,7 @@ endphoneme

phoneme l.
liquid rfx
ipa ɭ
lengthmod 7
FMT(l^/l_rfx)
endphoneme
@@ -563,7 +579,7 @@ phoneme j
liquid palatal
lengthmod 7

IF nextPh(isVowel) THEN
IF nextPhW(isVowel) THEN
NextVowelStarts
VowelStart(j/j@)
VowelStart(j/ja)
@@ -591,6 +607,10 @@ phoneme ; // linking j, used between (i) vowels and a following vowel
liquid palatal
lengthmod 0

IF prevPh(#i) THEN
ipa NULL // linking after i vowel, don't show in ipa
ENDIF

IF nextPh(isNotVowel) THEN
ChangePhoneme(NULL) // this is to ignore this phoneme if not before a vowel
ENDIF
@@ -682,6 +702,7 @@ endphoneme

phoneme n.
vcd rfx nasal
ipa ɳ
starttype n endtype n
Vowelin f1=2 f2=1200 -300 250 f3=-500 80 rms=20 colr=2
Vowelout f1=2 f2=1200 -300 250 f3=-500 80 rms=20 brk colr=2
@@ -712,6 +733,7 @@ endphoneme

phoneme n^
vcd pal nasal palatal
ipa ɲ
Vowelout f1=3 f2=2500 300 500 f3=100 80 len=45 brk rate
lengthmod 4

@@ -777,6 +799,7 @@ endphoneme

phoneme ** // TEST flap
liquid alv
ipa ɾ
lengthmod 3
Vowelout f1=3 f2=1600 -300 300 f3=-300 80 rms=35 len=15
Vowelin f1=2 f2=1600 -300 300 f3=-100 80 len=20
@@ -792,8 +815,13 @@ endphoneme
phoneme * // flap
vcd alv flp
brkafter
ipa ɾ
lengthmod 3

IF prevPhW(@-) THEN
ipa r // @-* sequence for [r]
ENDIF

IF nextPh(#e) OR nextPh(#i) THEN
Vowelin f1=0 f2=1500 -300 300 f3=-200 80
FMT(d/tap1) addWav(r3/rx, 150)
@@ -1052,6 +1080,7 @@ endphoneme

phoneme v# // approximant, not fricative
vcd lbd frc
ipa ʋ
lengthmod 6
voicingswitch f
Vowelin f1=0 f2=1000 -300 -200 f3=-300 100
@@ -1121,6 +1150,7 @@ endphoneme

phoneme z.
vcd pla frc sibilant
ipa ʐ
voicingswitch s.
lengthmod 6
Vowelin f1=0 f2=1800 -100 300 f3=-300 80
@@ -1142,6 +1172,7 @@ endphoneme

phoneme z;
vcd pal frc sibilant palatal
ipa ʑ
voicingswitch s;
lengthmod 6
Vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70
@@ -1170,6 +1201,7 @@ endphoneme

phoneme J^ // palatal fricative (Kirshenbaum C<vcd>)
vcd pal frc palatal
ipa ʝ
voicingswitch C
lengthmod 6
Vowelin f1=1 f2=2700 400 600 f3=200 70
@@ -1213,8 +1245,9 @@ phoneme Q^
endphoneme


phoneme Q" // voiced velar fricative
phoneme Q"
vcd uvl frc
ipa ʁ
lengthmod 6

IF nextPh(isPause2) THEN
@@ -1430,6 +1463,7 @@ endphoneme

phoneme s.
vls pla frc sibilant
ipa ʂ
voicingswitch z.
lengthmod 3
Vowelin f1=0 f2=1800 -100 300 f3=-300 80
@@ -1444,6 +1478,7 @@ endphoneme

phoneme s;
vls pal frc sibilant palatal
ipa ʂ
voicingswitch z;
lengthmod 3
Vowelin f1=1 f2=2700 400 600 f3=200 70 rate len=70
@@ -1472,6 +1507,7 @@ endphoneme

phoneme l# // Lateral fricative (eg. Welsh "ll")
vls alv frc
ipa ɬ
lengthmod 3

NextVowelStarts
@@ -1533,6 +1569,7 @@ endphoneme
phoneme h
vls glt apr
lengthmod 3
ipa h

IF nextPh(#@) THEN
WAV(h/h@)
@@ -1767,3 +1804,6 @@ include ph_bulgarian

phonemetable nso base
include ph_northern-sotho

phonemetable ht fr
include ph_haitian

BIN
phsource/vowel/V_4 View File


BIN
phsource/vowel/aa_7 View File


BIN
phsource/vowel/o_5 View File


BIN
phsource/vowel/o_6 View File


BIN
phsource/vowel/oo View File


+ 37
- 35
platforms/windows/windows_dll/src/speak_lib.h View File

@@ -50,12 +50,13 @@ Revision 5
typedef enum {
espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list.
espeakEVENT_WORD = 1, // Start of word
espeakEVENT_SENTENCE, // Start of sentence
espeakEVENT_MARK, // Mark
espeakEVENT_PLAY, // Audio element
espeakEVENT_END, // End of sentence or clause
espeakEVENT_MSG_TERMINATED, // End of message
espeakEVENT_PHONEME // Phoneme, if enabled in espeak_Initialize()
espeakEVENT_SENTENCE = 2, // Start of sentence
espeakEVENT_MARK = 3, // Mark
espeakEVENT_PLAY = 4, // Audio element
espeakEVENT_END = 5, // End of sentence or clause
espeakEVENT_MSG_TERMINATED = 6, // End of message
espeakEVENT_PHONEME = 7, // Phoneme, if enabled in espeak_Initialize()
espeakEVENT_SAMPLERATE = 8 // internal use, set sample rate
} espeak_EVENT_TYPE;


@@ -73,7 +74,7 @@ typedef struct {
const char *name; // used for MARK and PLAY events. UTF8 string
} id;
} espeak_EVENT;
/*
/*
When a message is supplied to espeak_synth, the request is buffered and espeak_synth returns. When the message is really processed, the callback function will be repetedly called.


@@ -81,16 +82,16 @@ typedef struct {

In PLAYBACK mode, the callback function is called as soon as an event happens.

For example suppose that the following message is supplied to espeak_Synth:
For example suppose that the following message is supplied to espeak_Synth:
"hello, hello."


* Once processed in RETRIEVAL mode, it could lead to 3 calls of the callback function :

** Block 1:
<audio data> +
<audio data> +
List of events: SENTENCE + WORD + LIST_TERMINATED
** Block 2:
<audio data> +
List of events: WORD + END + LIST_TERMINATED
@@ -127,11 +128,11 @@ typedef enum {

typedef enum {
/* PLAYBACK mode: plays the audio data, supplies events to the calling program*/
AUDIO_OUTPUT_PLAYBACK,
AUDIO_OUTPUT_PLAYBACK,

/* RETRIEVAL mode: supplies audio data and events to the calling program */
AUDIO_OUTPUT_RETRIEVAL,
/* SYNCHRONOUS mode: as RETRIEVAL but doesn't return until synthesis is completed */
AUDIO_OUTPUT_SYNCHRONOUS,

@@ -174,7 +175,7 @@ extern "C"
ESPEAK_API void espeak_SetSynthCallback(t_espeak_callback* SynthCallback);
/* Must be called before any synthesis functions are called.
This specifies a function in the calling program which is called when a buffer of
speech sound data has been produced.
speech sound data has been produced.


The callback function is of the form:
@@ -263,7 +264,7 @@ ESPEAK_API espeak_ERROR espeak_Synth(const void *text,
start of the text.

position_type: Determines whether "position" is a number of characters, words, or sentences.
Values:
Values:

end_position: If set, this gives a character position at which speaking will stop. A value
of zero indicates no end position.
@@ -282,13 +283,13 @@ ESPEAK_API espeak_ERROR espeak_Synth(const void *text,
espeakENDPAUSE If set then a sentence pause is added at the end of the text. If not set then
this pause is suppressed.

unique_identifier: message identifier; helpful for identifying later
unique_identifier: message identifier; helpful for identifying later
data supplied to the callback.

user_data: pointer which will be passed to the callback function.

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -311,8 +312,8 @@ ESPEAK_API espeak_ERROR espeak_Synth_Mark(const void *text,

For the other parameters, see espeak_Synth()

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -325,8 +326,8 @@ ESPEAK_API espeak_ERROR espeak_Key(const char *key_name);
If key_name is a single character, it speaks the name of the character.
Otherwise, it speaks key_name as a text string.

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -335,10 +336,10 @@ ESPEAK_API espeak_ERROR espeak_Key(const char *key_name);
extern "C"
#endif
ESPEAK_API espeak_ERROR espeak_Char(wchar_t character);
/* Speak the name of the given character
/* Speak the name of the given character

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -394,7 +395,7 @@ ESPEAK_API espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int valu
espeakRANGE: pitch range, range 0-100. 0-monotone, 50=normal

espeakPUNCTUATION: which punctuation characters to announce:
value in espeak_PUNCT_TYPE (none, all, some),
value in espeak_PUNCT_TYPE (none, all, some),
see espeak_GetParameter() to specify which characters are announced.

espeakCAPITALS: announce capital letters by:
@@ -406,8 +407,8 @@ ESPEAK_API espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int valu

espeakWORDGAP: pause between words, units of 10mS (at the default speed)

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -429,8 +430,8 @@ ESPEAK_API espeak_ERROR espeak_SetPunctuationList(const wchar_t *punctlist);

punctlist: A list of character codes, terminated by a zero character.

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -474,7 +475,7 @@ typedef struct {
unsigned char gender; // 0=none 1=male, 2=female,
unsigned char age; // 0=not specified, or age in years
unsigned char variant; // only used when passed as a parameter to espeak_SetVoiceByProperties
unsigned char xx1; // for internal use
unsigned char xx1; // for internal use
int score; // for internal use
void *spare; // for internal use
} espeak_VOICE;
@@ -519,8 +520,8 @@ ESPEAK_API espeak_ERROR espeak_SetVoiceByName(const char *name);
/* Searches for a voice with a matching "name" field. Language is not considered.
"name" is a UTF8 string.

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
you may try after a while to call the function again.
EE_INTERNAL_ERROR.
*/
@@ -561,7 +562,7 @@ ESPEAK_API espeak_ERROR espeak_Cancel(void);
function returns, the audio output is fully stopped and the synthesizer is ready to
synthesize a new message.

Return: EE_OK: operation achieved
Return: EE_OK: operation achieved
EE_INTERNAL_ERROR.
*/

@@ -578,7 +579,7 @@ extern "C"
#endif
ESPEAK_API espeak_ERROR espeak_Synchronize(void);
/* This function returns when all data have been spoken.
Return: EE_OK: operation achieved
Return: EE_OK: operation achieved
EE_INTERNAL_ERROR.
*/

@@ -587,7 +588,7 @@ extern "C"
#endif
ESPEAK_API espeak_ERROR espeak_Terminate(void);
/* last function to be called.
Return: EE_OK: operation achieved
Return: EE_OK: operation achieved
EE_INTERNAL_ERROR.
*/

@@ -600,3 +601,4 @@ ESPEAK_API const char *espeak_Info(void* ptr);
The parameter is for future use, and should be set to NULL
*/
#endif


+ 61
- 0
src/compiledata.cpp View File

@@ -42,6 +42,7 @@

extern void FindPhonemesUsed(void);
extern void DisplayErrorFile(const char *fname);
extern int utf8_out(unsigned int c, char *buf);
char path_source[sizeof(path_home)+20];


@@ -290,6 +291,7 @@ static keywtab_t keywords[] = {
{"LengthAdd", tINSTRN1, i_ADD_LENGTH},
{"Lengthmod", tINSTRN1, i_LENGTH_MOD},
{"lengthmod", tINSTRN1, i_LENGTH_MOD},
{"ipa", tINSTRN1, i_IPA_NAME},

// flags
{"wavef", tPHONEME_FLAG, phWAVE},
@@ -392,6 +394,7 @@ static void DecompilePhoneme(FILE *f_out, PHONEME_TAB *ph, int compile_phoneme)
int ix;
int any;
const char *name;
char buf[120];

static const char *INV = "Invalid";

@@ -456,6 +459,18 @@ return;
fprintf(f_out,"%s",instn0_string[data1]);
}
else
if(type2 == i_IPA_NAME)
{
for(ix = 0; ix < data1; ix += 2)
{
instn = *pc++;
buf[ix] = instn >> 8;
buf[ix+1] = instn & 0xff;
}
buf[ix] = 0;
fprintf(f_out,"ipa %s",buf);
}
else
{
fprintf(f_out,"%s(",KeyToMnem(keywords, tINSTRN1, type2));
switch(instn1_paramtype[type2])
@@ -2541,6 +2556,11 @@ int CompilePhoneme(int compile_phoneme)
int keyword;
int value;
int phcode = 0;
int ix;
unsigned int c;
char *p;
char number_buf[12];
char ipa_buf[N_ITEM_STRING];
PHONEME_TAB phoneme_out2;
PHONEME_PROG_LOG phoneme_prog_log;

@@ -2657,6 +2677,42 @@ int CompilePhoneme(int compile_phoneme)
value = NextItem(tNUMBER);
phoneme_out->length_mod = value;
break;

case i_IPA_NAME:
NextItem(tSTRING);

if(strcmp(item_string,"NULL")==0)
strcpy(item_string," ");

// copy the string, recognize characters in the form U+9999
p = item_string;
ix = 0;
while((c = *p++) != 0)
{
if((c=='U') && (p[0]=='+'))
{
// U+9999
memcpy(number_buf,&p[1],4); // U+ should be followed by 4 hex digits
number_buf[4] = 0;
c = 0;
sscanf(number_buf,"%x",&c);
p += 5;
ix += utf8_out(c, &ipa_buf[ix]);
}
else
{
ipa_buf[ix++] = c;
}
}
ipa_buf[ix] = 0;
value = strlen(ipa_buf); // number of UTF-8 bytes

*prog_out++ = (i_IPA_NAME << 8) + value;
for(ix=0; ix < value; ix += 2)
{
*prog_out++ = (ipa_buf[ix] << 8) + (ipa_buf[ix+1] & 0xff);
}
break;
}
break;

@@ -2702,6 +2758,11 @@ int CompilePhoneme(int compile_phoneme)
case kSTRESSTYPE:
value = NextItem(tNUMBER);
phoneme_out->std_length = value;
if(prog_out > prog_buf)
{
error("stress phonemes can't contain program instructions",NULL);
prog_out = prog_buf;
}
break;

case kIF:

+ 104
- 20
src/dictionary.cpp View File

@@ -506,20 +506,84 @@ void DecodePhonemes(const char *inptr, char *outptr)
} // end of DecodePhonemes


// using Kirschenbaum to IPA translation, ascii 0x20 to 0x7f
unsigned short ipa1[96] = {
0x20,0x21,0x22,0x2b0,0x24,0x25,0x0e6,0x2c8,0x28,0x27e,0x2a,0x2b,0x2cc,0x2d,0x2e,0x2f,
0x252,0x31,0x32,0x25c,0x34,0x35,0x36,0x37,0x275,0x39,0x2d0,0x2b2,0x3c,0x3d,0x3e,0x294,
0x259,0x251,0x3b2,0xe7,0xf0,0x25b,0x46,0x262,0x127,0x26a,0x25f,0x4b,0x4c,0x271,0x14b,0x254,
0x3a6,0x263,0x280,0x283,0x3b8,0x28a,0x28c,0x153,0x3c7,0xf8,0x292,0x32a,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x303,0x7f
};


static void WritePhMnemonic(char *phon_out, int *ix, PHONEME_TAB *ph, PHONEME_LIST *plist)
{//=======================================================================================
int c;
int mnem;
int len;
int first;
unsigned int ipa_control=0; // first byte of ipa string may control the phoneme name interpretation. 0x20 = ignore this phoneme
PHONEME_DATA phdata;

static void WriteMnemonic(char *phon_out, int *ix, int mnem)
{//=========================================================
unsigned char c;
if(option_phonemes == 3)
{
// has an ipa name been defined for this phoneme ?
phdata.ipa_string[0] = 0;

if(plist == NULL)
{
InterpretPhoneme2(ph->code, &phdata);
}
else
{
InterpretPhoneme(NULL, 0, plist, &phdata);
}

len = strlen(phdata.ipa_string);
if(len > 0)
{
if((ipa_control = phdata.ipa_string[0]) > 0x20)
{
strcpy(&phon_out[*ix], phdata.ipa_string);
*ix += len;
}
if(ipa_control >= 0x20)
return; // 0x20 = ignore phoneme
}
}

while((c = mnem & 0xff) != 0)
first = 1;
for(mnem = ph->mnemonic; (c = mnem & 0xff) != 0; mnem = mnem >> 8)
{
if((c == '/') && (option_phoneme_variants==0))
break; // discard phoneme variant indicator
phon_out[(*ix)++]= c;
// phon_out[phon_out_ix++]= ipa1[c];
mnem = mnem >> 8;

if(option_phonemes == 3)
{
// convert from ascii to ipa
if(first && (c == '_'))
break; // don't show pause phonemes

if((c == '#') && (ph->type == phVOWEL))
break; // # is subscript-h, but only for consonants

// ignore digits after the first character
if(!first && isdigit(c))
continue;

if((c >= 0x20) && (c < 128))
c = ipa1[c-0x20];

*ix += utf8_out(c, &phon_out[*ix]);
}
else
{
phon_out[(*ix)++]= c;
}
first = 0;
}
}
} // end of WritePhMnemonic



@@ -532,6 +596,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out)
int ix;
int phon_out_ix=0;
int stress;
unsigned int c;
char *p;
PHONEME_LIST *plist;
@@ -549,35 +614,52 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out)
{
if((stress = plist->stresslevel) > 1)
{
c = 0;
if(stress > 5) stress = 5;
phon_out[phon_out_ix++] = stress_chars[stress];

if(option_phonemes == 3)
{
c = 0x2cc; // ipa, secondary stress
if(stress > 3)
c = 0x02c8; // ipa, primary stress
}
else
{
c = stress_chars[stress];
}

if(c != 0)
{
phon_out_ix += utf8_out(c, &phon_out[phon_out_ix]);
}
}
}
WriteMnemonic(phon_out, &phon_out_ix, plist->ph->mnemonic);
WritePhMnemonic(phon_out, &phon_out_ix, plist->ph, plist);

if(plist->synthflags & SFLAG_LENGTHEN)
{
WriteMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonLENGTHEN]->mnemonic);
WritePhMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonLENGTHEN], NULL);
}
if((plist->synthflags & SFLAG_SYLLABLE) && (plist->type != phVOWEL))
{
// syllablic consonant
WriteMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonSYLLABIC]->mnemonic);
WritePhMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonSYLLABIC], NULL);
}
if(plist->ph->code == phonSWITCH)
{
// the tone_ph field contains a phoneme table number
p = phoneme_tab_list[plist->tone_ph].name;
while(*p != 0)
while((c = *p++) != 0)
{
phon_out[phon_out_ix++] = *p++;
if(option_phonemes != 3)
phon_out[phon_out_ix++] = c;
}
phon_out[phon_out_ix++] = ' ';
}
else
if(plist->tone_ph > 0)
{
WriteMnemonic(phon_out, &phon_out_ix, phoneme_tab[plist->tone_ph]->mnemonic);
WritePhMnemonic(phon_out, &phon_out_ix, phoneme_tab[plist->tone_ph], NULL);
}
}
@@ -1049,17 +1131,19 @@ void ChangeWordStress(Translator *tr, char *word, int new_stress)



void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int prev_stress)
{//=========================================================================================================
void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control)
{//=====================================================================================================
/* Guess stress pattern of word. This is language specific

'output' is used for input and output

'dictionary_flags' has bits 0-3 position of stressed vowel (if > 0)
or unstressed (if == 7) or syllables 1 and 2 (if == 6)
bits 8... dictionary flags

If 'tonic' is set (>= 0), replace highest stress by this value.

Parameter used for input and output
control: bit 0 This is an individual symbol, not a word
*/

unsigned char phcode;
@@ -1495,7 +1579,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
p = phonetic;
v = 1;

if((ph = phoneme_tab[*p]) != NULL)
if(!(control & 1) && ((ph = phoneme_tab[*p]) != NULL))
{

if(ph->type == phSTRESS)
@@ -2564,7 +2648,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
}
else
{
LookupLetter(tr, wc, -1, ph_buf);
LookupLetter(tr, wc, -1, ph_buf, 0);
if(ph_buf[0])
{
match1.phonemes = ph_buf;

+ 19
- 14
src/espeak.cpp View File

@@ -34,7 +34,7 @@


static const char *help_text =
"\nspeak [options] [\"<words>\"]\n\n"
"\nespeak [options] [\"<words>\"]\n\n"
"-f <text file> Text file to speak\n"
"--stdin Read text input from stdin instead of a file\n\n"
"If neither -f nor --stdin, then <words> are spoken, or if none then text\n"
@@ -43,6 +43,9 @@ static const char *help_text =
"\t Amplitude, 0 to 200, default is 100\n"
"-g <integer>\n"
"\t Word gap. Pause between words, units of 10mS at the default speed\n"
"-k <integer>\n"
"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n"
"\t higher values indicate a pitch increase (try -k20).\n"
"-l <integer>\n"
"\t Line length. If not zero (which is the default), consider\n"
"\t lines less than this length as end-of-clause\n"
@@ -53,34 +56,31 @@ static const char *help_text =
"-v <voice name>\n"
"\t Use voice file of this name from espeak-data/voices\n"
"-w <wave file name>\n"
"\t Write output to this WAV file, rather than speaking it directly\n"
"\t Write speech to this WAV file, rather than speaking it directly\n"
"-b\t Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit \n"
"-m\t Interpret SSML markup, and ignore other < > tags\n"
"-q\t Quiet, don't produce any speech (may be useful with -x)\n"
"-x\t Write phoneme mnemonics to stdout\n"
"-X\t Write phonemes mnemonics and translation trace to stdout\n"
"-z\t No final sentence pause at the end of the text\n"
"--stdout Write speech output to stdout\n"
"--compile=<voice name>\n"
"\t Compile the pronunciation rules and dictionary in the current\n"
"\t Compile pronunciation rules and dictionary from the current\n"
"\t directory. <voice name> specifies the language\n"
"--ipa Write phonemes to stdout using International Phonetic Alphabet\n"
"--path=\"<path>\"\n"
"\t Specifies the directory containing the espeak-data directory\n"
"--pho\n"
"\t Write mbrola phoneme data (.pho) to stdout, or to the file in --phonout\n"
"--pho Write mbrola phoneme data (.pho) to stdout or to the file in --phonout\n"
"--phonout=\"<filename>\"\n"
"\t Write phoneme output from -x -X and --pho to this file\n"
"\t Write phoneme output from -x -X --ipa and --pho to this file\n"
"--punct=\"<characters>\"\n"
"\t Speak the names of punctuation characters during speaking. If\n"
"\t =<characters> is omitted, all punctuation is spoken.\n"
"--split=\"<minutes>\"\n"
"\t Starts a new WAV file every <minutes>. Used with -w\n"
"--stdout Write speech output to stdout\n"
"--voices=<language>\n"
"\t List the available voices for the specified language.\n"
"\t If <language> is omitted, then list all voices.\n"
"-k <integer>\n"
"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n"
"\t higher values indicate a pitch increase (try -k20).\n";
"\t If <language> is omitted, then list all voices.\n";



@@ -355,6 +355,7 @@ int main (int argc, char **argv)
{"path", required_argument, 0, 0x107},
{"phonout", required_argument, 0, 0x108},
{"pho", no_argument, 0, 0x109},
{"ipa", no_argument, 0, 0x10a},
{0, 0, 0, 0}
};

@@ -573,9 +574,9 @@ int main (int argc, char **argv)

case 0x106: // -- split
if(optarg2 == NULL)
samples_split = 30 * 60; // default 30 minutes
samples_split_seconds = 30 * 60; // default 30 minutes
else
samples_split = atoi(optarg2) * 60;
samples_split_seconds = atoi(optarg2) * 60;
break;

case 0x107: // --path
@@ -590,7 +591,11 @@ int main (int argc, char **argv)
break;

case 0x109: // --pho
option_mbrola_phonemes = 8;
option_mbrola_phonemes = 16;
break;

case 0x10a: // --ipa
option_phonemes = 3;
break;

default:

+ 19
- 2
src/espeakedit.cpp View File

@@ -148,6 +148,7 @@ if(argc > 1)
if(strcmp(param,"--compile")==0)
{
CompilePhonemeData();
CompileIntonation();
exit(0);
}
}
@@ -197,7 +198,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
EVT_MENU(MENU_SPECTRUM, MyFrame::OnNewWindow)
EVT_MENU(MENU_SPECTRUM2, MyFrame::OnNewWindow)
EVT_MENU(MENU_PROSODY, MyFrame::OnProsody)
EVT_MENU(MENU_PARAMS, MyFrame::OnOptions)
EVT_MENU(MENU_OPT_SPEED, MyFrame::OnOptions)
EVT_MENU(MENU_OPT_PUNCT, MyFrame::OnOptions)
EVT_MENU(MENU_OPT_SPELL, MyFrame::OnOptions)
EVT_MENU(MENU_PATH0, MyFrame::OnOptions)
EVT_MENU(MENU_PATH1, MyFrame::OnOptions)
EVT_MENU(MENU_PATH2, MyFrame::OnOptions)
@@ -214,6 +217,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
EVT_MENU(MENU_QUIT, MyFrame::OnQuit)
EVT_MENU(MENU_SPEAK_TRANSLATE, MyFrame::OnSpeak)
EVT_MENU(MENU_SPEAK_RULES, MyFrame::OnSpeak)
EVT_MENU(MENU_SPEAK_IPA, MyFrame::OnSpeak)
EVT_MENU(MENU_SPEAK_TEXT, MyFrame::OnSpeak)
EVT_MENU(MENU_SPEAK_FILE, MyFrame::OnSpeak)
EVT_MENU(MENU_SPEAK_STOP, MyFrame::OnSpeak)
@@ -473,7 +477,7 @@ void OnOptions2(int event_id)

switch(event_id)
{
case MENU_PARAMS:
case MENU_OPT_SPEED:
value = wxGetNumberFromUser(_T(""),_T(""),_T("Speed"),option_speed,80,500);
if(value > 0)
{
@@ -483,6 +487,18 @@ void OnOptions2(int event_id)
}
break;

case MENU_OPT_PUNCT:
transldlg->t_source->SetValue(_T("<tts:style field=\"punctuation\" mode=\"all\">\n"));
transldlg->t_source->SetInsertionPointEnd();
notebook->SetSelection(1);
break;

case MENU_OPT_SPELL:
transldlg->t_source->SetValue(_T("<say-as interpret-as=\"tts:char\">\n"));
transldlg->t_source->SetInsertionPointEnd();
notebook->SetSelection(1);
break;

case MENU_PATH0:
string = wxFileSelector(_T("Master phonemes file"),wxFileName(path_phfile).GetPath(),
_T(""),_T(""),_T("*"),wxOPEN);
@@ -677,6 +693,7 @@ void MyFrame::OnSpeak(wxCommandEvent& event)
{
case MENU_SPEAK_TRANSLATE:
case MENU_SPEAK_RULES:
case MENU_SPEAK_IPA:
case MENU_SPEAK_TEXT:
transldlg->OnCommand(event);
break;

+ 1
- 1
src/intonation.cpp View File

@@ -192,7 +192,7 @@ static unsigned char env_risefallrise[128] = {



unsigned char *envelope_data[20] = {
unsigned char *envelope_data[N_ENVELOPE_DATA] = {
env_fall, env_fall,
env_rise, env_rise,
env_frise, env_r_frise,

+ 9
- 9
src/klatt.cpp View File

@@ -458,7 +458,7 @@ if(option_log_frames)
temp = (temp * kt_globals.fadeout) / 64;
}

value = int(temp) + ((echo_buf[echo_tail++]*echo_amp) >> 8);
value = (int)temp + ((echo_buf[echo_tail++]*echo_amp) >> 8);
if(echo_tail >= N_ECHO_BUF)
echo_tail=0;

@@ -973,7 +973,7 @@ static double DBtoLIN(long dB)
return(0);
}
return(double(amptable[dB]) * 0.001);
return((double)(amptable[dB]) * 0.001);
}


@@ -1050,7 +1050,7 @@ int Wavegen_Klatt(int resume)
for(ix=0; ix < N_KLATTP; ix++)
{
klattp1[ix] += klattp_inc[ix];
klattp[ix] = int(klattp1[ix]);
klattp[ix] = (int)klattp1[ix];
}

for(ix=0; ix<=6; ix++)
@@ -1213,7 +1213,7 @@ if(option_log_frames)
else
{
klattp1[ix] = klattp[ix] = fr1->klattp[ix];
klattp_inc[ix] = double((fr2->klattp[ix] - klattp[ix]) * STEPSIZE)/length;
klattp_inc[ix] = (double)((fr2->klattp[ix] - klattp[ix]) * STEPSIZE)/length;
}

// get klatt parameter adjustments for the voice
@@ -1226,7 +1226,7 @@ if(option_log_frames)
for(ix=1; ix < 6; ix++)
{
peaks[ix].freq1 = (fr1->ffreq[ix] * v->freq[ix] / 256.0) + v->freqadd[ix];
peaks[ix].freq = int(peaks[ix].freq1);
peaks[ix].freq = (int)peaks[ix].freq1;
next = (fr2->ffreq[ix] * v->freq[ix] / 256.0) + v->freqadd[ix];
peaks[ix].freq_inc = ((next - peaks[ix].freq1) * STEPSIZE) / length;

@@ -1234,7 +1234,7 @@ if(option_log_frames)
{
// klatt bandwidth for f1, f2, f3 (others are fixed)
peaks[ix].bw1 = fr1->bw[ix] * 2;
peaks[ix].bw = int(peaks[ix].bw1);
peaks[ix].bw = (int)peaks[ix].bw1;
next = fr2->bw[ix] * 2;
peaks[ix].bw_inc = ((next - peaks[ix].bw1) * STEPSIZE) / length;
}
@@ -1245,7 +1245,7 @@ if(option_log_frames)
if(peaks[0].freq1 == 0)
peaks[0].freq1 = kt_frame.Fhz[F_NP]; // if no nasal zero, set it to same freq as nasal pole

peaks[0].freq = int(peaks[0].freq1);
peaks[0].freq = (int)peaks[0].freq1;
next = fr2->klattp[KLATT_FNZ] * 2;
if(next == 0)
next = kt_frame.Fhz[F_NP];
@@ -1262,12 +1262,12 @@ if(option_log_frames)
for(ix=1; ix < 7; ix++)
{
peaks[ix].bp1 = fr1->klatt_bp[ix] * 4; // parallel bandwidth
peaks[ix].bp = int(peaks[ix].bp1);
peaks[ix].bp = (int)peaks[ix].bp1;
next = fr2->klatt_bp[ix] * 2;
peaks[ix].bp_inc = ((next - peaks[ix].bp1) * STEPSIZE) / length;

peaks[ix].ap1 = fr1->klatt_ap[ix]; // parallal amplitude
peaks[ix].ap = int(peaks[ix].ap1);
peaks[ix].ap = (int)peaks[ix].ap1;
next = fr2->klatt_ap[ix] * 2;
peaks[ix].ap_inc = ((next - peaks[ix].ap1) * STEPSIZE) / length;
}

+ 5
- 2
src/main.h View File

@@ -94,11 +94,11 @@ public:
void SpeakFile(void);
void ReadVoice(int variant);
void OnCommand(wxCommandEvent& event);
wxTextCtrl* t_source;

private:
wxButton *t_translate;
wxButton *t_process;
wxTextCtrl* t_source;
wxTextCtrl* t_phonetic;


@@ -124,7 +124,9 @@ enum {
MENU_DOCS,

MENU_OPTIONS,
MENU_PARAMS,
MENU_OPT_SPEED,
MENU_OPT_PUNCT,
MENU_OPT_SPELL,
MENU_PATHS,
MENU_PATH0,
MENU_PATH1,
@@ -143,6 +145,7 @@ enum {

MENU_SPEAK_TRANSLATE,
MENU_SPEAK_RULES,
MENU_SPEAK_IPA,
MENU_SPEAK_TEXT,
MENU_SPEAK_FILE,
MENU_SPEAK_PAUSE,

+ 89
- 62
src/mbrowrap.cpp View File

@@ -74,19 +74,19 @@ static void log(const char *msg, ...)
va_end(params);
}

static void err(const char *err, ...)
static void err(const char *errmsg, ...)
{
va_list params;

va_start(params, err);
vsnprintf(mbr_errorbuf, sizeof(mbr_errorbuf), err, params);
va_start(params, errmsg);
vsnprintf(mbr_errorbuf, sizeof(mbr_errorbuf), errmsg, params);
va_end(params);
log("mbrola error: \"%s\"", mbr_errorbuf);
log("mbrowrap error: %s", mbr_errorbuf);
}

static int create_pipes(int p1[2], int p2[2], int p3[2])
{
int error=0;
int error;

if (pipe(p1) != -1) {
if (pipe(p2) != -1) {
@@ -100,7 +100,8 @@ static int create_pipes(int p1[2], int p2[2], int p3[2])
error = errno;
close(p1[0]);
close(p1[1]);
}
} else
error = errno;

err("pipe(): %s", strerror(error));
return -1;
@@ -231,67 +232,89 @@ static void free_pending_data(void)
mbr_pending_data_tail = NULL;
}

static int mbrola_has_errors(void)
static int mbrola_died(void)
{
int result, error;
pid_t pid;
int status, len;
const char *msg;
char msgbuf[80];

pid = waitpid(mbr_pid, &status, WNOHANG);
if (!pid) {
msg = "mbrola closed stderr and did not exit";
} else if (pid != mbr_pid) {
msg = "waitpid() is confused";
} else {
mbr_pid = 0;
if (WIFSIGNALED(status)) {
int sig = WTERMSIG(status);
snprintf(msgbuf, sizeof(msgbuf),
"mbrola died by signal %d", sig);
msg = msgbuf;
} else if (WIFEXITED(status)) {
int exst = WEXITSTATUS(status);
snprintf(msgbuf, sizeof(msgbuf),
"mbrola exited with status %d", exst);
msg = msgbuf;
} else {
msg = "mbrola died and wait status is weird";
}
}

result = read(mbr_error_fd, mbr_errorbuf, sizeof(mbr_errorbuf)-1);
log("mbrowrap error: %s", msg);

if (result == -1) {
if (errno == EAGAIN)
return 0;
err("read(error): %s", strerror(errno));
return -1;
}
len = strlen(mbr_errorbuf);
if (!len)
snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), "%s", msg);
else
snprintf(mbr_errorbuf + len, sizeof(mbr_errorbuf) - len,
", (%s)", msg);
return -1;
}

static int mbrola_has_errors(void)
{
int result;
char buffer[256];
char *buf_ptr, *lf;

buf_ptr = buffer;
for (;;) {
result = read(mbr_error_fd, buf_ptr,
sizeof(buffer) - (buf_ptr - buffer) - 1);
if (result == -1) {
if (errno == EAGAIN)
return 0;
err("read(error): %s", strerror(errno));
return -1;
}

if (result != 0) {
mbr_errorbuf[result] = 0;
if (mbr_errorbuf[result - 1] == '\n')
mbr_errorbuf[result - 1] = 0;
/* inhibit the reset signal message */
if (strncmp(mbr_errorbuf, "Got a reset signal", 18) == 0) {
mbr_errorbuf[0] = 0;
return 0;
if (result == 0) {
/* EOF on stderr, assume mbrola died. */
return mbrola_died();
}
/* don't consider this fatal at this point */
error = 0;
} else {
/* EOF on stderr, assume mbrola died. */
pid_t pid;
int status, len;
const char *msg;
char msgbuf[80];

pid = waitpid(mbr_pid, &status, WNOHANG);
if (!pid) {
msg = "mbrola closed stderr and did not exit";
} else {
mbr_pid = 0;
if (WIFSIGNALED(status)) {
int sig = WTERMSIG(status);
snprintf(msgbuf, sizeof(msgbuf),
"mbrola died by signal %d", sig);
msg = msgbuf;
} else if (WIFEXITED(status)) {
int exst = WEXITSTATUS(status);
snprintf(msgbuf, sizeof(msgbuf),
"mbrola exited with status %d", exst);
msg = msgbuf;
} else {
msg = "mbrola died and wait status is weird";

buf_ptr[result] = 0;

for (; (lf = strchr(buf_ptr, '\n')); buf_ptr = lf + 1) {
/* inhibit the reset signal messages */
if (strncmp(buf_ptr, "Got a reset signal", 18) == 0 ||
strncmp(buf_ptr, "Input Flush Signal", 18) == 0)
continue;
*lf = 0;
log("mbrola: %s", buf_ptr);
/* is this the last line? */
if (lf == &buf_ptr[result - 1]) {
snprintf(mbr_errorbuf, sizeof(mbr_errorbuf),
"%s", buf_ptr);
/* don't consider this fatal at this point */
return 0;
}
}
len = strlen(mbr_errorbuf);
if (!len)
snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), "%s", msg);
else
snprintf(mbr_errorbuf+len, sizeof(mbr_errorbuf)-len,
", (%s)", msg);
error = -1;
}

log("mbrola error: \"%s\"", mbr_errorbuf);
return error;
memmove(buffer, buf_ptr, result);
buf_ptr = buffer + result;
}
}

static int send_to_mbrola(const char *cmd)
@@ -468,7 +491,8 @@ int init_MBR(const char *voice_path)
/* we should actually be getting only 44 bytes */
result = receive_from_mbrola(wavhdr, 45);
if (result != 44) {
err("unable to get .wav header from mbrola");
if (result >= 0)
err("unable to get .wav header from mbrola");
stop_mbrola();
return -1;
}
@@ -482,7 +506,7 @@ int init_MBR(const char *voice_path)
}
mbr_samplerate = wavhdr[24] + (wavhdr[25]<<8) +
(wavhdr[26]<<16) + (wavhdr[27]<<24);
//log("mbrola: voice samplerate = %d", mbr_samplerate);
//log("mbrowrap: voice samplerate = %d", mbr_samplerate);

/* remember the voice path for setVolumeRatio_MBR() */
if (mbr_voice_path != voice_path) {
@@ -568,7 +592,10 @@ void setVolumeRatio_MBR(float value)

int lastErrorStr_MBR(char *buffer, int bufsize)
{
int result = snprintf(buffer, bufsize, "%s", mbr_errorbuf);
int result;
if (mbr_pid)
mbrola_has_errors();
result = snprintf(buffer, bufsize, "%s", mbr_errorbuf);
return result >= bufsize ? (bufsize - 1) : result;
}


+ 4
- 1
src/menus.cpp View File

@@ -71,6 +71,7 @@ wxMenuBar *MakeMenu(int type)
speak_menu = new wxMenu;
speak_menu->Append(MENU_SPEAK_TRANSLATE, _("&Translate"));
speak_menu->Append(MENU_SPEAK_RULES, _("Show &Rules"));
speak_menu->Append(MENU_SPEAK_IPA, _("Show &IPA"));
speak_menu->Append(MENU_SPEAK_TEXT, _("&Speak"));
speak_menu->AppendSeparator();
speak_menu->Append(MENU_SPEAK_FILE, _("Speak &file..."));
@@ -105,7 +106,9 @@ wxMenuBar *MakeMenu(int type)

option_menu = new wxMenu;
option_menu->Append(MENU_PATHS, _("Set &paths"), paths_menu);
option_menu->Append(MENU_PARAMS, _("Speed..."));
option_menu->Append(MENU_OPT_SPEED, _("Speed..."));
option_menu->Append(MENU_OPT_PUNCT, _("Speak punctiation"));
option_menu->Append(MENU_OPT_SPELL, _("Speak character names"));

// TOOLS
vowelchart_menu = new wxMenu;

+ 23
- 29
src/numbers.cpp View File

@@ -498,12 +498,12 @@ void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf)



void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf1)
{//=================================================================================
void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf1, int control)
{//==============================================================================================
// control, bit 0: not the first letter of a word

int len;
unsigned char *p;
static char single_letter[10] = {0,0};
char ph_stress[2];
unsigned int dict_flags[2];
char ph_buf3[40];
char *ptr;
@@ -568,27 +568,17 @@ void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_b
LookupAccentedLetter(tr, letter, ph_buf3);
}

if(ph_buf3[0] == 0)
{
ph_buf1[0] = 0;
return;
}
if(ph_buf3[0] == phonSWITCH)
strcpy(ph_buf1, ph_buf3);
if((ph_buf1[0] == 0) || (ph_buf1[0] == phonSWITCH))
{
strcpy(ph_buf1,ph_buf3);
return;
}
// at a stress marker at the start of the letter name, unless one is already marked
ph_stress[0] = phonSTRESS_P;
ph_stress[1] = 0;

for(p=(unsigned char *)ph_buf3; (*p != 0) && (phoneme_tab[*p] != NULL); p++)
{
if(phoneme_tab[*p]->type == phSTRESS)
ph_stress[0] = 0; // stress is already marked
}
sprintf(ph_buf1,"%s%s",ph_stress,ph_buf3);
}
dict_flags[0] = 0;
dict_flags[1] = 0;
SetWordStress(tr, ph_buf1, dict_flags, -1, control & 1);

} // end of LookupLetter



@@ -596,7 +586,9 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
{//=========================================================================
// get pronunciation for an isolated letter
// return number of bytes used by the letter
// control 2=say-as glyphs, 3-say-as chars
// control bit 0: a non-initial letter in a word
// bit 1: say 'capital'

int n_bytes;
int letter;
int len;
@@ -618,7 +610,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
letter &= 0xff; // uncode private usage area
}

if(control > 2)
if(control & 2)
{
// include CAPITAL information
if(iswupper(letter))
@@ -628,7 +620,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
}
letter = towlower2(letter);

LookupLetter(tr, letter, word[n_bytes], ph_buf);
LookupLetter(tr, letter, word[n_bytes], ph_buf, control & 1);

if(ph_buf[0] == phonSWITCH)
{
@@ -642,7 +634,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
SetTranslator2("en");
save_option_phonemes = option_phonemes;
option_phonemes = 0;
LookupLetter(translator2, letter, word[n_bytes], ph_buf);
LookupLetter(translator2, letter, word[n_bytes], ph_buf, control & 1);
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table
option_phonemes = save_option_phonemes;

@@ -671,7 +663,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
{
pbuf += strlen(pbuf);
*pbuf++ = phonPAUSE_VSHORT;
LookupLetter(tr, *p2, 0, pbuf);
LookupLetter(tr, *p2, 0, pbuf, 1);
}
}
}
@@ -740,9 +732,11 @@ void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars)
if(control == 4)
c = phonPAUSE; // pause after each character
if(((count % 3) == 0) || (control > 2))
c = phonPAUSE_SHORT; // pause following a primary stress
c = phonPAUSE_NOLINK; // pause following a primary stress
else
continue; // remove marker
c = phonPAUSE_VSHORT;
// else
// continue; // remove marker
}
*phonemes++ = c;
}
@@ -1593,7 +1587,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
hyphen = 1;
ix++;
}
while((word[ix] != 0) && (word[ix] != ' ') && (ix < int(sizeof(suffix)-1)))
while((word[ix] != 0) && (word[ix] != ' ') && (ix < (int)(sizeof(suffix)-1)))
{
*p++ = word[ix++];
}

+ 4
- 1
src/prosodydisplay.cpp View File

@@ -380,9 +380,12 @@ void ProsodyDisplay::DrawEnv(wxDC& dc, int x1, int y1, int width, PHONEME_LIST *
{
// the envelope is given by a Tone phoneme acting on this vowel
InterpretPhoneme2(ph->tone_ph, &phdata_tone);
env = LookupEnvelope(phdata_tone.pitch_env);
env = GetEnvelope(phdata_tone.pitch_env);
}

if(env == NULL)
return;

for(ix=0; ix<=width; ix+=4)
{
x = int((ix * 127.9)/width);

+ 6
- 6
src/readclause.cpp View File

@@ -121,17 +121,17 @@ static const unsigned int punct_attributes [] = { 0,
CLAUSE_COMMA, CLAUSE_PERIOD, CLAUSE_QUESTION, CLAUSE_EXCLAMATION, CLAUSE_COLON, CLAUSE_SEMICOLON,
CLAUSE_SEMICOLON, // en-dash
CLAUSE_SEMICOLON, // em-dash
CLAUSE_SEMICOLON + PUNCT_SAY_NAME | 0x8000, // elipsis
CLAUSE_SEMICOLON | PUNCT_SAY_NAME | 0x8000, // elipsis

CLAUSE_QUESTION, // Greek question mark
CLAUSE_SEMICOLON, // Greek semicolon
CLAUSE_PERIOD+0x8000, // Devanagari Danda (fullstop)
CLAUSE_PERIOD | 0x8000, // Devanagari Danda (fullstop)

CLAUSE_PERIOD+0x8000, // Armenian period
CLAUSE_PERIOD | 0x8000, // Armenian period
CLAUSE_COMMA, // Armenian comma
CLAUSE_EXCLAMATION + PUNCT_IN_WORD, // Armenian exclamation
CLAUSE_QUESTION + PUNCT_IN_WORD, // Armenian question
CLAUSE_PERIOD + PUNCT_IN_WORD, // Armenian emphasis mark
CLAUSE_EXCLAMATION | PUNCT_IN_WORD, // Armenian exclamation
CLAUSE_QUESTION | PUNCT_IN_WORD, // Armenian question
CLAUSE_PERIOD | PUNCT_IN_WORD, // Armenian emphasis mark

CLAUSE_SEMICOLON, // Arabic ;
CLAUSE_QUESTION, // Arabic question mark

+ 10
- 4
src/setlengths.cpp View File

@@ -360,14 +360,14 @@ void SetParameter(int parameter, int value, int relative)



static void DoEmbedded2(int &embix)
static void DoEmbedded2(int *embix)
{//================================
// There were embedded commands in the text at this point

unsigned int word;

do {
word = embedded_list[embix++];
word = embedded_list[(*embix)++];

if((word & 0x1f) == EMBED_S)
{
@@ -420,7 +420,7 @@ void CalcLengths(Translator *tr)

if(p->synthflags & SFLAG_EMBEDDED)
{
DoEmbedded2(embedded_ix);
DoEmbedded2(&embedded_ix);
}

type = p->type;
@@ -734,6 +734,12 @@ if(p->type != phVOWEL)
}
p->length = length_mod;

if(p->env >= (N_ENVELOPE_DATA-1))
{
fprintf(stderr,"espeak: Bad intonation data\n");
p->env = 0;
}

// pre-vocalic part
// set last-pitch
env2 = p->env + 1; // version for use with preceding semi-vowel
@@ -741,7 +747,7 @@ if(p->type != phVOWEL)
if(p->tone_ph != 0)
{
InterpretPhoneme2(p->tone_ph, &phdata_tone);
pitch_env = LookupEnvelope(phdata_tone.pitch_env);
pitch_env = GetEnvelope(phdata_tone.pitch_env);
}
else
{

+ 17
- 12
src/speak.cpp View File

@@ -75,44 +75,44 @@ static const char *help_text =
"\t Amplitude, 0 to 200, default is 100\n"
"-g <integer>\n"
"\t Word gap. Pause between words, units of 10mS at the default speed\n"
"-k <integer>\n"
"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n"
"\t higher values indicate a pitch increase (try -k20).\n"
"-l <integer>\n"
"\t Line length. If not zero (which is the default), consider\n"
"\t lines less than this length as end-of-clause\n"
"-p <integer>\n"
"\t Pitch adjustment, 0 to 99, default is 50\n"
"-s <integer>\n"
"\t Speed in words per minute 80 to 450, default is 175\n"
"\t Speed in words per minute, 80 to 450, default is 175\n"
"-v <voice name>\n"
"\t Use voice file of this name from espeak-data/voices\n"
"-w <wave file name>\n"
"\t Write output to this WAV file, rather than speaking it directly\n"
"\t Write speech to this WAV file, rather than speaking it directly\n"
"-b\t Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit \n"
"-m\t Interpret SSML markup, and ignore other < > tags\n"
"-q\t Quiet, don't produce any speech (may be useful with -x)\n"
"-x\t Write phoneme mnemonics to stdout\n"
"-X\t Write phonemes mnemonics and translation trace to stdout\n"
"-z\t No final sentence pause at the end of the text\n"
"--stdout Write speech output to stdout\n"
"--compile=<voice name>\n"
"\t Compile the pronunciation rules and dictionary in the current\n"
"\t Compile pronunciation rules and dictionary from the current\n"
"\t directory. <voice name> specifies the language\n"
"--ipa Write phonemes to stdout using International Phonetic Alphabet\n"
"--path=\"<path>\"\n"
"\t Specifies the directory containing the espeak-data directory\n"
"--pho\n"
"\t Write mbrola phoneme data (.pho) to stdout, or to the file in --phonout\n"
"--pho Write mbrola phoneme data (.pho) to stdout or to the file in --phonout\n"
"--phonout=\"<filename>\"\n"
"\t Write phoneme output from -x -X and --pho to this file\n"
"\t Write phoneme output from -x -X --ipa and --pho to this file\n"
"--punct=\"<characters>\"\n"
"\t Speak the names of punctuation characters during speaking. If\n"
"\t =<characters> is omitted, all punctuation is spoken.\n"
"--split=\"<minutes>\"\n"
"\t Starts a new WAV file every <minutes>. Used with -w\n"
"--stdout Write speech output to stdout\n"
"--voices=<language>\n"
"\t List the available voices for the specified language.\n"
"\t If <language> is omitted, then list all voices.\n"
"-k <integer>\n"
"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n"
"\t higher values indicate a pitch increase (try -k20).\n";
"\t If <language> is omitted, then list all voices.\n";


void DisplayVoices(FILE *f_out, char *language);
@@ -478,6 +478,7 @@ int main (int argc, char **argv)
{"path", required_argument, 0, 0x107},
{"phonout", required_argument, 0, 0x108},
{"pho", no_argument, 0, 0x109},
{"ipa", no_argument, 0, 0x10a},
{0, 0, 0, 0}
};

@@ -708,7 +709,11 @@ int main (int argc, char **argv)
break;

case 0x109: // --pho
option_mbrola_phonemes = 8;
option_mbrola_phonemes = 16;
break;

case 0x10a: // --ipa
option_phonemes = 3;
break;

default:

+ 7
- 5
src/speak_lib.cpp View File

@@ -1120,13 +1120,15 @@ ESPEAK_API void espeak_SetPhonemeTrace(int value, FILE *stream)
{//============================================================
ENTER("espeak_SetPhonemes");
/* Controls the output of phoneme symbols for the text
value=0 No phoneme output (default)
value=1 Output the translated phoneme symbols for the text
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries)
bit 3: produce mbrola pho data
bits 0-3:
value=0 No phoneme output (default)
value=1 Output the translated phoneme symbols for the text
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries)
value=3 as (1), but produces IPA phoneme names rather than ascii
bit 4: produce mbrola pho data
*/
option_phonemes = value & 3;
option_mbrola_phonemes = value & 8;
option_mbrola_phonemes = value & 16;
f_trans = stream;
if(stream == NULL)
f_trans = stderr;

+ 1
- 0
src/speak_lib.h View File

@@ -444,6 +444,7 @@ void espeak_SetPhonemeTrace(int value, FILE *stream);
value=0 No phoneme output (default)
value=1 Output the translated phoneme symbols for the text
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries)
value=3 as (1), but produces IPA rather than ascii phoneme names

stream output stream for the phoneme symbols (and trace). If stream=NULL then it uses stdout.
*/

+ 17
- 19
src/synth_mbrola.cpp View File

@@ -386,7 +386,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr
int done;
int len_percent;
const char *final_pitch;
char buf[80];
char *ptr;
char mbr_buf[120];

static int phix;
@@ -404,7 +404,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr
if (WcmdqFree() < MIN_WCMDQ)
return 1;

mbr_buf[0] = 0;
ptr = mbr_buf;

p = &plist[phix];
next = &plist[phix+1];
@@ -415,7 +415,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr

if(p->synthflags & SFLAG_EMBEDDED)
{
DoEmbedded(embedded_ix, p->sourceix);
DoEmbedded(&embedded_ix, p->sourceix);
}

if(p->newword & 4)
@@ -446,13 +446,12 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr

DoMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, ph->mnemonic);

sprintf(buf,"%s\t",WordToString(name));
strcat(mbr_buf,buf);
ptr += sprintf(ptr,"%s\t",WordToString(name));

if(name2 == '_')
{
// add a pause after this phoneme
pause = PauseLength(len_percent,0);
pause = len_percent;
name2 = 0;
}

@@ -472,17 +471,19 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr

if(name2 == 0)
{
sprintf(buf,"%d\t%s", len, WritePitch(p->env,p->pitch1,p->pitch2,0,0));
strcat(mbr_buf,buf);
char *pitch = WritePitch(p->env,p->pitch1,p->pitch2,0,0);
ptr += sprintf(ptr,"%d\t%s", len, pitch);
}
else
{
char *pitch;

pitch = WritePitch(p->env,p->pitch1,p->pitch2,len_percent,0);
len1 = (len * len_percent)/100;
sprintf(buf,"%d\t%s", len1, WritePitch(p->env,p->pitch1,p->pitch2,len_percent,0));
strcat(mbr_buf,buf);
ptr += sprintf(ptr,"%d\t%s", len1, pitch);

sprintf(buf,"%s\t%d\t%s", WordToString(name2), len-len1, WritePitch(p->env,p->pitch1,p->pitch2,-len_percent,0));
strcat(mbr_buf,buf);
pitch = WritePitch(p->env,p->pitch1,p->pitch2,-len_percent,0);
ptr += sprintf(ptr,"%s\t%d\t%s", WordToString(name2), len-len1, pitch);
}
done = 1;
break;
@@ -545,25 +546,22 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr
if(name2 != 0)
{
len1 = (len * len_percent)/100;
sprintf(buf,"%d\n%s\t",len1,WordToString(name2));
strcat(mbr_buf,buf);
ptr += sprintf(ptr,"%d\n%s\t",len1,WordToString(name2));
len -= len1;
}
sprintf(buf,"%d%s\n",len,final_pitch);
strcat(mbr_buf,buf);
ptr += sprintf(ptr,"%d%s\n",len,final_pitch);
}

if(pause)
{
len += PauseLength(pause,0);
sprintf(buf,"_ \t%d\n",PauseLength(pause,0));
strcat(mbr_buf,buf);
ptr += sprintf(ptr,"_ \t%d\n",PauseLength(pause,0));
pause = 0;
}

if(f_mbrola)
{
fwrite(mbr_buf,1,strlen(mbr_buf),f_mbrola); // write .pho to a file
fwrite(mbr_buf,1,(ptr-mbr_buf),f_mbrola); // write .pho to a file
}
else
{

+ 22
- 7
src/synthdata.cpp View File

@@ -35,8 +35,8 @@
#include "translate.h"
#include "wave.h"

const char *version_string = "1.43.48 28.Jun.10";
const int version_phdata = 0x014342;
const char *version_string = "1.43.52 04.Jul.10";
const int version_phdata = 0x014351;

int option_device_number = -1;
FILE *f_logespeak = NULL;
@@ -364,11 +364,14 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,



unsigned char *LookupEnvelope(int ix)
{//================================
if(ix==0)
return(NULL);
return((unsigned char *)&spects_data[ix]);
unsigned char *GetEnvelope(int index)
{//==================================
if(index==0)
{
fprintf(stderr,"espeak: No envelope\n");
return(envelope_data[0]); // not found, use a default envelope
}
return((unsigned char *)&spects_data[index]);
}


@@ -877,6 +880,18 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
phdata->pd_param[i_APPEND_PHONEME] = data;
}
else
if(instn2 == i_IPA_NAME)
{
// followed by utf-8 characters, 2 per instn word
for(ix=0; (ix < data) && (ix < 16); ix += 2)
{
prog++;
phdata->ipa_string[ix] = prog[0] >> 8;
phdata->ipa_string[ix+1] = prog[0] & 0xff;
}
phdata->ipa_string[ix] = 0;
}
else
if(instn2 < N_PHONEME_DATA_PARAM)
{
if(instn2 == i_CHANGE_PHONEME2)

+ 19
- 16
src/synthesize.cpp View File

@@ -1198,7 +1198,7 @@ void DoVoiceChange(voice_t *v)
}


void DoEmbedded(int &embix, int sourceix)
void DoEmbedded(int *embix, int sourceix)
{//======================================
// There were embedded commands in the text at this point
unsigned int word; // bit 7=last command for this word, bits 5,6 sign, bits 0-4 command
@@ -1206,7 +1206,7 @@ void DoEmbedded(int &embix, int sourceix)
int command;

do {
word = embedded_list[embix++];
word = embedded_list[(*embix)++];
value = word >> 8;
command = word & 0x7f;

@@ -1323,7 +1323,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)

if(p->synthflags & SFLAG_EMBEDDED)
{
DoEmbedded(embedded_ix, p->sourceix);
DoEmbedded(&embedded_ix, p->sourceix);
}

if(p->newword)
@@ -1627,8 +1627,8 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
if(p->tone_ph != 0)
{
InterpretPhoneme2(p->tone_ph, &phdata_tone);
pitch_env = LookupEnvelope(phdata_tone.pitch_env);
amp_env = LookupEnvelope(phdata_tone.amp_env);
pitch_env = GetEnvelope(phdata_tone.pitch_env);
amp_env = GetEnvelope(phdata_tone.amp_env);
}

StartSyllable();
@@ -1848,21 +1848,24 @@ int SpeakNextClause(FILE *f_in, const void *text_in, int control)
CalcPitches(translator, clause_tone);
CalcLengths(translator);

GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out));
if(option_phonemes > 0)
if((option_phonemes > 0) || (phoneme_callback != NULL))
{
fprintf(f_trans,"%s\n",translator->phon_out);

if(!iswalpha(0x010d))
GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out));
if(option_phonemes > 0)
{
fprintf(f_trans,"%s\n",translator->phon_out);
if(!iswalpha(0x010d))
{
// check that c-caron is recognized as an alphabetic character
fprintf(stderr,"Warning: Accented letters are not recognized, eg: U+010D\nSet LC_CTYPE to a UTF-8 locale\n");
}
}
if(phoneme_callback != NULL)
{
// check that c-caron is recognized as an alphabetic character
fprintf(stderr,"Warning: Accented letters are not recognized, eg: U+010D\nSet LC_CTYPE to a UTF-8 locale\n");
phoneme_callback(translator->phon_out);
}
}
if(phoneme_callback != NULL)
{
phoneme_callback(translator->phon_out);
}


if(skipping_text)

+ 8
- 3
src/synthesize.h View File

@@ -266,6 +266,7 @@ typedef struct {
int vowel_transition[4];
int pitch_env;
int amp_env;
char ipa_string[18];
} PHONEME_DATA;


@@ -289,7 +290,7 @@ typedef struct {
#define i_RETURN 0x0001
#define i_CONTINUE 0x0002

// Group 0 instrcutions with 8 bit operand. These value go into bits 8-15 if the instruction
// Group 0 instrcutions with 8 bit operand. These values go into bits 8-15 of the instruction
#define i_CHANGE_PHONEME 0x01
#define i_REPLACE_NEXT_PHONEME 0x02
#define i_INSERT_PHONEME 0x03
@@ -302,6 +303,8 @@ typedef struct {
#define i_SET_LENGTH 0x0a
#define i_LONG_LENGTH 0x0b
#define i_CHANGE_PHONEME2 0x0c // not yet used
#define i_IPA_NAME 0x0d

#define i_CHANGE_IF 0x10 // 0x10 to 0x14

#define i_ADD_LENGTH 0x0c
@@ -532,7 +535,8 @@ int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, cha
#define ENV_LEN 128 // length of pitch envelopes
#define PITCHfall 0 // standard pitch envelopes
#define PITCHrise 2
extern unsigned char *envelope_data[20];
#define N_ENVELOPE_DATA 20
extern unsigned char *envelope_data[N_ENVELOPE_DATA];

extern int formant_rate[]; // max rate of change of each formant
extern SPEED_FACTORS speed;
@@ -562,13 +566,14 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr
int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume);
int MbrolaFill(int length, int resume);
void MbrolaReset(void);
void DoEmbedded(int &embix, int sourceix);
void DoEmbedded(int *embix, int sourceix);
void DoMarker(int type, int char_posn, int length, int value);
//int DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length_mod, int amp);
int DoSample3(PHONEME_DATA *phdata, int length_mod, int amp);
int DoSpect2(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, PHONEME_LIST *plist, int modulation);
int PauseLength(int pause, int control);
int LookupPhonemeTable(const char *name);
unsigned char *GetEnvelope(int index);

void InitBreath(void);


+ 15
- 4
src/tr_languages.cpp View File

@@ -418,7 +418,7 @@ Translator *SelectTranslator(const char *name)

case L('d','a'): // Danish
{
static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,210};
static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,230};
SetupTranslator(tr,stress_lengths_da,NULL);

tr->transpose_min = 'a';
@@ -605,16 +605,18 @@ Translator *SelectTranslator(const char *name)
}
break;


case L('f','r'): // french
{
static const short stress_lengths_fr[8] = {190, 170, 190, 200, 0, 0, 235, 240};
static const unsigned char stress_amps_fr[8] = {18,16, 20,20, 20,22, 22,21 };
static const short stress_lengths_fr[8] = {190, 170, 190, 200, 0, 0, 190, 240};
static const unsigned char stress_amps_fr[8] = {18,16, 20,20, 20,22, 18,18 };

SetupTranslator(tr,stress_lengths_fr,stress_amps_fr);
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable
tr->langopts.stress_flags = 0x0024; // don't use secondary stress
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.accents = 2; // Say "Capital" after the letter.
tr->langopts.vowel_pause = 0;

tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_VIGESIMAL | NUM_DFRACTION_4;
SetLetterVowel(tr,'y');
@@ -678,6 +680,15 @@ Translator *SelectTranslator(const char *name)
break;


case L('h','t'): // Haitian Creole
// static const short stress_lengths_fr[8] = {190, 170, 190, 200, 0, 0, 235, 240};
// memcpy(tr->stress_lengths,stress_lengths_fr,sizeof(tr->stress_lengths));
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable
tr->langopts.stress_flags = 0x0024; // don't use secondary stress
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_VIGESIMAL | NUM_DFRACTION_4;
break;


case L('h','u'): // Hungarian
{
static const unsigned char stress_amps_hu[8] = {17,17, 19,19, 20,22, 22,21 };

+ 24
- 12
src/translate.cpp View File

@@ -577,11 +577,17 @@ char *strchr_w(const char *s, int c)
static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word)
{//============================================================================================
int posn = 0;
int capitals = 0;
int non_initial = 0;

if (spell_word > 2)
capitals = 2;

while((*word != ' ') && (*word != 0))
{
word += TranslateLetter(tr, word, phonemes, spell_word);
word += TranslateLetter(tr, word, phonemes, capitals | non_initial);
posn++;
non_initial = 1;
if(phonemes[0] == phonSWITCH)
{
// change to another language in order to translate this word
@@ -666,10 +672,8 @@ int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab)
{//===========================================================================
// word1 is terminated by space (0x20) character

int length;
int word_length;
int ix;
int posn;
int pfix;
int n_chars;
unsigned int dictionary_flags[2];
@@ -898,10 +902,14 @@ if((wmark > 0) && (wmark < 8))
else
if(found == 0)
{
int posn;
int non_initial;
int length;
// word's pronunciation is not given in the dictionary list, although
// dictionary_flags may have ben set there

posn = 0;
non_initial = 0;
length = 999;
wordx = word1;

@@ -911,7 +919,11 @@ if((wmark > 0) && (wmark < 8))
// This word looks "unpronouncable", so speak letters individually until we
// find a remainder that we can pronounce.
emphasize_allcaps = 0;
wordx += TranslateLetter(tr, wordx, unpron_phonemes, 0);

if(posn > 0)
non_initial = 1;

wordx += TranslateLetter(tr, wordx, unpron_phonemes, non_initial);
posn++;
if(unpron_phonemes[0] == phonSWITCH)
{
@@ -1234,13 +1246,13 @@ strcpy(phonemes2,phonemes);
snprintf(word_phonemes, sizeof(word_phonemes), "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#endif
word_phonemes[N_WORD_PHONEMES-1] = 0;
SetWordStress(tr, word_phonemes, dictionary_flags, -1, tr->prev_last_stress);
SetWordStress(tr, word_phonemes, dictionary_flags, -1, 0);
}
}
else
{
if(prefix_phonemes[0] == 0)
SetWordStress(tr, phonemes, dictionary_flags, -1, tr->prev_last_stress);
SetWordStress(tr, phonemes, dictionary_flags, -1, 0);
else
SetWordStress(tr, phonemes, dictionary_flags, -1, 0);
#ifdef PLATFORM_WINDOWS
@@ -2334,6 +2346,12 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t
}
next_in_nbytes = utf8_in(&next_in,&source[source_index]);

if(c == 0)
{
finished = 1;
c = ' ';
}

if((c == CTRL_EMBEDDED) || (c == ctrl_embedded))
{
// start of embedded command in the text
@@ -2486,12 +2504,6 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
}
}

if(c == 0)
{
finished = 1;
c = ' ';
}
else
if(IsAlpha(c))
{
if(!IsAlpha(prev_out) || (tr->langopts.ideographs && ((c > 0x3040) || (prev_out > 0x3040))))

+ 4
- 4
src/translate.h View File

@@ -469,8 +469,8 @@ typedef struct {
#define NUM_SEP_SPACE 0x1000 // allow space as thousands separator (in addition to langopts.thousands_sep)
#define NUM_DEC_IT 0x2000 // (LANG=it) speak post-decimal-point digits as a combined number not as single digits

struct Translator
{//=============
typedef struct
{//===========

LANGUAGE_OPTIONS langopts;
int translator_name;
@@ -535,7 +535,7 @@ struct Translator
int end_stressed_vowel; // word ends with stressed vowel
int prev_dict_flags; // dictionary flags from previous word
int clause_terminator;
}; // end of class Translator
} Translator;


extern int option_tone2;
@@ -624,7 +624,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab);
void ChangeWordStress(Translator *tr, char *word, int new_stress);
void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars);
int TranslateLetter(Translator *tr, char *letter, char *phonemes, int control);
void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf);
void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf, int control);
void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf);

int LoadDictionary(Translator *tr, const char *name, int no_error);

+ 56
- 40
src/transldlg.cpp View File

@@ -48,6 +48,7 @@
#define T_TRANSLATE 503
#define T_PROCESS 504
#define T_RULES 505
#define T_TRANSLATE_IPA 506

TranslDlg *transldlg = NULL;
extern char *speech_to_phonemes(char *data, char *phout);
@@ -58,12 +59,19 @@ BEGIN_EVENT_TABLE(TranslDlg, wxPanel)
EVT_BUTTON(T_TRANSLATE,TranslDlg::OnCommand)
EVT_BUTTON(T_PROCESS,TranslDlg::OnCommand)
EVT_BUTTON(T_RULES,TranslDlg::OnCommand)
EVT_BUTTON(T_TRANSLATE_IPA,TranslDlg::OnCommand)
END_EVENT_TABLE()


FILE *f_wave = NULL;
wxFont font_phonetic;
wxTextAttr style_phonetic;
wxFont font_phonetic_large;
wxTextAttr style_phonetic_large;


#ifdef deleted

class IPATextCtrl : public wxTextCtrl
{
public:
@@ -78,27 +86,6 @@ BEGIN_EVENT_TABLE(IPATextCtrl, wxTextCtrl)
END_EVENT_TABLE()


// using Kirschenbaum scheme to enter IPA from the keyboard
wchar_t ipa1[256] = {
0,0x250,32,32,32,32,32,32,32,32,0xa,0xb,0xc,0x26f,0x272,0x275,
32,32,0x25a,32,32,32,32,0x28d,32,32,32,32,32,32,32,32,
0x20,0x21,0x22,0x23,0x24,0x25,0x0e6,0x27,0x28,0x27e,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x252,0x31,0x32,0x25c,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x294,
0x259,0x251,0x3b2,0xe7,0xf0,0x25b,0x46,0x262,0x127,0x26a,0x25f,0x4b,0x26c,0x271,0x14b,0x254,
0x3a6,0x263,0x280,0x283,0x3b8,0x28a,0x28c,0x153,0x3c7,0xf8,0x292,0x32a,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x303,0x7f,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
};


IPATextCtrl::IPATextCtrl(wxWindow *parent,wxWindowID id,const wxPoint& pos,const wxSize& size) :
wxTextCtrl(parent,id,_T(""),pos,size,wxTE_MULTILINE)
{
@@ -132,7 +119,7 @@ void IPATextCtrl::OnKey(wxKeyEvent& event)
else
event.Skip();
}
#endif



@@ -280,8 +267,10 @@ TranslDlg::TranslDlg(wxWindow *parent) : wxPanel(parent)
int height;
int width;
int x,y;
int font_size;
int height_ph = 350;


wxTextAttr attr;
wxFont font = wxFont(12,wxFONTFAMILY_ROMAN,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_LIGHT,false,_T(""),wxFONTENCODING_SYSTEM);

@@ -305,9 +294,18 @@ TranslDlg::TranslDlg(wxWindow *parent) : wxPanel(parent)
t_phonetic = new wxTextCtrl(this,T_PHONETIC,_T(""),wxPoint(0,262),
wxSize(298,height_ph),wxTE_MULTILINE | wxTE_READONLY,wxDefaultValidator,_T("Phoneme translation window"));

style_phonetic = t_phonetic->GetDefaultStyle();
font_phonetic = style_phonetic.GetFont();
font_size = font_phonetic.GetPointSize();
font_phonetic_large = font_phonetic;
style_phonetic_large = style_phonetic;
font_phonetic_large.SetPointSize(font_size+1);
style_phonetic_large.SetFont(font_phonetic_large);

y = height_ph + 270;
t_translate = new wxButton(this,T_TRANSLATE,_T("Translate"),wxPoint(4,y));
t_translate = new wxButton(this,T_RULES,_T("Show Rules"),wxPoint(4,y+32));
t_translate = new wxButton(this,T_TRANSLATE_IPA,_T("Show IPA"),wxPoint(100,y+32));
t_process = new wxButton(this,T_PROCESS,_T("Speak"),wxPoint(100,y));

t_source->SetFocus();
@@ -399,6 +397,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
#define N_PH_LIST N_PHONEME_LIST

void *vp;
int translate_text = 0;
char buf[1000];
char phon_out[N_PH_LIST*2];
int clause_tone;
@@ -415,8 +414,6 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
{
case T_RULES:
case MENU_SPEAK_RULES:
option_phonemes = 2;

#ifdef PLATFORM_POSIX
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
@@ -435,8 +432,41 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
f_trans = f; // write translation rule trace to a temp file
}
#endif
t_phonetic->SetDefaultStyle(style_phonetic);
translate_text = 2;
break;

case T_TRANSLATE:
case MENU_SPEAK_TRANSLATE:
t_phonetic->SetDefaultStyle(style_phonetic);
translate_text = 1;
break;

case T_TRANSLATE_IPA:
case MENU_SPEAK_IPA:
t_phonetic->SetDefaultStyle(style_phonetic_large);

translate_text = 3;
break;

case T_PROCESS:
case MENU_SPEAK_TEXT:
if(prosodycanvas == NULL)
{
myframe->OnProsody(event);
}
prosodycanvas->LayoutData(ph_list,n_ph_list);
option_phoneme_events = 1;
option_log_frames = 1;
MakeWave2(ph_list,n_ph_list);
option_log_frames = 0;
break;
}

if(translate_text)
{
option_phonemes = translate_text;

option_multibyte = espeakCHARS_AUTO;
SpeakNextClause(NULL,NULL,2); // stop speaking file

@@ -457,7 +487,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
if(clause_count++ > 0)
strcat(phon_out," ||");
strcat(phon_out,translator->phon_out);
t_phonetic->SetValue(wxString(translator->phon_out,wxConvLocal));
t_phonetic->SetValue(wxString(translator->phon_out,wxConvUTF8));

if((n_ph_list + n_phoneme_list) >= N_PH_LIST)
{
@@ -482,20 +512,6 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
fclose(f_trans);
remove(fname_temp);
}
t_phonetic->AppendText(wxString(phon_out,wxConvLocal));
break;

case T_PROCESS:
case MENU_SPEAK_TEXT:
if(prosodycanvas == NULL)
{
myframe->OnProsody(event);
}
prosodycanvas->LayoutData(ph_list,n_ph_list);
option_phoneme_events = 1;
option_log_frames = 1;
MakeWave2(ph_list,n_ph_list);
option_log_frames = 0;
break;
t_phonetic->AppendText(wxString(phon_out,wxConvUTF8));
}
} // end of TranslDlg::OnCommand

Loading…
Cancel
Save