.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; | ||||
} | } |