diff --git a/dictsource/dict_phonemes b/dictsource/dict_phonemes index 10d32442..6a9daf1e 100644 --- a/dictsource/dict_phonemes +++ b/dictsource/dict_phonemes @@ -225,10 +225,9 @@ Dictionary sv_dict I i: O o: U u- u: W y y: Y: -: ; b B d f g h -j k l m n N p R -s S s. S; sx t v w -z +: ; b d f g h j +k l m n N p R s +S s. S; sx t v w z Dictionary sw_dict @@ -253,9 +252,10 @@ s t t[ ts; v w z Dictionary zhy_dict -a aa aai aan aau ai au e -ei eo eoi eu i iu o oe -oi ong ou u ui yu +a aa aai aan aau ai ang au +e ei eng eo eoi eu i ing +iu ng o oe oen oi ong ou +u ui ung yu b c d f g h j k l m n N p r s t @@ -348,6 +348,16 @@ S; t th ts ts. ts. tS; tS; tsh v w x z z. +Dictionary jbo_dict + +@ a aI aU e eI i l- +o OI r- u + +b d dZ f g h j k +l m n N p R s S +t tS v w x z Z + + Dictionary hbs_dict & @ @2 a A a: aI aU diff --git a/dictsource/jbo_list b/dictsource/jbo_list new file mode 100644 index 00000000..f0bb9df2 --- /dev/null +++ b/dictsource/jbo_list @@ -0,0 +1,86 @@ + +// Numbers +_0 no +_1 pa +_2 Re +_3 Si +_4 vo +_5 mu +_6 xa +_7 ze +_8 bi +_9 so +_dpt pi_ + + +a abu +b b@ +c S@ +d d@ +e ebu +f f@ +g g@ +i ibu +j Z@ +k k@ +l l@ +m m@ +n n@ +o obu +p p@ +r R@ +s s@ +t t@ +u ubu +v v@ +x x@ +y '@bu +z z@ + +h @h@bu +q k@bu +w v@bu + + + +e'o $u+ // request +xu $u+ // question + +pu $u+ // past + +ko $u+ +ku $u+ +cu $u+ +se $u+ +te $u+ + +la $u+ // article +le $u+ +li $u+ +lo $u+ + +pe $u+ // of +po $u+ +po'e $u+ + +fa $u+ +fe $u+ +fi $u+ +fo $u+ +fu $u+ + +i $u+ $pause + +// terminators (include a pause after) +ku ku_: +boi bOI_: +vau vaU_: +kei keI_: + +// pronouns +mi $u+ +do $u+ +ti $u+ +ta $u+ +tu $u+ +zo'e $u+ diff --git a/dictsource/jbo_rules b/dictsource/jbo_rules new file mode 100644 index 00000000..5350e169 --- /dev/null +++ b/dictsource/jbo_rules @@ -0,0 +1,108 @@ + +// This file is UTF8 encoded +// Spelling to phoneme rules for Lojban (an artificial constructed language). + + +.group a + a a + ai aI + au aU + +.group b + b b + +.group c + c S + +.group d + d d + dj dZ + +.group e + e e + ei eI + +.group f + f f + +.group g + g g + +.group h + h h + +.group i + i i + i (A j + +.group j + j Z + +.group k + k k + +.group l + l l- + A) l l + l (A l + +.group m + m m + +.group n + n n + n (g N + n (k N + +.group o + o o + oi OI + +.group p + p p + +.group q + q kw + +.group r + r r- + A) r R + r (A R + + +.group s + s s + +.group t + t t + tc tS + +.group u + u u + u (A w + +.group v + v v + +.group w + w w + +.group x + x x + +.group y + y @ + +.group z + z z + +.group + ' h + _) ' (_ '@h@ + + . _! + _) . (@P1 _! // remove . prefix + . (_S1 _! // remove . suffix + + + ˈ ' // U+2c8 stress marker diff --git a/dictsource/no_list b/dictsource/no_list index c6425f14..5e37bb11 100755 --- a/dictsource/no_list +++ b/dictsource/no_list @@ -211,7 +211,7 @@ ikke $u // auxillary verbs (be, have, can, etc) være $u+ -er E:r $u +er ,E:r var $u vært $u @@ -254,5 +254,7 @@ i i: $atend // MAIN WORD DICTIONARY //********************* +der dE:r +her hE:r kom kOm system syst'e:m diff --git a/dictsource/sv_list b/dictsource/sv_list index 3054b0fe..050a6664 100755 --- a/dictsource/sv_list +++ b/dictsource/sv_list @@ -34,7 +34,7 @@ v ve: w d'8b@lve: x Eks y y: -z s'e:t@ +z s'E:ta2 _. p'8Nkt @@ -76,10 +76,8 @@ _1M2 mIlj'u:n _0M3 bIlj'u:nER _1M3 bIlj'u:n _dpt p'8Nkt - (1 : a) f'Ws.ta - // abbreviations //************** @@ -197,19 +195,28 @@ andras andRas ange anje: anger anje:R anges anje:s +anne ann +anse anse: +anser anse:R +anses anse:s arkiv 'aRki:v av A:v $u bäste b'EstE -betala b'Et'A:l,a +bet be:t +// betala b'Et'A:l,a betalt b'Et'A:lt bort bORt bott b'Ut botten b'OtEn bra bRA: +dags daks dan dA:n dem dEm dig dEj dra dRA: +drar dRA:R +dras dRA:s +duger du-gER därför d'ERfY:R egen e:gEn egna e:gna @@ -223,6 +230,7 @@ framme fR'amE framåt fRamOt gemensam jEm'e:nsam gemensamt jEm'e:nsamt +grep gRe:p greps gRe:ps gripna gRi:pna ha hA: @@ -248,11 +256,15 @@ måsten m'Ost@n nvda Enve:de:A: ont Unt ost Ust +par pA:R per pE:R program pRUgR'am -redigera REdIS;'e:Ra +rad RA:d +raden RA:d%En +rader RA:d%ER sade sA:dE sades sA:dEs +sent se:nt sex s'Eks sig sEj skolan sk'u:lan @@ -262,20 +274,30 @@ stad stA:d staden stA:dEn stadens stA:dEns stan stA:n +stor stu:R +stort stu:Rt +susanna s8s'ana +susanne s8s'an svar svA:R -tar tA:R ta tA: +tar tA:R +tas tA:s togs t'u:gs tomt t'Umt tom t'Um torsdag t'u:SdA:g +torsdags t'u:Sdags +torsdagen t'u:SdA:gEn +torsdagens t'u:SdA:gEns tredje tR'e:djE +tyvärr t%yv'E:R usa u-Es'A: usas u-Es'A:s usa:s u-Es'A:s vad vA:d $u valt vA:lt var vA:R $u +vare vA:RE $u vem vEm @@ -285,14 +307,21 @@ browser _^_EN button _^_EN cancel _^_EN checked _^_EN +column _^_EN +columns _^_EN desktop _^_EN dot _^_EN +edit _^_EN email _^_EN Explorer _^_EN firefox _^_EN frame _^_EN +frames _^_EN gaim _^_EN +google _^_EN graphic _^_EN +graphics _^_EN +has _^_EN heading _^_EN headings _^_EN image _^_EN @@ -301,24 +330,35 @@ jaws _^_EN leaving _^_EN level _^_EN link _^_EN +links _^_EN mail _^_EN messenger _^_EN Microsoft _^_EN mozilla _^_EN name _^_EN no _^_EN +of _^_EN office _^_EN one _^_EN online _^_EN orca ORka password _^_EN +page _^_EN read _^_EN +reader _^_EN +row _^_EN +rows _^_EN +screen _^_EN software _^_EN submenu _^_EN +table _^_EN +tables _^_EN +this _^_EN tray _^_EN unchecked _^_EN unselected _^_EN user _^_EN view _^_EN web _^_EN +with _^_EN word _^_EN diff --git a/dictsource/sv_rules b/dictsource/sv_rules index 2ffc313a..c82b99c4 100755 --- a/dictsource/sv_rules +++ b/dictsource/sv_rules @@ -4,22 +4,37 @@ .group a a A: + ik) a %a + a (CC a a (vs A: a (vb A: a (vd A: a (va a a (rt_ A: + _) a (rt %a a (vg A: a (r_ a a (s_ a p) a (d_ a - k) a (d_ a + k) a (k A: + kl) a (r A: + ikl) a (r_ a + xempl) a (r A: + sv) a (r A: + sv) a (rt a + b) a (k A: + bl) a (d A: + gl) a (d A: + gl) a (d% a + b) a (kte a k) a (s_ a k) a (ni a b) a (r_ A: lt) a (t A: + _b) a (k A: bb) a (r_ a - a (CC a + a (C% a +// r) a (C% a a (_ a &) a (_ a2 a (re a @@ -27,7 +42,7 @@ a (rna a l) a (rs A: idr) a A: - k) a (ta ,a + k) a (ta %a m) a (j a om) a (t A: m) a (ter a @@ -48,7 +63,7 @@ st) a (t_ a tot) a (l 'A: _gl) a (s A: - _gl) a (ss a + gl) a (s% a v) a (ld A: v) a (rd A: sm) a (rt A: @@ -76,22 +91,65 @@ ppd) a (t a r) a (ba a ass) a a - l) a (gl A: - _d) a (g A: + l) a (g A: + l) a (gg a + d) a (g A: + d) a (g% a ik) a (ns 'A: - et) a (g 'A: + t) a (g A: + t) a (g% a f) a (rt 'A: f) a (rl 'A: - t) a (ti a - tt) a (C a + f) a (ren A: + n) a (ti %a + s) a (ti %a + t) a (ti %a + ks) a (m a + ts) a (m a +// tt) a (C a + n) a (l_ 'A: + tt) a (ga A: + tt) a (get A: + tt) a (git A: + + &) a a dd) a (C a + + dr) a (t a + dr) a (d a + nd) a (r a + str) a a + edr) a (r A: + s) a (kn A: + s) a (ks A: + s) a (ke A: + t) a (ls A: + at) a ( a + ep) a (r %a arbet aRbe:t amerik amERIk agera age:Ra + pl) a (nera %a analy analy: _) avta A:vtA: - _) avge A:vje: + _) avge A:vj'e: + v) a (lf A: + delt) a A: + ret) a (g A: + edr) a (g A: + sk) a (da A: + sk) a (de A: + sk) a (p A: + t) a (lC A: + t) a (l% a + v) a (ria a + b) a (r A: + t) a (l_ 'A: + t) a (l_ 'A: + b) a (r% a + a (bo a alkohol alkUho:l + allvar allvA:R .group b b b @@ -99,9 +157,11 @@ bevakn bEvA:kn bredband bRe:dband begrav bEgRA:v - begrip BEgR'i:p + begrip bEgR'i:p beslag bEsl'A:g beslagta bEsl'A:gtA: + betal b%Et'A:l + .group c c k @@ -113,6 +173,7 @@ c (ä s c (ö s ch S + ch (ef sx ck k ck (A k: // ?? computer _^_EN @@ -124,8 +185,8 @@ dagen dA:gEn daglig dA:glIg diske dIskE - djup j'u-p - djur j'u-R + dju j'u- + djung j'8N dum d8m datorer dat'u:RER dator dA:tOR @@ -141,18 +202,18 @@ e e: h) e (m E e (CC E + &) e %E med) e (l E - b) e (s E - b) e (k E + e (j E d) e (lv e: + d) e (c E d) e (ls e: m) e (dde e: d) e (ln e: d) e (lt e: l) e (dn e: d) e (bat E - s) e (kund E ch) e (f E: e (ta E e (x E @@ -169,30 +230,72 @@ n) e (ds e: br) e (v e: sv) e (r E - _s) e (p E + s) e (p %E ka) e (l E b) e (l_ E nyh) e (t e: r) e (sul E r) e (sur E r) e (dak E - b) e (f E - b) e (k E - b) e (h E - b) e (s E - b) e (v E + b) e (f %E + b) e (g %E + b) e (k %E + b) e (h %E + b) e (s %E + b) e (v %E + b) e (l %E + b) e (t %E + b) e (r %E + r) e (g %E + s) e (k %E v) e (ta e: r) e (ta e: r) e (dn e: l) e (ta e: e (nli e: e (gent E - pr) e (n E + pr) e (n %E + mp) e (l %E + pr) e (c %E + sp) e (c %E + g) e (n %E _) e (tik E r) e (ce E m) e (tod E p) e (ri E xtr) e (m e: + v) e (k e: + it) e (t_ e: + st) e (mC 'e: + s) e (ra e: + r) e (ra e: + n) e (ra e: + f) e (ra e: + g) e (ra e: + m) e (ra e: + d) e (ra e: + l) e (ra e: + t) e (ra e: + m) e (del e: + d) e (lse %E + g) e (nom e: + liot) e (k e: + c) e (r e: + l) e (da e: + gh) e (t e: + h) e (ten e: + st) e (k e: + yst) e (m e: + it) e (t e: + _h) e (ta e: + ember 'EmbER + e (rsä e: + e (rsatt e: + e (nbar e: + e (rin e: + p) e (da E + r) e (tur %E + e (xemp %E elek 'ElEk espeak _^_EN ekonom 'Eku:n,O:m @@ -205,6 +308,7 @@ enhet e:nhe:t f (f familj fam'Ilj formad fORmad + face _^_EN .group g g g @@ -220,9 +324,20 @@ enhet e:nhe:t g (n N gj j lä) g (e g - gjord ju:Rd + vä) g g + lo) g (i g + y) g (e g + y) g (a g + y) g (o g + a) g (e g + i) g (i g + a) g (i g + sla) g g + gjor ju:R gani gan'I garage gaR'A:S + garant g%aR'ant + gata gA:ta glöm glWm guide g'aId guider g'aIdER @@ -232,26 +347,46 @@ enhet e:nhe:t h h h (h hj j + hjälp jElp hög hY:g heading _^_EN .group i i i: i (CC I + i (nf %I i (g_ I + i (nstr %I + s) i (t I + dr) i (v i: + item _^_EN _fl) i (k i: t) i (d i: skr) i (v i: v) i (sn i: l) i (kna i: + l) i (c I + d) i (r I + t) i (s I + c) i I + c) i (s_ i: + Cl) i (kaC %I + kr) i (ti I + kr) i (te I + kr) i (s i: + kr) i (st i: + krit) i (k_ i: ikon Ik'o:n - inne InE + ibili IbIlI + itut Itu-t imag _^_EN .group j j j + java jA:va + j (uster sx jou (r sxU .group k @@ -286,8 +421,7 @@ ikon Ik'o:n lg (_ lj _) lj j låg l'o:g -ljud j'u-d -ljug j'u-g +lju j'u- ligen lIgEn lager lA:gER @@ -296,10 +430,12 @@ ligen lIgEn m (m menu _^_EN människ m'EnIsx, - medlem m'e:dlEm + medl m'e:dl maga maga meny mEn'y: minimera mIni:m'e:Ra2 + maria m%aR'i:a + marie m%aR'i: maximera maksi:m'e:Ra2 motor m'u:tOR motorer m'Otu:RER @@ -324,10 +460,19 @@ ligen lIgEn normal nORmA:l natur n'at'u-R nali nalI + navig n%av%Ig .group o o u: o (CC O + o (C% U + o (bb O + o (dd O + o (mm O + o (pp O + o (ss O + o (tt O + o (ff O o (rC u: o (rr O o (ll O @@ -337,6 +482,8 @@ ligen lIgEn o (rg O o (ck O f) o (n 'o: + pr) o (c %U + s) o (ci %U l) o (g 'o: l) o (v 'o: l) o (gg 'O @@ -346,11 +493,16 @@ ligen lIgEn f) o (rm 'O pr) oj Osx' o (ns U + l) o (k %U + g) o (r U nn) o (ns O ss) o (n O C) o (rs O - k) o (rta O + k) o (rt O b) o (rt O + n) o (r_ O + t) o (r_ O + s) o (r_ O rs) o (rd u: o (rde o: b) o (st u: @@ -363,8 +515,8 @@ ligen lIgEn osparat u:spA:Rat och 'Ok k) o (ns O - pr) o (cent O - p) o (lis O + pr) o (cent %O + p) o (lis %O p) o (pu O g) o (n O sp) o (rt O @@ -372,14 +524,27 @@ ligen lIgEn upp) o (rt o: l) o (n O d) o (n O + pr) o (b %O + pr) o (d %O + k) o (lu %O + inf) o (rmati %O k) o (d o: + lk) o (r o: + g) o (d u: _) o (j O o (ni 'o: + m) o (t 'u: + k) o (k 'u: + bl) o (d 'u: + k) o (rv O + n) o (vell %O + st) o (rm O operat OpERat .group p p p p (p + pion pI;'u:n påstå po:sto: paket pak'e:t parentes paR@nt,e:s @@ -401,6 +566,7 @@ ligen lIgEn rss s. rg (_ Rj radera Rad'e:Ra +rediger R%EdIsx'e:R rafik Raf'i:k regel Re:gEl resor R'e:sOR @@ -420,10 +586,11 @@ rubrik R8bR'i:k sk (ö sx fi) s (k s fu) s (k s - skj sx + skj S; stj sx sio (n sx'u: ssio (n sx'u: + skype sk'ajp spegel spe:gEl segel se:gEl spel spe:l @@ -431,6 +598,7 @@ rubrik R8bR'i:k säg sEj service sY:Rvi:s spara spA:Ra + sjack sjak svara svA:Ra slog sl'u:g stått stOt @@ -450,7 +618,6 @@ rubrik R8bR'i:k tt (A t: // ?? ti (on sx' tj S; - &C) te (_S2 tE // ?? task _^_EN talsyntes t'A:lsynt,e:s @@ -463,6 +630,7 @@ rubrik R8bR'i:k u u- u (tb u- u (tf u- + u (tg u- u (ts u- u (tr u- u (tv u- @@ -471,20 +639,30 @@ rubrik R8bR'i:k u (n 8 u (tl u- sj) u (k u- + j) u (ni u- + j) u (l u- r) u (m_ 8: utmärk 'u-tm@Rk b) u (tik 8 v) u (x 8 + lin) u (x %8 uppge 8pje: + u (tn u- + u (tr u- + u (ng 8 + u (nkC %8 + u (kti %8 upload _^_EN .group v v v v (v + vali valI varandra vaRandRa varn vA:Rn varan vA:Ran verk vERk + verktyg vERkty:g .group w w v @@ -499,6 +677,9 @@ upload _^_EN .group y y y: y (CC y + t) y (d 'y: + s) y (s %y + t) y (g 'y: s) y (nska y: .group z @@ -507,8 +688,12 @@ upload _^_EN .group å å o: - å (CC O + å (CC o: + å (C% O + å (ng O tr) å (d 'o: + l) å (s 'o: + l) å (ss 'O v) å (r 'o: r) å (k o: h) å (r 'o: @@ -522,6 +707,7 @@ upload _^_EN ä E: ä (CC E ä (r E: + ä (rd E: tr) ä (d E: v) ä (lk E: l) ä (sn E: @@ -529,9 +715,11 @@ upload _^_EN sk) ä (rg E: l) ä (st E: n) ä (tt E + v) ä (x E n) ä (t E: f) ä (rd E: + b) ä (r E: r) ä (k E: ärl (d 'E:R @@ -540,6 +728,9 @@ upload _^_EN ö Y: ö (CC 'W f) ö (rd 'Y: + f) ö (rk %W + l) ö (sn 'Y: + l) ö (st 'Y: ö (vr 'Y: r) ö (m 'W diff --git a/espeak-data/voices/jbo b/espeak-data/voices/jbo new file mode 100644 index 00000000..ebab1a87 --- /dev/null +++ b/espeak-data/voices/jbo @@ -0,0 +1,3 @@ +name lojban +language jbo + diff --git a/phsource/compile_report b/phsource/compile_report index 30faa855..19eedad2 100644 --- a/phsource/compile_report +++ b/phsource/compile_report @@ -1,4 +1,4 @@ -42 phoneme tables +43 phoneme tables new total base 96 96 base2 24 115 @@ -12,6 +12,7 @@ cy 29 122 de 33 123 eo 13 108 + jbo 4 109 fi 40 127 fr 34 118 fr_ca 11 118 @@ -1243,6 +1244,7 @@ vowel/ee_6 [E] en_n [&] sk [E3] sv vowel/e_mid [E] en_rp + [e] jbo [E] fr_ca [E] hi [E] hu @@ -1443,7 +1445,8 @@ vowelr/aa_r [A:] en_sc [A@] en_sc vowelr/oo_r [O@] en_sc vowelr/o_r [o@] en_sc -vowelr/r-voc [r-] hi +vowelr/r-voc [r-] jbo + [r-] hi [r-] sk [r:] sk [r-] hr @@ -1622,7 +1625,8 @@ vwl_fr/@R [R] fr [x] pt_pt vwl_fr/@R2 [R] fr_ca vwl_hi/A [a:] hi -vwl_hi/l-voc [l-] hi +vwl_hi/l-voc [l-] jbo + [l-] hi [l-] sk [l:] sk vwl_no/& [a] no diff --git a/phsource/ph_lojban b/phsource/ph_lojban new file mode 100644 index 00000000..6f04289f --- /dev/null +++ b/phsource/ph_lojban @@ -0,0 +1,23 @@ +// Phonemes for Lojban (an artificial constructed language) +// Inherits phonemes from Esperanto + + +phoneme r- // syllabic r, for lojban + vowel starttype (@) endtype (@) + length 220 + formants vowelr/r-voc +endphoneme + +phoneme l- // syllabuc l, for lojban + vowel starttype (@) endtype (@) + length 140 + formants vwl_hi/l-voc +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 170 + formants vowel/e_mid +endphoneme + + diff --git a/phsource/ph_norwegian b/phsource/ph_norwegian index 2ea54448..d12468c3 100644 --- a/phsource/ph_norwegian +++ b/phsource/ph_norwegian @@ -71,7 +71,7 @@ endphoneme phoneme E: vowel starttype (e) endtype (e) - length 250 + length 260 formants vowel/ee_1 endphoneme diff --git a/phsource/ph_swedish b/phsource/ph_swedish index 422510ab..b872f16f 100644 --- a/phsource/ph_swedish +++ b/phsource/ph_swedish @@ -33,7 +33,7 @@ phoneme E vowel starttype (e) endtype (e) length 140 formants vowel/ee - reduceto @ 2 + reduceto E- 2 endphoneme phoneme E: diff --git a/phsource/phonemes b/phsource/phonemes index 9b09cd8e..d4a4282d 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -98,7 +98,7 @@ phoneme _! // Short pause, don't replace by linking pause formants NULL starttype _ endtype _ - length 25 + length 35 lengthmod 1 nolink endphoneme @@ -1160,6 +1160,9 @@ include ph_german phonemetable eo base include ph_esperanto +phonemetable jbo eo +include ph_lojban + phonemetable fi base include ph_finnish diff --git a/src/numbers.cpp b/src/numbers.cpp index 1dfee97b..592d74d1 100644 --- a/src/numbers.cpp +++ b/src/numbers.cpp @@ -208,6 +208,7 @@ int Translator::TranslateRoman(char *word, char *ph_out) int prev; int value; int subtract; + int repeat = 0; unsigned int flags; char number_chars[N_WORD_BYTES]; @@ -224,6 +225,14 @@ int Translator::TranslateRoman(char *word, char *ph_out) return(0); value = roman_values[p2 - roman_numbers]; + if(value == prev) + { + repeat++; + if(repeat >= 3) + return(0); + } + else + repeat = 0; if((prev==5) || (prev==50) || (prev==500)) { diff --git a/src/phonemelist.cpp b/src/phonemelist.cpp index c9c92a33..bd4feec4 100755 --- a/src/phonemelist.cpp +++ b/src/phonemelist.cpp @@ -498,27 +498,40 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) { int x; - if(langopts.vowel_pause && (ph->type != phPAUSE) && (next->type == phVOWEL)) + if(langopts.vowel_pause && (ph->type != phPAUSE)) { - if(langopts.vowel_pause & 0x04) + + if((ph->type != phVOWEL) && (langopts.vowel_pause & 0x200)) { - // break before a word which starts with a vowel - insert_ph = phonPAUSE_VSHORT; + // add a pause after a word which ends in a consonant + insert_ph = phonPAUSE_NOLINK; } - if((ph->type == phVOWEL) && ((x = langopts.vowel_pause & 0x03) != 0)) + if(next->type == phVOWEL) { - // adjacent vowels over a word boundary - if(x == 2) + if((x = langopts.vowel_pause & 0x0c) != 0) + { + // break before a word which starts with a vowel + if(x == 0xc) + insert_ph = phonPAUSE_NOLINK; + else + insert_ph = phonPAUSE_VSHORT; + } + + if((ph->type == phVOWEL) && ((x = langopts.vowel_pause & 0x03) != 0)) + { + // adjacent vowels over a word boundary + if(x == 2) + insert_ph = phonPAUSE_SHORT; + else + insert_ph = phonPAUSE_VSHORT; + } + + if(((plist2+1)->stress >= 4) && (langopts.vowel_pause & 0x100)) + { + // pause before a words which starts with a stressed vowel insert_ph = phonPAUSE_SHORT; - else - insert_ph = phonPAUSE_VSHORT; - } - - if(((plist2+1)->stress >= 4) && (langopts.vowel_pause & 0x08)) - { - // pause before a words which starts with a stressed vowel - insert_ph = phonPAUSE_SHORT; + } } } diff --git a/src/speak.cpp b/src/speak.cpp index ed7b410f..1097231e 100755 --- a/src/speak.cpp +++ b/src/speak.cpp @@ -260,13 +260,13 @@ static void init_path(char *argv0) #ifdef PLATFORM_DOS strcpy(path_home,PATH_ESPEAK_DATA); #else -// char *env; -// if((env = getenv("ESPEAK_DATA_PATH")) != NULL) -// { -// snprintf(path_home,sizeof(path_home),"%s/espeak-data",env); -// if(GetFileLength(path_home) == -2) -// return; // an espeak-data directory exists -// } + char *env; + if((env = getenv("ESPEAK_DATA_PATH")) != NULL) + { + snprintf(path_home,sizeof(path_home),"%s/espeak-data",env); + if(GetFileLength(path_home) == -2) + return; // an espeak-data directory exists + } snprintf(path_home,sizeof(path_home),"%s/espeak-data",getenv("HOME")); if(access(path_home,R_OK) != 0) diff --git a/src/synthdata.cpp b/src/synthdata.cpp index eecdc268..f6ef662b 100755 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,7 +35,7 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.30.02 02.Jan.08"; +const char *version_string = "1.30.03 04.Jan.08"; const int version_phdata = 0x013000; int option_device_number = -1; diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp index c4118122..e649592b 100644 --- a/src/tr_languages.cpp +++ b/src/tr_languages.cpp @@ -39,6 +39,7 @@ #define L_qa 0x716100 #define L_grc 0x677263 // grc Ancient Greek +#define L_jbo 0x6a626f // jbo Lojban #define L_zhy 0x7a6879 // zhy @@ -214,7 +215,6 @@ Translator *SelectTranslator(const char *name) tr->langopts.vowel_pause = 1; tr->langopts.stress_rule = 2; tr->langopts.stress_flags = 0x6 | 0x10; -// tr->langopts.stress_flags = 0x1; // don't give full stress to monosyllables tr->langopts.unstressed_wd1 = 1; tr->langopts.unstressed_wd2 = 2; @@ -409,6 +409,20 @@ SetLengthMods(tr,3); // all equal } break; + case L_jbo: // Lojban + { + static const short stress_lengths_jbo[8] = {180,180, 220,220, 0,0, 260,280}; + static const wchar_t jbo_punct_within_word[] = {'.',',','\'',0x2c8,0}; // allow period and comma within a word, also stress marker + tr = new Translator(); + SetupTranslator(tr,stress_lengths_jbo,NULL); + tr->langopts.stress_rule = 2; + tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant + tr->punct_within_word = jbo_punct_within_word; + tr->langopts.param[LOPT_SYLLABLE_CAPS] = 1; // capitals indicate stressed syllables + SetLetterVowel(tr,'y'); + } + break; + case L('l','a'): //Latin { tr = new Translator(); diff --git a/src/translate.cpp b/src/translate.cpp index ade51309..2229ad2c 100755 --- a/src/translate.cpp +++ b/src/translate.cpp @@ -396,6 +396,7 @@ Translator::Translator() static const unsigned char stress_amps2[] = {16,16, 20,20, 20,24, 24,21 }; static const short stress_lengths2[8] = {182,140, 220,220, 220,240, 260,280}; static const wchar_t empty_wstring[1] = {0}; + static const wchar_t punct_in_word[2] = {'\'', 0}; // allow hyphen within words charset_a0 = charsets[1]; // ISO-8859-1, this is for when the input is not utf8 dictionary_name[0] = 0; @@ -423,6 +424,7 @@ Translator::Translator() char_plus_apostrophe = empty_wstring; + punct_within_word = punct_in_word; for(ix=0; ix<8; ix++) { @@ -657,6 +659,8 @@ int Translator::TranslateWord(char *word1, int next_pause, WORD_TAB *wtab) spell_word = 0; found = LookupDictList(&word1, phonemes, dictionary_flags, FLAG_ALLOW_TEXTMODE, wtab); // the original word + // if textmode, LookupDictList() replaces word1 by the new text and returns found=0 + if(phonemes[0] == phonSWITCH) { // change to another language in order to translate this word @@ -1709,6 +1713,7 @@ void *Translator::TranslateClause(FILE *f_text, const void *vp_input, int *tone_ int embedded_count = 0; int letter_count = 0; int space_inserted = 0; + int syllable_marked = 0; char *word; char *p; int j, k; @@ -1933,7 +1938,8 @@ if((c == '/') && (langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_ou if(char_inserted) next_in = char_inserted; - if(!IsAlpha(c) && !iswspace(c) && (c != '\'')) + // allow certain punctuation within a word (usually only apostrophe) + if(!IsAlpha(c) && !iswspace(c) && (wcschr(punct_within_word,c) == 0)) { if(IsAlpha(prev_out)) { @@ -1974,10 +1980,10 @@ if((c == '/') && (langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_ou { if(!IsAlpha(prev_out) || (langopts.ideographs && ((c >= 0x3000) || (prev_out >= 0x3000)))) { - if(prev_out != '\'') + if(wcschr(punct_within_word,prev_out) == 0) letter_count = 0; // don't reset count for an apostrophy within a word - if((prev_out != ' ') && (prev_out != '\'')) + if((prev_out != ' ') && (wcschr(punct_within_word,prev_out) == 0)) { // start of word, insert space if not one there already c = ' '; @@ -2004,37 +2010,36 @@ if((c == '/') && (langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_ou { c = towlower(c); - if(iswlower(prev_in)) + if(langopts.param[LOPT_SYLLABLE_CAPS]) { - c = ' '; // lower case followed by upper case, treat as new word - space_inserted = 1; - prev_in2 = c; + if(syllable_marked == 0) + { + char_inserted = c; + c = 0x2c8; // stress marker + syllable_marked = 1; + } } -//#ifdef deleted -// changed to break after the last uppercase letter, not before. See below else - if((c != ' ') && iswupper(prev_in) && iswlower(next_in) && - (memcmp(&source[source_index],"s ",2) != 0)) // ENGLISH specific plural { - c = ' '; // change from upper to lower case, start new word at the last uppercase - space_inserted = 1; - prev_in2 = c; - next_word_flags |= FLAG_NOSPACE; + if(iswlower(prev_in)) + { + c = ' '; // lower case followed by upper case, treat as new word + space_inserted = 1; + prev_in2 = c; + } + else + if((c != ' ') && iswupper(prev_in) && iswlower(next_in) && + (memcmp(&source[source_index],"s ",2) != 0)) // ENGLISH specific plural + { + c = ' '; // change from upper to lower case, start new word at the last uppercase + space_inserted = 1; + prev_in2 = c; + next_word_flags |= FLAG_NOSPACE; + } } -//#endif } else { -#ifdef deleted - if(iswupper(prev_in) && iswalpha(prev_out2) && - (memcmp(&source[source_index-1],"s ",2) != 0)) // ENGLISH specific plural - { -// change to break after the last uppercase letter, not before. - c = ' '; // more than one upper case followed by lower case, treat as new word - space_inserted = 1; - prev_in2 = c; - } -#endif if((all_upper_case) && (letter_count > 2)) { if((c == 's') && (next_in==' ')) @@ -2211,6 +2216,7 @@ if((c == '/') && (langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_ou pre_pause = 0; word_mark = 0; all_upper_case = FLAG_ALL_UPPER; + syllable_marked = 0; } } else diff --git a/src/translate.h b/src/translate.h index 7dccd4a2..6236238e 100755 --- a/src/translate.h +++ b/src/translate.h @@ -227,7 +227,7 @@ extern const int param_defaults[N_SPEECH_PARAM]; -#define N_LOPTS 13 +#define N_LOPTS 14 #define LOPT_DIERESES 1 // 1=remove [:] from unstressed syllables, 2= remove from unstressed or non-penultimate syllables // bit 4=0, if stress < 4, bit 4=1, if not the highest stress in the word @@ -271,6 +271,9 @@ extern const int param_defaults[N_SPEECH_PARAM]; // change [t] when followed by unstressed vowel #define LOPT_REDUCE_T 12 + // stressed syllable is indicated by capitals +#define LOPT_SYLLABLE_CAPS 13 + typedef struct { // bits0-2 separate words with (1=pause_vshort, 2=pause_short, 3=pause, 4=pause_long 5=[?] phonemme) @@ -389,6 +392,7 @@ public: int dict_condition; // conditional apply some pronunciation rules and dict.lookups const unsigned short *charset_a0; // unicodes for characters 0xa0 to oxff const wchar_t *char_plus_apostrophe; // single chars + apostrophe treated as words + const wchar_t *punct_within_word; // allow these punctuation characters within words // holds properties of characters: vowel, consonant, etc for pronunciation rules unsigned char letter_bits[256];