| @@ -6,7 +6,7 @@ | |||
| .L03 f h j s y z r // allow [B] [D] [Q] before these consonants | |||
| .L04 b v f p // labials, nasals are [m] | |||
| .L05 g k // velars, nasals are [N] | |||
| .L06 a e o | |||
| .group a | |||
| a a | |||
| @@ -75,6 +75,8 @@ | |||
| i) e E | |||
| u) e E | |||
| y) e E | |||
| L06_) e e# // unstressed 'e' silent at start of word after a,e,o | |||
| _) ent' (AP4 ent | |||
| _) enta' ,ent%a | |||
| @@ -199,6 +201,10 @@ q k | |||
| &) s (_S1 s | |||
| _) s' (AP2 s | |||
| _) s (C@ %es | |||
| _) s (hA s | |||
| _) s (y s | |||
| A_) s (C s | |||
| .group t | |||
| @@ -1,131 +1,133 @@ | |||
| // Translation rules for Bengali | |||
| // Translation rules for Assamese | |||
| // input by . | |||
| // This file is UTF8 encoded | |||
| // Numbers | |||
| // Bengali numbers are changed to latin characters before translation | |||
| _0 S'unjO | |||
| _1 '&k | |||
| // Numbers are changed to latin characters before translation | |||
| _0 X'unjO | |||
| _1 'ek | |||
| _2 d'uj | |||
| _3 t'in | |||
| _4 tS'ar | |||
| _3 t'ini | |||
| _4 tS#'ar'i | |||
| _5 p'a~tS | |||
| _6 tS#'Oj | |||
| _7 S'at | |||
| _8 'at.# | |||
| _7 X'at | |||
| _8 a~t.# | |||
| _9 n'Oj | |||
| _2a d'u // with hundreds etc. | |||
| _6a tS#'a | |||
| _6a tS#'O | |||
| _9a n'O | |||
| _10 d'OS | |||
| _11 '&garo | |||
| _10 d@h | |||
| _11 Ig#'a:ro | |||
| _12 b'arO | |||
| _13 t'erO | |||
| _14 tS'oddO | |||
| _14 tS#au'ddO | |||
| _15 p'OnerO | |||
| _16 S'olO | |||
| _17 S'OterO | |||
| _16 X'olO | |||
| _17 X'OterO | |||
| _18 'at.#arO | |||
| _19 'uniS | |||
| _19 'un'niS | |||
| _20 k'uri // or b'iS ?? | |||
| _20 b'iS | |||
| _21 ek'uS | |||
| _22 b'ajS | |||
| _23 t'ejS | |||
| _24 tS'ObbiS | |||
| _25 p'O~tSiS | |||
| _26 tSh'abbiS | |||
| _27 Sat'aS | |||
| _27 X'at'aS | |||
| _28 'at.#aS | |||
| _29 unOtr'iS | |||
| _29 'unOtr'iS | |||
| _30 tr'iS | |||
| _31 ekOtr'iS | |||
| _32 bOtr'iS | |||
| _33 tetr'iS | |||
| _34 tSowtr'iS | |||
| _35 pO~jtr'iS | |||
| _31 'ek'Otr'iS | |||
| _32 b'Otr'iS | |||
| _33 t'etr'iS | |||
| _34 tS'owtr'iS | |||
| _35 p'O~jtr'iS | |||
| _36 tS#'Otr'iS | |||
| _37 Sa~itr'iS | |||
| _38 at.tr'iS | |||
| _37 X'a~i'tr'iS | |||
| _38 'a~t.tr'iS | |||
| _39 'unOtSOll'iS | |||
| _40 tSOll'iS | |||
| _41 ektSOll'iS | |||
| _42 biall'iS | |||
| _43 tetall'iS | |||
| _44 tSoall'iS | |||
| _45 pO~jtall'iS | |||
| _46 tSetSOll'iS | |||
| _47 SatSOll'is | |||
| _48 atSOll'iS | |||
| _49 unOpO~tSaS | |||
| _50 pO~tS'aS | |||
| _51 &kann'o | |||
| _52 bajann'o | |||
| _53 tepann'o | |||
| _54 tSujann'o | |||
| _55 pontSann'o | |||
| _56 tS#apann'o | |||
| _57 Satann'o | |||
| _58 at.ann'o | |||
| _59 unOS'at. | |||
| _60 s'at. | |||
| _61 ekSOt.t.'i | |||
| _62 baSOt.t.'i | |||
| _63 teSOt.t.'i | |||
| _64 tSowSOt.t.'i | |||
| _65 pojSOt.t.'i | |||
| _66 SeSOt.t.'i | |||
| _67 SatSOt.t.'i | |||
| _68 at.SOt.t.'i | |||
| _6X sat.t.'i | |||
| _69 unOSOtt'ur | |||
| _70 SOtt'Or | |||
| _71 ekatt'Or | |||
| _72 bahatt'Or | |||
| _73 tehatt'Or | |||
| _74 tSuhatt'Or | |||
| _75 pOtSatt'Or | |||
| _76 tS#ijatt'Or | |||
| _77 Satatt'Or | |||
| _78 at.att'Or | |||
| _79 unOaS'i | |||
| _80 aS'i | |||
| _81 &kaS'i | |||
| _82 beraS'i | |||
| _83 teraS'i | |||
| _84 tSuraS'i | |||
| _85 po~tSaS'i | |||
| _86 tS#ijaS'i | |||
| _87 SataS'i | |||
| _88 at.aS'i | |||
| _89 ,unOnObb'oj | |||
| _41 'ektSOll'iS | |||
| _42 b'iall'iS | |||
| _43 t'etall'iS | |||
| _44 tS'oall'iS | |||
| _45 p'O~jtall'iS | |||
| _46 tS'etSO'll'iS | |||
| _47 X'atSOll'is | |||
| _48 'a~'tSOll'iS | |||
| _49 'unOpO~tSaS | |||
| _50 p'O~tS'aS | |||
| _51 I'kann'o | |||
| _52 b'ajann'o | |||
| _53 t'epann'o | |||
| _54 tS'ujann'o | |||
| _55 p'ontSann'o | |||
| _56 tS#'apann'o | |||
| _57 X'atann'o | |||
| _58 'at.ann'o | |||
| _59 'unO'Xa:t. | |||
| _60 sa:t. | |||
| _61 'ek'XO't.t.'i | |||
| _62 b'aXO't.t.'i | |||
| _63 t'eXO't.t.'i | |||
| _64 tS'ow'XO't.t.'i | |||
| _65 p'oj'XO't.t.'i | |||
| _66 S'eSOt.t.'i | |||
| _67 Sa:tSOt'ti | |||
| _68 'a~t.SOt.t.'i | |||
| _6X s'at.t.'i | |||
| _69 'unO'X'Ott'Or | |||
| _70 X'Ott'Or | |||
| _71 I'k#'Ott'Or | |||
| _72 b'ahatt'Or | |||
| _73 t'iatt'Or | |||
| _74 tS'uhatt'Or | |||
| _75 p'OX'at.t'Or | |||
| _76 tS#'ijatt'Or | |||
| _77 S'atatt'Or | |||
| _78 'a~t.att'Or | |||
| _79 'unOa'X'i | |||
| _80 a:X'i | |||
| _81 I'ka'X'i | |||
| _82 b'ira'X'i | |||
| _83 t'ira'X'i | |||
| _84 tS'ura'X'i | |||
| _85 p'o~tSa'X'i | |||
| _86 tS#'ija'X'i | |||
| _87 S'ataS'i | |||
| _88 X'ata'S'i | |||
| _89 'unOnObb'oj | |||
| _90 nObb'oj | |||
| _91 &kanObb'oj | |||
| _92 beranObb'oj | |||
| _93 teranObb'oj | |||
| _94 tSuranObb'oj | |||
| _95 pOtSanObb'oj | |||
| _96 tS#ijanObb'oj | |||
| _97 SatanObb'oj | |||
| _98 at.anObb'oj | |||
| _99 niranObb'oj | |||
| _0C S'o | |||
| _91 I'kanObb'oj | |||
| _92 b'ira'nObb'oj | |||
| _93 t'ira:nObb'oj | |||
| _94 tS'uranObb'oj | |||
| _95 p'OtSanObb'oj | |||
| _96 tS#'ijanObb'oj | |||
| _97 X'atanObb'oj | |||
| _98 'a~t.anObb'oj | |||
| _99 n'iranObb'oj | |||
| _0C e'X'o | |||
| _0M1 h'ajar | |||
| _0M2 l'ak# | |||
| _0M3 k'ot.i | |||
| _0M4 'Orbud | |||
| _dpt _d'Osomik_ | |||
| _dpt _d'OX'omik_ | |||
| // Single consonants | |||
| @@ -133,7 +135,7 @@ _dpt _d'Osomik_ | |||
| খ k#O | |||
| গ gO | |||
| ঘ g#O | |||
| ঙ 'uNO~ | |||
| ঙ 'uNgO~ | |||
| চ tSO | |||
| ছ tShO // [h] to distinguish from [tS] | |||
| জ JO | |||
| @@ -154,46 +156,46 @@ _dpt _d'Osomik_ | |||
| ব bO | |||
| ভ b#O | |||
| ম mO | |||
| য় Oj | |||
| য ,ontostedZ'O | |||
| র rO | |||
| ড় r.O | |||
| ড় r.O // (d. + nukta) | |||
| ঢ় hr.O | |||
| ঢ় hr.O // (d#. + nukta) | |||
| ৰ rO | |||
| ল lO | |||
| ৱ wO | |||
| শ t,aleboS:'O | |||
| ষ m,ud#en:oS:'O | |||
| স d,onteS:'O | |||
| স d,onte'X:'O | |||
| হ hO | |||
| ৎ kh,Ond.ot'O | |||
| ক্ষ k,ojmud#en:oS:'O | |||
| ড় dOerO // (d. + nukta) | |||
| ঢ় d#e hr.O // (d#. + nukta) | |||
| য় ,ontosteOj | |||
| ৎ kh,Ond.ot'O | |||
| // full vowels | |||
| অ O | |||
| আ a | |||
| ই hrOS:o'i | |||
| ঈ dirg#o'i | |||
| ঈ d'i:rg#o'i | |||
| উ hrOS:o'u | |||
| ঊ dirg#o'u | |||
| ঊ d'i:rg#o'u | |||
| ঋ ri | |||
| ও o | |||
| ঔ ow | |||
| এ e $u+ // word 'it' | |||
| ঐ oj $u+ // word 'that' | |||
| ও o $u+ $brk // 'and' | |||
| _এ e | |||
| _ঐ oj | |||
| _ও o | |||
| // combining vowel signs | |||
| া 'akar | |||
| ি r'oS:ikar | |||
| ী d'irg#ikar | |||
| ূ r'oS:ukar | |||
| ু d'irg#ukar | |||
| ি hrOS:o'ikar | |||
| ী d'i:rg#ikar | |||
| ূ hrOS:o'ukar | |||
| ু d'i:rg#ukar | |||
| ৃ r'ikar | |||
| ে 'ekar | |||
| ৈ 'ojkar | |||
| @@ -208,116 +210,53 @@ _ও o | |||
| ় b'indu | |||
| $ d.Olar | |||
| % SOtk'Ora | |||
| % X'Otk'Ora | |||
| + jOg | |||
| = SOman | |||
| = X'Oman | |||
| // Punctuation | |||
| । dVn.d.V | |||
| । dVn.ri | |||
| _, koma | |||
| _? pr'oSnOtSihnO | |||
| // Pronouns | |||
| আমি $u // main: I | |||
| আমায় $u | |||
| আমার $u | |||
| আমরা $u // we | |||
| আমাদের $u | |||
| ময $u // I, me | |||
| আমি $u // us | |||
| আমার $u // our | |||
| আপনি $u // you(formal) | |||
| আপনাকে $u | |||
| আপনার $u | |||
| আপনাক $u | |||
| তুমি $u // you (informal) | |||
| তোমায় $u | |||
| তোমার $u | |||
| তোমাদের $u | |||
| তুই $u // you (informal) | |||
| তোকে $u | |||
| তোমাক $u | |||
| তয় $u // you (informal) | |||
| তোক $u | |||
| তোর $u | |||
| এ $u // he/she/it | |||
| আপনি $u | |||
| এটার $u | |||
| এর $u | |||
| ইনি $u // they | |||
| এনাকে $u | |||
| এনার $u | |||
| ও $u // he/she/it | |||
| সে $u | |||
| ওর $u | |||
| তার $u | |||
| ওরা $u // they | |||
| তারা $u | |||
| ওদের $u // unheṃ: them | |||
| তাদের $u | |||
| এই $u // e:I this/it | |||
| এটা $u // e:ta: this/it | |||
| এটার $u // e:ta:'r this/it | |||
| এর $u // e:r this/it | |||
| ওটা $u // o:ta: that | |||
| ওটাকে $u // o:ta:ke: to that | |||
| ওটার $u // o:ta:'r of that | |||
| সি $u // he | |||
| তাই $u // she | |||
| ওগুলো $u // o:gu:lo: those | |||
| ওগুলোকে $u // o:gu:lo:ke: to those | |||
| ওগুলোর $u // o:gu:lo:'r of those | |||
| // Prepositions/Postpositions | |||
| মধ্যে $u // moddhe in | |||
| উপর $u // upor on, above | |||
| নীচে $u // niche below | |||
| পূর্ব্বে $u // purbe before, prior | |||
| পর্য্যন্ত $u // parjonto till | |||
| অব্দি $u // abdi till | |||
| বিনা $u // bina without | |||
| // Questions | |||
| কেন $u $pause // kano why interrogative particle | |||
| কি $u $pause // ki what | |||
| কোথায় $u $pause // kothaay where | |||
| কখন $u $pause // kakhon when | |||
| কে $u $pause // ke who | |||
| কিয় $u $pause // kio why interrogative particle | |||
| কি $u $pause // ki what | |||
| কোত $u $pause // kot where | |||
| কেতিয়া $u $pause // ketia when | |||
| কোন $u $pause // kon who | |||
| // Conjunctions | |||
| এবং $u $pause // ebong: and | |||
| আর $u $pause // aar: and | |||
| অথবা $u $pause // athoba: or | |||
| এরং $u $pause // ebong: and | |||
| আরু $u $pause // aaru : and | |||
| অথরা $u $pause // athoba: or | |||
| কিন্তু $u $pause // kintu: but | |||
| যদি $pause // jodi: if | |||
| তবু $pause // tobu: still, yet | |||
| তবে $pause // tabe: if...then | |||
| তেতিয়া $pause // then | |||
| অথচ $u // athacho: yet | |||
| // Verbs | |||
| হয় $u | |||
| ছিল $u // chilo: past aux | |||
| ছিলেন $u // chilen | |||
| করছি $u // korchi: continuous | |||
| করছিলাম $u // korchilam: past indefinite | |||
| করেছি $u // korechi: past | |||
| // Exceptions | |||
| এত &to | |||
| এটা &ta // one piece, one | |||
| @@ -1,4 +1,4 @@ | |||
| | |||
| // Pronounciation rule for Assamese. | |||
| // This file is UTF8 encoded | |||
| // letter groups: | |||
| @@ -7,8 +7,6 @@ | |||
| // C consonants | |||
| // Y vowel letters and vowel signs | |||
| .replace | |||
| ০ 0 | |||
| ১ 1 | |||
| @@ -21,368 +19,328 @@ | |||
| ৮ 8 | |||
| ৯ 9 | |||
| // Vowels | |||
| .group অ | |||
| অ V | |||
| অঁ O~ | |||
| অ্যা & // V,ja in [æmiba] | |||
| অ V | |||
| অঁ O~ | |||
| অ্যা & // V,ja in [æmiba] | |||
| .group আ | |||
| আ a | |||
| আঁ a~ | |||
| আ a | |||
| আঁ a~ | |||
| .group ই | |||
| ই i | |||
| ইঁ i~ | |||
| ই i | |||
| ইঁ i~ | |||
| .group ঈ | |||
| ঈ i | |||
| ঈঁ i~ | |||
| ঈ i | |||
| ঈঁ i~ | |||
| .group উ | |||
| উ u | |||
| উঁ u~ | |||
| উ u | |||
| উঁ u~ | |||
| .group ঊ | |||
| ঊ u | |||
| ঊঁ u~ | |||
| ঊ u | |||
| ঊঁ u~ | |||
| .group ঋ | |||
| ঋ ri | |||
| ঋঁ ri~ | |||
| .group ঌ | |||
| ঌ l- | |||
| ঋ ri | |||
| .group এ | |||
| এ & | |||
| এঁ &~ | |||
| এ & | |||
| এঁ &~ | |||
| .group ঐ | |||
| ঐ oj | |||
| ঐঁ o~j | |||
| ঐ oj | |||
| ঐঁ o~j | |||
| .group এ | |||
| এ e | |||
| এঁ e~ | |||
| এ e | |||
| এঁ e~ | |||
| এ্যা & // e,ja [ækademi] | |||
| এ্যা & // e,ja [ækademi] | |||
| .group ও | |||
| ও o | |||
| ওঁ o~ | |||
| ও o | |||
| ওঁ o~ | |||
| .group ঔ | |||
| ঔ ow | |||
| ঔঁ o~w | |||
| ঔ ow | |||
| ঔঁ o~w | |||
| .group ও //?? | |||
| ও o: | |||
| ও o: | |||
| // Vowel Signs | |||
| .group া | |||
| া a | |||
| াঁ a~ | |||
| C) া a | |||
| C) াঁ a~ | |||
| .group ি | |||
| ি i | |||
| িঁ i~ | |||
| C) ি i | |||
| C) িঁ i~ | |||
| .group ী | |||
| ী i | |||
| ীঁ i~ | |||
| C) ী i | |||
| C) ীঁ i~ | |||
| .group ূ | |||
| ূ u | |||
| ূঁ u~ | |||
| C) ূ u | |||
| C) ূঁ u~ | |||
| .group ু | |||
| ু u | |||
| ুঁ u~ | |||
| C) ু u | |||
| C) ুঁ u~ | |||
| .group ৃ | |||
| ৃ ri | |||
| ৃঁ ri~ | |||
| C) ৃ r'i | |||
| .group ে | |||
| ে e | |||
| েঁ e~ | |||
| েউ ew | |||
| C) ে e | |||
| C) েঁ e~ | |||
| C) েউ ew | |||
| .group ৈ | |||
| ৈ oj | |||
| ৈঁ o~j | |||
| C) ৈ oj | |||
| C) ৈঁ o~j | |||
| .group ো | |||
| ো o | |||
| োঁ o~ | |||
| C) ো o | |||
| C) োঁ o~ | |||
| .group ৌ | |||
| ৌ ow | |||
| ৌঁ o~w | |||
| C) ৌ ow | |||
| C) ৌঁ o~w | |||
| // Consonants | |||
| .group ক | |||
| ক kV | |||
| ক (B k | |||
| ক kV | |||
| ক (B k | |||
| .group খ | |||
| খ k#V | |||
| খ (B k# | |||
| খ k#V | |||
| খ (B k# | |||
| .group গ | |||
| গ gV | |||
| গ (B g | |||
| গ gV | |||
| গ (B g | |||
| .group ঘ | |||
| ঘ g#V | |||
| ঘ (B g# | |||
| ঘ g#V | |||
| ঘ (B g# | |||
| .group ঙ | |||
| ঙ NV | |||
| ঙ্ (B N | |||
| ঙ NV | |||
| ঙ (B N | |||
| .group চ | |||
| চ tSV | |||
| চ (B tS | |||
| চ tSV | |||
| চ (B tS | |||
| .group ছ | |||
| ছ tS#V | |||
| ছ (B tS# | |||
| ছ tS#V | |||
| ছ (B tS# | |||
| .group জ | |||
| জ JV | |||
| জ (B J | |||
| জ JV | |||
| জ (B J | |||
| জ্ব JV | |||
| জ্ব (B J | |||
| জ্ঞ ggo~ | |||
| জ্ঞ (B gg | |||
| জ্ব JV | |||
| জ্ব (B J | |||
| জ্ঞ ggo~ | |||
| জ্ঞ (B gg | |||
| .group ঝ | |||
| ঝ J#V | |||
| ঝ (B J# | |||
| ঝ J#V | |||
| ঝ (B J# | |||
| .group ঞ | |||
| ঞ nV | |||
| ঞ্ (B n | |||
| ঞ nV | |||
| ঞ (B n | |||
| .group ট | |||
| ট t.V | |||
| ট (B t. | |||
| ট t.V | |||
| ট (B t. | |||
| .group ঠ | |||
| ঠ t.#V | |||
| ঠ (B t.# | |||
| ঠ t.#V | |||
| ঠ (B t.# | |||
| .group ড | |||
| ড d.V | |||
| ড (B d. | |||
| ড d.V | |||
| ড (B d. | |||
| ড় r.V // nukta | |||
| ড় (B r. | |||
| .group ঢ | |||
| ঢ d.#V | |||
| ঢ (B d.# | |||
| ঢ d.#V | |||
| ঢ (B d.# | |||
| ঢ় hr.V | |||
| ঢ় (B hr. | |||
| .group ণ | |||
| ণ nV // should be [n.] if adjacent to t. or d. ? | |||
| ণ (B n | |||
| ণ nV // should be [n.] if adjacent to t. or d. ? | |||
| ণ (B n | |||
| .group ত | |||
| ত tV | |||
| ত (B t | |||
| ত tV | |||
| ত (B t | |||
| ত (_ to | |||
| .group থ | |||
| থ t#V | |||
| থ (B t# | |||
| থ t#V | |||
| থ (B t# | |||
| .group দ | |||
| দ dV | |||
| দ (B d | |||
| দ dV | |||
| দ (B d | |||
| .group ধ | |||
| ধ d#V | |||
| ধ (B d# | |||
| ধ d#V | |||
| ধ (B d# | |||
| .group ন | |||
| ন nV | |||
| ন (B n | |||
| ন nV | |||
| ন (B n | |||
| .group প | |||
| প pV | |||
| প (B p | |||
| প pV | |||
| প (B p | |||
| .group ফ | |||
| ফ fV // or [p#] ? | |||
| ফ (B f | |||
| ফ fV // or [p#] ? | |||
| ফ (B f | |||
| .group ব | |||
| ব bV | |||
| ব (B b | |||
| ব bV | |||
| ব (B b | |||
| .group ভ | |||
| ভ b#V | |||
| ভ (B b# | |||
| ভ b#V | |||
| ভ (B b# | |||
| .group ম | |||
| ম mV | |||
| ম (B m | |||
| .group য় | |||
| য় jV | |||
| য় (B j | |||
| ম mV | |||
| ম (B m | |||
| .group য | |||
| য dZV | |||
| য (B dZ | |||
| য় jV // nukta | |||
| য় (B j | |||
| ্) য (C & // ব্যস্ত [bæsto] | |||
| ্) যা & // ব্যাকরণ [bækɔron] | |||
| য dZV | |||
| য (B dZ | |||
| ্) য (_ :O // double the previous consonant | |||
| ্) য (B_ : | |||
| ্) য (C & // ব্যস্ত [bæsto] | |||
| ্) যা & // ব্যাকরণ [bækɔron] | |||
| .group র | |||
| র rV | |||
| র (B r | |||
| .group ৰ | |||
| ৰ rV | |||
| ৰ (B r | |||
| .group ল | |||
| ল lV | |||
| ল (B l | |||
| ল lV | |||
| ল (B l | |||
| .group ৱ | |||
| ৱ waV | |||
| ৱ (B wO | |||
| .group শ | |||
| শ SV // or [s] ? | |||
| শ (B S | |||
| শ SV // or [s] ? | |||
| শ (B S | |||
| শ (্ল s | |||
| শ (্ল s | |||
| .group ষ | |||
| ষ SV | |||
| ষ (B S | |||
| ষ SV | |||
| ষ (B S | |||
| .group স | |||
| স SV // or [s] ?? | |||
| স (B S | |||
| স (্থ s | |||
| স (্ত s | |||
| _) স্ব SV // shb | |||
| স X@ // or [s] ?? | |||
| স (B X | |||
| স (্থ s | |||
| স (্ত s | |||
| স (্য s // সমস্যা | |||
| _) স্ব SV // shb | |||
| _) স্ব (B S | |||
| .group হ | |||
| হ hV | |||
| হ (B h | |||
| হ hV | |||
| হ (B h | |||
| হ (_ ho | |||
| .group হ্ব | |||
| হ্ব vV | |||
| হ্ব (B v | |||
| .group ক্ষ | |||
| ক্ষ k#k#V // or [k#:] ? | |||
| ক্ষ (B k#k# | |||
| .group ৎ | |||
| ৎ t | |||
| .group ড় | |||
| ড় r.V // can be ড plus nukta | |||
| ড় (B r. | |||
| .group ঢ় | |||
| ঢ় hr.V // can be ঢ plus nukta | |||
| ঢ় (B hr. | |||
| .group ড় // can be ড plus nukta | |||
| ড় r.V | |||
| ড় (B r. | |||
| .group য় | |||
| য় jV | |||
| _) য় (B j | |||
| য় (B // used to separate 2 vowels | |||
| .group ঢ় // can be ঢ plus nukta | |||
| ঢ় hr.V | |||
| ঢ় (B hr. | |||
| .group হ্ব | |||
| হ্ব vV | |||
| হ্ব (B v | |||
| .group ৎ | |||
| ৎ t | |||
| .group ঁ | |||
| ঁ O~ // candrabindu, nasalize the previous vowel | |||
| C) ঁ O~ // candrabindu, nasalize the previous vowel/Consonants | |||
| .group ং | |||
| ং N // anusvara/onushshor | |||
| A) ং N // anusvara/onushshor | |||
| C) ং N | |||
| .group ঃ // visarga/bishorgo | |||
| ঃ // doubles the following consonant | |||
| ঃ (_ H | |||
| ঃ (_ H | |||
| .group ্ // virama/hoshonto | |||
| ্ | |||
| .group ় | |||
| ় // nukta, modifies a consonant | |||
| .group | |||
| // obsolete letters | |||
| ঋ r- | |||
| ৠ r- | |||
| ঌ l- | |||
| ৡ l- | |||
| ৃ r- | |||
| ৄ r- | |||
| ৢ l- | |||
| ৣ l- | |||
| __) - (_D bij'og | |||
| D_) - (_D bij'og | |||
| // D_) - (_D bij'og | |||
| @@ -506,6 +506,7 @@ talk _^_EN | |||
| teaser _^_EN | |||
| tech _^_EN | |||
| terminal _^_EN | |||
| time _^_EN | |||
| trip _^_EN | |||
| tuner _^_EN | |||
| unix _^_EN | |||
| @@ -588,6 +589,7 @@ erst e:rst | |||
| ersten e:rst@n | |||
| erstmal e:rstma:l | |||
| erzgebirg e:rtsg@bIrg | |||
| expedient Ekspe:dI'Ent | |||
| extravagant $1 | |||
| extrem Ekstr'e:m | |||
| @@ -734,6 +734,7 @@ financ) ie (r I'e: | |||
| @t) ien (_ 'i:@n | |||
| &) iens (_ =I;@ns | |||
| ient (_ I'Ent | |||
| d) ient (_ i:nt | |||
| &) ienz (_ I'Ents | |||
| sch) ie (n i: | |||
| @) ie (reX 'i: | |||
| @@ -18,6 +18,16 @@ | |||
| ೮ 8 | |||
| ೯ 9 | |||
| .L01 ಕ ಖ ಗ ಘ ಙ // velar | |||
| .L02 ಚ ಛ ಜ ಝ ಞ // palatal | |||
| .L03 ಟ ಠ ಡ ಢ ಣ // retroflex | |||
| .L04 ತ ಥ ದ ಧ ನ // dental | |||
| .L05 ಪ ಫ ಬ ಭ ಮ // labial | |||
| .group ಕ | |||
| ಕ ka | |||
| @@ -215,7 +225,11 @@ | |||
| .group 0xe0b2 // characters which start with UTF-8 bytes: [e0 b2] | |||
| ಂ m // anusvara (this should nasalize the vowel) | |||
| ಂ(L01 N // anusvara (this should nasalize the vowel) | |||
| ಂ(L02 n^ | |||
| ಂ(L03 n. | |||
| ಂ(L04 n | |||
| ಂ m | |||
| ಃ h // visarga | |||
| @@ -403,7 +403,7 @@ zeten $alt | |||
| boezemen $alt | |||
| ademen $alt | |||
| bliksemen $alt | |||
| wasemen $alt | |||
| wasemen v#a:s@m@n $alt | |||
| // words where -er is not a stressed verb ending | |||
| @@ -881,7 +881,7 @@ waaier $alt | |||
| wakker $alt | |||
| wapper $alt | |||
| water $alt | |||
| wedijver v#Ed'EIv@r $alt | |||
| wedijver v#'EtEIv@r $alt | |||
| weelder $alt | |||
| wegwijzer $alt | |||
| weiger $alt | |||
| @@ -1805,7 +1805,7 @@ verderop $3 | |||
| vergezicht vErQ@zIxt | |||
| verre vEr@ | |||
| verrekijker vEr@kEIk@r | |||
| versa vErs'a: | |||
| versa v'Erza: | |||
| verste vErst@ | |||
| verte vErt@ | |||
| volledig $2 | |||
| @@ -430,9 +430,10 @@ | |||
| _) ge (tenL02 Qe: | |||
| _) geu QY: | |||
| _) ge (ven Qe: | |||
| _) ge (ver Qe: | |||
| ge (vend_ Qe: | |||
| ge (ver Qe: | |||
| ge (val Q@ | |||
| _) ge (ving Qe: | |||
| ge (ving Qe: | |||
| ge (sprek Q@ // in compounds | |||
| @@ -518,6 +519,7 @@ | |||
| &) iko (_ =iko: | |||
| fam) i (lie 'i | |||
| _) in (C@P2 'In | |||
| _) in (a@P2 'In | |||
| _) ing (eC_ IN // bewerkingen | |||
| _) in (do In | |||
| _) in (forma In | |||
| @@ -140,7 +140,8 @@ _⁃ odRa:Zka||'v||tvaRe||p'oml-tSki | |||
| £ libRa | |||
| ¤ mena | |||
| © kopiRajt | |||
| ® Registrovane: | |||
| ® RegistRovane: | |||
| ¶ 'oznatSenie||'odseku | |||
| ¥ jen | |||
| − mi:nus | |||
| ± plus||m'i:nus | |||
| @@ -206,7 +206,7 @@ _1M3 orUko:d.ie: | |||
| _dpt _pul.l.i | |||
| // drop final [U] when followed by an ordinal suffix | |||
| // drop final [U] when followed by an ordinal suffix or thousands | |||
| _1o onR | |||
| _2o irVn.d. | |||
| _3o mu:nR | |||
| @@ -239,18 +239,30 @@ _6Co aRUnu:R | |||
| _7Co ;ez.Unu:R | |||
| _8Co ;en.n.u:R | |||
| _#ம் a:m // ordinal suffix | |||
| _#ல் il | |||
| _#வது a:vVdU | |||
| _#வதும் a:vVdUm | |||
| _#வதுமாக a:vVdUma:gV | |||
| _#ஆம் a:m // including ஆ | |||
| _#ஆவது a:vVdU | |||
| _#ஆவதும் a:vVdUm | |||
| _#ஆவதுமாக a:vVdUma:gV | |||
| _#-ம் a:m // ordinal suffix with hyphen | |||
| _#-ல் il | |||
| _#-வது a:vVdU | |||
| _#-வதும் a:vVdUm | |||
| _#-வதுமாக a:vVdUma:gV | |||
| _#-ஆம் a:m // including ஆ | |||
| _#-ஆவது a:vVdU | |||
| _#-ஆவதும் a:vVdUm | |||
| _#-ஆவதுமாக a:vVdUma:gV | |||
| // English words | |||
| tamil தமிழ் $text | |||
| @@ -387,6 +399,7 @@ tamil தமிழ் $text | |||
| பாதிக்காம $alt | |||
| பனியா $alt | |||
| பாம் $alt | |||
| போத $alt | |||
| // initial த as [d] | |||
| @@ -548,7 +561,6 @@ tamil தமிழ் $text | |||
| போன் fo:n | |||
| போனில் fo:nil | |||
| //பைலை faIlaI | |||
| பாதர் fa:dVr | |||
| பாதரிடம் fa:dVrid.Vm | |||
| பாதருடன் fa:dVrUd.Vn | |||
| பாதரில்லாமல் fa:dVrilla:mVl | |||
| @@ -130,6 +130,9 @@ | |||
| // endings after போர்ட (board) | |||
| .L31 ்_ ிங் ின ை ுக்க ில ும | |||
| // words after அர்த்த | |||
| .L32 ராத்திரி ஜாம நிசி வேளை | |||
| // consonants | |||
| @@ -270,7 +273,6 @@ | |||
| _) க (ால்ஃப் g | |||
| _) கால்ப் ga:lf | |||
| _) க (ிஃப்ட g | |||
| _) கிட (ார git. | |||
| _) க (ிடுகிடு g | |||
| _) க (ிண்ணென்ற g | |||
| _) க (ின்னஸ g | |||
| @@ -601,9 +603,24 @@ _மன்மதக்) க (ுகை g | |||
| _) க் (ளாஸ்_ g | |||
| _) க்வ (A kw | |||
| _) க் (வாலியர g | |||
| _) க (ுட்கா g | |||
| _) கோவர்த்த go:vVrddV# | |||
| _) கோர்க (ாலாந்த go:rk | |||
| _) குருமுக (ி gurumuk | |||
| _) க (ோஸ்வாமி g | |||
| _) க (ோசுவாமி g | |||
| _) க (ிடார் g | |||
| _) க (ிடாரை g | |||
| _) க (ிடாரில g | |||
| _) க (ிடாரின g | |||
| _) க (ிடாரிட g | |||
| //endsort | |||
| //sort | |||
| _முட்) க (டிகார gV | |||
| _தமிழ்) க (ூற k | |||
| _து) க (ாராம k | |||
| _நாகர்) க (ோவில k | |||
| _கோபி) க kV# | |||
| _ஸ்டா) க kV# | |||
| _ஜமாய்) க kV# | |||
| @@ -1351,6 +1368,12 @@ _வெனி) ச (ுவேல z | |||
| _) ச (ௌஹான tS | |||
| _ந) ச் (னு tS | |||
| _கா) ச்மூச tSmu:tSV# | |||
| அ) சு (வமேத s | |||
| அ) சோக (் s.o:k | |||
| _பாஸ்கரா) ச (ாரி tS | |||
| _பரமா) ச (ாரி tS | |||
| _மி) ச (ோராம z | |||
| _) சு (வாதி s | |||
| //endsort | |||
| @@ -1785,6 +1808,8 @@ _நடுரோ) ட் (ல t. | |||
| அ) ட்லாண்ட t.la:n.t.V# // atlant | |||
| _) ட்விங்க (ிள t.wiNk | |||
| _) ட்வ (ிட்டர t.w | |||
| _ஸ்) டி (ரைக் t. | |||
| _) ட (ூல t. | |||
| //endsort | |||
| @@ -2205,9 +2230,13 @@ _) தீர்க்க (_சுமங்கலி di:rggV | |||
| _) த (ோஹா d | |||
| _) தௌலதாப (ாத daUlVd.a:b | |||
| _) த (்ராட்சை d | |||
| _) த (ாவீத d | |||
| _) த (ுரியானந்த d | |||
| _) த (ாவூத d | |||
| //endsort | |||
| //sort | |||
| _அர்) த்த (_L32 ddV# | |||
| _நிசப்) த dV# | |||
| அனந்) த tV# | |||
| _வசந்) த tV# | |||
| @@ -3602,9 +3631,48 @@ _பெனசீர்_) ப (ுட்டோ b | |||
| _) ப் (ளூஸ b | |||
| _) ப் (ளோரிடா f | |||
| _) ப் (ளௌஸ b | |||
| _) புத்த (கய buddV | |||
| _) பாப (ுஜி ba:p | |||
| _) பிக (ார biH | |||
| _) ப (ிஹார b | |||
| _) ப (வ்விய bV | |||
| _) பி (ளட் b | |||
| L03) ப்ப (ூதகண bb | |||
| L03) ப்ப (ூதங்கள bb | |||
| _) புளூடூத் bl.u:t.u:T | |||
| _) ப்ளூடூத் bl.u:t.u:T | |||
| _) பி (ரவுன b | |||
| _) ப் (ரவுன b | |||
| _) ப (ட்டாச்சாரி bV | |||
| _) ப (ிசினச b | |||
| _) ப (ிசினெச b | |||
| _) ப (ூசுக்த b | |||
| _) ப (ேலூர b | |||
| _) பி (ரஷர p | |||
| _) பி (ரத்தியட்ச p | |||
| _) பி (ரத்தியக்ஷ p | |||
| _) ப (ோதத் b | |||
| _) ப (ோதங்கள b | |||
| _ஜுகல்_) ப (ந்தி bV | |||
| _) புத்த (ியக்க putt | |||
| _) ப (ாணம b | |||
| _) ப (ாணத்த b | |||
| //endsort | |||
| //sort | |||
| _சுக) ப (ோக_ b | |||
| _க) ப (ளீகர bV | |||
| _ஜா) ப (ர fV | |||
| _முரண்) ப (ாட p | |||
| _வழி) ப (ார் p | |||
| _வழி) ப (ோட p | |||
| _பழி) ப (ோட p | |||
| _துர்) ப்ப (ுத்தி bb | |||
| அவிர்) ப்ப (ாக bb | |||
| L03) ப்பி (ரேத pp | |||
| L03) ப்பி (ரதே pp | |||
| _துண்டு) ப்பி (ரசுர pp | |||
| _கை) ப்பி (ரசுர pp | |||
| _நீர்) ப pV# | |||
| _ப்ரூ) ப fV# | |||
| இடர்) ப pV# | |||
| @@ -4405,7 +4473,7 @@ _சந்தேக) ப்ப (ுத்தி bb | |||
| _) வி (யா v | |||
| வி (யூக v | |||
| இண்டர்) வி (யூ v | |||
| L03வ்) வி (யா v | |||
| .group ஶ | |||
| ஶ SV | |||
| @@ -4427,6 +4495,7 @@ _சந்தேக) ப்ப (ுத்தி bb | |||
| _ம) ஸ்த (ூர zd | |||
| அரி) ஸ (ோன z | |||
| _சூய) ஸ zV# | |||
| _ஹி) ஸ்ப (ுல்லா zb | |||
| .group ஹ | |||
| ஹ HV | |||
| @@ -4527,6 +4596,8 @@ _சந்தேக) ப்ப (ுத்தி bb | |||
| இலேக்க (ிய le:gg | |||
| இ (லேச | |||
| இ (லையோலா | |||
| இ (ராத்_ | |||
| இ (ராப்பகல | |||
| //endsort | |||
| .group உ | |||
| @@ -1,4 +1,3 @@ | |||
| name slovenian-test | |||
| language sl | |||
| stressLength 160 150 240 240 240 240 300 320 | |||
| @@ -15,6 +15,12 @@ phoneme E | |||
| FMT(vowel/ee_1) | |||
| endphoneme | |||
| phoneme e# | |||
| vowel starttype #e endtype #e | |||
| length 200 | |||
| ChangeIfStressed(e) | |||
| ChangePhoneme(NULL) | |||
| endphoneme | |||
| phoneme O | |||
| vowel starttype #o endtype #o | |||
| @@ -286,3 +286,11 @@ phoneme z | |||
| CALL base/z | |||
| endphoneme | |||
| phoneme l | |||
| import_phoneme en/l | |||
| endphoneme | |||
| phoneme x2 | |||
| import_phoneme af/x2 | |||
| endphoneme | |||
| @@ -359,11 +359,13 @@ phoneme t | |||
| Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | |||
| Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
| IF nextPhW(isVowel) AND nextPh(isUnstressed) AND NOT next2PhW(n) THEN | |||
| IF prevPhW(isVowel) THEN | |||
| ChangePhoneme(t#) | |||
| ELIF prevPhW(n) THEN | |||
| WAV(ustop/t, 60) | |||
| IF nextPhW(isVowel) AND nextPh(isUnstressed) THEN | |||
| IF NOT next2PhW(n) OR nextPhW(3:) THEN | |||
| IF prevPhW(isVowel) AND NOT prevPhW(aI@) THEN | |||
| ChangePhoneme(t#) | |||
| ELIF prevPhW(n) THEN | |||
| WAV(ustop/t, 60) | |||
| ENDIF | |||
| ENDIF | |||
| ENDIF | |||
| @@ -277,3 +277,44 @@ phoneme g# | |||
| endphoneme | |||
| // suggested by Prasenjit Sen, but perhaps not needed? | |||
| // ml_rules changes [p], [t], [k] to [b], [d], [g] in non-initial | |||
| // positions | |||
| phoneme p | |||
| import_phoneme consonants/p- | |||
| voicingswitch b | |||
| IF thisPh(isWordStart) THEN | |||
| CALL base/p | |||
| ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN | |||
| ChangePhoneme(b) | |||
| ENDIF | |||
| endphoneme | |||
| phoneme t | |||
| import_phoneme base/t[ | |||
| voicingswitch d | |||
| IF thisPh(isWordStart) THEN | |||
| CALL base/t | |||
| ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN | |||
| ChangePhoneme(d) | |||
| ENDIF | |||
| endphoneme | |||
| phoneme k | |||
| import_phoneme consonants/k- | |||
| voicingswitch g | |||
| IF thisPh(isWordStart) THEN | |||
| CALL base/k | |||
| ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN | |||
| ChangePhoneme(g) | |||
| ENDIF | |||
| endphoneme | |||
| @@ -0,0 +1,95 @@ | |||
| //==================================================== | |||
| // Manipuri, inherits from Bengali | |||
| //==================================================== | |||
| phoneme a | |||
| vowel starttype #a endtype #a | |||
| length 225 | |||
| IF thisPh(isWordEnd) AND thisPh(isUnstressed) THEN | |||
| FMT(vowel/a#_2) | |||
| ENDIF | |||
| FMT(vowel/a_3) | |||
| endphoneme | |||
| phoneme i | |||
| vowel starttype #i endtype #i | |||
| length 210 | |||
| FMT(vowel/i_6) | |||
| endphoneme | |||
| phoneme u | |||
| vowel starttype #u endtype #u | |||
| length 210 | |||
| FMT(vowel/u) | |||
| endphoneme | |||
| phoneme e | |||
| vowel starttype #e endtype #e | |||
| length 210 | |||
| FMT(vowel/e) | |||
| endphoneme | |||
| phoneme & | |||
| vowel starttype #a endtype #a | |||
| length 210 | |||
| FMT(vowel/&_2) | |||
| endphoneme | |||
| phoneme o | |||
| vowel starttype #o endtype #o | |||
| length 210 | |||
| IF nextPhW(w) THEN | |||
| length 170 | |||
| ENDIF | |||
| FMT(vowel/o) | |||
| endphoneme | |||
| phoneme O | |||
| vowel starttype #o endtype #o | |||
| length 200 | |||
| FMT(vowel/oo_5) | |||
| endphoneme | |||
| phoneme tS | |||
| vls pla afr sibilant | |||
| voicingswitch dZ | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
| IF nextPh(isPause2) THEN | |||
| WAV(ustop/tsh_unasp2) | |||
| ENDIF | |||
| WAV(ustop/tsh_unasp2) | |||
| endphoneme | |||
| phoneme tS# | |||
| vls pla afr sibilant | |||
| voicingswitch dZ | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
| IF nextPh(isPause2) THEN | |||
| WAV(ustop/tsh_) | |||
| ENDIF | |||
| WAV(ustop/tsh) | |||
| endphoneme | |||
| phoneme ~ | |||
| virtual | |||
| endphoneme | |||
| @@ -0,0 +1,105 @@ | |||
| //==================================================== | |||
| // Oriya, inherits from Bengali | |||
| //==================================================== | |||
| phoneme V // inherent vowel, can be [O] or [o] | |||
| vowel flag1 starttype #o endtype #o | |||
| length 200 | |||
| IF thisPh(isWordEnd) AND prevPhW(isNotVowel) THEN | |||
| ChangePhoneme(O) | |||
| ENDIF | |||
| endphoneme | |||
| phoneme a | |||
| vowel starttype #a endtype #a | |||
| length 225 | |||
| IF thisPh(isWordEnd) AND thisPh(isUnstressed) THEN | |||
| FMT(vowel/a#_2) | |||
| ENDIF | |||
| FMT(vowel/a_3) | |||
| endphoneme | |||
| phoneme i | |||
| vowel starttype #i endtype #i | |||
| length 210 | |||
| FMT(vowel/i_6) | |||
| endphoneme | |||
| phoneme u | |||
| vowel starttype #u endtype #u | |||
| length 210 | |||
| FMT(vowel/u) | |||
| endphoneme | |||
| phoneme e | |||
| vowel starttype #e endtype #e | |||
| length 210 | |||
| FMT(vowel/e) | |||
| endphoneme | |||
| phoneme & | |||
| vowel starttype #a endtype #a | |||
| length 210 | |||
| FMT(vowel/&_2) | |||
| endphoneme | |||
| phoneme o | |||
| vowel starttype #o endtype #o | |||
| length 210 | |||
| IF nextPhW(w) THEN | |||
| length 170 | |||
| ENDIF | |||
| FMT(vowel/o) | |||
| endphoneme | |||
| phoneme O | |||
| vowel starttype #o endtype #o | |||
| length 200 | |||
| FMT(vowel/oo_5) | |||
| endphoneme | |||
| phoneme tS | |||
| vls pla afr sibilant | |||
| voicingswitch dZ | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
| IF nextPh(isPause2) THEN | |||
| WAV(ustop/tsh_unasp2) | |||
| ENDIF | |||
| WAV(ustop/tsh_unasp2) | |||
| endphoneme | |||
| phoneme tS# | |||
| vls pla afr sibilant | |||
| voicingswitch dZ | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
| IF nextPh(isPause2) THEN | |||
| WAV(ustop/tsh_) | |||
| ENDIF | |||
| WAV(ustop/tsh) | |||
| endphoneme | |||
| phoneme ~ | |||
| virtual | |||
| endphoneme | |||
| @@ -6,44 +6,44 @@ | |||
| phoneme 1 // ngang tone: level | |||
| stress | |||
| Tone(32, 34, envelope/p_level, NULL) | |||
| Tone(20,35, envelope/i_risefall,NULL) //40,5,envelope/p_level, NULL) //40 45 | |||
| endphoneme | |||
| phoneme 2 // huyền tone: low falling | |||
| stress | |||
| Tone(35,20 , envelope/p_fall, NULL) //20 | |||
| Tone(10,20 , envelope/p_fall, NULL) //20 | |||
| endphoneme | |||
| phoneme 3 // sắc Tone(rising | |||
| stress | |||
| Tone(40,60, envelope/p_rise, NULL) // 25 50 | |||
| Tone(45,80, envelope/p_rise, NULL) // 30 50 | |||
| endphoneme | |||
| phoneme 4 // hỏi Tone(curve (dipping rising) | |||
| stress | |||
| Tone(30,50, envelope/p_rise, NULL) //envelope/vi_5amp) // 28,58 | |||
| Tone(45,50, envelope/p_fallrise,envelope/vi_5amp) // 28,58 | |||
| endphoneme | |||
| phoneme 5 // ngã tone: broken (creaking rising) | |||
| stress | |||
| Tone(30,50, envelope/p_rise, NULL) //20,80, envelope/p_214, envelope/vi_5amp) // 28,58 | |||
| Tone(30,75, envelope/p_214, NULL) //20,80, envelope/p_214, envelope/vi_5amp) // 28,58 | |||
| endphoneme | |||
| phoneme 6 // nặng Tone(drop (constricted) | |||
| stress | |||
| //length 150 // ignore because it make too short sound 75 // reduce the length of the vowel | |||
| Tone(10,5, envelope/p_512,NULL) // envelope/vi_6amp) | |||
| Tone(20,25, envelope/p_512,NULL) // envelope/vi_6amp) 10 5 | |||
| endphoneme | |||
| phoneme 7 // Tone(1 (ngang) at end of clause | |||
| stress | |||
| Tone(40, 20, envelope/p_fall, NULL) | |||
| Tone(40,42, envelope/p_fall, NULL) //20, 30, envelope/p_fall, NULL) | |||
| endphoneme | |||
| // Redefine the length of vowels | |||
| @@ -51,11 +51,13 @@ endphoneme | |||
| phoneme i | |||
| CALL vi/i | |||
| length 150 | |||
| FMT(vowel/i#) | |||
| endphoneme | |||
| phoneme E | |||
| CALL vi/E | |||
| length 150 | |||
| FMT(vowel/ee_1) | |||
| endphoneme | |||
| phoneme a: | |||
| @@ -76,8 +78,8 @@ endphoneme | |||
| phoneme O | |||
| CALL vi/O | |||
| length 150 | |||
| FMT(vowel/0) | |||
| length 80 | |||
| FMT(vowel/oo_1) | |||
| endphoneme | |||
| phoneme Oi | |||
| @@ -94,4 +96,9 @@ endphoneme | |||
| phoneme o | |||
| CALL vi/o | |||
| FMT(vowel/o_5) | |||
| endphoneme | |||
| phoneme @:I | |||
| CALL vi/@:I | |||
| FMT(vdiph/y#y) | |||
| endphoneme | |||
| @@ -1934,6 +1934,11 @@ include ph_gujarati | |||
| phonemetable as bn | |||
| include ph_assamese | |||
| phonemetable or bn | |||
| include ph_oriya | |||
| phonemetable mni bn | |||
| include ph_manipuri | |||
| @@ -0,0 +1,37 @@ | |||
| #include <speak_lib.h> | |||
| #ifdef PLATFORM_WINDOWS | |||
| #include <windows.h> | |||
| #define sleep(x) Sleep(1000*x) | |||
| #endif | |||
| int callback(short* wav, int num, espeak_EVENT *pEv) | |||
| { | |||
| int cEv = 0; | |||
| while (pEv->type) { | |||
| cEv++; | |||
| pEv++; | |||
| } | |||
| printf("callback, events: %d\n", cEv); | |||
| return 0; | |||
| } | |||
| main() | |||
| { | |||
| int nRate = espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 10000, NULL, 0); | |||
| printf("nRate: %d\n", nRate); | |||
| if (nRate < 0) | |||
| return; | |||
| espeak_SetSynthCallback(callback); | |||
| espeak_SetParameter(espeakRATE, 175, 0); | |||
| int rv; | |||
| rv = espeak_Char('c'); | |||
| printf("rv: %d\n", rv); | |||
| const char* sText = "tralalalallala"; | |||
| rv = espeak_Synth(sText, 100, 0, POS_CHARACTER, 0, 0, 0, 0); | |||
| printf("rv: %d (full: %d, internal: %d)\n", | |||
| rv, EE_BUFFER_FULL, EE_INTERNAL_ERROR); | |||
| sleep(2); // 2 seconds | |||
| puts("slept"); | |||
| espeak_Terminate(); | |||
| } | |||
| @@ -0,0 +1,169 @@ | |||
| Index: src/Makefile | |||
| =================================================================== | |||
| --- src/Makefile (revision 364) | |||
| +++ src/Makefile (working copy) | |||
| @@ -18,6 +18,13 @@ | |||
| # Use SONAME_OPT=-Wl,h, on Solaris | |||
| SONAME_OPT=-Wl,-soname, | |||
| +ifdef PLATFORM_WINDOWS | |||
| + LIB_NAME = libespeak.dll | |||
| +else | |||
| + # On Windows not all source files are compiled | |||
| + non_windows_SOURCES = mbrowrap.cpp | |||
| +endif | |||
| + | |||
| # Use EXTRA_LIBS=-lm on Solaris | |||
| EXTRA_LIBS = | |||
| @@ -72,12 +79,12 @@ | |||
| speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ | |||
| readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ | |||
| - synthdata.cpp synthesize.cpp translate.cpp mbrowrap.cpp \ | |||
| + synthdata.cpp synthesize.cpp translate.cpp $(non_windows_SOURCES) \ | |||
| tr_languages.cpp voices.cpp wavegen.cpp phonemelist.cpp klatt.cpp sonic.cpp | |||
| libespeak_SOURCES = speak_lib.cpp compiledict.cpp dictionary.cpp intonation.cpp \ | |||
| readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ | |||
| - synthdata.cpp synthesize.cpp translate.cpp mbrowrap.cpp \ | |||
| + synthdata.cpp synthesize.cpp translate.cpp $(non_windows_SOURCES) \ | |||
| tr_languages.cpp voices.cpp wavegen.cpp phonemelist.cpp \ | |||
| espeak_command.cpp event.cpp fifo.cpp $(WAVE) debug.cpp klatt.cpp sonic.cpp | |||
| @@ -94,8 +101,14 @@ | |||
| LIBS3=-lstdc++ -L . -lespeak | |||
| CXXFLAGS=-O2 | |||
| +ifdef PLATFORM_WINDOWS | |||
| + CXXFLAGS += -DPLATFORM_WINDOWS -DNEED_STRUCT_TIMESPEC | |||
| + LDFLAGS += -static-libgcc -static-libstdc++ | |||
| +endif | |||
| +ifdef DEBUG | |||
| + CXXFLAGS += -DDEBUG_ENABLED | |||
| +endif | |||
| - | |||
| all: $(BIN_NAME) $(LIB_NAME) $(STATIC_LIB_NAME) $(BIN2_NAME) | |||
| .cpp.o: | |||
| @@ -116,9 +129,11 @@ | |||
| $(LIB_NAME): $(OBJS2) | |||
| $(CXX) $(LDFLAGS) -shared $(SONAME_OPT)$(LIB_NAME).$(LIB_VERSION) -o $@ \ | |||
| $(OBJS2) $(LIBS2) | |||
| - mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG) | |||
| - $(LN_SF) $(LIB_NAME).$(LIBTAG) $(LIB_NAME).$(LIB_VERSION) | |||
| - $(LN_SF) $(LIB_NAME).$(LIB_VERSION) $(LIB_NAME) | |||
| + $(if $(PLATFORM_WINDOWS), , \ | |||
| + mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG); \ | |||
| + $(LN_SF) $(LIB_NAME).$(LIBTAG) $(LIB_NAME).$(LIB_VERSION); \ | |||
| + $(LN_SF) $(LIB_NAME).$(LIB_VERSION) $(LIB_NAME); \ | |||
| + ) | |||
| $(STATIC_LIB_NAME): $(OBJS2) | |||
| $(AR) cqs $(STATIC_LIB_NAME) $(OBJS2) | |||
| Index: src/speech.h | |||
| =================================================================== | |||
| --- src/speech.h (revision 364) | |||
| +++ src/speech.h (working copy) | |||
| @@ -37,7 +37,6 @@ | |||
| #endif | |||
| -#define PLATFORM_POSIX | |||
| #define PATHSEP '/' | |||
| // USE_PORTAUDIO or USE_PULSEAUDIO are now defined in the makefile | |||
| //#define USE_PORTAUDIO | |||
| @@ -77,7 +76,14 @@ | |||
| #ifdef PLATFORM_WINDOWS | |||
| #define N_PATH_HOME 230 | |||
| -#else | |||
| +// sleep(seconds) | |||
| +// Sleep(millisecond = 1/1000 s), windows api, kernel32.dll | |||
| +// usleep(microseconds = 1/1000000 s) | |||
| +#define sleep(x) Sleep(1000*x) | |||
| +// we are lucky, in current code usleep is always used in multiplies of 1000 | |||
| +#define usleep(x) Sleep((x+500)/1000) | |||
| +#else /* PLATFORM_POSIX */ | |||
| +#define PLATFORM_POSIX | |||
| #define N_PATH_HOME 160 | |||
| #endif | |||
| Index: src/speak_lib.cpp | |||
| =================================================================== | |||
| --- src/speak_lib.cpp (revision 364) | |||
| +++ src/speak_lib.cpp (working copy) | |||
| @@ -31,7 +31,13 @@ | |||
| #include "speech.h" | |||
| #include <sys/stat.h> | |||
| -#ifndef PLATFORM_WINDOWS | |||
| + | |||
| +#ifdef PLATFORM_WINDOWS | |||
| +#include <fcntl.h> | |||
| +#include <io.h> | |||
| +#include <windows.h> | |||
| +#include <winreg.h> | |||
| +#else /* PLATFORM_POSIX */ | |||
| #include <unistd.h> | |||
| #endif | |||
| Index: src/wave.cpp | |||
| =================================================================== | |||
| --- src/wave.cpp (revision 364) | |||
| +++ src/wave.cpp (working copy) | |||
| @@ -32,7 +32,9 @@ | |||
| #include <time.h> | |||
| #include "portaudio.h" | |||
| -#ifndef PLATFORM_WINDOWS | |||
| +#ifdef PLATFORM_WINDOWS | |||
| +#include <windows.h> | |||
| +#else /* PLATFORM_POSIX */ | |||
| #include <unistd.h> | |||
| #endif | |||
| #include "wave.h" | |||
| @@ -40,6 +42,14 @@ | |||
| //<Definitions | |||
| +#ifdef NEED_STRUCT_TIMESPEC | |||
| +#define HAVE_STRUCT_TIMESPEC 1 | |||
| +struct timespec { | |||
| + long tv_sec; | |||
| + long tv_nsec; | |||
| +}; | |||
| +#endif /* HAVE_STRUCT_TIMESPEC */ | |||
| + | |||
| enum {ONE_BILLION=1000000000}; | |||
| #ifdef USE_PORTAUDIO | |||
| Index: src/event.cpp | |||
| =================================================================== | |||
| --- src/event.cpp (revision 364) | |||
| +++ src/event.cpp (working copy) | |||
| @@ -24,7 +24,9 @@ | |||
| //<includes | |||
| +#ifndef PLATFORM_WINDOWS | |||
| #include <unistd.h> | |||
| +#endif | |||
| #include <assert.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| Index: src/fifo.cpp | |||
| =================================================================== | |||
| --- src/fifo.cpp (revision 364) | |||
| +++ src/fifo.cpp (working copy) | |||
| @@ -24,7 +24,9 @@ | |||
| //<includes | |||
| +#ifndef PLATFORM_WINDOWS | |||
| #include <unistd.h> | |||
| +#endif | |||
| #include <assert.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| @@ -0,0 +1,16 @@ | |||
| These are instructions to built the library on MS Windows, using msys and mingw. | |||
| This library is fully functional, contrary to the library described | |||
| in windows_dll directory. | |||
| To build exe file go to windows_cmd directory, to build sapi dll, | |||
| go to windows_sapi directory. | |||
| - Use sources from src directory. | |||
| - Have a ready to use portaudio v19 library (dll file is sufficient, here | |||
| libportaudio-2.dll filename is assumed in a directory relative to espeak) | |||
| - Copy portaudio.h file from your portaudio directory to src directory, | |||
| overwriting the existing one. At the time of writing this is the same | |||
| file as src/portaudio19.h distributed within espeak. | |||
| Make command: | |||
| make libespeak.dll PLATFORM_WINDOWS=1 LIB_AUDIO="-L ../../portaudio/lib/.libs -lportaudio-2 -lwinmm" | |||
| @@ -990,6 +990,10 @@ static wxString CompileAllDictionaries() | |||
| sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | |||
| log = fopen(fname_log,"w"); | |||
| if(log != 0) | |||
| { | |||
| fprintf(log, "%s", utf8_bom); | |||
| } | |||
| sprintf(fname_log,"%s%s",path_dsource,"dict_phonemes"); | |||
| f_phused = fopen(fname_log,"w"); | |||
| @@ -2407,6 +2411,9 @@ int CompileIf(int elif) | |||
| else | |||
| { | |||
| error("Unexpected keyword '%s'",item_string); | |||
| if((strcmp(item_string, "phoneme") == 0) || (strcmp(item_string, "endphoneme") == 0)) | |||
| return(-1); | |||
| } | |||
| // output the word | |||
| @@ -425,7 +425,8 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) | |||
| char *mnemptr; | |||
| unsigned char flag_codes[100]; | |||
| char encoded_ph[200]; | |||
| unsigned char bad_phoneme[4]; | |||
| char bad_phoneme_str[4]; | |||
| int bad_phoneme; | |||
| static char nullstring[] = {0}; | |||
| text_not_phonemes = 0; | |||
| @@ -660,17 +661,18 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) | |||
| } | |||
| else | |||
| { | |||
| EncodePhonemes(phonetic,encoded_ph,bad_phoneme); | |||
| EncodePhonemes(phonetic,encoded_ph,&bad_phoneme); | |||
| if(strchr(encoded_ph,phonSWITCH) != 0) | |||
| { | |||
| flag_codes[n_flag_codes++] = BITNUM_FLAG_ONLY_S; // don't match on suffixes (except 's') when switching languages | |||
| } | |||
| // check for errors in the phonemes codes | |||
| if(bad_phoneme[0] != 0) | |||
| if(bad_phoneme != 0) | |||
| { | |||
| // unrecognised phoneme, report error | |||
| fprintf(f_log,"%5d: Bad phoneme [%c] (0x%x) in: %s %s\n",linenum,bad_phoneme[0],bad_phoneme[0],word,phonetic); | |||
| bad_phoneme_str[utf8_out(bad_phoneme, bad_phoneme_str)] = 0; | |||
| fprintf(f_log,"%5d: Bad phoneme [%s] (U+%x) in: %s %s\n",linenum,bad_phoneme_str,bad_phoneme,word,phonetic); | |||
| error_count++; | |||
| } | |||
| } | |||
| @@ -1194,7 +1196,8 @@ static char *compile_rule(char *input) | |||
| int finish=0; | |||
| char buf[80]; | |||
| char output[150]; | |||
| unsigned char bad_phoneme[4]; | |||
| int bad_phoneme; | |||
| char bad_phoneme_str[4]; | |||
| buf[0]=0; | |||
| rule_cond[0]=0; | |||
| @@ -1272,10 +1275,11 @@ static char *compile_rule(char *input) | |||
| return(NULL); | |||
| } | |||
| EncodePhonemes(rule_phonemes,buf,bad_phoneme); | |||
| if(bad_phoneme[0] != 0) | |||
| EncodePhonemes(rule_phonemes,buf,&bad_phoneme); | |||
| if(bad_phoneme != 0) | |||
| { | |||
| fprintf(f_log,"%5d: Bad phoneme [%c] in %s\n",linenum,bad_phoneme[0],input); | |||
| bad_phoneme_str[utf8_out(bad_phoneme, bad_phoneme_str)] = 0; | |||
| fprintf(f_log,"%5d: Bad phoneme [%s] (U+%x) in: %s\n",linenum,bad_phoneme_str,bad_phoneme,input); | |||
| error_count++; | |||
| } | |||
| strcpy(output,buf); | |||
| @@ -348,8 +348,8 @@ int HashDictionary(const char *string) | |||
| const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phoneme) | |||
| /***************************************************************************/ | |||
| const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme) | |||
| /******************************************************************/ | |||
| /* Translate a phoneme string from ascii mnemonics to internal phoneme numbers, | |||
| from 'p' up to next blank . | |||
| Returns advanced 'p' | |||
| @@ -366,7 +366,7 @@ const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phone | |||
| unsigned int mnemonic_word; | |||
| if(bad_phoneme != NULL) | |||
| bad_phoneme[0] = 0; | |||
| *bad_phoneme = 0; | |||
| // skip initial blanks | |||
| while(isspace(*p)) | |||
| @@ -428,8 +428,7 @@ const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phone | |||
| // not recognised, report and ignore | |||
| if(bad_phoneme != NULL) | |||
| { | |||
| bad_phoneme[0] = *p; | |||
| bad_phoneme[1] = 0; | |||
| utf8_in(bad_phoneme, p); | |||
| } | |||
| *outptr++ = 0; | |||
| return(p+1); | |||
| @@ -726,6 +726,7 @@ void MyFrame::OnTools(wxCommandEvent& event) | |||
| int debug_flag=0; | |||
| char fname_log[sizeof(path_dsource)+12]; | |||
| char err_fname[sizeof(path_home)+15]; | |||
| static const char utf8_bom[] = {0xef,0xbb,0xbf,0}; | |||
| switch(event.GetId()) | |||
| { | |||
| @@ -776,6 +777,10 @@ void MyFrame::OnTools(wxCommandEvent& event) | |||
| case MENU_COMPILE_DICT: | |||
| sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | |||
| log = fopen(fname_log,"w"); | |||
| if(log != NULL) | |||
| { | |||
| fprintf(log, "%s", utf8_bom); | |||
| } | |||
| LoadDictionary(translator, translator->dictionary_name, 0); | |||
| if((err = CompileDictionary(path_dsource,translator->dictionary_name,log,err_fname,debug_flag)) < 0) | |||
| @@ -22,7 +22,9 @@ | |||
| //<includes | |||
| #ifndef PLATFORM_WINDOWS | |||
| #include <unistd.h> | |||
| #endif | |||
| #include <assert.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| @@ -47,6 +49,7 @@ static sem_t my_sem_stop_is_required; | |||
| static sem_t my_sem_stop_is_acknowledged; | |||
| // my_thread: polls the audio duration and compares it to the duration of the first event. | |||
| static pthread_t my_thread; | |||
| static bool thread_inited; | |||
| static t_espeak_callback* my_callback = NULL; | |||
| static int my_event_is_running=0; | |||
| @@ -94,16 +97,16 @@ void event_init(void) | |||
| assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | |||
| pthread_attr_t a_attrib; | |||
| if (pthread_attr_init (& a_attrib) | |||
| || pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) | |||
| || pthread_create( &my_thread, | |||
| & a_attrib, | |||
| polling_thread, | |||
| (void*)NULL)) | |||
| { | |||
| assert(0); | |||
| } | |||
| if (pthread_attr_init (&a_attrib) == 0 | |||
| && pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) == 0) | |||
| { | |||
| thread_inited = (0 == pthread_create(&my_thread, | |||
| &a_attrib, | |||
| polling_thread, | |||
| (void*)NULL)); | |||
| } | |||
| assert(thread_inited); | |||
| pthread_attr_destroy(&a_attrib); | |||
| } | |||
| //> | |||
| @@ -126,7 +129,10 @@ ENTER("event_display"); | |||
| "MARK", | |||
| "PLAY", | |||
| "END", | |||
| "MSG_TERMINATED" | |||
| "MSG_TERMINATED", | |||
| "PHONEME", | |||
| "SAMPLERATE", | |||
| "??" | |||
| }; | |||
| SHOW("event_display > event=0x%x\n",event); | |||
| @@ -711,7 +717,7 @@ void event_terminate() | |||
| { | |||
| ENTER("event_terminate"); | |||
| if (my_thread) | |||
| if (thread_inited) | |||
| { | |||
| pthread_cancel(my_thread); | |||
| pthread_join(my_thread,NULL); | |||
| @@ -720,6 +726,7 @@ ENTER("event_terminate"); | |||
| sem_destroy(&my_sem_stop_is_required); | |||
| sem_destroy(&my_sem_stop_is_acknowledged); | |||
| init(); // purge event | |||
| thread_inited = 0; | |||
| } | |||
| } | |||
| //> | |||
| @@ -22,7 +22,9 @@ | |||
| //<includes | |||
| #ifndef PLATFORM_WINDOWS | |||
| #include <unistd.h> | |||
| #endif | |||
| #include <assert.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| @@ -1506,7 +1506,10 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out | |||
| else | |||
| { | |||
| // followed by hundreds or thousands etc | |||
| sprintf(string,"_%da",value); | |||
| if(tr->langopts.numbers2 & NUM2_ORDINAL_AND_THOUSANDS) | |||
| sprintf(string, "_%do", value); | |||
| else | |||
| sprintf(string, "_%da", value); | |||
| found = Lookup(tr, string, ph_digits); | |||
| } | |||
| @@ -1612,7 +1615,10 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out | |||
| else if(((control & 2) == 0) || ((tr->langopts.numbers & NUM_SWAP_TENS) != 0)) | |||
| { | |||
| // followed by hundreds or thousands (or tens) | |||
| sprintf(string,"_%da",units); | |||
| if(tr->langopts.numbers2 & NUM2_ORDINAL_AND_THOUSANDS) | |||
| sprintf(string, "_%do", units); | |||
| else | |||
| sprintf(string, "_%da", units); | |||
| found = Lookup(tr, string, ph_digits); | |||
| } | |||
| } | |||
| @@ -49,7 +49,7 @@ | |||
| #define phSINGLE_INSTN 0x1000 // this phoneme has a single instruction program, with an implicit Return | |||
| #define phBRKAFTER 0x4000 // [*] add a post-pause | |||
| #define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position | |||
| #define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position | |||
| #define phLONG 0x200000 | |||
| #define phLENGTHENSTOP 0x400000 // make the pre-pause slightly longer | |||
| #define phRHOTIC 0x800000 // bit 23 | |||
| @@ -113,7 +113,7 @@ typedef struct { | |||
| unsigned char end_type; | |||
| unsigned char std_length; // for vowels, in mS/2; for phSTRESS phonemes, this is the stress/tone type | |||
| unsigned char length_mod; // a length_mod group number, used to access length_mod_tab | |||
| } PHONEME_TAB; | |||
| @@ -155,13 +155,13 @@ typedef struct { | |||
| #define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name | |||
| #define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name | |||
| #define PH3(c1,c2,c3) (c3<<16)+(c2<<8)+c1 | |||
| #define PhonemeCode2(c1,c2) PhonemeCode((c2<<8)+c1) | |||
| int LookupPhonemeString(const char *string); | |||
| int PhonemeCode(unsigned int mnem); | |||
| const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phoneme); | |||
| const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme); | |||
| void DecodePhonemes(const char *inptr, char *outptr); | |||
| extern const char *WordToString(unsigned int word); | |||
| @@ -32,7 +32,12 @@ | |||
| #include "speech.h" | |||
| #include <sys/stat.h> | |||
| #ifndef PLATFORM_WINDOWS | |||
| #ifdef PLATFORM_WINDOWS | |||
| #include <fcntl.h> | |||
| #include <io.h> | |||
| #include <windows.h> | |||
| #include <winreg.h> | |||
| #else /* PLATFORM_POSIX */ | |||
| #include <unistd.h> | |||
| #endif | |||
| @@ -552,7 +557,11 @@ static const char* label[] = { | |||
| "SENTENCE", | |||
| "MARK", | |||
| "PLAY", | |||
| "END"}; | |||
| "END", | |||
| "MSG_TERMINATED", | |||
| "PHONEME", | |||
| "SAMPLERATE", | |||
| "??" }; | |||
| #endif | |||
| @@ -35,7 +35,7 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.47.12 23.Sep.13"; | |||
| const char *version_string = "1.47.13 22.Oct.13"; | |||
| const int version_phdata = 0x014709; | |||
| int option_device_number = -1; | |||
| @@ -1486,6 +1486,7 @@ SetLengthMods(tr,3); // all equal | |||
| SetupTranslator(tr,stress_lengths_ta, NULL); | |||
| tr->letter_bits_offset = OFFSET_TAMIL; | |||
| tr->langopts.numbers = NUM_OMIT_1_THOUSAND ; | |||
| tr->langopts.numbers2 = NUM2_ORDINAL_AND_THOUSANDS; | |||
| tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words | |||
| } | |||
| else | |||
| @@ -1582,6 +1583,7 @@ SetLengthMods(tr,3); // all equal | |||
| break; | |||
| case L('u','r'): // Urdu | |||
| case L('s','d'): // Sindhi | |||
| { | |||
| tr->letter_bits_offset = OFFSET_ARABIC; | |||
| tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words | |||
| @@ -1310,7 +1310,7 @@ if(end_type & SUFX_UNPRON) | |||
| prefix_flags = 1; | |||
| if(found == 0) | |||
| { | |||
| end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, 0, dictionary_flags); | |||
| end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, wflags & FLAG_HYPHEN_AFTER, dictionary_flags); | |||
| if(phonemes[0] == phonSWITCH) | |||
| { | |||
| @@ -1768,7 +1768,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| int ix; | |||
| int sylimit; // max. number of syllables in a word to be combined with a preceding preposition | |||
| const char *new_language; | |||
| unsigned char bad_phoneme[4]; | |||
| int bad_phoneme; | |||
| int word_flags; | |||
| int word_copy_len; | |||
| char word_copy[N_WORD_BYTES+1]; | |||
| @@ -1874,7 +1874,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| } | |||
| else | |||
| { | |||
| EncodePhonemes(word,word_phonemes,bad_phoneme); | |||
| EncodePhonemes(word,word_phonemes,&bad_phoneme); | |||
| } | |||
| flags = FLAG_FOUND; | |||
| } | |||
| @@ -511,6 +511,7 @@ typedef struct { | |||
| #define NUM2_ENGLISH_NUMERALS 0x8000 | |||
| #define NUM2_PERCENT_BEFORE 0x10000 | |||
| #define NUM2_OMIT_1_HUNDRED_ONLY 0x20000 | |||
| #define NUM2_ORDINAL_AND_THOUSANDS 0x40000 | |||
| // bits 1-4 use variant form of numbers before thousands,millions,etc. | |||
| // bits 6-8 use different forms of thousand, million, etc (M MA MB) | |||
| // bit9=(LANG=rw) say "thousand" and "million" before its number, not after | |||
| @@ -521,6 +522,7 @@ typedef struct { | |||
| // bit15=(LANG=ne) speak (non-replaced) English numerals in English | |||
| // bit16=(LANG=si) say "%" before the number | |||
| // bit17=(LANG=ml) omit "one" before hundred only if there are no previous digits | |||
| // bit18=(LANG=ta) same variant for ordinals and thousands (#o = #a) | |||
| int numbers2; | |||
| #define BREAK_THOUSANDS 0x49249248 | |||
| @@ -31,7 +31,10 @@ | |||
| #include <sys/time.h> | |||
| #include <time.h> | |||
| #ifndef PLATFORM_WINDOWS | |||
| #include "portaudio.h" | |||
| #ifdef PLATFORM_WINDOWS | |||
| #include <windows.h> | |||
| #else | |||
| #include <unistd.h> | |||
| #endif | |||
| #include "wave.h" | |||
| @@ -39,6 +42,15 @@ | |||
| //<Definitions | |||
| #ifdef NEED_STRUCT_TIMESPEC | |||
| #define HAVE_STRUCT_TIMESPEC 1 | |||
| struct timespec { | |||
| long tv_sec; | |||
| long tv_nsec; | |||
| }; | |||
| #endif /* HAVE_STRUCT_TIMESPEC */ | |||
| enum {ONE_BILLION=1000000000}; | |||
| #ifdef USE_PORTAUDIO | |||
| @@ -53,8 +65,8 @@ enum {ONE_BILLION=1000000000}; | |||
| #endif | |||
| #ifdef USE_PULSEAUDIO | |||
| // create some wrappers for runtime detection | |||
| @@ -203,8 +215,8 @@ static t_wave_callback* my_callback_is_output_enabled=NULL; | |||
| #define BUFFER_LENGTH (MAX_SAMPLE_RATE*2*sizeof(uint16_t)) | |||
| //#define THRESHOLD (BUFFER_LENGTH/5) | |||
| static char myBuffer[BUFFER_LENGTH]; | |||
| static char* myRead=NULL; | |||
| static char* myWrite=NULL; | |||
| static char* myRead=NULL; | |||
| static char* myWrite=NULL; | |||
| static int out_channels=1; | |||
| static int my_stream_could_start=0; | |||
| static int wave_samplerate; | |||
| @@ -223,7 +235,7 @@ static PaError pa_init_err=0; | |||
| // time measurement | |||
| // The read and write position audio stream in the audio stream are measured in ms. | |||
| // | |||
| // | |||
| // * When the stream is opened, myReadPosition and myWritePosition are cleared. | |||
| // * myWritePosition is updated in wave_write. | |||
| // * myReadPosition is updated in pa_callback (+ sample delay). | |||
| @@ -275,12 +287,12 @@ static void start_stream() | |||
| PaError err; | |||
| SHOW_TIME("start_stream"); | |||
| my_stream_could_start=0; | |||
| my_stream_could_start=0; | |||
| mInCallbackFinishedState = false; | |||
| err = Pa_StartStream(pa_stream); | |||
| SHOW("start_stream > Pa_StartStream=%d (%s)\n", err, Pa_GetErrorText(err)); | |||
| #if USE_PORTAUDIO == 19 | |||
| if(err == paStreamIsNotStopped) | |||
| { | |||
| @@ -337,7 +349,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, | |||
| memcpy(outputBuffer, myRead, aUsedMem); | |||
| } | |||
| char* p = (char*)outputBuffer + aUsedMem; | |||
| memset(p, 0, n - aUsedMem); | |||
| memset(p, 0, n - aUsedMem); | |||
| // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | |||
| myRead = aWrite; | |||
| } | |||
| @@ -367,7 +379,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, | |||
| myRead = myBuffer + aRest; | |||
| } | |||
| else | |||
| { | |||
| { | |||
| SHOW_TIME("pa_callback > underflow"); | |||
| aResult=1; // paComplete; | |||
| @@ -387,7 +399,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, | |||
| size_t aUsedMem = aTopMem + aRest; | |||
| char* p = (char*)outputBuffer + aUsedMem; | |||
| memset(p, 0, n - aUsedMem); | |||
| memset(p, 0, n - aUsedMem); | |||
| // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | |||
| myRead = aWrite; | |||
| } | |||
| @@ -498,8 +510,8 @@ static int wave_open_sound() | |||
| //paClipOff | paDitherOff, | |||
| paNoFlag, | |||
| pa_callback, (void *)userdata); | |||
| SHOW("wave_open_sound > Pa_OpenDefaultStream(1): err=%d (%s)\n",err, Pa_GetErrorText(err)); | |||
| SHOW("wave_open_sound > Pa_OpenDefaultStream(1): err=%d (%s)\n",err, Pa_GetErrorText(err)); | |||
| if(err == paInvalidChannelCount) | |||
| { | |||
| @@ -544,7 +556,7 @@ static int wave_open_sound() | |||
| // paClipOff | paDitherOff, | |||
| pa_callback, | |||
| (void *)userdata); | |||
| if ((err!=paNoError) | |||
| if ((err!=paNoError) | |||
| && (err!=paInvalidChannelCount)) //err==paUnanticipatedHostError | |||
| { | |||
| fprintf(stderr, "wave_open_sound > Pa_OpenStream : err=%d (%s)\n",err,Pa_GetErrorText(err)); | |||
| @@ -600,7 +612,7 @@ static void update_output_parameters(int selectedDevice, const PaDeviceInfo *dev | |||
| myOutputParameters.channelCount = 1; | |||
| myOutputParameters.sampleFormat = paInt16; | |||
| // Latency greater than 100ms for avoiding glitches | |||
| // Latency greater than 100ms for avoiding glitches | |||
| // (e.g. when moving a window in a graphical desktop) | |||
| // deviceInfo = Pa_GetDeviceInfo(selectedDevice); | |||
| if (deviceInfo) | |||
| @@ -654,15 +666,15 @@ static void select_device(const char* the_api) | |||
| for( i=0; i<numDevices; i++ ) | |||
| { | |||
| deviceInfo = Pa_GetDeviceInfo( i ); | |||
| if (deviceInfo == NULL) | |||
| { | |||
| break; | |||
| } | |||
| const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi ); | |||
| if (hostInfo && hostInfo->type == paALSA) | |||
| { | |||
| { | |||
| // Check (once) the default output device | |||
| if (defaultAlsaIndex == numDevices) | |||
| { | |||
| @@ -671,23 +683,23 @@ static void select_device(const char* the_api) | |||
| update_output_parameters(defaultAlsaIndex, deviceInfo); | |||
| if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | |||
| { | |||
| SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); | |||
| SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); | |||
| selectedIndex = defaultAlsaIndex; | |||
| selectedDeviceInfo = deviceInfo; | |||
| break; | |||
| } | |||
| } | |||
| // if the default output device does not match, | |||
| // look for the device with the highest number of output channels | |||
| // if the default output device does not match, | |||
| // look for the device with the highest number of output channels | |||
| SHOW( "select_device > ALSA, i=%d (numDevices=%d)\n", i, numDevices); | |||
| update_output_parameters(i, deviceInfo); | |||
| if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | |||
| { | |||
| SHOW( "select_device > ALSA, name=%s (#%d)\n", deviceInfo->name, i); | |||
| if (!selectedDeviceInfo | |||
| || (selectedDeviceInfo->maxOutputChannels < deviceInfo->maxOutputChannels)) | |||
| { | |||
| @@ -703,14 +715,14 @@ static void select_device(const char* the_api) | |||
| { | |||
| update_output_parameters(selectedIndex, selectedDeviceInfo); | |||
| } | |||
| else | |||
| else | |||
| { | |||
| i = Pa_GetDefaultOutputDevice(); | |||
| deviceInfo = Pa_GetDeviceInfo( i ); | |||
| update_output_parameters(i, deviceInfo); | |||
| } | |||
| #endif | |||
| #endif | |||
| } | |||
| //> | |||
| @@ -798,18 +810,18 @@ void* wave_open(const char* the_api) | |||
| //<copyBuffer | |||
| static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
| { | |||
| static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
| { | |||
| size_t bytes_written = 0; | |||
| unsigned int i = 0; | |||
| uint16_t* a_dest = NULL; | |||
| uint16_t* a_src = NULL; | |||
| if ((src != NULL) && dest != NULL) | |||
| { | |||
| { | |||
| // copy for one channel (mono)? | |||
| if(out_channels==1) | |||
| { | |||
| { | |||
| SHOW("copyBuffer > 1 channel > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes); | |||
| memcpy(dest, src, theSizeInBytes); | |||
| bytes_written = theSizeInBytes; | |||
| @@ -820,7 +832,7 @@ static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
| i = 0; | |||
| a_dest = (uint16_t* )dest; | |||
| a_src = (uint16_t* )src; | |||
| for(i=0; i<theSizeInBytes/2; i++) | |||
| { | |||
| a_dest[2*i] = a_src[i]; | |||
| @@ -829,8 +841,8 @@ static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
| bytes_written = 2*theSizeInBytes; | |||
| } // end if(out_channels==1) | |||
| } // end if ((src != NULL) && dest != NULL) | |||
| return bytes_written; | |||
| return bytes_written; | |||
| } | |||
| //> | |||
| @@ -843,7 +855,7 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
| // space in ringbuffer for the sample needed: 1x mono channel but 2x for 1 stereo channel | |||
| size_t bytes_to_write = (out_channels==1) ? theSize : theSize*2; | |||
| my_stream_could_start = 0; | |||
| if(pa_stream == NULL) | |||
| { | |||
| SHOW_TIME("wave_write > wave_open_sound\n"); | |||
| @@ -859,16 +871,16 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
| my_stream_could_start = 1; | |||
| } | |||
| assert(BUFFER_LENGTH >= bytes_to_write); | |||
| if (myWrite >= myBuffer + BUFFER_LENGTH) | |||
| { | |||
| myWrite = myBuffer; | |||
| } // end if (myWrite >= myBuffer + BUFFER_LENGTH) | |||
| size_t aTotalFreeMem=0; | |||
| char* aRead = myRead; | |||
| SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | |||
| while (1) | |||
| { | |||
| if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) | |||
| @@ -876,9 +888,9 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
| SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | |||
| return 0; | |||
| } | |||
| aRead = myRead; | |||
| // write pointer is before read pointer? | |||
| if (myWrite >= aRead) | |||
| { | |||
| @@ -888,27 +900,27 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
| { | |||
| aTotalFreeMem = aRead - myWrite; | |||
| } // end if (myWrite >= aRead) | |||
| if (aTotalFreeMem>1) | |||
| { | |||
| // -1 because myWrite must be different of aRead | |||
| // otherwise buffer would be considered as empty | |||
| aTotalFreeMem -= 1; | |||
| } // end if (aTotalFreeMem>1) | |||
| if (aTotalFreeMem >= bytes_to_write) | |||
| { | |||
| break; | |||
| } // end if (aTotalFreeMem >= bytes_to_write) | |||
| //SHOW_TIME("wave_write > wait"); | |||
| SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem); | |||
| SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | |||
| usleep(10000); | |||
| } // end while (1) | |||
| aRead = myRead; | |||
| // write pointer is ahead the read pointer? | |||
| if (myWrite >= aRead) | |||
| { | |||
| @@ -945,17 +957,17 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
| SHOW_TIME("wave_write > myWrite <= aRead"); | |||
| myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize); | |||
| } // end if (myWrite >= aRead) | |||
| bytes_written = bytes_to_write; | |||
| myWritePosition += theSize/sizeof(uint16_t); // add number of samples | |||
| if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | |||
| { | |||
| start_stream(); | |||
| } // end if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | |||
| SHOW_TIME("wave_write > LEAVE"); | |||
| return bytes_written; | |||
| } | |||
| @@ -974,7 +986,7 @@ int wave_close(void* theHandler) | |||
| SHOW_TIME("wave_close > LEAVE (NULL stream)"); | |||
| return 0; | |||
| } | |||
| if( Pa_IsStreamStopped( pa_stream ) ) | |||
| { | |||
| SHOW_TIME("wave_close > LEAVE (stopped)"); | |||
| @@ -986,7 +998,7 @@ int wave_close(void* theHandler) | |||
| SHOW_TIME("wave_close > LEAVE (NULL stream)"); | |||
| return 0; | |||
| } | |||
| if( Pa_StreamActive( pa_stream ) == false && mInCallbackFinishedState == false ) | |||
| { | |||
| SHOW_TIME("wave_close > LEAVE (not active)"); | |||
| @@ -1002,20 +1014,20 @@ int wave_close(void* theHandler) | |||
| SHOW_TIME("wave_close > LEAVE (stopStreamCount)"); | |||
| return 0; | |||
| } | |||
| // Comment from Audacity-1.2.4b adapted to the eSpeak context. | |||
| // Comment from Audacity-1.2.4b adapted to the eSpeak context. | |||
| // | |||
| // We got here in one of two ways: | |||
| // | |||
| // 1. The calling program calls the espeak_Cancel function and we | |||
| // therefore want to stop as quickly as possible. | |||
| // 1. The calling program calls the espeak_Cancel function and we | |||
| // therefore want to stop as quickly as possible. | |||
| // So we use AbortStream(). If this is | |||
| // the case the portaudio stream is still in the Running state | |||
| // (see PortAudio state machine docs). | |||
| // | |||
| // 2. The callback told PortAudio to stop the stream since it had | |||
| // reached the end of the selection. | |||
| // The event polling thread discovered this by noticing that | |||
| // reached the end of the selection. | |||
| // The event polling thread discovered this by noticing that | |||
| // wave_is_busy() returned false. | |||
| // wave_is_busy() (which calls Pa_GetStreamActive()) will not return | |||
| // false until all buffers have finished playing, so we can call | |||
| @@ -1030,7 +1042,7 @@ int wave_close(void* theHandler) | |||
| // call StopStream if the callback brought us here, and AbortStream | |||
| // if the user brought us here. | |||
| // | |||
| #if (USE_PORTAUDIO == 19) | |||
| if (pa_stream) | |||
| { | |||
| @@ -1114,14 +1126,14 @@ int wave_is_busy(void* theHandler) | |||
| if (pa_stream) | |||
| { | |||
| #if USE_PORTAUDIO == 18 | |||
| active = Pa_StreamActive(pa_stream) | |||
| active = Pa_StreamActive(pa_stream) | |||
| && (mInCallbackFinishedState == false); | |||
| #else | |||
| active = Pa_IsStreamActive(pa_stream) | |||
| && (mInCallbackFinishedState == false); | |||
| #endif | |||
| } | |||
| SHOW("wave_is_busy: %d\n",active); | |||
| @@ -1160,7 +1172,7 @@ int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
| if (!time || !pa_stream) | |||
| { | |||
| SHOW("event get_remaining_time> %s\n","audio device not available"); | |||
| SHOW("event get_remaining_time> %s\n","audio device not available"); | |||
| return -1; | |||
| } | |||
| @@ -1246,7 +1258,7 @@ void add_time_in_ms(struct timespec *ts, int time_in_ms) | |||
| { | |||
| SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); | |||
| ts->tv_sec += 1; | |||
| t_ns -= ONE_BILLION; | |||
| t_ns -= ONE_BILLION; | |||
| } | |||
| ts->tv_nsec = (long int)t_ns; | |||
| } | |||