Conflicts: dictsource/dict_phonemes phsource/compile_reportmaster
| @@ -158,7 +158,7 @@ _0M1o mil'Esim | |||
| vi bi // not a Roman number | |||
| // unstressed words | |||
| // articles | |||
| el $u | |||
| el $atend | |||
| @@ -224,9 +224,9 @@ vuestra $u | |||
| vuestra $atend | |||
| vuestras $u | |||
| vuestras $atend | |||
| // prepositions | |||
| a $u // at | |||
| a $atend | |||
| al $u | |||
| al $atend | |||
| de $u // of,from | |||
| @@ -243,22 +243,32 @@ por $u // for,through,along,via | |||
| por $atend | |||
| tras $u | |||
| tras $atend | |||
| ante $u | |||
| ante $u $only | |||
| ante $atend | |||
| para $u // for,in order,by | |||
| para $atend | |||
| entre $u | |||
| entre $atend $capital | |||
| entre $atend | |||
| sobre $u | |||
| sobre $atend | |||
| bajo $u | |||
| bajo $atend | |||
| desde $u // from,since | |||
| desde $atend | |||
| hasta $u | |||
| hasta $atend | |||
| hacia $u | |||
| hacia $atend | |||
| // conjunctions | |||
| e $u $only | |||
| e $atend | |||
| y %i // and | |||
| o $u // or | |||
| o $atend | |||
| u $u | |||
| u $atend | |||
| aunque $u // although | |||
| aunque $atend | |||
| @@ -266,6 +276,8 @@ pero $u | |||
| pero $atend | |||
| porque $u // because | |||
| porque $atend | |||
| que $u // what | |||
| que $atend | |||
| cuando $u | |||
| @@ -276,15 +288,16 @@ donde $u | |||
| donde $atend | |||
| como $u | |||
| como $atend | |||
| quien $u | |||
| quien $atend | |||
| quienes $u | |||
| quienes $atend | |||
| mientras $u | |||
| mientras $atend | |||
| si $u | |||
| si $atend | |||
| // negative | |||
| // auxillary verbs | |||
| // some common adjectives and adverbs | |||
| // Letters | |||
| @@ -315,21 +328,16 @@ x _|Ekis | |||
| z TEta | |||
| _a a | |||
| a a $atend | |||
| _e e | |||
| e e $atend | |||
| _o o | |||
| o o $atend | |||
| _y igr'iEQa | |||
| y igr'iEQa $atend | |||
| _y igri'eQa | |||
| y igri'eQa $atend | |||
| ch tSe | |||
| ll EJ^e | |||
| ?2 ll Ej:e | |||
| ll 'El^e | |||
| á 'a||aTEntw'aDa | |||
| é 'e||aTEntw'aDa | |||
| í 'i||aTEntw'aDa | |||
| _ó 'o||aTEntw'aDa | |||
| ó 'o||aTEntw'aDa $atend | |||
| ú 'u||aTEntw'aDa | |||
| ü ,uDj'ErEsis | |||
| @@ -375,7 +383,7 @@ microsoft m'aIkrosoft | |||
| software s'oftwer | |||
| hardware h'ardwer | |||
| skype sk'aIp | |||
| messenger m'esenJer | |||
| messenger m'esendZer | |||
| live l'aIB | |||
| facebook f'eIsbuk | |||
| twitter tw'iter | |||
| @@ -394,9 +402,14 @@ apple 'ap@l | |||
| iphone 'aIfon | |||
| (i pod) 'aIpod | |||
| ipod 'aIpod | |||
| jaws J'os | |||
| jaws dZ'os | |||
| window w'indow | |||
| eyes 'aIs | |||
| free fr'i | |||
| google g'ug@l | |||
| chrome kr'owm | |||
| office 'ofis | |||
| service s'erBis | |||
| power p'awer | |||
| thunderbird t'anderbird | |||
| jazz dZ'as | |||
| @@ -42,7 +42,7 @@ | |||
| c (Y T // ce, ci | |||
| ch tS | |||
| A) ck k | |||
| .group d | |||
| d d | |||
| @@ -94,12 +94,12 @@ | |||
| .group h | |||
| h // silent | |||
| _) hi (A J^ | |||
| _) hi (A j | |||
| .group i | |||
| i i | |||
| i (A J^ | |||
| i (A j | |||
| C) i (A j | |||
| gu) i (A j | |||
| ?!3 l) i (A %i | |||
| @@ -117,22 +117,19 @@ | |||
| .group l | |||
| l l | |||
| _) ll (A J^ // allowe _ll | |||
| ll J^ | |||
| ?2 A) ll (A j: | |||
| ll (_ l | |||
| _) ll (A l^ // allowe _ll | |||
| ?2 _) ll (A J^ | |||
| ?2 ll j: | |||
| ?2 n_) ll (A dZ | |||
| ll l^ | |||
| .group m | |||
| m m | |||
| _) mn (em n | |||
| m (K n | |||
| m (L04 m | |||
| m (_L04 m | |||
| m (L05 N | |||
| m (_L05 N | |||
| m (j N | |||
| _) mb (A mb | |||
| .group n | |||
| @@ -140,9 +137,10 @@ | |||
| n (L04 m | |||
| n (_L04 m | |||
| n (L05 N | |||
| n (_L05 N | |||
| n (_L05 N | |||
| n (j N | |||
| ny (A n^ // catalan words | |||
| _) nh (A n | |||
| .group o | |||
| o o | |||
| @@ -153,13 +151,14 @@ | |||
| oi oI | |||
| oy (K oI | |||
| oy (_ 'oI | |||
| ou ow | |||
| .group p | |||
| p p | |||
| _) p (L01A p // allow pl pr at start of word | |||
| p (t p: | |||
| _) ph f | |||
| _) ph (A f | |||
| ph (@ f | |||
| ph (K f | |||
| _) ps (i s | |||
| _) ps (eudo s | |||
| @@ -169,7 +168,8 @@ | |||
| .group q | |||
| q k | |||
| qu k | |||
| qu (Y k // que, qui | |||
| _) qw (A kw // qwerty | |||
| .group r | |||
| @@ -189,26 +189,28 @@ | |||
| .group s | |||
| s s | |||
| &) s (_S1 s | |||
| _) s (C@ %Es | |||
| ss (K s | |||
| _) s (K@ s | |||
| ss s | |||
| _) sh (A S | |||
| _) sh (L01A S | |||
| sh (K S | |||
| ?!1 sc (Y s // sce sci for non castilian accent | |||
| .group t | |||
| t t | |||
| _) t (L01A t // all tr at start of word | |||
| _) th (A t | |||
| _) th (@ t | |||
| th (K t | |||
| _) tx (A tS | |||
| tx tS | |||
| .group u | |||
| u u | |||
| u (u u | |||
| u (A w | |||
| !?3 l) u (A %u | |||
| !?3 r) u (A %u | |||
| g) u (e | |||
| g) u (i | |||
| g) u (é | |||
| @@ -235,25 +237,24 @@ g) u (í | |||
| .group x | |||
| x ks | |||
| ?1 A) x (A Qs | |||
| x (_ =Qs | |||
| _) x ($unpr s // ? | |||
| ?!1 xc (Y ks // xce xci for non castilian accent | |||
| .group y | |||
| y i | |||
| _) y ($unpr J | |||
| _m) y J | |||
| n) y J | |||
| _l) y J | |||
| y (A J^ | |||
| ?2 A) y (A j: | |||
| u) y (K j | |||
| _m) y (A j | |||
| _l) y (A j | |||
| y (A j: | |||
| _) y (A J^ | |||
| u) y (K j: | |||
| n_) y (A dZ | |||
| y (_ i | |||
| .group z | |||
| z T | |||
| ?2 z (L02 z | |||
| zz ts | |||
| .group | |||
| @@ -0,0 +1,126 @@ | |||
| $textmode | |||
| _0 ᅧᆼ | |||
| _1 ᅵᆯ | |||
| _2 ᅵ | |||
| _3 삼 | |||
| _4 사 | |||
| _5 ᅩ | |||
| _6 ᅲᆨ | |||
| _7 칠 | |||
| _8 팔 | |||
| _9 구 | |||
| _1X 십 | |||
| _2X ᅵ십 | |||
| _3X 삼십 | |||
| _4X 사십 | |||
| _5X ᅩ십 | |||
| _6X ᅲᆨ십 | |||
| _7X 칠십 | |||
| _8X 팔십 | |||
| _9X 구십 | |||
| _0C 백 | |||
| _0M1 천 | |||
| _1M1 천 | |||
| // 사ᅵ시ᅩᆺ | |||
| 고랫재 고랟째 | |||
| 귓밥 귇빱 | |||
| 나룻배 나룯빼 | |||
| 나뭇가지 나묻까지 | |||
| 냇가 낻ː까 | |||
| 댓가지 댇까지 | |||
| 뒷갈망 뒫ː깔망 | |||
| 맷돌 맫똘 | |||
| 머릿기름 머릳끼림 | |||
| 모깃불 모ː긷뿔 | |||
| 못자리 몯짜리 | |||
| 바닷가 바닫까 | |||
| 뱃길 밷낄 | |||
| 볏가리 볃까리 | |||
| 부싯돌 부싣똘 | |||
| 선짓국 선짇꾹 | |||
| 쇳조각 쉗쪼각 | |||
| ᅡ랫집 ᅡ랟찝 | |||
| ᅮ렁ᅵᆺ속 ᅮ렁ᅵᆮ쏙 | |||
| ᅵᆺ자국 ᅵᆮ짜국 | |||
| 잿더미 잳떠미 | |||
| 조갯살 조갣쌀 | |||
| 찻집 찯찝 | |||
| 쳇바퀴 첻빠퀴 | |||
| 킷값 킫깝 | |||
| 핏대 핃때 | |||
| 햇볕 핻뼏 | |||
| 혓바늘 혇빠늘 | |||
| // (2) 뒷말ᅴ 첫소리 'ᄂ, ᄆ' ᅡᇁᅦ서 'ᄂ' 소리가 덧나는 것 | |||
| 멧나물 멘나물 | |||
| ᅡ랫니 ᅡ랜니 | |||
| 텃마당 턴마당 | |||
| ᅡ랫마ᅳᆯ ᅡ랜마ᅳᆯ | |||
| 뒷머리 뒨ː머리 | |||
| ᅵᆺ몸 ᅵᆫ몸 | |||
| 깻묵 깬묵 | |||
| 냇물 낸ː물 | |||
| 빗물 빈물 | |||
| // (3) 뒷말ᅴ 첫소리 모ᅳᆷ ᅡᇁᅦ서 'ᄂᄂ' 소리가 덧나는 것 | |||
| 도리깻ᅧᆯ 도리깬녈 | |||
| 뒷ᅲᆾ 뒨ː뉻 | |||
| 두렛ᅵᆯ 두렌닐 | |||
| 뒷ᅵᆯ 뒨ː닐 | |||
| 뒷ᅵᆸ맛 뒨ː님맏 | |||
| 베갯ᅵᆺ 베갠닏 | |||
| ᅭᆺᅵᆺ ᅭᆫ닏 | |||
| 깻ᅵᇁ 깬닙 | |||
| 나뭇ᅵᇁ 나문닙 | |||
| 댓ᅵᇁ 댄닙 | |||
| // 2. 순 ᅮ리말과 한자ᅥ로 된 합성ᅥ로서 ᅡᇁ말ᅵ 모ᅳᆷᅳ로 끝난 경ᅮ | |||
| // (1) 뒷말ᅴ 첫소리가 된소리로 나는 것 | |||
| 귓병 귇뼝 | |||
| 머릿방 머릳빵 | |||
| 뱃병 밷뼝 | |||
| 봇둑 볻뚝 | |||
| 사잣밥 사ː잗빱 | |||
| 샛강 샏ː깡 | |||
| ᅡ랫방 ᅡ랟빵 | |||
| 자릿세 자릳쎄 | |||
| 전깃세 전긷쎄 | |||
| 전셋집 전섿찝 | |||
| 찻잔 찯짠 | |||
| 찻종 찯쫑 | |||
| 촛국 촏꾹 | |||
| 콧병 콛뼝 | |||
| 탯줄 탣쭐 | |||
| 텃세 턷쎄 | |||
| 핏기 핃끼 | |||
| 햇수 핻쑤 | |||
| 횟가루 휃까루 | |||
| 횟배 휃빼 | |||
| // (2) 뒷말ᅴ 첫소리 'ᄂ, ᄆ' ᅡᇁᅦ서 'ᄂ' 소리가 덧나는 것 | |||
| 곗날 곈ː날/겐ː날 | |||
| 제삿날 제ː삳날 | |||
| 훗날 훈ː날 | |||
| 툇마루 퇸ː마루/퉨ː마루 | |||
| ᅣᆼ칫물 ᅣᆼ친물 | |||
| // (3) 뒷말ᅴ 첫소리 모ᅳᆷ ᅡᇁᅦ서 'ᄂᄂ' 소리가 덧나는 것 | |||
| 가ᅬᆺᅵᆯ 가ᅬᆫ닐/가ᅰᆫ닐 | |||
| 사삿ᅵᆯ 사산닐 | |||
| ᅨ삿ᅵᆯ ᅨː산닐 | |||
| 훗ᅵᆯ 훈ː닐 | |||
| // 3. 두 ᅳᆷ절로 된 다ᅳᆷ 한자ᅥ | |||
| 곳간 곧깐 | |||
| 셋방 섿빵 | |||
| 숫자 숟짜 | |||
| 찻간 찯깐 | |||
| 툇간 퇻깐 | |||
| 횟수 횓쑤 | |||
| 찻잔 찯짠 | |||
| ᄉᄇ 시바 | |||
| @@ -0,0 +1,286 @@ | |||
| // This file is UTF8 encoded | |||
| .replace | |||
| // Note: These specific range of "normalized" unicode characters of Korean are | |||
| // hardly used as individually, and look broken and badly aligned in most | |||
| // fonts. | |||
| // We're using hard tabs so that we can recognize where they are placed at | |||
| // the first place. | |||
| // Stop finals and their consorts: ㄱㄲㅋ ㄷㅌ ㅂㅍ ㅅㅆㅈㅊ | |||
| .L01 ᆨ ᆩ ᆿ ᆮ ᇀ ᆸ ᇁ ᆺ ᆻ ᆽ ᆾ ᆪ ᆹ ᆬ ᆰ ᆱ ᆲ ᆳ ᆴ ᆵ | |||
| // i and j-vowels: ㅣ ㅑㅒ ㅕㅖ ㅛㅠ | |||
| .L02 ᅵ ᅣ ᅤ ᅧ ᅨ ᅭ ᅲ | |||
| // h-finals: ㅎ ㄶㅀ | |||
| .L03 ᇂ ᆭ ᆶ | |||
| // Initials | |||
| // Order: ㄱㄲㅋ ㄷㄸㅌ ㅂㅃㅍ ㅅㅆㅈㅉㅊ ㄴㅁ ㄹ ㅎ | |||
| .group ᄀ // ㄱ | |||
| ᄀ g | |||
| _) ᄀ k | |||
| L01) ᄀ k- | |||
| L03) ᄀ kh | |||
| .group ᄁ // ㄲ | |||
| ᄁ k- | |||
| .group ᄏ // ㅋ | |||
| ᄏ kh | |||
| .group ᄃ // ㄷ | |||
| ᄃ d | |||
| _) ᄃ t | |||
| L01) ᄃ t- | |||
| L03) ᄃ th | |||
| .group ᄄ // ㄸ | |||
| ᄄ t- | |||
| .group ᄐ // ㅌ | |||
| ᄐ th | |||
| .group ᄇ // ㅂ | |||
| ᄇ b | |||
| _) ᄇ p | |||
| L01) ᄇ p- | |||
| L03) ᄇ ph | |||
| .group ᄈ // ㅃ | |||
| ᄈ p- | |||
| .group ᄑ // ㅍ | |||
| ᄑ ph | |||
| .group ᄉ // ㅅ | |||
| ᄉ s | |||
| L01) ᄉ s- | |||
| .group ᄊ // ㅆ | |||
| ᄊ s- // TODO: phoneme | |||
| .group ᄌ // ㅈ | |||
| ᄌ dZ; | |||
| _) ᄌ tS; | |||
| L01) ᄌ tS;- | |||
| L03) ᄌ tSh; | |||
| .group ᄍ // ㅉ | |||
| ᄍ tS;- // TODO: phoneme | |||
| .group ᄎ // ㅊ | |||
| ᄎ tSh; // TODO: phoneme | |||
| .group ᄂ // ㄴ | |||
| ᄂ n | |||
| .group ᄆ // ㅁ | |||
| ᄆ m | |||
| .group ᄅ // ㄹ | |||
| ᄅ * // TODO: alveolar flap [ɾ] | |||
| ᄅ (_ l | |||
| .group ᄒ // ㅎ | |||
| ᄒ h // TODO: [ɦ] | |||
| _) ᄒ h | |||
| // Medials | |||
| .group ᅡ // ㅏ | |||
| ᅡ a | |||
| .group ᅢ // ㅐ | |||
| ᅢ E | |||
| .group ᅣ // ㅑ | |||
| ᅣ ja | |||
| .group ᅤ // ㅒ | |||
| ᅤ jE | |||
| .group ᅥ // ㅓ | |||
| ᅥ @ | |||
| .group ᅦ // ㅔ | |||
| ᅦ e | |||
| .group ᅧ // ㅕ | |||
| ᅧ j@ | |||
| .group ᅨ // ㅖ | |||
| ᅨ je | |||
| .group ᅩ // ㅗ | |||
| ᅩ o | |||
| .group ᅪ // ㅘ | |||
| ᅪ wa | |||
| .group ᅫ // ㅙ | |||
| ᅫ wE | |||
| .group ᅬ // ㅚ | |||
| ᅬ we // was [Y] until 1970s | |||
| .group ᅭ // ㅛ | |||
| ᅭ jo | |||
| .group ᅮ // ㅜ | |||
| ᅮ u | |||
| .group ᅯ // ㅝ | |||
| ᅯ w@ | |||
| .group ᅰ // ㅞ | |||
| ᅰ we | |||
| .group ᅱ // ㅟ | |||
| ᅱ wi // was [y] until 1970s | |||
| .group ᅲ // ㅠ | |||
| ᅲ ju | |||
| .group ᅳ // ㅡ | |||
| ᅳ u- | |||
| .group ᅴ // ㅢ | |||
| ᅴ u-j // TODO: [ɰi] | |||
| C) ᅴ i | |||
| .group ᅵ // ㅣ | |||
| ᅵ i | |||
| // Finals | |||
| // Order: ㄱㄳㄲㅋ ㄷㅌ ㅂㅍ ㅅㅆㅈㅊ ㄴㅁ ㅇㅎ ㄹ | |||
| .group ᆨ // ㄱ | |||
| ᆨ k // TODO: final stops | |||
| ᆨᄒ kh | |||
| .group ᆪ // ㄳ | |||
| ᆪ k | |||
| ᆪ (A ks | |||
| ᆪᄒ kh | |||
| .group ᆩ // ㄲ | |||
| ᆩ k | |||
| ᆩ (A k- | |||
| ᆩᄒ kh // 꺾히다 | |||
| .group ᆿ // ㅋ | |||
| ᆿ k | |||
| ᆿ (A kh | |||
| .group ᆮ // ㄷ | |||
| ᆮ t | |||
| ᆮᄂ nn | |||
| ᆮᄆ mm | |||
| ᆮᄒ th | |||
| ᆮ (L02 dZ; | |||
| .group ᇀ // ㅌ | |||
| ᇀ t | |||
| ᇀᄂ nn | |||
| ᇀᄆ mm | |||
| ᇀ (A th | |||
| ᇀ (L02 tSh; | |||
| .group ᆸ // ㅂ | |||
| ᆸ p | |||
| ᆸᄒ ph | |||
| .group ᆹ // ㅄ | |||
| ᆹ p | |||
| ᆹ (A ps- | |||
| ᆹᄒ ps- | |||
| .group ᇁ // ㅍ | |||
| ᇁ p | |||
| ᇁ (A ph | |||
| .group ᆺ // ㅅ | |||
| ᆺ t | |||
| ᆺᄂ nn | |||
| ᆺᄆ mm | |||
| ᆺ (A s | |||
| ᆺᄒ s- | |||
| .group ᆻ // ㅆ | |||
| ᆻ t | |||
| ᆻᄂ nn | |||
| ᆻᄆ mm | |||
| ᆻ (A s- | |||
| .group ᆽ // ㅈ | |||
| ᆽ t | |||
| ᆽᄂ nn | |||
| ᆽᄆ mm | |||
| ᆽ (A tS; | |||
| .group ᆾ // ㅊ | |||
| ᆾ t | |||
| ᆾᄂ nn | |||
| ᆾᄆ mm | |||
| ᆾ (A tSh; | |||
| .group ᆫ // ㄴ | |||
| ᆫ n | |||
| .group ᆬ // ㄵ | |||
| ᆬ n | |||
| ᆬ (A ndZ; | |||
| .group ᆭ // ㄶ | |||
| ᆭ n | |||
| ᆭ (A n // no nh | |||
| .group ᆷ // ㅁ | |||
| ᆷ m | |||
| .group ᆼ // ㅇ | |||
| ᆼ ng | |||
| .group ᇂ // ㅎ | |||
| ᇂ t | |||
| ᇂ (A | |||
| .group ᆯ // ㄹ | |||
| ᆯ l | |||
| ᆯᄅ l | |||
| ᆯ (A * | |||
| .group ᆰ // ㄺ | |||
| ᆰ k | |||
| ᆰ (A lg | |||
| .group ᆱ // ㄻ | |||
| ᆱ m | |||
| ᆱ (A lm | |||
| .group ᆲ // ㄼ | |||
| ᆲ p | |||
| ᆲ (A lb | |||
| .group ᆳ // ㄽ | |||
| ᆳ l | |||
| ᆳ (A ls | |||
| .group ᆴ // ㄾ | |||
| ᆴ l | |||
| ᆴ (A lth | |||
| .group ᆵ // ㄿ | |||
| ᆵ p | |||
| ᆵ (A lph | |||
| .group ᆶ // ㅀ | |||
| ᆶ l | |||
| ᆶ (A * | |||
| .group | |||
| . | |||
| ː | |||
| @@ -651,6 +651,7 @@ albatrozes $alt | |||
| alcateia $alt | |||
| alferes $alt | |||
| algozes $alt | |||
| alicerce $alt | |||
| amanheça $alt2 | |||
| amanheço $alt2 | |||
| amarelo $alt | |||
| @@ -659,6 +660,9 @@ amores $alt2 | |||
| anoiteça $alt2 | |||
| anoiteço $alt2 | |||
| apreço $alt2 | |||
| aperto $alt2 $noun | |||
| apoio $alt $verb | |||
| aprendeste $alt2 | |||
| assembleia $alt | |||
| atrozes $alt | |||
| austera $alt | |||
| @@ -685,6 +689,7 @@ cerco $alt $verb | |||
| chamego $alt2 | |||
| chefe $alt | |||
| chinelo $alt | |||
| choro $alt2 $noun | |||
| coco $alt2 | |||
| cofre $alt | |||
| colmeia $alt | |||
| @@ -697,6 +702,7 @@ coreia $alt | |||
| corneta $alt2 | |||
| cornos $alt | |||
| corpos $alt | |||
| correste $alt2 | |||
| corto $alt | |||
| corvos $alt | |||
| coto $alt2 | |||
| @@ -706,32 +712,40 @@ couberdes $alt | |||
| couberes $alt | |||
| crede $alt2 | |||
| cresce $alt | |||
| crescem $alt | |||
| der $alt | |||
| desce $alt | |||
| descem $alt | |||
| descova $alt2 | |||
| desfecho $alt2 | |||
| desprezo $alt $verb | |||
| deva $alt2 | |||
| devo $alt2 | |||
| dez $alt | |||
| diarreia $alt | |||
| discordo $alt | |||
| dobro $alt2 $noun | |||
| doce $alt2 | |||
| droga $alt | |||
| endereço $alt2 | |||
| enumerem $alt | |||
| enxerto $alt2 $noun | |||
| epopeia $alt | |||
| eritreia $alt | |||
| erro $alt2 $noun | |||
| escopeta $alt2 | |||
| escroto $alt2 | |||
| esforço $alt $verb | |||
| esforços $alt | |||
| esperma $alt | |||
| espeto $alt2 $noun | |||
| espiroqueta $alt2 | |||
| estrofe $alt | |||
| enterro $alt2 $noun | |||
| estiverdes $alt | |||
| estiveres $alt | |||
| estrofe $alt | |||
| etiqueta $alt2 | |||
| exagero $alt $verb | |||
| expeça $alt2 | |||
| expeço $alt2 | |||
| farofa $alt | |||
| @@ -740,11 +754,13 @@ fere $alt | |||
| ferem $alt | |||
| fezes $alt | |||
| fizer $alt | |||
| Fizeram $alt | |||
| fizerem $alt | |||
| fizerdes $alt | |||
| fizeres $alt | |||
| fogos $alt | |||
| fores $alt2 | |||
| forro $alt $verb | |||
| fosse $alt2 | |||
| fossem $alt2 | |||
| foste $alt2 | |||
| @@ -755,6 +771,7 @@ gelo $alt $verb | |||
| germe $alt | |||
| gesso $alt2 | |||
| gonorreia $alt | |||
| gozo $alt $verb | |||
| grego $alt2 | |||
| grelha $alt | |||
| groselha $alt | |||
| @@ -783,7 +800,7 @@ mexo m'eSU | |||
| miolo $alt2 | |||
| modo $alt | |||
| modos $alt | |||
| molho $alt $verb | |||
| molho $alt2 $noun | |||
| monera $alt | |||
| morcego $alt2 | |||
| morda $alt2 | |||
| @@ -796,6 +813,7 @@ muito mw'iNtU // -s is included as a suffix | |||
| muita mw'iNt& | |||
| mulheres $alt | |||
| mureta $alt2 | |||
| mutreta $alt2 | |||
| naquele $alt2 | |||
| negro $alt2 | |||
| novos $alt | |||
| @@ -804,6 +822,7 @@ onu $1 | |||
| opereta $alt2 | |||
| osso $alt2 | |||
| ovos $alt | |||
| padeceste $alt2 | |||
| paexa paeSa | |||
| pangeia $alt | |||
| palheta $alt2 | |||
| @@ -828,6 +847,7 @@ porra $alt2 | |||
| portos $alt | |||
| pose $alt2 | |||
| povos $alt | |||
| poxa p'oS& | |||
| preta $alt2 | |||
| preto $alt2 | |||
| profere $alt | |||
| @@ -838,14 +858,19 @@ recordo $alt | |||
| recorto $alt | |||
| rede $alt2 | |||
| reforços $alt | |||
| refresco $alt $verb | |||
| remorso $alt | |||
| resolve $alt | |||
| resolvem $alt | |||
| rixa xiS& | |||
| rixa x'iS& | |||
| rogas $alt | |||
| saleta $alt2 | |||
| seborreia $alt | |||
| seco $alt2 $noun | |||
| selo $alt $verb | |||
| selvagem seUv'aZeIN | |||
| sincera $alt | |||
| sincero $alt | |||
| sobe $alt | |||
| sobem $alt | |||
| soco $alt2 | |||
| @@ -855,6 +880,7 @@ sofreste $alt2 | |||
| sopre $alt | |||
| soprem $alt | |||
| sorvete $alt2 | |||
| sossego $alt2 $noun | |||
| souber $alt | |||
| souberdes $alt | |||
| souberes $alt | |||
| @@ -864,7 +890,6 @@ sugerem $alt | |||
| suor swOr | |||
| tapete $alt2 | |||
| teta $alt2 | |||
| tijolo $alt2 | |||
| tiver $alt | |||
| tiveres $alt | |||
| toga $alt | |||
| @@ -882,6 +907,7 @@ verme $alt | |||
| vierem $alt | |||
| violeta $alt2 | |||
| vozes $alt | |||
| zelo $alt $verb | |||
| zero $alt | |||
| zorra $alt2 | |||
| @@ -151,8 +151,6 @@ | |||
| ?1 e (_iN =i/ // drop final [i] is next word starts with another i | |||
| ?1 e (e i //eg: candeeiro | |||
| ?2 ee i | |||
| ?2 pr) ee (n ee | |||
| ?2 el (K EU | |||
| e (lh+ e | |||
| @@ -342,6 +340,7 @@ | |||
| _estr) ei (L01_ EI | |||
| _inv) e (jL02_ E | |||
| _dec) e (pL02_ E | |||
| _g) e (rL02_ E | |||
| _op) e (rL02_ E | |||
| _qu) e (rL02_ E | |||
| _alt) e (rL02_ E | |||
| @@ -547,11 +546,9 @@ _reapar) e (çL01_ e | |||
| oi ($w_alt OI | |||
| oi (a_ OI // ?? | |||
| oi (cA_ OI | |||
| oi (de_ OI | |||
| oi (s oI | |||
| o (iCK o | |||
| oo u | |||
| oon u~N | |||
| c) oo oo | |||
| ?1 C) oo (_ ow // eg: voo, enjoo, etc... | |||
| oy OI | |||
| @@ -660,7 +657,7 @@ _reapar) e (çL01_ e | |||
| c) o (rrL03_ o // escorra, incorra, corra, recorra | |||
| _m) o (rrL03_ o | |||
| _ap) oi (L03_ OI | |||
| p) o (stos_ O // dispostos etc. | |||
| p) ostos (_ Ost=Us# // dispostos etc. | |||
| .group ô | |||
| ô ''o | |||
| @@ -1888,7 +1888,8 @@ _அகாலி_) த (ள dV | |||
| _) தௌலதாப (ாத daUlVd.a:b | |||
| _சா) த்த (ியக்கூற dd | |||
| _சா) த்த (ியங்கள dd | |||
| _சா) த்தியத்த ddijVddV# | |||
| _சா) த்த (ியத்த dd | |||
| _சா) த்த (ியந் dd | |||
| _சா) த்த (ியப்பட dd | |||
| _சா) த்த (ியம dd | |||
| _) த (்ராட்சை d | |||
| @@ -80,4 +80,4 @@ _1M3 milli'Ard | |||
| _0M4 billi'on | |||
| _1M4 billi'on | |||
| _dpt bWt,Wn | |||
| _dpt bWt,en | |||
| @@ -21,7 +21,8 @@ | |||
| д d | |||
| .group е | |||
| е e // may be [je] [j@] | |||
| _) е je2 // may be [je] [jV] | |||
| е e | |||
| .group ё | |||
| ё jo | |||
| @@ -119,10 +120,10 @@ | |||
| э e | |||
| .group ю | |||
| ю ju // or jy | |||
| ю ju2 // or jy | |||
| .group я | |||
| я jA // or ja | |||
| я jA2 // or ja | |||
| .group | |||
| $ dolAR | |||
| @@ -0,0 +1,27 @@ | |||
| // Korean | |||
| 0 k- NULL 0 k_> | |||
| 0 t- NULL 0 t_> | |||
| 0 * NULL 0 4 | |||
| 0 p- NULL 0 p_> | |||
| 0 s- NULL 0 s_> | |||
| 0 tS; NULL 0 ts\ | |||
| 0 tS;- NULL 0 ts\_> | |||
| 0 tSh; NULL 0 ts\_h | |||
| 0 k_h NULL 0 ts\_h | |||
| 0 tSh; NULL 0 ts\_h | |||
| 0 kh NULL 0 k_h | |||
| 0 th NULL 0 t_h | |||
| 0 ph NULL 0 p_h | |||
| 0 dZ; NULL 0 dz\ | |||
| 0 ng NULL 0 N | |||
| 0 @ NULL 0 V | |||
| 0 j@ NULL 0 jV | |||
| 0 Y NULL 0 2 | |||
| 0 w@ NULL 0 wV | |||
| 0 u- NULL 0 M | |||
| 0 u-j NULL 0 M\i | |||
| @@ -0,0 +1,110 @@ | |||
| // vowels | |||
| phoneme a // a(ㅏ) | |||
| ipa ɐ | |||
| vowel starttype #a endtype #a | |||
| length 200 | |||
| FMT(vowel/aa_8) | |||
| endphoneme | |||
| phoneme E // ae(ㅐ) | |||
| ipa ɛ | |||
| vowel starttype #e endtype #e | |||
| length 200 | |||
| FMT(vowel/ee_5) | |||
| endphoneme | |||
| phoneme @ // eo(ㅓ) | |||
| ipa ʌ | |||
| vowel starttype #@ endtype #@ | |||
| length 200 | |||
| FMT(vowel/oo_2) | |||
| endphoneme | |||
| phoneme o // o(ㅗ) | |||
| ipa o | |||
| vowel starttype #o endtype #o | |||
| length 200 | |||
| FMT(vowel/o_8) | |||
| endphoneme | |||
| phoneme u // u(ㅜ) | |||
| ipa u | |||
| vowel starttype #u endtype #u | |||
| length 200 | |||
| FMT(vowel/u_bck) | |||
| endphoneme | |||
| phoneme u- // eu(ㅡ) | |||
| ipa ɯ | |||
| vowel starttype #u endtype #u | |||
| length 200 | |||
| FMT(vowel/i#_7) | |||
| endphoneme | |||
| // diphthongs | |||
| // consonants | |||
| phoneme k- // /ㄲ/ | |||
| vls vel stop | |||
| lengthmod 3 | |||
| Vowelin f1=1 f2=1700 0 200 f3=-300 80 f4 | |||
| Vowelout f1=1 f2=1700 0 200 f3=-300 80 f4 rms=30 | |||
| WAV(ustop/k_unasp_, 75) | |||
| length 100 | |||
| endphoneme | |||
| phoneme kh // /ㅋ/ | |||
| import_phoneme consonants/kh | |||
| endphoneme | |||
| phoneme t- // /ㄸ/ | |||
| vls alv stop | |||
| lengthmod 3 | |||
| Vowelin f1=0 f2=1700 -300 300 f3=-100 80 rms=40 | |||
| Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
| WAV(ustop/t_unasp, 40) // TODO | |||
| endphoneme | |||
| // TODO: ㅌ | |||
| phoneme p- // /ㅃ/ | |||
| import_phoneme consonants/p- | |||
| endphoneme | |||
| phoneme ph // /ㅍ/ | |||
| import_phoneme consonants/ph | |||
| endphoneme | |||
| phoneme tS; // voiceless /ㅈ/ | |||
| vls pla afr sibilant palatal | |||
| ipa tɕ | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=2700 400 600 f3=300 80 | |||
| WAV(ustop/ts_pzd3) | |||
| endphoneme | |||
| phoneme dZ; // voiced /ㅈ/ | |||
| vcd pla afr sibilant palatal | |||
| ipa dʑ | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=2700 400 600 f3=300 80 | |||
| FMT(dzh/dzh) addWav(x/dz_pzd) | |||
| endphoneme | |||
| phoneme * // r(ㄹ) at initial, medial | |||
| vcd alv flp rhotic | |||
| ipa ɾ | |||
| lengthmod 3 | |||
| Vowelout f1=3 f2=1600 -300 300 f3=-300 80 rms=35 len=15 | |||
| Vowelin f1=2 f2=1600 -300 300 f3=-100 80 len=20 | |||
| IF prevPh(#i) OR prevPh(#e) THEN | |||
| FMT(r3/@tap2) | |||
| ENDIF | |||
| FMT(r3/@tap) | |||
| endphoneme | |||
| @@ -1,12 +1,15 @@ | |||
| // use 'flag1' for front vowels | |||
| phoneme i | |||
| vowel starttype #i endtype #i | |||
| vowel flag1 starttype #i endtype #i | |||
| length 180 | |||
| FMT(vowel/i) | |||
| endphoneme | |||
| phoneme y | |||
| vowel starttype #u endtype #u | |||
| vowel flag1 starttype #u endtype #u | |||
| length 180 | |||
| FMT(vowel/y) | |||
| endphoneme | |||
| @@ -17,16 +20,34 @@ phoneme u | |||
| FMT(vowel/u) | |||
| endphoneme | |||
| phoneme u2 // letter 'ю' | |||
| vowel starttype #u endtype #u | |||
| length 180 | |||
| IF prevVowel(isFlag1) OR nextVowel(isFlag1) THEN | |||
| ChangePhoneme(y) | |||
| ELSE | |||
| ChangePhoneme(u) | |||
| ENDIF | |||
| endphoneme | |||
| phoneme e | |||
| vowel starttype #@ endtype #@ | |||
| vowel flag1 starttype #@ endtype #@ | |||
| length 100 | |||
| FMT(vowel/ii#) | |||
| endphoneme | |||
| phoneme W | |||
| phoneme e2 // 'e' at start of word | |||
| vowel starttype #@ endtype #@ | |||
| length 100 | |||
| IF nextVowel(isFlag1) THEN | |||
| ChangePhoneme(e) | |||
| ENDIF | |||
| ChangePhoneme(V) | |||
| endphoneme | |||
| phoneme W | |||
| vowel flag1 starttype #@ endtype #@ | |||
| length 100 | |||
| FMT(vowel/oe) | |||
| endphoneme | |||
| @@ -44,7 +65,7 @@ endphoneme | |||
| phoneme a | |||
| vowel starttype #a endtype #a | |||
| vowel flag1 starttype #a endtype #a | |||
| length 180 | |||
| FMT(vowel/&_2) | |||
| endphoneme | |||
| @@ -55,22 +76,30 @@ phoneme A | |||
| IF thisPh(isFirstVowel) THEN | |||
| ChangePhoneme(0) | |||
| ENDIF | |||
| IF thisPh(isSeqFlag1) THEN | |||
| IF prevVowel(0) THEN | |||
| ChangePhoneme(0) | |||
| ENDIF | |||
| FMT(vowel/aa) | |||
| endphoneme | |||
| phoneme A2 // letter 'я' | |||
| vowel starttype #a endtype #a | |||
| length 180 | |||
| IF prevVowel(isFlag1) OR nextVowel(isFlag1) THEN | |||
| ChangePhoneme(a) | |||
| ENDIF | |||
| ChangePhoneme(A) | |||
| endphoneme | |||
| phoneme 0 | |||
| vowel starttype #o endtype #o | |||
| flag1 | |||
| length 180 | |||
| FMT(vowel/0_3) | |||
| endphoneme | |||
| phoneme I | |||
| vowel starttype #i endtype #i | |||
| vowel flag1 starttype #i endtype #i | |||
| length 100 | |||
| FMT(vowel/ii) | |||
| endphoneme | |||
| @@ -1900,3 +1900,7 @@ include ph_irish | |||
| phonemetable tt base | |||
| include ph_tatar | |||
| phonemetable ko base | |||
| include ph_korean | |||
| @@ -90,17 +90,18 @@ static keywtab_t k_conditions[] = { | |||
| {"AND", 0, k_AND}, | |||
| {"OR", 0, k_OR}, | |||
| {"THEN", 0, k_THEN}, | |||
| {"prevPh", tWHICH_PHONEME, 0x000}, | |||
| {"prevPhW", tWHICH_PHONEME, 0x500}, | |||
| {"thisPh", tWHICH_PHONEME, 0x100}, | |||
| {"nextPh", tWHICH_PHONEME, 0x200}, | |||
| {"next2Ph", tWHICH_PHONEME, 0x300}, | |||
| {"nextPhW", tWHICH_PHONEME, 0x400}, | |||
| {"nextVowel",tWHICH_PHONEME, 0x600}, | |||
| // {"next2PhW", tWHICH_PHONEME, 0x700}, | |||
| {"prevPh", tWHICH_PHONEME, 0}, | |||
| {"prevPhW", tWHICH_PHONEME, 5}, | |||
| {"thisPh", tWHICH_PHONEME, 1}, | |||
| {"nextPh", tWHICH_PHONEME, 2}, | |||
| {"next2Ph", tWHICH_PHONEME, 3}, | |||
| {"nextPhW", tWHICH_PHONEME, 4}, | |||
| {"next2PhW", tWHICH_PHONEME, 6}, | |||
| {"nextVowel",tWHICH_PHONEME, 7}, | |||
| {"prevVowel",tWHICH_PHONEME, 8}, | |||
| // {"next2PhW", tWHICH_PHONEME, 0x800}, | |||
| // {"numVowels", tTEST, 0x000}, | |||
| // {"afterStress", tTEST, 0x000}, | |||
| {"PreVoicing", tTEST, 0xf01}, | |||
| {"KlattSynth", tTEST, 0xf02}, | |||
| @@ -605,7 +606,7 @@ return; | |||
| case 13: | |||
| case 14: | |||
| case 15: | |||
| address = ((instn & 0xf) << 16) + *pc++; | |||
| address = ((instn & 0xf) << 16) + *pc++; | |||
| fprintf(f_out, " %d %.5x",(instn >> 4) & 0xff,address*4); | |||
| break; | |||
| } | |||
| @@ -770,7 +771,7 @@ static void CompileReport(void) | |||
| } | |||
| n = ix; | |||
| qsort((void *)list,n,sizeof(REF_HASH_TAB *),(int (*)(const void *,const void *))ref_sorter); | |||
| data_path = ""; | |||
| prev_mnemonic = 0; | |||
| prev_table = 0; | |||
| @@ -1197,7 +1198,7 @@ static int LookupPhoneme(const char *string, int control) | |||
| // don't use phoneme number 0, reserved for string terminator | |||
| start = 1; | |||
| if(control==2) | |||
| start = 8; // don't look for control and stress phonemes (allows these characters to be | |||
| // used for other purposes) | |||
| @@ -1267,12 +1268,12 @@ static int NextItem(int type) | |||
| int sign; | |||
| char *p; | |||
| keywtab_t *pk; | |||
| item_type = -1; | |||
| f_in_displ = ftell(f_in); | |||
| f_in_linenum = linenum; | |||
| while(!feof(f_in)) | |||
| { | |||
| c = get_char(); | |||
| @@ -1592,7 +1593,7 @@ int LoadSpect(const char *path, int control) | |||
| wxString filename = path_phsource + path_sep + wxString(path,wxConvLocal); | |||
| wxFileInputStream stream(filename); | |||
| if(stream.Ok() == FALSE) | |||
| { | |||
| error("Failed to open: '%s'",path); | |||
| @@ -1616,7 +1617,7 @@ int LoadSpect(const char *path, int control) | |||
| seq_out.sqflags=0; | |||
| seq_out.length_total=0; | |||
| total = 0; | |||
| total = 0; | |||
| for(frame=0; frame < spectseq->numframes; frame++) | |||
| { | |||
| @@ -1650,7 +1651,7 @@ for(ix=0; ix<8; ix++) | |||
| seq_out.n_frames++; | |||
| if(frame > 0) | |||
| total += spectseq->frames[frame-1]->length; | |||
| } | |||
| } | |||
| } | |||
| seq_out.length_total = int(total); | |||
| @@ -1665,7 +1666,7 @@ for(ix=0; ix<8; ix++) | |||
| for(frame=0; frame < spectseq->numframes; frame++) | |||
| { | |||
| fr = spectseq->frames[frame]; | |||
| if(fr->keyframe) | |||
| { | |||
| if(klatt_flag) | |||
| @@ -1756,7 +1757,7 @@ for(ix=0; ix<8; ix++) | |||
| n_frames++; | |||
| } | |||
| } | |||
| if(klatt_flag) | |||
| { | |||
| seqk_out.n_frames = seq_out.n_frames; | |||
| @@ -1799,7 +1800,7 @@ static int LoadWavefile(FILE *f, const char *fname) | |||
| fseek(f,24,SEEK_SET); | |||
| sr1 = Read4Bytes(f); | |||
| sr2 = Read4Bytes(f); | |||
| fseek(f,40,SEEK_SET); | |||
| fseek(f,40,SEEK_SET); | |||
| if((sr1 != samplerate_native) || (sr2 != sr1*2)) | |||
| { | |||
| @@ -1828,7 +1829,7 @@ static int LoadWavefile(FILE *f, const char *fname) | |||
| return(0); | |||
| } | |||
| } | |||
| f = fopen(fname_temp,"rb"); | |||
| if(f == NULL) | |||
| { | |||
| @@ -2078,7 +2079,7 @@ static int LoadDataFile(const char *path, int control) | |||
| if(addr == 0) | |||
| { | |||
| sprintf(buf,"%s%s",path_source,path); | |||
| if((f = fopen(buf,"rb")) == NULL) | |||
| { | |||
| sprintf(buf,"%s%s.wav",path_source,path); | |||
| @@ -2091,7 +2092,7 @@ static int LoadDataFile(const char *path, int control) | |||
| id = Read4Bytes(f); | |||
| rewind(f); | |||
| if(id == 0x43455053) | |||
| { | |||
| addr = LoadSpect(path, control); | |||
| @@ -2121,7 +2122,7 @@ static int LoadDataFile(const char *path, int control) | |||
| addr = -1; | |||
| } | |||
| fclose(f); | |||
| if(addr > 0) | |||
| { | |||
| fprintf(f_phcontents,"%c 0x%.5x %s\n",type_code,addr & 0x7fffff,path); | |||
| @@ -2188,7 +2189,7 @@ static int CompileToneSpec(void) | |||
| *prog_out++ = i_AMPENV + ((amp_env >> 16) & 0xf); | |||
| *prog_out++ = amp_env; | |||
| } | |||
| return(0); | |||
| } // end of CompileToneSpec | |||
| @@ -2217,7 +2218,7 @@ int CompileSound(int keyword, int isvowel) | |||
| { | |||
| value = -128; | |||
| error("Parameter < -128",NULL); | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| @@ -2256,6 +2257,7 @@ int CompileIf(int elif) | |||
| int key; | |||
| int finish = 0; | |||
| int word = 0; | |||
| int word2 = 0; | |||
| int data; | |||
| int bitmap; | |||
| int brackets; | |||
| @@ -2274,10 +2276,18 @@ int CompileIf(int elif) | |||
| if((key = NextItem(tCONDITION)) < 0) | |||
| error("Expected a condition, not '%s'",item_string); | |||
| if(item_type == tWHICH_PHONEME) | |||
| { | |||
| // prevPh(), thisPh(), nextPh(), next2Ph() | |||
| // prevPh(), thisPh(), nextPh(), next2Ph() etc | |||
| if(key >= 6) | |||
| { | |||
| // put the 'which' code in the next instruction | |||
| word2 = key; | |||
| key = 6; | |||
| } | |||
| key = key << 8; | |||
| data = NextItemBrackets(tPROPERTIES,0); | |||
| if(data >= 0) | |||
| { | |||
| @@ -2320,6 +2330,9 @@ int CompileIf(int elif) | |||
| prog_last_if = prog_out; | |||
| *prog_out++ = word | i_CONDITION; | |||
| if(word2 != 0) | |||
| *prog_out++ = word2; | |||
| // expect AND, OR, THEN | |||
| switch(NextItem(tCONDITION)) | |||
| { | |||
| @@ -2416,7 +2429,7 @@ int CompileElse(void) | |||
| { | |||
| ref = prog_out; | |||
| *prog_out++ = 0; | |||
| if((p = if_stack[if_level].p_else) != NULL) | |||
| { | |||
| *ref = ref - p; // backwards offset to the previous else | |||
| @@ -2461,14 +2474,14 @@ int CompileEndif(void) | |||
| do | |||
| { | |||
| chain = *p; // a chain of previous else links | |||
| offset = prog_out - p; | |||
| if(offset > MAX_JUMP) | |||
| { | |||
| error("IF block is too long",NULL); | |||
| } | |||
| *p = i_JUMP + offset; | |||
| p -= chain; | |||
| } while (chain > 0); | |||
| } | |||
| @@ -2489,7 +2502,7 @@ static int CompileSwitch(int type) | |||
| // check the instructions in the Switch | |||
| return(0); | |||
| } | |||
| // count_VowelStart = 0; | |||
| // count_VowelEnding = 0; | |||
| @@ -2664,7 +2677,7 @@ int CompilePhoneme(int compile_phoneme) | |||
| phoneme_flags = 0; | |||
| place_articulation = 0; | |||
| NextItem(tSTRING); | |||
| NextItem(tSTRING); | |||
| if(compile_phoneme) | |||
| { | |||
| phcode = LookupPhoneme(item_string,1); // declare phoneme if not already there | |||
| @@ -2825,7 +2838,7 @@ int CompilePhoneme(int compile_phoneme) | |||
| phcode = LookupPhoneme(item_string,1); | |||
| phoneme_out->start_type = phcode; | |||
| break; | |||
| case kENDTYPE: | |||
| phcode = NextItem(tPHONEMEMNEM); | |||
| if(phcode == -1) | |||
| @@ -2882,7 +2895,7 @@ int CompilePhoneme(int compile_phoneme) | |||
| case kSWITCH_PREVVOWEL: | |||
| endphoneme = CompileSwitch(1); | |||
| break; | |||
| case kSWITCH_NEXTVOWEL: | |||
| endphoneme = CompileSwitch(2); | |||
| break; | |||
| @@ -2908,7 +2921,7 @@ int CompilePhoneme(int compile_phoneme) | |||
| DecThenCount(); | |||
| endphoneme = CompileSound(keyword,0); | |||
| break; | |||
| case kVOWELIN: | |||
| DecThenCount(); | |||
| endphoneme = CompileVowelTransition(1); | |||
| @@ -2968,7 +2981,7 @@ int CompilePhoneme(int compile_phoneme) | |||
| } | |||
| phoneme_out->phflags = place_articulation << 16; | |||
| phoneme_out->phflags |= phoneme_flags; | |||
| if(phoneme_out->phflags & phVOICED) | |||
| { | |||
| if(phoneme_out->type == phSTOP) | |||
| @@ -2977,15 +2990,15 @@ int CompilePhoneme(int compile_phoneme) | |||
| if(phoneme_out->type == phFRICATIVE) | |||
| phoneme_out->type = phVFRICATIVE; | |||
| } | |||
| if(phoneme_out->std_length == 0) | |||
| { | |||
| if(phoneme_out->type == phVOWEL) | |||
| phoneme_out->std_length = 180/2; // default length for vowel | |||
| } | |||
| phoneme_out->phflags |= phLOCAL; //declared in this phoneme table | |||
| if(phoneme_out->type == phDELETED) | |||
| { | |||
| phoneme_out->mnemonic = 0x01; // will not be recognised | |||
| @@ -3334,7 +3347,7 @@ static void CompilePhonemeFiles() | |||
| stack[stack_ix].linenum = linenum; | |||
| strcpy(stack[stack_ix].fname,current_fname); | |||
| stack[stack_ix++].file = f_in; | |||
| f_in = f; | |||
| strncpy0(current_fname,item_string,sizeof(current_fname)); | |||
| linenum = 1; | |||
| @@ -3382,7 +3395,7 @@ static void CompilePhonemeData2(const char *source) | |||
| wxString report_dict; | |||
| #ifdef MAKE_ENVELOPES | |||
| make_envs(); | |||
| make_envs(); | |||
| #endif | |||
| n_envelopes = 0; | |||
| @@ -3525,7 +3538,7 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references | |||
| { | |||
| strncpy0(fname,(report+report_dict).mb_str(wxConvLocal),sizeof(fname)); | |||
| fprintf(stderr,"%s\n",fname); | |||
| } | |||
| } // end of CompilePhonemeData | |||
| @@ -3605,7 +3618,7 @@ void CompileMbrola() | |||
| wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal)); | |||
| return; | |||
| } | |||
| data[count].name = 0; // list terminator | |||
| Write4Bytes(f_out, mbrola_ctrl); | |||
| @@ -18,7 +18,7 @@ | |||
| ***************************************************************************/ | |||
| #include "StdAfx.h" | |||
| #include <stdio.h> | |||
| #include <ctype.h> | |||
| #include <stdlib.h> | |||
| @@ -218,7 +218,7 @@ static void InitGroups(Translator *tr) | |||
| { | |||
| if(tr->groups2_start[c] == 255) | |||
| tr->groups2_start[c] = tr->n_groups2; | |||
| tr->groups2_count[c]++; | |||
| tr->groups2[tr->n_groups2] = p; | |||
| tr->groups2_name[tr->n_groups2++] = (c + (c2 << 8)); | |||
| @@ -489,7 +489,7 @@ sprintf(outptr,"* "); | |||
| continue; /* indicates unrecognised phoneme */ | |||
| if((ph = phoneme_tab[phcode]) == NULL) | |||
| continue; | |||
| if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->program == 0)) | |||
| { | |||
| if(ph->std_length > 1) | |||
| @@ -499,7 +499,7 @@ sprintf(outptr,"* "); | |||
| { | |||
| mnem = ph->mnemonic; | |||
| while((c = (mnem & 0xff)) != 0) | |||
| while((c = (mnem & 0xff)) != 0) | |||
| { | |||
| *outptr++ = c; | |||
| mnem = mnem >> 8; | |||
| @@ -565,7 +565,7 @@ char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int | |||
| } | |||
| else | |||
| { | |||
| InterpretPhoneme(NULL, 0, plist, &phdata); | |||
| InterpretPhoneme(NULL, 0, plist, &phdata, NULL); | |||
| } | |||
| len = strlen(phdata.ipa_string); | |||
| @@ -638,7 +638,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa) | |||
| char *buf; | |||
| char phon_buf[30]; | |||
| PHONEME_LIST *plist; | |||
| static const char *stress_chars = "==,,''"; | |||
| if(phon_out != NULL) | |||
| @@ -694,7 +694,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa) | |||
| buf = WritePhMnemonic(buf, phoneme_tab[plist->tone_ph], NULL, use_ipa); | |||
| } | |||
| } | |||
| len = buf - phon_buf; | |||
| max_len = (n_phon_out - phon_out_ix - 5); // allow for " ..." and zero byte terminator | |||
| if(len > max_len) | |||
| @@ -939,7 +939,7 @@ static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char * | |||
| max_stress = 4; | |||
| primary_posn = j; | |||
| } | |||
| /* reduce any preceding primary stress markers */ | |||
| for(ix=1; ix<j; ix++) | |||
| { | |||
| @@ -1166,7 +1166,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */ | |||
| // any stress position marked in the xx_list dictionary ? | |||
| // any stress position marked in the xx_list dictionary ? | |||
| stressed_syllable = dflags & 0x7; | |||
| if(dflags & 0x8) | |||
| { | |||
| @@ -1217,7 +1217,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| ix++; | |||
| } | |||
| } | |||
| switch(tr->langopts.stress_rule) | |||
| { | |||
| case 8: | |||
| @@ -1275,12 +1275,12 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| mnem = phoneme_tab[final_ph]->mnemonic; | |||
| mnem2 = phoneme_tab[final_ph2]->mnemonic; | |||
| if((mnem == 's') && (mnem2 == 'n')) | |||
| if((mnem == 's') && (phoneme_tab[final_ph2]->type == phNASAL)) | |||
| { | |||
| // -ns stress remains on penultimate syllable | |||
| } | |||
| else | |||
| if(((mnem != 'n') && (mnem != 's')) || (phoneme_tab[final_ph2]->type != phVOWEL)) | |||
| if(((phoneme_tab[final_ph]->type != phNASAL) && (mnem != 's')) || (phoneme_tab[final_ph2]->type != phVOWEL)) | |||
| { | |||
| stressed_syllable = vowel_count - 1; | |||
| } | |||
| @@ -1710,7 +1710,7 @@ void AppendPhonemes(Translator *tr, char *string, int size, const char *ph) | |||
| /* Add new phoneme string "ph" to "string" | |||
| Keeps count of the number of vowel phonemes in the word, and whether these | |||
| can be stressed syllables. These values can be used in translation rules | |||
| */ | |||
| */ | |||
| const char *p; | |||
| unsigned char c; | |||
| int unstress_mark; | |||
| @@ -1748,7 +1748,7 @@ void AppendPhonemes(Translator *tr, char *string, int size, const char *ph) | |||
| } | |||
| } | |||
| } | |||
| if(string != NULL) | |||
| strcat(string,ph); | |||
| } /* end of AppendPhonemes */ | |||
| @@ -1843,7 +1843,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| match.points = 1; | |||
| match.end_type = 0; | |||
| match.del_fwd = NULL; | |||
| pre_ptr = *word; | |||
| post_ptr = *word + group_length; | |||
| @@ -1909,7 +1909,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| case RULE_CONDITION: | |||
| /* conditional rule, next byte gives condition number */ | |||
| condition_num = *rule++; | |||
| if(condition_num >= 32) | |||
| { | |||
| // allow the rule only if the condition number is NOT set | |||
| @@ -2017,7 +2017,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| else | |||
| failed = 1; | |||
| break; | |||
| case RULE_NONALPHA: | |||
| if(!iswalpha(letter_w)) | |||
| { | |||
| @@ -2388,13 +2388,13 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| memcpy(&best,&match,sizeof(match)); | |||
| total_consumed = consumed; | |||
| } | |||
| if((option_phonemes == 2) && (match.points > 0) && ((word_flags & FLAG_NO_TRACE) == 0)) | |||
| { | |||
| // show each rule that matches, and it's points score | |||
| int pts; | |||
| char decoded_phonemes[80]; | |||
| pts = match.points; | |||
| if(group_length > 1) | |||
| pts += 35; // to account for an extra letter matching | |||
| @@ -2490,10 +2490,10 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| p = p_start; | |||
| tr->word_vowel_count = 0; | |||
| tr->word_stressed_count = 0; | |||
| if(end_phonemes != NULL) | |||
| end_phonemes[0] = 0; | |||
| while(((c = *p) != ' ') && (c != 0)) | |||
| { | |||
| wc_bytes = utf8_in(&wc,p); | |||
| @@ -2511,7 +2511,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| string[1+wc_bytes] = 0; | |||
| Lookup(tr, string,buf); | |||
| if(++digit_count >= 2) | |||
| { | |||
| { | |||
| strcat(buf,str_pause); | |||
| digit_count=0; | |||
| } | |||
| @@ -2538,7 +2538,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| /* there are some 2 byte chains for this initial letter */ | |||
| c2 = p[1]; | |||
| c12 = c + (c2 << 8); /* 2 characters */ | |||
| g1 = tr->groups2_start[c]; | |||
| for(g=g1; g < (g1+n); g++) | |||
| { | |||
| @@ -2563,7 +2563,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| } | |||
| } | |||
| } | |||
| if(!found) | |||
| { | |||
| /* alphabetic, single letter chain */ | |||
| @@ -2619,14 +2619,14 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| p[-1] = ix; | |||
| while((p[0] = p[n]) != ' ') p++; | |||
| while(n-- > 0) *p++ = ' '; // replacement character must be no longer than original | |||
| if(tr->langopts.param[LOPT_DIERESES] && (lookupwchar(diereses_list,letter) > 0)) | |||
| { | |||
| // vowel with dieresis, replace and continue from this point | |||
| p = p2; | |||
| continue; | |||
| } | |||
| phonemes[0] = 0; // delete any phonemes which have been produced so far | |||
| p = p_start; | |||
| tr->word_vowel_count = 0; | |||
| @@ -2685,7 +2685,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| if(match1.phonemes == NULL) | |||
| match1.phonemes = ""; | |||
| if(match1.points > 0) | |||
| { | |||
| if(word_flags & FLAG_UNPRON_TEST) | |||
| @@ -2888,7 +2888,7 @@ int TransposeAlphabet(Translator *tr, char *text) | |||
| if(bits >= 8) | |||
| { | |||
| bits -= 8; | |||
| *p2++ = (acc >> bits); | |||
| *p2++ = (acc >> bits); | |||
| } | |||
| } | |||
| if(bits > 0) | |||
| @@ -3206,7 +3206,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor | |||
| if(flags != NULL) | |||
| flags[0] |= FLAG_FOUND; // this flag indicates word was found in dictionary | |||
| if(option_phonemes == 2) | |||
| { | |||
| char ph_decoded[N_WORD_PHONEMES]; | |||
| @@ -3344,9 +3344,9 @@ int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *f | |||
| if(found == 0) | |||
| { | |||
| ph_out[0] = 0; | |||
| // try modifications to find a recognised word | |||
| if((end_flags & FLAG_SUFX_E_ADDED) && (word[length-1] == 'e')) | |||
| { | |||
| // try removing an 'e' which has been added by RemoveEnding | |||
| @@ -3439,7 +3439,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| This routine is language specific. In English it deals with reversing y->i and e-dropping | |||
| that were done when the suffix was added to the original word. | |||
| */ | |||
| int i; | |||
| char *word_end; | |||
| int len_ending; | |||
| @@ -3447,7 +3447,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| const char *p; | |||
| int len; | |||
| static char ending[12]; | |||
| // these lists are language specific, but are only relevent if the 'e' suffix flag is used | |||
| static const char *add_e_exceptions[] = { | |||
| "ion", NULL }; | |||
| @@ -3476,7 +3476,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| len_ending++; | |||
| } | |||
| } | |||
| // remove bytes from the end of the word and replace them by spaces | |||
| for(i=0; i<len_ending; i++) | |||
| { | |||
| @@ -3487,17 +3487,17 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| word_end--; /* now pointing at last character of stem */ | |||
| end_flags = (end_type & 0xfff0) | FLAG_SUFX; | |||
| /* add an 'e' to the stem if appropriate, | |||
| if stem ends in vowel+consonant | |||
| or stem ends in 'c' (add 'e' to soften it) */ | |||
| if(end_type & SUFX_I) | |||
| { | |||
| if(word_end[0] == 'i') | |||
| word_end[0] = 'y'; | |||
| } | |||
| if(end_type & SUFX_E) | |||
| { | |||
| if(tr->translator_name == L('n','l')) | |||
| @@ -3517,7 +3517,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| if(IsLetter(tr, word_end[-1],LETTERGP_VOWEL2) && IsLetter(tr, word_end[0],1)) | |||
| { | |||
| // vowel(incl.'y') + hard.consonant | |||
| for(i=0; (p = add_e_exceptions[i]) != NULL; i++) | |||
| { | |||
| len = strlen(p); | |||
| @@ -63,24 +63,24 @@ static int SubstitutePhonemes(Translator *tr, PHONEME_LIST *plist_out) | |||
| { | |||
| if(ix < (n_ph_list2 -1)) | |||
| next = phoneme_tab[ph_list2[ix+1].phcode]; | |||
| word_end = 0; | |||
| if((plist2+1)->sourceix || ((next != 0) && (next->type == phPAUSE))) | |||
| word_end = 1; // this phoneme is the end of a word | |||
| // check whether a Voice has specified that we should replace this phoneme | |||
| for(k=0; k<n_replace_phonemes; k++) | |||
| { | |||
| if(plist2->phcode == replace_phonemes[k].old_ph) | |||
| { | |||
| replace_flags = replace_phonemes[k].type; | |||
| if((replace_flags & 1) && (word_end == 0)) | |||
| continue; // this replacement only occurs at the end of a word | |||
| if((replace_flags & 2) && ((plist2->stresslevel & 0x7) > 3)) | |||
| continue; // this replacement doesn't occur in stressed syllables | |||
| // substitute the replacement phoneme | |||
| plist2->phcode = replace_phonemes[k].new_ph; | |||
| if((plist2->stresslevel > 1) && (phoneme_tab[plist2->phcode]->phflags & phUNSTRESSED)) | |||
| @@ -88,7 +88,7 @@ static int SubstitutePhonemes(Translator *tr, PHONEME_LIST *plist_out) | |||
| break; | |||
| } | |||
| } | |||
| if(plist2->phcode == 0) | |||
| { | |||
| continue; // phoneme has been replaced by NULL, so don't copy it | |||
| @@ -131,7 +131,9 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| PHONEME_LIST ph_list3[N_PHONEME_LIST]; | |||
| PHONEME_LIST2 *plist2; | |||
| WORD_PH_DATA worddata; | |||
| memset(&worddata, 0, sizeof(worddata)); | |||
| plist2 = ph_list2; | |||
| phlist = phoneme_list; | |||
| end_sourceix = plist2[n_ph_list2-1].sourceix; | |||
| @@ -339,7 +341,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| if(ph == NULL) continue; | |||
| InterpretPhoneme(tr, 0x100, plist3, &phdata); | |||
| InterpretPhoneme(tr, 0x100, plist3, &phdata, &worddata); | |||
| if((alternative = phdata.pd_param[pd_INSERTPHONEME]) > 0) | |||
| { | |||
| @@ -363,7 +365,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| // re-interpret the changed phoneme | |||
| // But it doesn't obey a second ChangePhoneme() | |||
| InterpretPhoneme(tr, 0x100, plist3, &phdata); | |||
| InterpretPhoneme(tr, 0x100, plist3, &phdata, &worddata); | |||
| } | |||
| if((alternative = phdata.pd_param[pd_CHANGEPHONEME]) > 0) | |||
| @@ -388,7 +390,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| // re-interpret the changed phoneme | |||
| // But it doesn't obey a second ChangePhoneme() | |||
| InterpretPhoneme(tr, 0x100, plist3, &phdata); | |||
| InterpretPhoneme(tr, 0x100, plist3, &phdata, &worddata); | |||
| } | |||
| if(ph->type == phVOWEL) | |||
| @@ -478,7 +480,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| else | |||
| insert_ph = phonPAUSE_VSHORT; | |||
| } | |||
| if((ph->type == phVOWEL) && ((x = tr->langopts.vowel_pause & 0x03) != 0)) | |||
| { | |||
| // adjacent vowels over a word boundary | |||
| @@ -487,7 +489,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| else | |||
| insert_ph = phonPAUSE_VSHORT; | |||
| } | |||
| if(((plist3+1)->stresslevel >= 4) && (tr->langopts.vowel_pause & 0x100)) | |||
| { | |||
| // pause before a words which starts with a stressed vowel | |||
| @@ -77,7 +77,7 @@ HINSTANCE hinstDllMBR = NULL; | |||
| BOOL load_MBR() | |||
| { | |||
| if(hinstDllMBR != NULL) | |||
| return TRUE; // already loaded | |||
| return TRUE; // already loaded | |||
| if ((hinstDllMBR=LoadLibraryA("mbrola.dll")) == 0) | |||
| return FALSE; | |||
| @@ -150,14 +150,14 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
| } | |||
| } | |||
| } | |||
| close_MBR(); | |||
| close_MBR(); | |||
| #endif | |||
| #ifdef PLATFORM_WINDOWS | |||
| if(load_MBR() == FALSE) // load mbrola.dll | |||
| { | |||
| fprintf(stderr, "Can't load mbrola.dll\n"); | |||
| return(EE_INTERNAL_ERROR); | |||
| } | |||
| } | |||
| #endif | |||
| if(init_MBR(path) != 0) // initialise the required mbrola voice | |||
| @@ -169,14 +169,14 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
| sprintf(path,"%s/mbrola_ph/%s",path_home,phtrans); | |||
| size = GetFileLength(path); | |||
| if((f_in = fopen(path,"rb")) == NULL) { | |||
| close_MBR(); | |||
| close_MBR(); | |||
| return(EE_NOT_FOUND); | |||
| } | |||
| if((mbrola_tab = (MBROLA_TAB *)realloc(mbrola_tab,size)) == NULL) | |||
| { | |||
| fclose(f_in); | |||
| close_MBR(); | |||
| close_MBR(); | |||
| return(EE_INTERNAL_ERROR); | |||
| } | |||
| @@ -190,7 +190,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
| fclose(f_in); | |||
| setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f); | |||
| // srate = getFreq_MBR(); | |||
| // srate = getFreq_MBR(); | |||
| samplerate = srate; | |||
| if(srate == 22050) | |||
| SetParameter(espeakVOICETYPE,0,0); | |||
| @@ -543,7 +543,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr | |||
| if(released == 0) | |||
| p->synthflags |= SFLAG_NEXT_PAUSE; | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, NULL); | |||
| len = DoSample3(&phdata, 0, -1); | |||
| len = (len * 1000)/samplerate; // convert to mS | |||
| @@ -556,7 +556,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr | |||
| case phFRICATIVE: | |||
| len = 0; | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, NULL); | |||
| if(p->synthflags & SFLAG_LENGTHEN) | |||
| len = DoSample3(&phdata, p->length, -1); // play it twice for [s:] etc. | |||
| len += DoSample3(&phdata, p->length, -1); | |||
| @@ -568,7 +568,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr | |||
| if(next->type != phVOWEL) | |||
| { | |||
| memset(&fmtp, 0, sizeof(fmtp)); | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, NULL); | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| len = DoSpect2(p->ph, 0, &fmtp, p, -1); | |||
| // len = DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,-1); | |||
| @@ -601,7 +601,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr | |||
| if(pause) | |||
| { | |||
| len += PauseLength(pause,0); | |||
| len += PauseLength(pause,0); | |||
| ptr += sprintf(ptr,"_ \t%d\n",PauseLength(pause,0)); | |||
| pause = 0; | |||
| } | |||
| @@ -655,7 +655,7 @@ int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| int again = MbrolaTranslate(phoneme_list, *n_ph, resume, f_mbrola); | |||
| if (!again) | |||
| *n_ph = 0; | |||
| return again; | |||
| return again; | |||
| } | |||
| @@ -710,7 +710,7 @@ void MbrolaReset(void) | |||
| espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int srate) | |||
| { | |||
| return(EE_INTERNAL_ERROR); | |||
| return(EE_INTERNAL_ERROR); | |||
| } | |||
| int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| @@ -35,8 +35,8 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.46.23 09.Sep.12"; | |||
| const int version_phdata = 0x014600; | |||
| const char *version_string = "1.46.24 11.Sep.12"; | |||
| const int version_phdata = 0x014624; | |||
| int option_device_number = -1; | |||
| FILE *f_logespeak = NULL; | |||
| @@ -80,7 +80,7 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size) | |||
| sprintf(buf,"%s%c%s",path_home,PATHSEP,fname); | |||
| length = GetFileLength(buf); | |||
| if((f_in = fopen(buf,"rb")) == NULL) | |||
| { | |||
| fprintf(stderr,"Can't read data file: '%s'\n",buf); | |||
| @@ -89,7 +89,7 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size) | |||
| if(ptr != NULL) | |||
| Free(ptr); | |||
| if((p = Alloc(length)) == NULL) | |||
| { | |||
| fclose(f_in); | |||
| @@ -230,7 +230,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, | |||
| SPECT_SEQK *seqk, *seqk2; | |||
| frame_t *frame; | |||
| static frameref_t frames_buf[N_SEQ_FRAMES]; | |||
| seq = (SPECT_SEQ *)(&phondata_ptr[fmt_params->fmt_addr]); | |||
| seqk = (SPECT_SEQK *)seq; | |||
| nf = seq->n_frames; | |||
| @@ -268,7 +268,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, | |||
| nf -= seq_break; | |||
| } | |||
| } | |||
| // do we need to modify a frame for blending with a consonant? | |||
| if((this_ph->type == phVOWEL) && (fmt_params->fmt2_addr == 0) && (fmt_params->use_vowelin)) | |||
| { | |||
| @@ -286,7 +286,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, | |||
| // add these spectra to the main sequence | |||
| seq2 = (SPECT_SEQ *)(&phondata_ptr[fmt_params->fmt2_addr]); | |||
| seqk2 = (SPECT_SEQK *)seq2; | |||
| // first frame of the addition just sets the length of the last frame of the main seq | |||
| nf--; | |||
| for(ix=0; ix<seq2->n_frames; ix++) | |||
| @@ -306,7 +306,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, | |||
| } | |||
| wavefile_ix = 0; | |||
| } | |||
| if(length1 > 0) | |||
| { | |||
| if(which==2) | |||
| @@ -324,7 +324,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, | |||
| length_factor = (length_std * 256)/ length1; | |||
| for(ix=0; ix<nf1; ix++) | |||
| { | |||
| frames[ix].length = (frames[ix].length * length_factor)/256; | |||
| @@ -362,7 +362,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, | |||
| } | |||
| } | |||
| } | |||
| *n_frames = nf; | |||
| return(frames); | |||
| } // end of LookupSpect | |||
| @@ -562,7 +562,7 @@ static bool StressCondition(Translator *tr, PHONEME_LIST *plist, int condition, | |||
| // change phoneme. Don't change phonemes which are given for the word in the dictionary. | |||
| return(false); | |||
| } | |||
| if((tr->langopts.param[LOPT_REDUCE] & 0x2) && (stress_level >= pl->wordstress)) | |||
| { | |||
| // treat the most stressed syllable in an unstressed word as stressed | |||
| @@ -607,69 +607,107 @@ static int CountVowelPosition(PHONEME_LIST *plist) | |||
| } // end of CoundVowelPosition | |||
| static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, int instn) | |||
| {//======================================================================================== | |||
| static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, USHORT *p_prog, WORD_PH_DATA *worddata) | |||
| {//======================================================================================================================== | |||
| int which; | |||
| unsigned int data; | |||
| int instn; | |||
| int instn2; | |||
| int count; | |||
| PHONEME_TAB *ph; | |||
| PHONEME_LIST *plist_this; | |||
| static int ph_position[8] = {0, 1, 2, 3, 2, 0, 1, 3}; // prevPh, thisPh, nextPh, next2Ph, nextPhW, prevPhW, nextVowel, (other conditions) | |||
| // instruction: 2xxx, 3xxx | |||
| // bits 8-10 = 0 to 6, which phoneme | |||
| // bits 8-10 = 0 to 5, which phoneme, =6 the 'which' information is in the next instruction. | |||
| // bit 11 = 0, bits 0-7 are a phoneme code | |||
| // bit 11 = 1, bits 5-7 type of data, bits 0-4 data value | |||
| // bits 8-10 = 7, other conditions | |||
| instn = (*p_prog) & 0xfff; | |||
| data = instn & 0xff; | |||
| instn2 = instn >> 8; | |||
| if(instn2 < 14) | |||
| { | |||
| plist_this = plist; | |||
| which = (instn2) % 7; | |||
| if(which==6) | |||
| { | |||
| // the 'which' code is in the next instruction | |||
| p_prog++; | |||
| which = (*p_prog); | |||
| } | |||
| if(which==4) | |||
| { | |||
| // nextPh not word boundary | |||
| // nextPhW not word boundary | |||
| if(plist[1].sourceix) | |||
| return(false); | |||
| } | |||
| if(which==5) | |||
| { | |||
| // prevPh, not word boundary | |||
| // prevPhW, not word boundary | |||
| if(plist[0].sourceix) | |||
| return(false); | |||
| } | |||
| if(which==6) | |||
| { | |||
| { | |||
| // next2PhW, not word boundary | |||
| if(plist[1].sourceix || plist[2].sourceix) | |||
| return(false); | |||
| } | |||
| switch(which) | |||
| { | |||
| case 0: // prevPh | |||
| case 5: // prevPhW | |||
| plist--; | |||
| break; | |||
| case 1: // thisPh | |||
| break; | |||
| case 2: // nextPh | |||
| case 4: // nextPhW | |||
| plist++; | |||
| break; | |||
| case 3: // next2Ph | |||
| case 6: // next2PhW | |||
| plist += 2; | |||
| break; | |||
| case 7: | |||
| // nextVowel, not word boundary | |||
| for(which=2;;which++) | |||
| for(which=1;;which++) | |||
| { | |||
| if(plist[which-1].sourceix) | |||
| if(plist[which].sourceix) | |||
| return(false); | |||
| if(phoneme_tab[plist[which-1].phcode]->type == phVOWEL) | |||
| if(phoneme_tab[plist[which].phcode]->type == phVOWEL) | |||
| { | |||
| plist = &plist[which]; | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| which = ph_position[which]; | |||
| } | |||
| break; | |||
| plist_this = plist; | |||
| plist = &plist[which-1]; | |||
| case 8: // prevVowel in this word | |||
| if((worddata==NULL) || (worddata->prev_vowel.ph == NULL)) | |||
| return(false); // no previous vowel | |||
| plist = &(worddata->prev_vowel); | |||
| break; | |||
| } | |||
| if(which == 0) | |||
| if((which == 0) || (which == 5)) | |||
| { | |||
| if(plist->phcode == 1) | |||
| { | |||
| // This is a NULL phoneme, a phoneme has been deleted so look at the previous phoneme | |||
| plist = &plist[-1]; | |||
| plist--; | |||
| } | |||
| } | |||
| @@ -739,7 +777,7 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| plist--; | |||
| if((plist->stresslevel & 0xf) >= 4) | |||
| return(true); | |||
| } while (plist->sourceix == 0); | |||
| break; | |||
| @@ -814,8 +852,8 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| } // end of InterpretCondition | |||
| static void SwitchVowelType(PHONEME_LIST *plist, PHONEME_DATA *phdata, USHORT **p_prog, int instn_type) | |||
| {//===================================================================================================== | |||
| static void SwitchOnVowelType(PHONEME_LIST *plist, PHONEME_DATA *phdata, USHORT **p_prog, int instn_type) | |||
| {//======================================================================================================== | |||
| USHORT *prog; | |||
| int voweltype; | |||
| signed char x; | |||
| @@ -848,18 +886,27 @@ static int NumInstnWords(USHORT *prog) | |||
| int instn; | |||
| int instn2; | |||
| int instn_type; | |||
| static char n_words[11] = {1,1,1,1,1,1,1,1,1,2,4}; | |||
| int n; | |||
| static const char n_words[16] = {1,1,0,0,1,1,1,1,1,2,4,0,0,0,0,0}; | |||
| instn = *prog; | |||
| instn_type = instn >> 12; | |||
| if(instn_type < 11) | |||
| return(n_words[instn_type]); | |||
| if((n = n_words[instn_type]) > 0) | |||
| return(n); | |||
| if(instn_type < 4) | |||
| { | |||
| // a condition, check for a 2-word instruction | |||
| if(((n = instn & 0x0f00) == 0x600) || (n == 0x0d00)) | |||
| return(2); | |||
| return(1); | |||
| } | |||
| // 11 to 15, 2 words | |||
| // instn_type 11 to 15, 2 words | |||
| instn2 = prog[2]; | |||
| if((instn2 >> 12) == 0xf) | |||
| { | |||
| // addWav(), 2 more words | |||
| // This instruction is followed by addWav(), 2 more words | |||
| return(4); | |||
| } | |||
| if(instn2 == i_CONTINUE) | |||
| @@ -871,8 +918,8 @@ static int NumInstnWords(USHORT *prog) | |||
| void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata) | |||
| {//========================================================================================== | |||
| void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata, WORD_PH_DATA *worddata) | |||
| {//=================================================================================================================== | |||
| // control: | |||
| //bit 0: PreVoicing | |||
| //bit 8: change phonemes | |||
| @@ -893,6 +940,12 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| ph = plist->ph; | |||
| if((worddata != NULL) && (plist->sourceix)) | |||
| { | |||
| // start of a word, reset word data | |||
| worddata->prev_vowel.ph = NULL; | |||
| } | |||
| memset(phdata, 0, sizeof(PHONEME_DATA)); | |||
| phdata->pd_param[i_SET_LENGTH] = ph->std_length; | |||
| phdata->pd_param[i_LENGTH_MOD] = ph->length_mod; | |||
| @@ -901,13 +954,13 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| return; | |||
| end_flag = 0; | |||
| for(prog = &phoneme_index[ph->program]; end_flag != 1; prog++) | |||
| { | |||
| instn = *prog; | |||
| instn2 = (instn >> 8) & 0xf; | |||
| or_flag = 0; | |||
| switch(instn >> 12) | |||
| { | |||
| case 0: // 0xxx | |||
| @@ -992,11 +1045,13 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| { | |||
| // process a sequence of conditions, using boolean accumulator | |||
| if(or_flag) | |||
| truth = (truth || InterpretCondition(tr, control, plist, instn & 0xfff)); | |||
| truth = (truth || InterpretCondition(tr, control, plist, prog, worddata)); | |||
| else | |||
| truth = (truth && InterpretCondition(tr, control, plist, instn & 0xfff)); | |||
| truth = (truth && InterpretCondition(tr, control, plist, prog, worddata)); | |||
| or_flag = instn & 0x1000; | |||
| instn = *(++prog); | |||
| prog += NumInstnWords(prog); | |||
| instn = *prog; | |||
| // instn = *(++prog); | |||
| } | |||
| if(truth == false) | |||
| @@ -1010,7 +1065,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| // instruction after a condition is not JUMP_FALSE, so skip the instruction. | |||
| prog += NumInstnWords(prog); | |||
| if((prog[0] & 0xfe00) == 0x6000) | |||
| prog++; // and skip ELSE jump | |||
| prog++; // and skip ELSE jump | |||
| } | |||
| } | |||
| prog--; | |||
| @@ -1029,11 +1084,11 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| break; | |||
| case 5: // NexttVowelStarts | |||
| SwitchVowelType(plist, phdata, &prog, 2); | |||
| SwitchOnVowelType(plist, phdata, &prog, 2); | |||
| break; | |||
| case 6: // PrevVowelTypeEndings | |||
| SwitchVowelType(plist, phdata, &prog, 3); | |||
| SwitchOnVowelType(plist, phdata, &prog, 3); | |||
| break; | |||
| } | |||
| break; | |||
| @@ -1130,6 +1185,11 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| } | |||
| } | |||
| if((worddata != NULL) && (plist->type == phVOWEL)) | |||
| { | |||
| memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST)); | |||
| } | |||
| } // end of InterpretPhoneme | |||
| @@ -1150,5 +1210,5 @@ void InterpretPhoneme2(int phcode, PHONEME_DATA *phdata) | |||
| plist[1].ph = phoneme_tab[phcode]; | |||
| plist[2].sourceix = 1; | |||
| InterpretPhoneme(NULL, 0, &plist[1], phdata); | |||
| InterpretPhoneme(NULL, 0, &plist[1], phdata, NULL); | |||
| } // end of InterpretPhoneme2 | |||
| @@ -483,7 +483,7 @@ static void set_frame_rms(frame_t *fr, int new_rms) | |||
| } | |||
| return; | |||
| } | |||
| if(fr->rms == 0) return; // check for divide by zero | |||
| x = (new_rms * 64)/fr->rms; | |||
| if(x >= 200) x = 199; | |||
| @@ -507,7 +507,7 @@ static void formants_reduce_hf(frame_t *fr, int level) | |||
| if(voice->klattv[0]) | |||
| return; | |||
| for(ix=2; ix < 8; ix++) | |||
| { | |||
| x = fr->fheight[ix] * level; | |||
| @@ -594,7 +594,7 @@ static void AdjustFormants(frame_t *fr, int target, int min, int max, int f1_adj | |||
| fr->ffreq[1] += x; | |||
| fr->ffreq[0] += x; | |||
| } | |||
| formants_reduce_hf(fr,hf_reduce); | |||
| formants_reduce_hf(fr,hf_reduce); | |||
| } | |||
| @@ -717,7 +717,7 @@ if(voice->klattv[0]) | |||
| fr = CopyFrame(seq[n_frames-1].frame,0); | |||
| seq[n_frames-1].frame = fr; | |||
| rms = RMS_GLOTTAL1; | |||
| // degree of glottal-stop effect depends on closeness of vowel (indicated by f1 freq) | |||
| modn_flags = 0x400 + (VowelCloseness(fr) << 8); | |||
| } | |||
| @@ -726,7 +726,7 @@ if(voice->klattv[0]) | |||
| fr = DuplicateLastFrame(seq,n_frames++,len); | |||
| if(len > 36) | |||
| seq_len_adjust += (len - 36); | |||
| if(f2 != 0) | |||
| { | |||
| AdjustFormants(fr, f2, f2_min, f2_max, f1, f3_adj, f3_amp, flags); | |||
| @@ -741,7 +741,7 @@ if(voice->klattv[0]) | |||
| { | |||
| fr = CopyFrame(seq[ix].frame,0); | |||
| seq[ix].frame = fr; | |||
| for(formant=1; formant<=5; formant++) | |||
| { | |||
| int x; | |||
| @@ -1182,7 +1182,7 @@ if(which==1) | |||
| q[1] = len + (modulation << 16); | |||
| q[2] = (long64)frame1; | |||
| q[3] = (long64)frame2; | |||
| WcmdqInc(); | |||
| } | |||
| last_frame = frame1 = frame2; | |||
| @@ -1348,6 +1348,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| PHONEME_DATA phdata_next; | |||
| PHONEME_DATA phdata_tone; | |||
| FMT_PARAMS fmtp; | |||
| static WORD_PH_DATA worddata; | |||
| if(option_quiet) | |||
| return(0); | |||
| @@ -1372,6 +1373,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| syllable_centre = -1; | |||
| last_pitch_cmd = -1; | |||
| memset(vowel_transition,0,sizeof(vowel_transition)); | |||
| memset(&worddata, 0, sizeof(worddata)); | |||
| DoPause(0,0); // isolate from the previous clause | |||
| } | |||
| @@ -1463,13 +1465,13 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(released == 0) | |||
| p->synthflags |= SFLAG_NEXT_PAUSE; | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, &worddata); | |||
| phdata.pd_control |= pd_DONTLENGTHEN; | |||
| DoSample3(&phdata, 0, 0); | |||
| break; | |||
| case phFRICATIVE: | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, &worddata); | |||
| if(p->synthflags & SFLAG_LENGTHEN) | |||
| { | |||
| @@ -1509,7 +1511,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if((prev->type==phVOWEL) || (prev->ph->phflags & phVOWEL2) || (ph->phflags & phPREVOICE)) | |||
| { | |||
| // a period of voicing before the release | |||
| InterpretPhoneme(NULL, 0x01, p, &phdata); | |||
| InterpretPhoneme(NULL, 0x01, p, &phdata, &worddata); | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| fmtp.fmt_amp = phdata.sound_param[pd_FMT]; | |||
| @@ -1537,7 +1539,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| { | |||
| p->synthflags |= SFLAG_NEXT_PAUSE; | |||
| } | |||
| InterpretPhoneme(NULL,0, p, &phdata); | |||
| InterpretPhoneme(NULL,0, p, &phdata, &worddata); | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| fmtp.fmt_amp = phdata.sound_param[pd_FMT]; | |||
| fmtp.wav_addr = phdata.sound_addr[pd_ADDWAV]; | |||
| @@ -1582,7 +1584,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| { | |||
| p->synthflags |= SFLAG_NEXT_PAUSE; | |||
| } | |||
| InterpretPhoneme(NULL,0, p, &phdata); | |||
| InterpretPhoneme(NULL,0, p, &phdata, &worddata); | |||
| memset(&fmtp, 0, sizeof(fmtp)); | |||
| fmtp.std_length = phdata.pd_param[i_SET_LENGTH]*2; | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| @@ -1608,7 +1610,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| last_frame = NULL; | |||
| } | |||
| InterpretPhoneme(NULL,0, p, &phdata); | |||
| InterpretPhoneme(NULL,0, p, &phdata, &worddata); | |||
| fmtp.std_length = phdata.pd_param[i_SET_LENGTH]*2; | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| fmtp.fmt_amp = phdata.sound_param[pd_FMT]; | |||
| @@ -1653,7 +1655,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| { | |||
| StartSyllable(); | |||
| } | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, &worddata); | |||
| fmtp.std_length = phdata.pd_param[i_SET_LENGTH]*2; | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| fmtp.fmt_amp = phdata.sound_param[pd_FMT]; | |||
| @@ -1669,7 +1671,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| memset(&fmtp, 0, sizeof(fmtp)); | |||
| InterpretPhoneme(NULL, 0, p, &phdata); | |||
| InterpretPhoneme(NULL, 0, p, &phdata, &worddata); | |||
| fmtp.std_length = phdata.pd_param[i_SET_LENGTH] * 2; | |||
| if(((fmtp.fmt_addr = phdata.sound_addr[pd_VWLSTART]) != 0) && ((phdata.pd_control & pd_FORNEXTPH) == 0)) | |||
| @@ -1681,7 +1683,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(prev->type != phPAUSE) | |||
| { | |||
| // check the previous phoneme | |||
| InterpretPhoneme(NULL, 0, prev, &phdata_prev); | |||
| InterpretPhoneme(NULL, 0, prev, &phdata_prev, NULL); | |||
| if((fmtp.fmt_addr = phdata_prev.sound_addr[pd_VWLSTART]) != 0) | |||
| { | |||
| // a vowel start has been specified by the Vowel program | |||
| @@ -1763,7 +1765,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(next->type != phPAUSE) | |||
| { | |||
| fmtp.fmt2_lenadj = 0; | |||
| InterpretPhoneme(NULL, 0, next, &phdata_next); | |||
| InterpretPhoneme(NULL, 0, next, &phdata_next, NULL); | |||
| fmtp.use_vowelin = 1; | |||
| fmtp.transition0 = phdata_next.vowel_transition[2]; // always do vowel_transition, even if ph_VWLEND ?? consider [N] | |||
| @@ -1939,7 +1941,7 @@ int SpeakNextClause(FILE *f_in, const void *text_in, int control) | |||
| if(option_phonemes > 0) | |||
| { | |||
| fprintf(f_trans,"%s\n",translator->phon_out); | |||
| if(!iswalpha(0x010d)) | |||
| { | |||
| // check that c-caron is recognized as an alphabetic character | |||
| @@ -265,6 +265,9 @@ typedef struct { | |||
| int std_length; | |||
| } FMT_PARAMS; | |||
| typedef struct { | |||
| PHONEME_LIST prev_vowel; | |||
| } WORD_PH_DATA; | |||
| // instructions | |||
| @@ -417,7 +420,7 @@ typedef struct { | |||
| unsigned char split_tail_start; | |||
| unsigned char split_tail_end; | |||
| unsigned char split_tune; | |||
| unsigned char spare[8]; | |||
| int spare2; // the struct length should be a multiple of 4 bytes | |||
| } TUNE; | |||
| @@ -18,7 +18,7 @@ | |||
| ***************************************************************************/ | |||
| #define L(c1,c2) (c1<<8)+c2 // combine two characters into an integer for translator name | |||
| #define L(c1,c2) (c1<<8)+c2 // combine two characters into an integer for translator name | |||
| #define CTRL_EMBEDDED 0x01 // control character at the start of an embedded command | |||
| #define REPLACED_E 'E' // 'e' replaced by silent e | |||
| @@ -29,7 +29,7 @@ | |||
| #define N_RULE_GROUP2 120 // max num of two-letter rule chains | |||
| #define N_HASH_DICT 1024 | |||
| #define N_CHARSETS 20 | |||
| #define N_LETTER_GROUPS 95 // maximum is 127-32 | |||
| #define N_LETTER_GROUPS 95 // maximum is 127-32 | |||
| /* dictionary flags, word 1 */ | |||
| @@ -52,7 +52,7 @@ | |||
| #define FLAG_STEM 0x40000 // must have a suffix | |||
| #define FLAG_DOUBLING 0x80000 // doubles the following consonant | |||
| #define BITNUM_FLAG_ALT 19 // bit number of FLAG_ALT_TRANS - 1 | |||
| #define BITNUM_FLAG_ALT 19 // bit number of FLAG_ALT_TRANS - 1 | |||
| #define FLAG_ALT_TRANS 0x100000 // language specific | |||
| #define FLAG_ALT2_TRANS 0x200000 // language specific | |||
| #define FLAG_ALT3_TRANS 0x400000 // language specific | |||
| @@ -110,7 +110,7 @@ | |||
| #define FLAG_MULTIPLE_SPACES 0x40000 // word is preceded by multiple spaces, newline, or tab | |||
| #define FLAG_INDIVIDUAL_DIGITS 0x80000 // speak number as individual digits | |||
| #define FLAG_DELETE_WORD 0x100000 // don't speak this word, it has been spoken as part of the previous word | |||
| #define FLAG_CHAR_REPLACED 0x200000 // characters have been replaced by .replace in the *_rules | |||
| #define FLAG_CHAR_REPLACED 0x200000 // characters have been replaced by .replace in the *_rules | |||
| #define FLAG_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix | |||
| #define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout | |||
| @@ -235,7 +235,7 @@ typedef struct { | |||
| int end_type; | |||
| char *del_fwd; | |||
| } MatchRecord; | |||
| // used to mark words with the source[] buffer | |||
| typedef struct{ | |||
| @@ -377,7 +377,7 @@ typedef struct { | |||
| // bit20= hyphenated words, 2nd part is unstressed | |||
| // bit21= don't lengthen vowels at end-of-clause | |||
| int stress_flags; | |||
| int stress_flags; | |||
| int unstressed_wd1; // stress for $u word of 1 syllable | |||
| int unstressed_wd2; // stress for $u word of >1 syllable | |||
| int param[N_LOPTS]; | |||
| @@ -542,18 +542,18 @@ typedef struct | |||
| // groups1 and groups2 are indexes into data_dictrules, set up by InitGroups() | |||
| // the two-letter rules for each letter must be consecutive in the language_rules source | |||
| char *groups1[256]; // translation rule lists, index by single letter | |||
| char *groups3[128]; // index by offset letter | |||
| char *groups2[N_RULE_GROUP2]; // translation rule lists, indexed by two-letter pairs | |||
| unsigned int groups2_name[N_RULE_GROUP2]; // the two letter pairs for groups2[] | |||
| int n_groups2; // number of groups2[] entries used | |||
| unsigned char groups2_count[256]; // number of 2 letter groups for this initial letter | |||
| unsigned char groups2_start[256]; // index into groups2 | |||
| const short *frequent_pairs; // list of frequent pairs of letters, for use in compressed *_list | |||
| int expect_verb; | |||
| int expect_past; // expect past tense | |||
| int expect_verb_s; | |||
| @@ -563,7 +563,7 @@ typedef struct | |||
| int word_vowel_count; // number of vowels so far | |||
| int word_stressed_count; // number of vowels so far which could be stressed | |||
| int clause_upper_count; // number of upper case letters in the clause | |||
| int clause_lower_count; // number of lower case letters in the clause | |||
| @@ -685,7 +685,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type, char *voice_change); | |||
| void SetVoiceStack(espeak_VOICE *v, const char *variant_name); | |||
| void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata); | |||
| void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata, WORD_PH_DATA *worddata); | |||
| void InterpretPhoneme2(int phcode, PHONEME_DATA *phdata); | |||
| char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa); | |||