| .L03 f h j s y z r // allow [B] [D] [Q] before these consonants | .L03 f h j s y z r // allow [B] [D] [Q] before these consonants | ||||
| .L04 b v f p // labials, nasals are [m] | .L04 b v f p // labials, nasals are [m] | ||||
| .L05 g k // velars, nasals are [N] | .L05 g k // velars, nasals are [N] | ||||
| .L06 a e o | |||||
| .group a | .group a | ||||
| a a | a a | ||||
| i) e E | i) e E | ||||
| u) e E | u) e E | ||||
| y) e E | y) e E | ||||
| L06_) e e# // unstressed 'e' silent at start of word after a,e,o | |||||
| _) ent' (AP4 ent | _) ent' (AP4 ent | ||||
| _) enta' ,ent%a | _) enta' ,ent%a | ||||
| &) s (_S1 s | &) s (_S1 s | ||||
| _) s' (AP2 s | _) s' (AP2 s | ||||
| _) s (C@ %es | |||||
| _) s (hA s | |||||
| _) s (y s | |||||
| A_) s (C s | |||||
| .group t | .group t |
| // Translation rules for Bengali | |||||
| // Translation rules for Assamese | |||||
| // input by . | |||||
| // This file is UTF8 encoded | // This file is UTF8 encoded | ||||
| // Numbers | // 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 | _2 d'uj | ||||
| _3 t'in | |||||
| _4 tS'ar | |||||
| _3 t'ini | |||||
| _4 tS#'ar'i | |||||
| _5 p'a~tS | _5 p'a~tS | ||||
| _6 tS#'Oj | _6 tS#'Oj | ||||
| _7 S'at | |||||
| _8 'at.# | |||||
| _7 X'at | |||||
| _8 a~t.# | |||||
| _9 n'Oj | _9 n'Oj | ||||
| _2a d'u // with hundreds etc. | _2a d'u // with hundreds etc. | ||||
| _6a tS#'a | |||||
| _6a tS#'O | |||||
| _9a n'O | _9a n'O | ||||
| _10 d'OS | |||||
| _11 '&garo | |||||
| _10 d@h | |||||
| _11 Ig#'a:ro | |||||
| _12 b'arO | _12 b'arO | ||||
| _13 t'erO | _13 t'erO | ||||
| _14 tS'oddO | |||||
| _14 tS#au'ddO | |||||
| _15 p'OnerO | _15 p'OnerO | ||||
| _16 S'olO | |||||
| _17 S'OterO | |||||
| _16 X'olO | |||||
| _17 X'OterO | |||||
| _18 'at.#arO | _18 'at.#arO | ||||
| _19 'uniS | |||||
| _19 'un'niS | |||||
| _20 k'uri // or b'iS ?? | |||||
| _20 b'iS | |||||
| _21 ek'uS | _21 ek'uS | ||||
| _22 b'ajS | _22 b'ajS | ||||
| _23 t'ejS | _23 t'ejS | ||||
| _24 tS'ObbiS | _24 tS'ObbiS | ||||
| _25 p'O~tSiS | _25 p'O~tSiS | ||||
| _26 tSh'abbiS | _26 tSh'abbiS | ||||
| _27 Sat'aS | |||||
| _27 X'at'aS | |||||
| _28 'at.#aS | _28 'at.#aS | ||||
| _29 unOtr'iS | |||||
| _29 'unOtr'iS | |||||
| _30 tr'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 | _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 | _39 'unOtSOll'iS | ||||
| _40 tSOll'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 | _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 | _0M1 h'ajar | ||||
| _0M2 l'ak# | _0M2 l'ak# | ||||
| _0M3 k'ot.i | _0M3 k'ot.i | ||||
| _0M4 'Orbud | _0M4 'Orbud | ||||
| _dpt _d'Osomik_ | |||||
| _dpt _d'OX'omik_ | |||||
| // Single consonants | // Single consonants | ||||
| খ k#O | খ k#O | ||||
| গ gO | গ gO | ||||
| ঘ g#O | ঘ g#O | ||||
| ঙ 'uNO~ | |||||
| ঙ 'uNgO~ | |||||
| চ tSO | চ tSO | ||||
| ছ tShO // [h] to distinguish from [tS] | ছ tShO // [h] to distinguish from [tS] | ||||
| জ JO | জ JO | ||||
| ব bO | ব bO | ||||
| ভ b#O | ভ b#O | ||||
| ম mO | ম mO | ||||
| য় Oj | |||||
| য ,ontostedZ'O | য ,ontostedZ'O | ||||
| র rO | |||||
| ড় r.O | |||||
| ড় r.O // (d. + nukta) | |||||
| ঢ় hr.O | |||||
| ঢ় hr.O // (d#. + nukta) | |||||
| ৰ rO | |||||
| ল lO | ল lO | ||||
| ৱ wO | |||||
| শ t,aleboS:'O | শ t,aleboS:'O | ||||
| ষ m,ud#en:oS:'O | ষ m,ud#en:oS:'O | ||||
| স d,onteS:'O | |||||
| স d,onte'X:'O | |||||
| হ hO | হ hO | ||||
| ৎ kh,Ond.ot'O | |||||
| ক্ষ k,ojmud#en:oS:'O | ক্ষ k,ojmud#en:oS:'O | ||||
| ড় dOerO // (d. + nukta) | |||||
| ঢ় d#e hr.O // (d#. + nukta) | |||||
| য় ,ontosteOj | |||||
| ৎ kh,Ond.ot'O | |||||
| // full vowels | // full vowels | ||||
| অ O | অ O | ||||
| আ a | আ a | ||||
| ই hrOS:o'i | ই hrOS:o'i | ||||
| ঈ dirg#o'i | |||||
| ঈ d'i:rg#o'i | |||||
| উ hrOS:o'u | উ hrOS:o'u | ||||
| ঊ dirg#o'u | |||||
| ঊ d'i:rg#o'u | |||||
| ঋ ri | ঋ ri | ||||
| ও o | |||||
| ঔ ow | ঔ ow | ||||
| এ e $u+ // word 'it' | এ e $u+ // word 'it' | ||||
| ঐ oj $u+ // word 'that' | ঐ oj $u+ // word 'that' | ||||
| ও o $u+ $brk // 'and' | ও o $u+ $brk // 'and' | ||||
| _এ e | _এ e | ||||
| _ঐ oj | _ঐ oj | ||||
| _ও o | |||||
| // combining vowel signs | // combining vowel signs | ||||
| া 'akar | া '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 | ৃ r'ikar | ||||
| ে 'ekar | ে 'ekar | ||||
| ৈ 'ojkar | ৈ 'ojkar | ||||
| ় b'indu | ় b'indu | ||||
| $ d.Olar | $ d.Olar | ||||
| % SOtk'Ora | |||||
| % X'Otk'Ora | |||||
| + jOg | + jOg | ||||
| = SOman | |||||
| = X'Oman | |||||
| // Punctuation | // Punctuation | ||||
| । dVn.d.V | |||||
| । dVn.ri | |||||
| _, koma | _, koma | ||||
| _? pr'oSnOtSihnO | _? pr'oSnOtSihnO | ||||
| // Pronouns | // Pronouns | ||||
| আমি $u // main: I | |||||
| আমায় $u | |||||
| আমার $u | |||||
| আমরা $u // we | |||||
| আমাদের $u | |||||
| ময $u // I, me | |||||
| আমি $u // us | |||||
| আমার $u // our | |||||
| আপনি $u // you(formal) | আপনি $u // you(formal) | ||||
| আপনাকে $u | |||||
| আপনার $u | |||||
| আপনাক $u | |||||
| তুমি $u // you (informal) | তুমি $u // you (informal) | ||||
| তোমায় $u | |||||
| তোমার $u | |||||
| তোমাদের $u | |||||
| তুই $u // you (informal) | |||||
| তোকে $u | |||||
| তোমাক $u | |||||
| তয় $u // you (informal) | |||||
| তোক $u | |||||
| তোর $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 | // 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 | কিন্তু $u $pause // kintu: but | ||||
| যদি $pause // jodi: if | যদি $pause // jodi: if | ||||
| তবু $pause // tobu: still, yet | |||||
| তবে $pause // tabe: if...then | |||||
| তেতিয়া $pause // then | |||||
| অথচ $u // athacho: yet | অথচ $u // athacho: yet | ||||
| // Verbs | |||||
| হয় $u | |||||
| ছিল $u // chilo: past aux | |||||
| ছিলেন $u // chilen | |||||
| করছি $u // korchi: continuous | |||||
| করছিলাম $u // korchilam: past indefinite | |||||
| করেছি $u // korechi: past | |||||
| // Exceptions | // Exceptions | ||||
| এত &to | |||||
| এটা &ta // one piece, one |
| | |||||
| // Pronounciation rule for Assamese. | |||||
| // This file is UTF8 encoded | // This file is UTF8 encoded | ||||
| // letter groups: | // letter groups: | ||||
| // C consonants | // C consonants | ||||
| // Y vowel letters and vowel signs | // Y vowel letters and vowel signs | ||||
| .replace | .replace | ||||
| ০ 0 | ০ 0 | ||||
| ১ 1 | ১ 1 | ||||
| ৮ 8 | ৮ 8 | ||||
| ৯ 9 | ৯ 9 | ||||
| // Vowels | // Vowels | ||||
| .group অ | .group অ | ||||
| অ V | |||||
| অঁ O~ | |||||
| অ্যা & // V,ja in [æmiba] | |||||
| অ V | |||||
| অঁ O~ | |||||
| অ্যা & // V,ja in [æmiba] | |||||
| .group আ | .group আ | ||||
| আ a | |||||
| আঁ a~ | |||||
| আ a | |||||
| আঁ a~ | |||||
| .group ই | .group ই | ||||
| ই i | |||||
| ইঁ i~ | |||||
| ই i | |||||
| ইঁ i~ | |||||
| .group ঈ | .group ঈ | ||||
| ঈ i | |||||
| ঈঁ i~ | |||||
| ঈ i | |||||
| ঈঁ i~ | |||||
| .group উ | .group উ | ||||
| উ u | |||||
| উঁ u~ | |||||
| উ u | |||||
| উঁ u~ | |||||
| .group ঊ | .group ঊ | ||||
| ঊ u | |||||
| ঊঁ u~ | |||||
| ঊ u | |||||
| ঊঁ u~ | |||||
| .group ঋ | .group ঋ | ||||
| ঋ ri | |||||
| ঋঁ ri~ | |||||
| .group ঌ | |||||
| ঌ l- | |||||
| ঋ ri | |||||
| .group এ | .group এ | ||||
| এ & | |||||
| এঁ &~ | |||||
| এ & | |||||
| এঁ &~ | |||||
| .group ঐ | .group ঐ | ||||
| ঐ oj | |||||
| ঐঁ o~j | |||||
| ঐ oj | |||||
| ঐঁ o~j | |||||
| .group এ | .group এ | ||||
| এ e | |||||
| এঁ e~ | |||||
| এ e | |||||
| এঁ e~ | |||||
| এ্যা & // e,ja [ækademi] | |||||
| এ্যা & // e,ja [ækademi] | |||||
| .group ও | .group ও | ||||
| ও o | |||||
| ওঁ o~ | |||||
| ও o | |||||
| ওঁ o~ | |||||
| .group ঔ | .group ঔ | ||||
| ঔ ow | |||||
| ঔঁ o~w | |||||
| ঔ ow | |||||
| ঔঁ o~w | |||||
| .group ও //?? | .group ও //?? | ||||
| ও o: | |||||
| ও o: | |||||
| // Vowel Signs | // Vowel Signs | ||||
| .group া | .group া | ||||
| া a | |||||
| াঁ a~ | |||||
| C) া a | |||||
| C) াঁ a~ | |||||
| .group ি | .group ি | ||||
| ি i | |||||
| িঁ i~ | |||||
| C) ি i | |||||
| C) িঁ i~ | |||||
| .group ী | .group ী | ||||
| ী i | |||||
| ীঁ i~ | |||||
| C) ী i | |||||
| C) ীঁ i~ | |||||
| .group ূ | .group ূ | ||||
| ূ u | |||||
| ূঁ u~ | |||||
| C) ূ u | |||||
| C) ূঁ u~ | |||||
| .group ু | .group ু | ||||
| ু u | |||||
| ুঁ u~ | |||||
| C) ু u | |||||
| C) ুঁ u~ | |||||
| .group ৃ | .group ৃ | ||||
| ৃ ri | |||||
| ৃঁ ri~ | |||||
| C) ৃ r'i | |||||
| .group ে | .group ে | ||||
| ে e | |||||
| েঁ e~ | |||||
| েউ ew | |||||
| C) ে e | |||||
| C) েঁ e~ | |||||
| C) েউ ew | |||||
| .group ৈ | .group ৈ | ||||
| ৈ oj | |||||
| ৈঁ o~j | |||||
| C) ৈ oj | |||||
| C) ৈঁ o~j | |||||
| .group ো | .group ো | ||||
| ো o | |||||
| োঁ o~ | |||||
| C) ো o | |||||
| C) োঁ o~ | |||||
| .group ৌ | .group ৌ | ||||
| ৌ ow | |||||
| ৌঁ o~w | |||||
| C) ৌ ow | |||||
| C) ৌঁ o~w | |||||
| // Consonants | // Consonants | ||||
| .group ক | .group ক | ||||
| ক kV | |||||
| ক (B k | |||||
| ক kV | |||||
| ক (B k | |||||
| .group খ | .group খ | ||||
| খ k#V | |||||
| খ (B k# | |||||
| খ k#V | |||||
| খ (B k# | |||||
| .group গ | .group গ | ||||
| গ gV | |||||
| গ (B g | |||||
| গ gV | |||||
| গ (B g | |||||
| .group ঘ | .group ঘ | ||||
| ঘ g#V | |||||
| ঘ (B g# | |||||
| ঘ g#V | |||||
| ঘ (B g# | |||||
| .group ঙ | .group ঙ | ||||
| ঙ NV | |||||
| ঙ্ (B N | |||||
| ঙ NV | |||||
| ঙ (B N | |||||
| .group চ | .group চ | ||||
| চ tSV | |||||
| চ (B tS | |||||
| চ tSV | |||||
| চ (B tS | |||||
| .group ছ | .group ছ | ||||
| ছ tS#V | |||||
| ছ (B tS# | |||||
| ছ tS#V | |||||
| ছ (B tS# | |||||
| .group জ | .group জ | ||||
| জ JV | |||||
| জ (B J | |||||
| জ JV | |||||
| জ (B J | |||||
| জ্ব JV | |||||
| জ্ব (B J | |||||
| জ্ঞ ggo~ | |||||
| জ্ঞ (B gg | |||||
| জ্ব JV | |||||
| জ্ব (B J | |||||
| জ্ঞ ggo~ | |||||
| জ্ঞ (B gg | |||||
| .group ঝ | .group ঝ | ||||
| ঝ J#V | |||||
| ঝ (B J# | |||||
| ঝ J#V | |||||
| ঝ (B J# | |||||
| .group ঞ | .group ঞ | ||||
| ঞ nV | |||||
| ঞ্ (B n | |||||
| ঞ nV | |||||
| ঞ (B n | |||||
| .group ট | .group ট | ||||
| ট t.V | |||||
| ট (B t. | |||||
| ট t.V | |||||
| ট (B t. | |||||
| .group ঠ | .group ঠ | ||||
| ঠ t.#V | |||||
| ঠ (B t.# | |||||
| ঠ t.#V | |||||
| ঠ (B t.# | |||||
| .group ড | .group ড | ||||
| ড d.V | |||||
| ড (B d. | |||||
| ড d.V | |||||
| ড (B d. | |||||
| ড় r.V // nukta | |||||
| ড় (B r. | |||||
| .group ঢ | .group ঢ | ||||
| ঢ d.#V | |||||
| ঢ (B d.# | |||||
| ঢ d.#V | |||||
| ঢ (B d.# | |||||
| ঢ় hr.V | |||||
| ঢ় (B hr. | |||||
| .group ণ | .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 ত | .group ত | ||||
| ত tV | |||||
| ত (B t | |||||
| ত tV | |||||
| ত (B t | |||||
| ত (_ to | |||||
| .group থ | .group থ | ||||
| থ t#V | |||||
| থ (B t# | |||||
| থ t#V | |||||
| থ (B t# | |||||
| .group দ | .group দ | ||||
| দ dV | |||||
| দ (B d | |||||
| দ dV | |||||
| দ (B d | |||||
| .group ধ | .group ধ | ||||
| ধ d#V | |||||
| ধ (B d# | |||||
| ধ d#V | |||||
| ধ (B d# | |||||
| .group ন | .group ন | ||||
| ন nV | |||||
| ন (B n | |||||
| ন nV | |||||
| ন (B n | |||||
| .group প | .group প | ||||
| প pV | |||||
| প (B p | |||||
| প pV | |||||
| প (B p | |||||
| .group ফ | .group ফ | ||||
| ফ fV // or [p#] ? | |||||
| ফ (B f | |||||
| ফ fV // or [p#] ? | |||||
| ফ (B f | |||||
| .group ব | .group ব | ||||
| ব bV | |||||
| ব (B b | |||||
| ব bV | |||||
| ব (B b | |||||
| .group ভ | .group ভ | ||||
| ভ b#V | |||||
| ভ (B b# | |||||
| ভ b#V | |||||
| ভ (B b# | |||||
| .group ম | .group ম | ||||
| ম mV | |||||
| ম (B m | |||||
| .group য় | |||||
| য় jV | |||||
| য় (B j | |||||
| ম mV | |||||
| ম (B m | |||||
| .group য | .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 ল | .group ল | ||||
| ল lV | |||||
| ল (B l | |||||
| ল lV | |||||
| ল (B l | |||||
| .group ৱ | |||||
| ৱ waV | |||||
| ৱ (B wO | |||||
| .group শ | .group শ | ||||
| শ SV // or [s] ? | |||||
| শ (B S | |||||
| শ SV // or [s] ? | |||||
| শ (B S | |||||
| শ (্ল s | |||||
| শ (্ল s | |||||
| .group ষ | .group ষ | ||||
| ষ SV | |||||
| ষ (B S | |||||
| ষ SV | |||||
| ষ (B S | |||||
| .group স | .group স | ||||
| স SV // or [s] ?? | |||||
| স (B S | |||||
| স (্থ s | |||||
| স (্ত s | |||||
| _) স্ব SV // shb | |||||
| স X@ // or [s] ?? | |||||
| স (B X | |||||
| স (্থ s | |||||
| স (্ত s | |||||
| স (্য s // সমস্যা | |||||
| _) স্ব SV // shb | |||||
| _) স্ব (B S | _) স্ব (B S | ||||
| .group হ | .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 ঁ | .group ঁ | ||||
| ঁ O~ // candrabindu, nasalize the previous vowel | |||||
| C) ঁ O~ // candrabindu, nasalize the previous vowel/Consonants | |||||
| .group ং | .group ং | ||||
| ং N // anusvara/onushshor | |||||
| A) ং N // anusvara/onushshor | |||||
| C) ং N | |||||
| .group ঃ // visarga/bishorgo | .group ঃ // visarga/bishorgo | ||||
| ঃ // doubles the following consonant | ঃ // doubles the following consonant | ||||
| ঃ (_ H | |||||
| ঃ (_ H | |||||
| .group ্ // virama/hoshonto | .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 |
| teaser _^_EN | teaser _^_EN | ||||
| tech _^_EN | tech _^_EN | ||||
| terminal _^_EN | terminal _^_EN | ||||
| time _^_EN | |||||
| trip _^_EN | trip _^_EN | ||||
| tuner _^_EN | tuner _^_EN | ||||
| unix _^_EN | unix _^_EN | ||||
| ersten e:rst@n | ersten e:rst@n | ||||
| erstmal e:rstma:l | erstmal e:rstma:l | ||||
| erzgebirg e:rtsg@bIrg | erzgebirg e:rtsg@bIrg | ||||
| expedient Ekspe:dI'Ent | |||||
| extravagant $1 | extravagant $1 | ||||
| extrem Ekstr'e:m | extrem Ekstr'e:m | ||||
| @t) ien (_ 'i:@n | @t) ien (_ 'i:@n | ||||
| &) iens (_ =I;@ns | &) iens (_ =I;@ns | ||||
| ient (_ I'Ent | ient (_ I'Ent | ||||
| d) ient (_ i:nt | |||||
| &) ienz (_ I'Ents | &) ienz (_ I'Ents | ||||
| sch) ie (n i: | sch) ie (n i: | ||||
| @) ie (reX 'i: | @) ie (reX 'i: |
| ೮ 8 | ೮ 8 | ||||
| ೯ 9 | ೯ 9 | ||||
| .L01 ಕ ಖ ಗ ಘ ಙ // velar | |||||
| .L02 ಚ ಛ ಜ ಝ ಞ // palatal | |||||
| .L03 ಟ ಠ ಡ ಢ ಣ // retroflex | |||||
| .L04 ತ ಥ ದ ಧ ನ // dental | |||||
| .L05 ಪ ಫ ಬ ಭ ಮ // labial | |||||
| .group ಕ | .group ಕ | ||||
| ಕ ka | ಕ ka | ||||
| .group 0xe0b2 // characters which start with UTF-8 bytes: [e0 b2] | .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 | ಃ h // visarga | ||||
| boezemen $alt | boezemen $alt | ||||
| ademen $alt | ademen $alt | ||||
| bliksemen $alt | bliksemen $alt | ||||
| wasemen $alt | |||||
| wasemen v#a:s@m@n $alt | |||||
| // words where -er is not a stressed verb ending | // words where -er is not a stressed verb ending | ||||
| wakker $alt | wakker $alt | ||||
| wapper $alt | wapper $alt | ||||
| water $alt | water $alt | ||||
| wedijver v#Ed'EIv@r $alt | |||||
| wedijver v#'EtEIv@r $alt | |||||
| weelder $alt | weelder $alt | ||||
| wegwijzer $alt | wegwijzer $alt | ||||
| weiger $alt | weiger $alt | ||||
| vergezicht vErQ@zIxt | vergezicht vErQ@zIxt | ||||
| verre vEr@ | verre vEr@ | ||||
| verrekijker vEr@kEIk@r | verrekijker vEr@kEIk@r | ||||
| versa vErs'a: | |||||
| versa v'Erza: | |||||
| verste vErst@ | verste vErst@ | ||||
| verte vErt@ | verte vErt@ | ||||
| volledig $2 | volledig $2 |
| _) ge (tenL02 Qe: | _) ge (tenL02 Qe: | ||||
| _) geu QY: | _) geu QY: | ||||
| _) ge (ven Qe: | _) ge (ven Qe: | ||||
| _) ge (ver Qe: | |||||
| ge (vend_ Qe: | |||||
| ge (ver Qe: | |||||
| ge (val Q@ | ge (val Q@ | ||||
| _) ge (ving Qe: | |||||
| ge (ving Qe: | |||||
| ge (sprek Q@ // in compounds | ge (sprek Q@ // in compounds | ||||
| &) iko (_ =iko: | &) iko (_ =iko: | ||||
| fam) i (lie 'i | fam) i (lie 'i | ||||
| _) in (C@P2 'In | _) in (C@P2 'In | ||||
| _) in (a@P2 'In | |||||
| _) ing (eC_ IN // bewerkingen | _) ing (eC_ IN // bewerkingen | ||||
| _) in (do In | _) in (do In | ||||
| _) in (forma In | _) in (forma In |
| £ libRa | £ libRa | ||||
| ¤ mena | ¤ mena | ||||
| © kopiRajt | © kopiRajt | ||||
| ® Registrovane: | |||||
| ® RegistRovane: | |||||
| ¶ 'oznatSenie||'odseku | |||||
| ¥ jen | ¥ jen | ||||
| − mi:nus | − mi:nus | ||||
| ± plus||m'i:nus | ± plus||m'i:nus |
| _dpt _pul.l.i | _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 | _1o onR | ||||
| _2o irVn.d. | _2o irVn.d. | ||||
| _3o mu:nR | _3o mu:nR | ||||
| _7Co ;ez.Unu:R | _7Co ;ez.Unu:R | ||||
| _8Co ;en.n.u:R | _8Co ;en.n.u:R | ||||
| _#ம் a:m // ordinal suffix | _#ம் a:m // ordinal suffix | ||||
| _#ல் il | _#ல் il | ||||
| _#வது a:vVdU | _#வது a:vVdU | ||||
| _#வதும் a:vVdUm | _#வதும் a:vVdUm | ||||
| _#வதுமாக a:vVdUma:gV | _#வதுமாக a:vVdUma:gV | ||||
| _#ஆம் a:m // including ஆ | |||||
| _#ஆவது a:vVdU | |||||
| _#ஆவதும் a:vVdUm | |||||
| _#ஆவதுமாக a:vVdUma:gV | |||||
| _#-ம் a:m // ordinal suffix with hyphen | _#-ம் a:m // ordinal suffix with hyphen | ||||
| _#-ல் il | _#-ல் il | ||||
| _#-வது a:vVdU | _#-வது a:vVdU | ||||
| _#-வதும் a:vVdUm | _#-வதும் a:vVdUm | ||||
| _#-வதுமாக a:vVdUma:gV | _#-வதுமாக a:vVdUma:gV | ||||
| _#-ஆம் a:m // including ஆ | |||||
| _#-ஆவது a:vVdU | |||||
| _#-ஆவதும் a:vVdUm | |||||
| _#-ஆவதுமாக a:vVdUma:gV | |||||
| // English words | // English words | ||||
| tamil தமிழ் $text | tamil தமிழ் $text | ||||
| பாதிக்காம $alt | பாதிக்காம $alt | ||||
| பனியா $alt | பனியா $alt | ||||
| பாம் $alt | பாம் $alt | ||||
| போத $alt | |||||
| // initial த as [d] | // initial த as [d] | ||||
| போன் fo:n | போன் fo:n | ||||
| போனில் fo:nil | போனில் fo:nil | ||||
| //பைலை faIlaI | //பைலை faIlaI | ||||
| பாதர் fa:dVr | |||||
| பாதரிடம் fa:dVrid.Vm | பாதரிடம் fa:dVrid.Vm | ||||
| பாதருடன் fa:dVrUd.Vn | பாதருடன் fa:dVrUd.Vn | ||||
| பாதரில்லாமல் fa:dVrilla:mVl | பாதரில்லாமல் fa:dVrilla:mVl |
| // endings after போர்ட (board) | // endings after போர்ட (board) | ||||
| .L31 ்_ ிங் ின ை ுக்க ில ும | .L31 ்_ ிங் ின ை ுக்க ில ும | ||||
| // words after அர்த்த | |||||
| .L32 ராத்திரி ஜாம நிசி வேளை | |||||
| // consonants | // consonants | ||||
| _) க (ால்ஃப் g | _) க (ால்ஃப் g | ||||
| _) கால்ப் ga:lf | _) கால்ப் ga:lf | ||||
| _) க (ிஃப்ட g | _) க (ிஃப்ட g | ||||
| _) கிட (ார git. | |||||
| _) க (ிடுகிடு g | _) க (ிடுகிடு g | ||||
| _) க (ிண்ணென்ற g | _) க (ிண்ணென்ற g | ||||
| _) க (ின்னஸ g | _) க (ின்னஸ g | ||||
| _) க் (ளாஸ்_ g | _) க் (ளாஸ்_ g | ||||
| _) க்வ (A kw | _) க்வ (A kw | ||||
| _) க் (வாலியர g | _) க் (வாலியர g | ||||
| _) க (ுட்கா g | |||||
| _) கோவர்த்த go:vVrddV# | |||||
| _) கோர்க (ாலாந்த go:rk | |||||
| _) குருமுக (ி gurumuk | |||||
| _) க (ோஸ்வாமி g | |||||
| _) க (ோசுவாமி g | |||||
| _) க (ிடார் g | |||||
| _) க (ிடாரை g | |||||
| _) க (ிடாரில g | |||||
| _) க (ிடாரின g | |||||
| _) க (ிடாரிட g | |||||
| //endsort | //endsort | ||||
| //sort | //sort | ||||
| _முட்) க (டிகார gV | |||||
| _தமிழ்) க (ூற k | |||||
| _து) க (ாராம k | |||||
| _நாகர்) க (ோவில k | |||||
| _கோபி) க kV# | _கோபி) க kV# | ||||
| _ஸ்டா) க kV# | _ஸ்டா) க kV# | ||||
| _ஜமாய்) க kV# | _ஜமாய்) க kV# | ||||
| _) ச (ௌஹான tS | _) ச (ௌஹான tS | ||||
| _ந) ச் (னு tS | _ந) ச் (னு tS | ||||
| _கா) ச்மூச tSmu:tSV# | _கா) ச்மூச tSmu:tSV# | ||||
| அ) சு (வமேத s | |||||
| அ) சோக (் s.o:k | |||||
| _பாஸ்கரா) ச (ாரி tS | |||||
| _பரமா) ச (ாரி tS | |||||
| _மி) ச (ோராம z | |||||
| _) சு (வாதி s | |||||
| //endsort | //endsort | ||||
| அ) ட்லாண்ட t.la:n.t.V# // atlant | அ) ட்லாண்ட t.la:n.t.V# // atlant | ||||
| _) ட்விங்க (ிள t.wiNk | _) ட்விங்க (ிள t.wiNk | ||||
| _) ட்வ (ிட்டர t.w | _) ட்வ (ிட்டர t.w | ||||
| _ஸ்) டி (ரைக் t. | |||||
| _) ட (ூல t. | |||||
| //endsort | //endsort | ||||
| _) த (ோஹா d | _) த (ோஹா d | ||||
| _) தௌலதாப (ாத daUlVd.a:b | _) தௌலதாப (ாத daUlVd.a:b | ||||
| _) த (்ராட்சை d | _) த (்ராட்சை d | ||||
| _) த (ாவீத d | |||||
| _) த (ுரியானந்த d | |||||
| _) த (ாவூத d | |||||
| //endsort | //endsort | ||||
| //sort | //sort | ||||
| _அர்) த்த (_L32 ddV# | |||||
| _நிசப்) த dV# | _நிசப்) த dV# | ||||
| அனந்) த tV# | அனந்) த tV# | ||||
| _வசந்) த tV# | _வசந்) த tV# | ||||
| _) ப் (ளூஸ b | _) ப் (ளூஸ b | ||||
| _) ப் (ளோரிடா f | _) ப் (ளோரிடா f | ||||
| _) ப் (ளௌஸ b | _) ப் (ளௌஸ 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 | //endsort | ||||
| //sort | //sort | ||||
| _சுக) ப (ோக_ b | |||||
| _க) ப (ளீகர bV | |||||
| _ஜா) ப (ர fV | |||||
| _முரண்) ப (ாட p | |||||
| _வழி) ப (ார் p | |||||
| _வழி) ப (ோட p | |||||
| _பழி) ப (ோட p | |||||
| _துர்) ப்ப (ுத்தி bb | |||||
| அவிர்) ப்ப (ாக bb | |||||
| L03) ப்பி (ரேத pp | |||||
| L03) ப்பி (ரதே pp | |||||
| _துண்டு) ப்பி (ரசுர pp | |||||
| _கை) ப்பி (ரசுர pp | |||||
| _நீர்) ப pV# | _நீர்) ப pV# | ||||
| _ப்ரூ) ப fV# | _ப்ரூ) ப fV# | ||||
| இடர்) ப pV# | இடர்) ப pV# | ||||
| _) வி (யா v | _) வி (யா v | ||||
| வி (யூக v | வி (யூக v | ||||
| இண்டர்) வி (யூ v | இண்டர்) வி (யூ v | ||||
| L03வ்) வி (யா v | |||||
| .group ஶ | .group ஶ | ||||
| ஶ SV | ஶ SV | ||||
| _ம) ஸ்த (ூர zd | _ம) ஸ்த (ூர zd | ||||
| அரி) ஸ (ோன z | அரி) ஸ (ோன z | ||||
| _சூய) ஸ zV# | _சூய) ஸ zV# | ||||
| _ஹி) ஸ்ப (ுல்லா zb | |||||
| .group ஹ | .group ஹ | ||||
| ஹ HV | ஹ HV | ||||
| இலேக்க (ிய le:gg | இலேக்க (ிய le:gg | ||||
| இ (லேச | இ (லேச | ||||
| இ (லையோலா | இ (லையோலா | ||||
| இ (ராத்_ | |||||
| இ (ராப்பகல | |||||
| //endsort | //endsort | ||||
| .group உ | .group உ |
| name slovenian-test | name slovenian-test | ||||
| language sl | language sl | ||||
| stressLength 160 150 240 240 240 240 300 320 | |||||
| FMT(vowel/ee_1) | FMT(vowel/ee_1) | ||||
| endphoneme | endphoneme | ||||
| phoneme e# | |||||
| vowel starttype #e endtype #e | |||||
| length 200 | |||||
| ChangeIfStressed(e) | |||||
| ChangePhoneme(NULL) | |||||
| endphoneme | |||||
| phoneme O | phoneme O | ||||
| vowel starttype #o endtype #o | vowel starttype #o endtype #o |
| CALL base/z | CALL base/z | ||||
| endphoneme | endphoneme | ||||
| phoneme l | |||||
| import_phoneme en/l | |||||
| endphoneme | |||||
| phoneme x2 | |||||
| import_phoneme af/x2 | |||||
| endphoneme |
| Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | ||||
| Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | 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 | ||||
| ENDIF | ENDIF | ||||
| endphoneme | 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 | |||||
| //==================================================== | |||||
| // 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 | |||||
| //==================================================== | |||||
| // 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 | |||||
| phoneme 1 // ngang tone: level | phoneme 1 // ngang tone: level | ||||
| stress | stress | ||||
| Tone(32, 34, envelope/p_level, NULL) | |||||
| Tone(20,35, envelope/i_risefall,NULL) //40,5,envelope/p_level, NULL) //40 45 | |||||
| endphoneme | endphoneme | ||||
| phoneme 2 // huyền tone: low falling | phoneme 2 // huyền tone: low falling | ||||
| stress | stress | ||||
| Tone(35,20 , envelope/p_fall, NULL) //20 | |||||
| Tone(10,20 , envelope/p_fall, NULL) //20 | |||||
| endphoneme | endphoneme | ||||
| phoneme 3 // sắc Tone(rising | phoneme 3 // sắc Tone(rising | ||||
| stress | stress | ||||
| Tone(40,60, envelope/p_rise, NULL) // 25 50 | |||||
| Tone(45,80, envelope/p_rise, NULL) // 30 50 | |||||
| endphoneme | endphoneme | ||||
| phoneme 4 // hỏi Tone(curve (dipping rising) | phoneme 4 // hỏi Tone(curve (dipping rising) | ||||
| stress | 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 | endphoneme | ||||
| phoneme 5 // ngã tone: broken (creaking rising) | phoneme 5 // ngã tone: broken (creaking rising) | ||||
| stress | 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 | endphoneme | ||||
| phoneme 6 // nặng Tone(drop (constricted) | phoneme 6 // nặng Tone(drop (constricted) | ||||
| stress | stress | ||||
| //length 150 // ignore because it make too short sound 75 // reduce the length of the vowel | //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 | endphoneme | ||||
| phoneme 7 // Tone(1 (ngang) at end of clause | phoneme 7 // Tone(1 (ngang) at end of clause | ||||
| stress | stress | ||||
| Tone(40, 20, envelope/p_fall, NULL) | |||||
| Tone(40,42, envelope/p_fall, NULL) //20, 30, envelope/p_fall, NULL) | |||||
| endphoneme | endphoneme | ||||
| // Redefine the length of vowels | // Redefine the length of vowels | ||||
| phoneme i | phoneme i | ||||
| CALL vi/i | CALL vi/i | ||||
| length 150 | length 150 | ||||
| FMT(vowel/i#) | |||||
| endphoneme | endphoneme | ||||
| phoneme E | phoneme E | ||||
| CALL vi/E | CALL vi/E | ||||
| length 150 | length 150 | ||||
| FMT(vowel/ee_1) | |||||
| endphoneme | endphoneme | ||||
| phoneme a: | phoneme a: | ||||
| phoneme O | phoneme O | ||||
| CALL vi/O | CALL vi/O | ||||
| length 150 | |||||
| FMT(vowel/0) | |||||
| length 80 | |||||
| FMT(vowel/oo_1) | |||||
| endphoneme | endphoneme | ||||
| phoneme Oi | phoneme Oi | ||||
| phoneme o | phoneme o | ||||
| CALL vi/o | CALL vi/o | ||||
| FMT(vowel/o_5) | FMT(vowel/o_5) | ||||
| endphoneme | |||||
| phoneme @:I | |||||
| CALL vi/@:I | |||||
| FMT(vdiph/y#y) | |||||
| endphoneme | endphoneme |
| phonemetable as bn | phonemetable as bn | ||||
| include ph_assamese | include ph_assamese | ||||
| phonemetable or bn | |||||
| include ph_oriya | |||||
| phonemetable mni bn | |||||
| include ph_manipuri | |||||
| #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(); | |||||
| } |
| 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> |
| 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" |
| sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | ||||
| log = fopen(fname_log,"w"); | log = fopen(fname_log,"w"); | ||||
| if(log != 0) | |||||
| { | |||||
| fprintf(log, "%s", utf8_bom); | |||||
| } | |||||
| sprintf(fname_log,"%s%s",path_dsource,"dict_phonemes"); | sprintf(fname_log,"%s%s",path_dsource,"dict_phonemes"); | ||||
| f_phused = fopen(fname_log,"w"); | f_phused = fopen(fname_log,"w"); | ||||
| else | else | ||||
| { | { | ||||
| error("Unexpected keyword '%s'",item_string); | error("Unexpected keyword '%s'",item_string); | ||||
| if((strcmp(item_string, "phoneme") == 0) || (strcmp(item_string, "endphoneme") == 0)) | |||||
| return(-1); | |||||
| } | } | ||||
| // output the word | // output the word |
| char *mnemptr; | char *mnemptr; | ||||
| unsigned char flag_codes[100]; | unsigned char flag_codes[100]; | ||||
| char encoded_ph[200]; | char encoded_ph[200]; | ||||
| unsigned char bad_phoneme[4]; | |||||
| char bad_phoneme_str[4]; | |||||
| int bad_phoneme; | |||||
| static char nullstring[] = {0}; | static char nullstring[] = {0}; | ||||
| text_not_phonemes = 0; | text_not_phonemes = 0; | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| EncodePhonemes(phonetic,encoded_ph,bad_phoneme); | |||||
| EncodePhonemes(phonetic,encoded_ph,&bad_phoneme); | |||||
| if(strchr(encoded_ph,phonSWITCH) != 0) | 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 | 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 | // check for errors in the phonemes codes | ||||
| if(bad_phoneme[0] != 0) | |||||
| if(bad_phoneme != 0) | |||||
| { | { | ||||
| // unrecognised phoneme, report error | // 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++; | error_count++; | ||||
| } | } | ||||
| } | } | ||||
| int finish=0; | int finish=0; | ||||
| char buf[80]; | char buf[80]; | ||||
| char output[150]; | char output[150]; | ||||
| unsigned char bad_phoneme[4]; | |||||
| int bad_phoneme; | |||||
| char bad_phoneme_str[4]; | |||||
| buf[0]=0; | buf[0]=0; | ||||
| rule_cond[0]=0; | rule_cond[0]=0; | ||||
| return(NULL); | 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++; | error_count++; | ||||
| } | } | ||||
| strcpy(output,buf); | strcpy(output,buf); |
| 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, | /* Translate a phoneme string from ascii mnemonics to internal phoneme numbers, | ||||
| from 'p' up to next blank . | from 'p' up to next blank . | ||||
| Returns advanced 'p' | Returns advanced 'p' | ||||
| unsigned int mnemonic_word; | unsigned int mnemonic_word; | ||||
| if(bad_phoneme != NULL) | if(bad_phoneme != NULL) | ||||
| bad_phoneme[0] = 0; | |||||
| *bad_phoneme = 0; | |||||
| // skip initial blanks | // skip initial blanks | ||||
| while(isspace(*p)) | while(isspace(*p)) | ||||
| // not recognised, report and ignore | // not recognised, report and ignore | ||||
| if(bad_phoneme != NULL) | if(bad_phoneme != NULL) | ||||
| { | { | ||||
| bad_phoneme[0] = *p; | |||||
| bad_phoneme[1] = 0; | |||||
| utf8_in(bad_phoneme, p); | |||||
| } | } | ||||
| *outptr++ = 0; | *outptr++ = 0; | ||||
| return(p+1); | return(p+1); |
| int debug_flag=0; | int debug_flag=0; | ||||
| char fname_log[sizeof(path_dsource)+12]; | char fname_log[sizeof(path_dsource)+12]; | ||||
| char err_fname[sizeof(path_home)+15]; | char err_fname[sizeof(path_home)+15]; | ||||
| static const char utf8_bom[] = {0xef,0xbb,0xbf,0}; | |||||
| switch(event.GetId()) | switch(event.GetId()) | ||||
| { | { | ||||
| case MENU_COMPILE_DICT: | case MENU_COMPILE_DICT: | ||||
| sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | ||||
| log = fopen(fname_log,"w"); | log = fopen(fname_log,"w"); | ||||
| if(log != NULL) | |||||
| { | |||||
| fprintf(log, "%s", utf8_bom); | |||||
| } | |||||
| LoadDictionary(translator, translator->dictionary_name, 0); | LoadDictionary(translator, translator->dictionary_name, 0); | ||||
| if((err = CompileDictionary(path_dsource,translator->dictionary_name,log,err_fname,debug_flag)) < 0) | if((err = CompileDictionary(path_dsource,translator->dictionary_name,log,err_fname,debug_flag)) < 0) |
| //<includes | //<includes | ||||
| #ifndef PLATFORM_WINDOWS | |||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #endif | |||||
| #include <assert.h> | #include <assert.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| static sem_t my_sem_stop_is_acknowledged; | static sem_t my_sem_stop_is_acknowledged; | ||||
| // my_thread: polls the audio duration and compares it to the duration of the first event. | // my_thread: polls the audio duration and compares it to the duration of the first event. | ||||
| static pthread_t my_thread; | static pthread_t my_thread; | ||||
| static bool thread_inited; | |||||
| static t_espeak_callback* my_callback = NULL; | static t_espeak_callback* my_callback = NULL; | ||||
| static int my_event_is_running=0; | static int my_event_is_running=0; | ||||
| assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | ||||
| pthread_attr_t a_attrib; | 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); | pthread_attr_destroy(&a_attrib); | ||||
| } | } | ||||
| //> | //> | ||||
| "MARK", | "MARK", | ||||
| "PLAY", | "PLAY", | ||||
| "END", | "END", | ||||
| "MSG_TERMINATED" | |||||
| "MSG_TERMINATED", | |||||
| "PHONEME", | |||||
| "SAMPLERATE", | |||||
| "??" | |||||
| }; | }; | ||||
| SHOW("event_display > event=0x%x\n",event); | SHOW("event_display > event=0x%x\n",event); | ||||
| { | { | ||||
| ENTER("event_terminate"); | ENTER("event_terminate"); | ||||
| if (my_thread) | |||||
| if (thread_inited) | |||||
| { | { | ||||
| pthread_cancel(my_thread); | pthread_cancel(my_thread); | ||||
| pthread_join(my_thread,NULL); | pthread_join(my_thread,NULL); | ||||
| sem_destroy(&my_sem_stop_is_required); | sem_destroy(&my_sem_stop_is_required); | ||||
| sem_destroy(&my_sem_stop_is_acknowledged); | sem_destroy(&my_sem_stop_is_acknowledged); | ||||
| init(); // purge event | init(); // purge event | ||||
| thread_inited = 0; | |||||
| } | } | ||||
| } | } | ||||
| //> | //> |
| //<includes | //<includes | ||||
| #ifndef PLATFORM_WINDOWS | |||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #endif | |||||
| #include <assert.h> | #include <assert.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> |
| else | else | ||||
| { | { | ||||
| // followed by hundreds or thousands etc | // 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); | found = Lookup(tr, string, ph_digits); | ||||
| } | } | ||||
| else if(((control & 2) == 0) || ((tr->langopts.numbers & NUM_SWAP_TENS) != 0)) | else if(((control & 2) == 0) || ((tr->langopts.numbers & NUM_SWAP_TENS) != 0)) | ||||
| { | { | ||||
| // followed by hundreds or thousands (or tens) | // 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); | found = Lookup(tr, string, ph_digits); | ||||
| } | } | ||||
| } | } |
| #define phSINGLE_INSTN 0x1000 // this phoneme has a single instruction program, with an implicit Return | #define phSINGLE_INSTN 0x1000 // this phoneme has a single instruction program, with an implicit Return | ||||
| #define phBRKAFTER 0x4000 // [*] add a post-pause | #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 phLONG 0x200000 | ||||
| #define phLENGTHENSTOP 0x400000 // make the pre-pause slightly longer | #define phLENGTHENSTOP 0x400000 // make the pre-pause slightly longer | ||||
| #define phRHOTIC 0x800000 // bit 23 | #define phRHOTIC 0x800000 // bit 23 | ||||
| unsigned char end_type; | unsigned char end_type; | ||||
| unsigned char std_length; // for vowels, in mS/2; for phSTRESS phonemes, this is the stress/tone 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 | unsigned char length_mod; // a length_mod group number, used to access length_mod_tab | ||||
| } PHONEME_TAB; | } PHONEME_TAB; | ||||
| #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 PH3(c1,c2,c3) (c3<<16)+(c2<<8)+c1 | ||||
| #define PhonemeCode2(c1,c2) PhonemeCode((c2<<8)+c1) | #define PhonemeCode2(c1,c2) PhonemeCode((c2<<8)+c1) | ||||
| int LookupPhonemeString(const char *string); | int LookupPhonemeString(const char *string); | ||||
| int PhonemeCode(unsigned int mnem); | 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); | void DecodePhonemes(const char *inptr, char *outptr); | ||||
| extern const char *WordToString(unsigned int word); | extern const char *WordToString(unsigned int word); |
| #include "speech.h" | #include "speech.h" | ||||
| #include <sys/stat.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> | #include <unistd.h> | ||||
| #endif | #endif | ||||
| "SENTENCE", | "SENTENCE", | ||||
| "MARK", | "MARK", | ||||
| "PLAY", | "PLAY", | ||||
| "END"}; | |||||
| "END", | |||||
| "MSG_TERMINATED", | |||||
| "PHONEME", | |||||
| "SAMPLERATE", | |||||
| "??" }; | |||||
| #endif | #endif | ||||
| #include "translate.h" | #include "translate.h" | ||||
| #include "wave.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; | const int version_phdata = 0x014709; | ||||
| int option_device_number = -1; | int option_device_number = -1; |
| SetupTranslator(tr,stress_lengths_ta, NULL); | SetupTranslator(tr,stress_lengths_ta, NULL); | ||||
| tr->letter_bits_offset = OFFSET_TAMIL; | tr->letter_bits_offset = OFFSET_TAMIL; | ||||
| tr->langopts.numbers = NUM_OMIT_1_THOUSAND ; | 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 | tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words | ||||
| } | } | ||||
| else | else | ||||
| break; | break; | ||||
| case L('u','r'): // Urdu | case L('u','r'): // Urdu | ||||
| case L('s','d'): // Sindhi | |||||
| { | { | ||||
| tr->letter_bits_offset = OFFSET_ARABIC; | tr->letter_bits_offset = OFFSET_ARABIC; | ||||
| tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words | tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words |
| prefix_flags = 1; | prefix_flags = 1; | ||||
| if(found == 0) | 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) | if(phonemes[0] == phonSWITCH) | ||||
| { | { | ||||
| int ix; | int ix; | ||||
| int sylimit; // max. number of syllables in a word to be combined with a preceding preposition | int sylimit; // max. number of syllables in a word to be combined with a preceding preposition | ||||
| const char *new_language; | const char *new_language; | ||||
| unsigned char bad_phoneme[4]; | |||||
| int bad_phoneme; | |||||
| int word_flags; | int word_flags; | ||||
| int word_copy_len; | int word_copy_len; | ||||
| char word_copy[N_WORD_BYTES+1]; | char word_copy[N_WORD_BYTES+1]; | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| EncodePhonemes(word,word_phonemes,bad_phoneme); | |||||
| EncodePhonemes(word,word_phonemes,&bad_phoneme); | |||||
| } | } | ||||
| flags = FLAG_FOUND; | flags = FLAG_FOUND; | ||||
| } | } |
| #define NUM2_ENGLISH_NUMERALS 0x8000 | #define NUM2_ENGLISH_NUMERALS 0x8000 | ||||
| #define NUM2_PERCENT_BEFORE 0x10000 | #define NUM2_PERCENT_BEFORE 0x10000 | ||||
| #define NUM2_OMIT_1_HUNDRED_ONLY 0x20000 | #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 1-4 use variant form of numbers before thousands,millions,etc. | ||||
| // bits 6-8 use different forms of thousand, million, etc (M MA MB) | // 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 | // bit9=(LANG=rw) say "thousand" and "million" before its number, not after | ||||
| // bit15=(LANG=ne) speak (non-replaced) English numerals in English | // bit15=(LANG=ne) speak (non-replaced) English numerals in English | ||||
| // bit16=(LANG=si) say "%" before the number | // bit16=(LANG=si) say "%" before the number | ||||
| // bit17=(LANG=ml) omit "one" before hundred only if there are no previous digits | // 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; | int numbers2; | ||||
| #define BREAK_THOUSANDS 0x49249248 | #define BREAK_THOUSANDS 0x49249248 |
| #include <sys/time.h> | #include <sys/time.h> | ||||
| #include <time.h> | #include <time.h> | ||||
| #ifndef PLATFORM_WINDOWS | |||||
| #include "portaudio.h" | |||||
| #ifdef PLATFORM_WINDOWS | |||||
| #include <windows.h> | |||||
| #else | |||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #endif | #endif | ||||
| #include "wave.h" | #include "wave.h" | ||||
| //<Definitions | //<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}; | enum {ONE_BILLION=1000000000}; | ||||
| #ifdef USE_PORTAUDIO | #ifdef USE_PORTAUDIO | ||||
| #endif | #endif | ||||
| #ifdef USE_PULSEAUDIO | #ifdef USE_PULSEAUDIO | ||||
| // create some wrappers for runtime detection | // create some wrappers for runtime detection | ||||
| #define BUFFER_LENGTH (MAX_SAMPLE_RATE*2*sizeof(uint16_t)) | #define BUFFER_LENGTH (MAX_SAMPLE_RATE*2*sizeof(uint16_t)) | ||||
| //#define THRESHOLD (BUFFER_LENGTH/5) | //#define THRESHOLD (BUFFER_LENGTH/5) | ||||
| static char myBuffer[BUFFER_LENGTH]; | 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 out_channels=1; | ||||
| static int my_stream_could_start=0; | static int my_stream_could_start=0; | ||||
| static int wave_samplerate; | static int wave_samplerate; | ||||
| // time measurement | // time measurement | ||||
| // The read and write position audio stream in the audio stream are measured in ms. | // 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. | // * When the stream is opened, myReadPosition and myWritePosition are cleared. | ||||
| // * myWritePosition is updated in wave_write. | // * myWritePosition is updated in wave_write. | ||||
| // * myReadPosition is updated in pa_callback (+ sample delay). | // * myReadPosition is updated in pa_callback (+ sample delay). | ||||
| PaError err; | PaError err; | ||||
| SHOW_TIME("start_stream"); | SHOW_TIME("start_stream"); | ||||
| my_stream_could_start=0; | |||||
| my_stream_could_start=0; | |||||
| mInCallbackFinishedState = false; | mInCallbackFinishedState = false; | ||||
| err = Pa_StartStream(pa_stream); | err = Pa_StartStream(pa_stream); | ||||
| SHOW("start_stream > Pa_StartStream=%d (%s)\n", err, Pa_GetErrorText(err)); | SHOW("start_stream > Pa_StartStream=%d (%s)\n", err, Pa_GetErrorText(err)); | ||||
| #if USE_PORTAUDIO == 19 | #if USE_PORTAUDIO == 19 | ||||
| if(err == paStreamIsNotStopped) | if(err == paStreamIsNotStopped) | ||||
| { | { | ||||
| memcpy(outputBuffer, myRead, aUsedMem); | memcpy(outputBuffer, myRead, aUsedMem); | ||||
| } | } | ||||
| char* p = (char*)outputBuffer + aUsedMem; | char* p = (char*)outputBuffer + aUsedMem; | ||||
| memset(p, 0, n - aUsedMem); | |||||
| memset(p, 0, n - aUsedMem); | |||||
| // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | ||||
| myRead = aWrite; | myRead = aWrite; | ||||
| } | } | ||||
| myRead = myBuffer + aRest; | myRead = myBuffer + aRest; | ||||
| } | } | ||||
| else | else | ||||
| { | |||||
| { | |||||
| SHOW_TIME("pa_callback > underflow"); | SHOW_TIME("pa_callback > underflow"); | ||||
| aResult=1; // paComplete; | aResult=1; // paComplete; | ||||
| size_t aUsedMem = aTopMem + aRest; | size_t aUsedMem = aTopMem + aRest; | ||||
| char* p = (char*)outputBuffer + aUsedMem; | char* p = (char*)outputBuffer + aUsedMem; | ||||
| memset(p, 0, n - aUsedMem); | |||||
| memset(p, 0, n - aUsedMem); | |||||
| // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | ||||
| myRead = aWrite; | myRead = aWrite; | ||||
| } | } | ||||
| //paClipOff | paDitherOff, | //paClipOff | paDitherOff, | ||||
| paNoFlag, | paNoFlag, | ||||
| pa_callback, (void *)userdata); | 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) | if(err == paInvalidChannelCount) | ||||
| { | { | ||||
| // paClipOff | paDitherOff, | // paClipOff | paDitherOff, | ||||
| pa_callback, | pa_callback, | ||||
| (void *)userdata); | (void *)userdata); | ||||
| if ((err!=paNoError) | |||||
| if ((err!=paNoError) | |||||
| && (err!=paInvalidChannelCount)) //err==paUnanticipatedHostError | && (err!=paInvalidChannelCount)) //err==paUnanticipatedHostError | ||||
| { | { | ||||
| fprintf(stderr, "wave_open_sound > Pa_OpenStream : err=%d (%s)\n",err,Pa_GetErrorText(err)); | fprintf(stderr, "wave_open_sound > Pa_OpenStream : err=%d (%s)\n",err,Pa_GetErrorText(err)); | ||||
| myOutputParameters.channelCount = 1; | myOutputParameters.channelCount = 1; | ||||
| myOutputParameters.sampleFormat = paInt16; | 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) | // (e.g. when moving a window in a graphical desktop) | ||||
| // deviceInfo = Pa_GetDeviceInfo(selectedDevice); | // deviceInfo = Pa_GetDeviceInfo(selectedDevice); | ||||
| if (deviceInfo) | if (deviceInfo) | ||||
| for( i=0; i<numDevices; i++ ) | for( i=0; i<numDevices; i++ ) | ||||
| { | { | ||||
| deviceInfo = Pa_GetDeviceInfo( i ); | deviceInfo = Pa_GetDeviceInfo( i ); | ||||
| if (deviceInfo == NULL) | if (deviceInfo == NULL) | ||||
| { | { | ||||
| break; | break; | ||||
| } | } | ||||
| const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi ); | const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi ); | ||||
| if (hostInfo && hostInfo->type == paALSA) | if (hostInfo && hostInfo->type == paALSA) | ||||
| { | |||||
| { | |||||
| // Check (once) the default output device | // Check (once) the default output device | ||||
| if (defaultAlsaIndex == numDevices) | if (defaultAlsaIndex == numDevices) | ||||
| { | { | ||||
| update_output_parameters(defaultAlsaIndex, deviceInfo); | update_output_parameters(defaultAlsaIndex, deviceInfo); | ||||
| if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | 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; | selectedIndex = defaultAlsaIndex; | ||||
| selectedDeviceInfo = deviceInfo; | selectedDeviceInfo = deviceInfo; | ||||
| break; | 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); | SHOW( "select_device > ALSA, i=%d (numDevices=%d)\n", i, numDevices); | ||||
| update_output_parameters(i, deviceInfo); | update_output_parameters(i, deviceInfo); | ||||
| if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | ||||
| { | { | ||||
| SHOW( "select_device > ALSA, name=%s (#%d)\n", deviceInfo->name, i); | SHOW( "select_device > ALSA, name=%s (#%d)\n", deviceInfo->name, i); | ||||
| if (!selectedDeviceInfo | if (!selectedDeviceInfo | ||||
| || (selectedDeviceInfo->maxOutputChannels < deviceInfo->maxOutputChannels)) | || (selectedDeviceInfo->maxOutputChannels < deviceInfo->maxOutputChannels)) | ||||
| { | { | ||||
| { | { | ||||
| update_output_parameters(selectedIndex, selectedDeviceInfo); | update_output_parameters(selectedIndex, selectedDeviceInfo); | ||||
| } | } | ||||
| else | |||||
| else | |||||
| { | { | ||||
| i = Pa_GetDefaultOutputDevice(); | i = Pa_GetDefaultOutputDevice(); | ||||
| deviceInfo = Pa_GetDeviceInfo( i ); | deviceInfo = Pa_GetDeviceInfo( i ); | ||||
| update_output_parameters(i, deviceInfo); | update_output_parameters(i, deviceInfo); | ||||
| } | } | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| //> | //> | ||||
| //<copyBuffer | //<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; | size_t bytes_written = 0; | ||||
| unsigned int i = 0; | unsigned int i = 0; | ||||
| uint16_t* a_dest = NULL; | uint16_t* a_dest = NULL; | ||||
| uint16_t* a_src = NULL; | uint16_t* a_src = NULL; | ||||
| if ((src != NULL) && dest != NULL) | if ((src != NULL) && dest != NULL) | ||||
| { | |||||
| { | |||||
| // copy for one channel (mono)? | // copy for one channel (mono)? | ||||
| if(out_channels==1) | if(out_channels==1) | ||||
| { | |||||
| { | |||||
| SHOW("copyBuffer > 1 channel > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes); | SHOW("copyBuffer > 1 channel > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes); | ||||
| memcpy(dest, src, theSizeInBytes); | memcpy(dest, src, theSizeInBytes); | ||||
| bytes_written = theSizeInBytes; | bytes_written = theSizeInBytes; | ||||
| i = 0; | i = 0; | ||||
| a_dest = (uint16_t* )dest; | a_dest = (uint16_t* )dest; | ||||
| a_src = (uint16_t* )src; | a_src = (uint16_t* )src; | ||||
| for(i=0; i<theSizeInBytes/2; i++) | for(i=0; i<theSizeInBytes/2; i++) | ||||
| { | { | ||||
| a_dest[2*i] = a_src[i]; | a_dest[2*i] = a_src[i]; | ||||
| bytes_written = 2*theSizeInBytes; | bytes_written = 2*theSizeInBytes; | ||||
| } // end if(out_channels==1) | } // end if(out_channels==1) | ||||
| } // end if ((src != NULL) && dest != NULL) | } // end if ((src != NULL) && dest != NULL) | ||||
| return bytes_written; | |||||
| return bytes_written; | |||||
| } | } | ||||
| //> | //> | ||||
| // space in ringbuffer for the sample needed: 1x mono channel but 2x for 1 stereo channel | // 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; | size_t bytes_to_write = (out_channels==1) ? theSize : theSize*2; | ||||
| my_stream_could_start = 0; | my_stream_could_start = 0; | ||||
| if(pa_stream == NULL) | if(pa_stream == NULL) | ||||
| { | { | ||||
| SHOW_TIME("wave_write > wave_open_sound\n"); | SHOW_TIME("wave_write > wave_open_sound\n"); | ||||
| my_stream_could_start = 1; | my_stream_could_start = 1; | ||||
| } | } | ||||
| assert(BUFFER_LENGTH >= bytes_to_write); | assert(BUFFER_LENGTH >= bytes_to_write); | ||||
| if (myWrite >= myBuffer + BUFFER_LENGTH) | if (myWrite >= myBuffer + BUFFER_LENGTH) | ||||
| { | { | ||||
| myWrite = myBuffer; | myWrite = myBuffer; | ||||
| } // end if (myWrite >= myBuffer + BUFFER_LENGTH) | } // end if (myWrite >= myBuffer + BUFFER_LENGTH) | ||||
| size_t aTotalFreeMem=0; | size_t aTotalFreeMem=0; | ||||
| char* aRead = myRead; | char* aRead = myRead; | ||||
| SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | ||||
| while (1) | while (1) | ||||
| { | { | ||||
| if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) | if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) | ||||
| SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| aRead = myRead; | aRead = myRead; | ||||
| // write pointer is before read pointer? | // write pointer is before read pointer? | ||||
| if (myWrite >= aRead) | if (myWrite >= aRead) | ||||
| { | { | ||||
| { | { | ||||
| aTotalFreeMem = aRead - myWrite; | aTotalFreeMem = aRead - myWrite; | ||||
| } // end if (myWrite >= aRead) | } // end if (myWrite >= aRead) | ||||
| if (aTotalFreeMem>1) | if (aTotalFreeMem>1) | ||||
| { | { | ||||
| // -1 because myWrite must be different of aRead | // -1 because myWrite must be different of aRead | ||||
| // otherwise buffer would be considered as empty | // otherwise buffer would be considered as empty | ||||
| aTotalFreeMem -= 1; | aTotalFreeMem -= 1; | ||||
| } // end if (aTotalFreeMem>1) | } // end if (aTotalFreeMem>1) | ||||
| if (aTotalFreeMem >= bytes_to_write) | if (aTotalFreeMem >= bytes_to_write) | ||||
| { | { | ||||
| break; | break; | ||||
| } // end if (aTotalFreeMem >= bytes_to_write) | } // end if (aTotalFreeMem >= bytes_to_write) | ||||
| //SHOW_TIME("wave_write > wait"); | //SHOW_TIME("wave_write > wait"); | ||||
| SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem); | SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem); | ||||
| SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | ||||
| usleep(10000); | usleep(10000); | ||||
| } // end while (1) | } // end while (1) | ||||
| aRead = myRead; | aRead = myRead; | ||||
| // write pointer is ahead the read pointer? | // write pointer is ahead the read pointer? | ||||
| if (myWrite >= aRead) | if (myWrite >= aRead) | ||||
| { | { | ||||
| SHOW_TIME("wave_write > myWrite <= aRead"); | SHOW_TIME("wave_write > myWrite <= aRead"); | ||||
| myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize); | myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize); | ||||
| } // end if (myWrite >= aRead) | } // end if (myWrite >= aRead) | ||||
| bytes_written = bytes_to_write; | bytes_written = bytes_to_write; | ||||
| myWritePosition += theSize/sizeof(uint16_t); // add number of samples | 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)) | if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | ||||
| { | { | ||||
| start_stream(); | start_stream(); | ||||
| } // end if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | } // end if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | ||||
| SHOW_TIME("wave_write > LEAVE"); | SHOW_TIME("wave_write > LEAVE"); | ||||
| return bytes_written; | return bytes_written; | ||||
| } | } | ||||
| SHOW_TIME("wave_close > LEAVE (NULL stream)"); | SHOW_TIME("wave_close > LEAVE (NULL stream)"); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| if( Pa_IsStreamStopped( pa_stream ) ) | if( Pa_IsStreamStopped( pa_stream ) ) | ||||
| { | { | ||||
| SHOW_TIME("wave_close > LEAVE (stopped)"); | SHOW_TIME("wave_close > LEAVE (stopped)"); | ||||
| SHOW_TIME("wave_close > LEAVE (NULL stream)"); | SHOW_TIME("wave_close > LEAVE (NULL stream)"); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| if( Pa_StreamActive( pa_stream ) == false && mInCallbackFinishedState == false ) | if( Pa_StreamActive( pa_stream ) == false && mInCallbackFinishedState == false ) | ||||
| { | { | ||||
| SHOW_TIME("wave_close > LEAVE (not active)"); | SHOW_TIME("wave_close > LEAVE (not active)"); | ||||
| SHOW_TIME("wave_close > LEAVE (stopStreamCount)"); | SHOW_TIME("wave_close > LEAVE (stopStreamCount)"); | ||||
| return 0; | 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: | // 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 | // So we use AbortStream(). If this is | ||||
| // the case the portaudio stream is still in the Running state | // the case the portaudio stream is still in the Running state | ||||
| // (see PortAudio state machine docs). | // (see PortAudio state machine docs). | ||||
| // | // | ||||
| // 2. The callback told PortAudio to stop the stream since it had | // 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() returned false. | ||||
| // wave_is_busy() (which calls Pa_GetStreamActive()) will not return | // wave_is_busy() (which calls Pa_GetStreamActive()) will not return | ||||
| // false until all buffers have finished playing, so we can call | // false until all buffers have finished playing, so we can call | ||||
| // call StopStream if the callback brought us here, and AbortStream | // call StopStream if the callback brought us here, and AbortStream | ||||
| // if the user brought us here. | // if the user brought us here. | ||||
| // | // | ||||
| #if (USE_PORTAUDIO == 19) | #if (USE_PORTAUDIO == 19) | ||||
| if (pa_stream) | if (pa_stream) | ||||
| { | { | ||||
| if (pa_stream) | if (pa_stream) | ||||
| { | { | ||||
| #if USE_PORTAUDIO == 18 | #if USE_PORTAUDIO == 18 | ||||
| active = Pa_StreamActive(pa_stream) | |||||
| active = Pa_StreamActive(pa_stream) | |||||
| && (mInCallbackFinishedState == false); | && (mInCallbackFinishedState == false); | ||||
| #else | #else | ||||
| active = Pa_IsStreamActive(pa_stream) | active = Pa_IsStreamActive(pa_stream) | ||||
| && (mInCallbackFinishedState == false); | && (mInCallbackFinishedState == false); | ||||
| #endif | #endif | ||||
| } | } | ||||
| SHOW("wave_is_busy: %d\n",active); | SHOW("wave_is_busy: %d\n",active); | ||||
| if (!time || !pa_stream) | 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; | return -1; | ||||
| } | } | ||||
| { | { | ||||
| SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); | SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); | ||||
| ts->tv_sec += 1; | ts->tv_sec += 1; | ||||
| t_ns -= ONE_BILLION; | |||||
| t_ns -= ONE_BILLION; | |||||
| } | } | ||||
| ts->tv_nsec = (long int)t_ns; | ts->tv_nsec = (long int)t_ns; | ||||
| } | } |