From bba7069cb3d21715c879473eb1cbeffee5078f04 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Sat, 21 Jul 2018 14:09:04 +0100 Subject: [PATCH] issue #520: Use .replace rules in the language rule files for Cyrillic to Latin --- dictsource/bs_rules | 36 +++++++++++++++++++++++++++++ dictsource/hr_rules | 36 +++++++++++++++++++++++++++++ dictsource/sl_rules | 35 ++++++++++++++++++++++++++++ dictsource/sr_rules | 36 +++++++++++++++++++++++++++++ src/libespeak-ng/tr_languages.c | 38 ------------------------------- tests/language-pronunciation.test | 34 +++++++++++++++++++++++++++ 6 files changed, 177 insertions(+), 38 deletions(-) diff --git a/dictsource/bs_rules b/dictsource/bs_rules index 18759610..20ca145a 100644 --- a/dictsource/bs_rules +++ b/dictsource/bs_rules @@ -11,6 +11,42 @@ // ?3 Bosnian (Bosna and Hercegovina) // ?4 Serbian & Bosnian +.replace +// Cyrl Latn -- Cyrillic to Latin + а a // U+0430 + б b // U+0431 + в v // U+0432 + г g // U+0433 + д d // U+0434 + е e // U+0435 + ж ž // U+0436 + з z // U+0437 + и i // U+0438 + к k // U+043A + л l // U+043B + м m // U+043C + н n // U+043D + о o // U+043E + п p // U+043F + р r // U+0440 + с s // U+0441 + т t // U+0442 + у u // U+0443 + ф f // U+0444 + х h // U+0445 + ц c // U+0446 + ч č // U+0447 + ш š // U+0161 + ђ đ // U+0452 + ѓ đ // U+0453 + ѕ dz // U+0455 + ј j // U+0458 + љ lj // U+0459 + њ nj // U+045A + ћ ć // U+045B + ќ ć // U+045C + џ dž // U+045F + .group a a a X) a ($w_alt1 a: diff --git a/dictsource/hr_rules b/dictsource/hr_rules index 18759610..20ca145a 100644 --- a/dictsource/hr_rules +++ b/dictsource/hr_rules @@ -11,6 +11,42 @@ // ?3 Bosnian (Bosna and Hercegovina) // ?4 Serbian & Bosnian +.replace +// Cyrl Latn -- Cyrillic to Latin + а a // U+0430 + б b // U+0431 + в v // U+0432 + г g // U+0433 + д d // U+0434 + е e // U+0435 + ж ž // U+0436 + з z // U+0437 + и i // U+0438 + к k // U+043A + л l // U+043B + м m // U+043C + н n // U+043D + о o // U+043E + п p // U+043F + р r // U+0440 + с s // U+0441 + т t // U+0442 + у u // U+0443 + ф f // U+0444 + х h // U+0445 + ц c // U+0446 + ч č // U+0447 + ш š // U+0161 + ђ đ // U+0452 + ѓ đ // U+0453 + ѕ dz // U+0455 + ј j // U+0458 + љ lj // U+0459 + њ nj // U+045A + ћ ć // U+045B + ќ ć // U+045C + џ dž // U+045F + .group a a a X) a ($w_alt1 a: diff --git a/dictsource/sl_rules b/dictsource/sl_rules index 6052e4c1..aa1dc01a 100644 --- a/dictsource/sl_rules +++ b/dictsource/sl_rules @@ -7,6 +7,41 @@ .L03 a e .L04 l v +.replace +// Cyrl Latn -- Cyrillic to Latin + а a // U+0430 + б b // U+0431 + в v // U+0432 + г g // U+0433 + д d // U+0434 + е e // U+0435 + ж ž // U+0436 + з z // U+0437 + и i // U+0438 + к k // U+043A + л l // U+043B + м m // U+043C + н n // U+043D + о o // U+043E + п p // U+043F + р r // U+0440 + с s // U+0441 + т t // U+0442 + у u // U+0443 + ф f // U+0444 + х h // U+0445 + ц c // U+0446 + ч č // U+0447 + ш š // U+0161 + ђ đ // U+0452 + ѓ đ // U+0453 + ѕ dz // U+0455 + ј j // U+0458 + љ lj // U+0459 + њ nj // U+045A + ћ ć // U+045B + ќ ć // U+045C + џ dž // U+045F .group a a a: diff --git a/dictsource/sr_rules b/dictsource/sr_rules index 18759610..20ca145a 100644 --- a/dictsource/sr_rules +++ b/dictsource/sr_rules @@ -11,6 +11,42 @@ // ?3 Bosnian (Bosna and Hercegovina) // ?4 Serbian & Bosnian +.replace +// Cyrl Latn -- Cyrillic to Latin + а a // U+0430 + б b // U+0431 + в v // U+0432 + г g // U+0433 + д d // U+0434 + е e // U+0435 + ж ž // U+0436 + з z // U+0437 + и i // U+0438 + к k // U+043A + л l // U+043B + м m // U+043C + н n // U+043D + о o // U+043E + п p // U+043F + р r // U+0440 + с s // U+0441 + т t // U+0442 + у u // U+0443 + ф f // U+0444 + х h // U+0445 + ц c // U+0446 + ч č // U+0447 + ш š // U+0161 + ђ đ // U+0452 + ѓ đ // U+0453 + ѕ dz // U+0455 + ј j // U+0458 + љ lj // U+0459 + њ nj // U+045A + ћ ć // U+045B + ќ ć // U+045C + џ dž // U+045F + .group a a a X) a ($w_alt1 a: diff --git a/src/libespeak-ng/tr_languages.c b/src/libespeak-ng/tr_languages.c index d3b2d464..46a8285b 100644 --- a/src/libespeak-ng/tr_languages.c +++ b/src/libespeak-ng/tr_languages.c @@ -361,42 +361,6 @@ static const short pairs_ru[] = { 0x7fff }; -static const unsigned int replace_cyrillic_latin[] = -{ 0x430, 'a', - 0x431, 'b', - 0x446, 'c', - 0x45b, 0x107, - 0x447, 0x10d, - 0x45f, 'd'+(0x17e<<16), - 0x455, 'd'+('z'<<16), - 0x434, 'd', - 0x452, 0x111, - 0x435, 'e', - 0x444, 'f', - 0x433, 'g', - 0x445, 'h', - 0x438, 'i', - 0x458, 'j', - 0x43a, 'k', - 0x459, 'l'+('j'<<16), - 0x43b, 'l', - 0x43c, 'm', - 0x45a, 'n'+('j'<<16), - 0x43d, 'n', - 0x43e, 'o', - 0x43f, 'p', - 0x440, 'r', - 0x441, 's', - 0x448, 0x161, - 0x442, 't', - 0x443, 'u', - 0x432, 'v', - 0x437, 'z', - 0x436, 0x17e, - 0x453, 0x111, - 0x45c, 0x107, - 0 }; // ѓ ѕ ќ - static const unsigned char ru_vowels[] = { // (also kazakh) offset by 0x420 -- а е ё и о у ы э ю я ә ө ұ ү і 0x10, 0x15, 0x31, 0x18, 0x1e, 0x23, 0x2b, 0x2d, 0x2e, 0x2f, 0xb9, 0xc9, 0x91, 0x8f, 0x36, 0 }; @@ -937,7 +901,6 @@ Translator *SelectTranslator(const char *name) tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_DECIMAL_COMMA | NUM_THOUS_SPACE | NUM_DFRACTION_2 | NUM_ROMAN_CAPITALS; tr->langopts.numbers2 = 0xa + NUM2_THOUSANDS_VAR5; // variant numbers before thousands,milliards - tr->langopts.replace_chars = replace_cyrillic_latin; tr->langopts.our_alphabet = OFFSET_CYRILLIC; // don't say "cyrillic" before letter names } @@ -1385,7 +1348,6 @@ Translator *SelectTranslator(const char *name) tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2 | NUM_ORDINAL_DOT | NUM_ROMAN; tr->langopts.numbers2 = 0x100; // plural forms of millions etc tr->langopts.thousands_sep = ' '; // don't allow dot as thousands separator - tr->langopts.replace_chars = replace_cyrillic_latin; break; case L('s', 'q'): // Albanian { diff --git a/tests/language-pronunciation.test b/tests/language-pronunciation.test index d644f849..012d157a 100755 --- a/tests/language-pronunciation.test +++ b/tests/language-pronunciation.test @@ -21,10 +21,20 @@ test_phonemes bg "Latin characters spoken in English" \ " (en)f'Ut str'Vt(bg)" \ "foot strut" +# This uses a pangram for Cyrillic letter coverage. +test_phonemes bs "Cyrillic" \ + " l^'ub&znI f'@ 'E slovo_|tS'EtIRI_|S'Est_|p'Et_: R'@ slovo_|tS'EtIRI_|S'Est_|d'EvEt_: I j'@2 & & tS'@_:_: & slovo_|tS'EtIRI_|S'Est_|j'ed&n_: v'@ tS'@ g'@ l'its& x'otS;E d'a m'i p'ok&ZE St'os" \ + "Љубазни фењерџија чађавог лица хоће да ми покаже штос." +test_phonemes bs "Latin" \ + " l^'ub&znI f'En^eRdZ,Ij& tS'adZ;&vog l'its& x'otS;E d'a m'i p'ok&ZE St'os" \ + "Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos." + test_phonemes de - \ " dr'Uk3 l'amp@ kOmpj'u:t3 St'Ern St'Ern@" \ "drucker lampe computer stern sterne" +# This word list is an extended version of Wells' Lexical Sets, used to cover +# different accent pronunciation. test_phonemes en - \ " k'It dr'Es tr'ap l'0t str'Vt f'Ut fl'i:s p'A:m T'O:t g'u:s n'3:s st'A@t n'O@T f'o@s kj'U@ n,i@3 skw'e@ t'3:m b'3:d h'api k'0m@ l'Et3r- Ekspl'o@ r'oUzI2z r'abIt f'eIs pr'aIs tS'OIs g'oUt m'aUT b'aaT kl'0T m'Ili@n dI2v'aIdI2d" \ "kit dress trap lot strut foot fleece palm thought goose nurse start north force cure near square term bird happy comma letter explore roses rabbit face price choice goat mouth bath cloth million divided" @@ -51,6 +61,14 @@ test_phonemes fa "Latin characters spoken in English" \ " (en)f'Ut str'Vt(fa)" \ "foot strut" +# This uses a pangram for Cyrillic letter coverage. +test_phonemes hr "Cyrillic" \ + " l^'ub&znI f'@ 'E slovo_|tS'EtIRI_|S'Est_|p'Et_: R'@ slovo_|tS'EtIRI_|S'Est_|d'EvEt_: I j'@2 & & tS'@_:_: & slovo_|tS'EtIRI_|S'Est_|j'ed&n_: v'@ tS'@ g'@ l'its& x'otS;E d'a m'i p'ok&ZE St'os" \ + "Љубазни фењерџија чађавог лица хоће да ми покаже штос." +test_phonemes hr "Latin" \ + " l^'ub&znI f'En^eRdZ,Ij& tS'adZ;&vog l'its& x'otS;E d'a m'i p'ok&ZE St'os" \ + "Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos." + test_phonemes ja "Hiragana" \ " k'a k'i k'u k'e k'o" \ "か き く け こ" @@ -66,3 +84,19 @@ test_phonemes lv - \ test_phonemes ru "Cyrillic" \ " 'Ab;i ab;'8 'AbjE 'Ab;I 'Abji 'Ap; 'Ab;u\" 'Ab;V" \ "абе абё абє аби абї абь абю абя" + +# This uses a pangram for Cyrillic letter coverage. +test_phonemes sl "Cyrillic" \ + " w k O Z'@ 'u: S'@ tsiR'i:litSnil'et@_|St'i:Ri_|S'e:st_|b'@_: 'u: k O Z'@ 'u: S'@ tsiR'i:litSnil'et@_|St'i:Ri_|S'e:st_|b'@_: 'u: xudObn'e:ga f'@ a n'@ tsiR'i:litSnil'et@_|St'i:Ri_|S'e:st_|'E:na_: stOp'i:tslja m'i:zaR" \ + "В кожушчку худобнега фанта стопицља мизар." +test_phonemes sl "Latin" \ + " ukOZ'u:StSku xudObn'e:ga f'a:nta stOp'i:tslja m'i:zaR" \ + "V kožuščku hudobnega fanta stopiclja mizar." + +# This uses a pangram for Cyrillic letter coverage. +test_phonemes sr "Cyrillic" \ + " l^'ub&znI f'@ 'E slovo_|tS'EtIRI_|S'Est_|p'Et_: R'@ slovo_|tS'EtIRI_|S'Est_|d'EvEt_: I j'@2 & & tS'@_:_: & slovo_|tS'EtIRI_|S'Est_|j'ed&n_: v'@ tS'@ g'@ l'its& x'otS;E d'a m'i p'ok&ZE St'os" \ + "Љубазни фењерџија чађавог лица хоће да ми покаже штос." +test_phonemes sr "Latin" \ + " l^'ub&znI f'En^eRdZ,Ij& tS'adZ;&vog l'its& x'otS;E d'a m'i p'ok&ZE St'os" \ + "Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos."