Change sound of Portugal 'rr' and initial 'r'. Fixed for Aragonese ordinal numbers. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@330 d46cf337-b52f-0410-862d-fd96e6ae7743master
_#º o | _#º o | ||||
_#ª a | _#ª a | ||||
_1ox prim'Er | _1ox prim'Er | ||||
_2ox seQ'und | _2ox seQ'und | ||||
_3ox tErT'Er | _3ox tErT'Er | ||||
_0M1o mil'en | _0M1o mil'en | ||||
_0M2o mil^on'en | _0M2o mil^on'en | ||||
_1M2o mil^on'en | _1M2o mil^on'en | ||||
_0M4o bil^on'en | |||||
_1M4o bil^on'en | |||||
// characters | // characters | ||||
$ d'olar | $ d'olar | ||||
sant $u | sant $u | ||||
donya $u | donya $u | ||||
don $u | don $u | ||||
he $u | |||||
has $u | |||||
ha $u | |||||
han $u | |||||
heba $u | |||||
hebas $u | |||||
heban $u | |||||
se'n sen $u | se'n sen $u | ||||
whatsapp was'app | whatsapp was'app | ||||
windows w'indows | windows w'indows | ||||
mobile _^_EN | |||||
//mobile _^_EN |
tS tS` v w x z Z | tS tS` v w x z Z | ||||
Dictionary an_dict 2013-03-19 | |||||
Dictionary an_dict 2013-03-21 | |||||
a aI aU e E eI eU i | a aI aU e E eI eU i | ||||
o O oI u U | o O oI u U |
haszo) n (jár n | haszo) n (jár n | ||||
boszorká) ny (jelet n^ | boszorká) ny (jelet n^ | ||||
káno) n (jog n | káno) n (jog n | ||||
legé) ny (jár n^ | |||||
szé) n (jelek n | |||||
teljesítmé) ny (j n^ | |||||
.group o | .group o | ||||
o o | o o | ||||
szen) tj (akab tj | szen) tj (akab tj | ||||
közérze) tj (aví tj | közérze) tj (aví tj | ||||
ké) tj (átszm tj | ké) tj (átszm tj | ||||
szavaza) tj (og tj | |||||
szavaza) tj (eg tj | |||||
.group ts | .group ts | ||||
ts (_S2 tS //general rule with word end of ts letters | ts (_S2 tS //general rule with word end of ts letters | ||||
_cha) tsz (ob t|s | _cha) tsz (ob t|s | ||||
robo) ts (of t|S | robo) ts (of t|S | ||||
merényle) ts (or t|S | merényle) ts (or t|S | ||||
szavaza) ts (o t|S | |||||
szige) ts (ej t|S | |||||
szige) ts (o t|S | |||||
.group tt | .group tt |
ca 11 127 | ca 11 127 | ||||
an 4 125 | an 4 125 | ||||
pt 29 140 | pt 29 140 | ||||
pt-pt 18 140 | |||||
pt-pt 20 140 | |||||
ro 36 148 | ro 36 148 | ||||
el 10 125 | el 10 125 | ||||
grc 12 129 | grc 12 129 | ||||
[r] et | [r] et | ||||
[r/] fr | [r/] fr | ||||
[R] fr-ca | [R] fr-ca | ||||
[x] pt-pt | |||||
[*;] ro | [*;] ro | ||||
[r#] is | [r#] is | ||||
[r/] tn | [r/] tn | ||||
vwl_fr/r_ [r/] fr | vwl_fr/r_ [r/] fr | ||||
vwl_fr/r_@ [r/] fr | vwl_fr/r_@ [r/] fr | ||||
vwl_fr/r@ fr post_r | vwl_fr/r@ fr post_r | ||||
vwl_fr/@R [x] pt-pt | |||||
vwl_fr/r@2 fr post_r | vwl_fr/r@2 fr post_r | ||||
vwl_fr/@R2 [R] fr-ca | vwl_fr/@R2 [R] fr-ca | ||||
vwl_fr/ra fr post_r | vwl_fr/ra fr post_r |
endphoneme | endphoneme | ||||
phoneme x // [r] for Portugal | |||||
liquid | |||||
trill | |||||
ipa ʁ | |||||
lengthmod 7 | |||||
Vowelin f1=0 f2=1500 -400 400 f3=-400 80 | |||||
IF nextPh(isNotVowel) THEN | |||||
ChangePhoneme(r/) | |||||
ENDIF | |||||
FMT(vwl_fr/@R) addWav(r3/rx, 120) | |||||
endphoneme | |||||
phoneme R // for Portugal this is same the as [r] | |||||
import_phoneme pt/r | |||||
endphoneme | |||||
phoneme s# // This is [s] for Brazil, [S] for Portugal | phoneme s# // This is [s] for Brazil, [S] for Portugal | ||||
CALL base/S | CALL base/S |
if(ph_buf[0] == 0) | if(ph_buf[0] == 0) | ||||
{ | { | ||||
if(al_offset == translator->langopts.alt_alphabet) | |||||
if((al_offset != 0) && (al_offset == translator->langopts.alt_alphabet)) | |||||
language = translator->langopts.alt_alphabet_lang; | language = translator->langopts.alt_alphabet_lang; | ||||
else | else | ||||
if((alphabet != NULL) && (alphabet->language != 0) && !(al_flags & AL_NOT_LETTERS)) | if((alphabet != NULL) && (alphabet->language != 0) && !(al_flags & AL_NOT_LETTERS)) | ||||
// Numbers | // Numbers | ||||
static char ph_ordinal2[12]; | static char ph_ordinal2[12]; | ||||
static char ph_ordinal2x[12]; | |||||
static int CheckDotOrdinal(Translator *tr, char *word, char *word_end, WORD_TAB *wtab, int roman) | static int CheckDotOrdinal(Translator *tr, char *word, char *word_end, WORD_TAB *wtab, int roman) | ||||
if(control & 4) | if(control & 4) | ||||
{ | { | ||||
sprintf(string,"_%d%cx",value,ord_type); // LANG=hu, special word for 1. 2. when there are no higher digits | sprintf(string,"_%d%cx",value,ord_type); // LANG=hu, special word for 1. 2. when there are no higher digits | ||||
found = Lookup(tr, string, ph_digits); | |||||
if((found = Lookup(tr, string, ph_digits)) != 0) | |||||
{ | |||||
if(ph_ordinal2x[0] != 0) | |||||
strcpy(ph_ordinal, ph_ordinal2x); // alternate pronunciation (lang=an) | |||||
} | |||||
} | } | ||||
if(found == 0) | if(found == 0) | ||||
{ | { | ||||
else | else | ||||
{ | { | ||||
if((is_ordinal) && | |||||
((units == 0) || (tr->langopts.numbers & NUM_SWAP_TENS) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))) | |||||
if(is_ordinal) | |||||
{ | { | ||||
sprintf(string,"_%dX%c", tens, ord_type); | sprintf(string,"_%dX%c", tens, ord_type); | ||||
if(Lookup(tr, string, ph_tens) != 0) | if(Lookup(tr, string, ph_tens) != 0) | ||||
{ | { | ||||
Lookup(tr, "_0and", ph_and); | Lookup(tr, "_0and", ph_and); | ||||
if((is_ordinal) && (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL)) | |||||
if((is_ordinal) && (tr->langopts.numbers2 & NUM2_ORDINAL_NO_AND)) | |||||
ph_and[0] = 0; | ph_and[0] = 0; | ||||
if(tr->langopts.numbers & NUM_SWAP_TENS) | if(tr->langopts.numbers & NUM_SWAP_TENS) | ||||
ordinal = 2; | ordinal = 2; | ||||
flags[0] |= FLAG_SKIPWORDS; | flags[0] |= FLAG_SKIPWORDS; | ||||
skipwords = 1; | skipwords = 1; | ||||
sprintf(string,"_x#%s",suffix); | |||||
Lookup(tr, string, ph_ordinal2x); // is there an alternate pronunciation? | |||||
} | } | ||||
} | } | ||||
} | } | ||||
if((tr->langopts.numbers & NUM_NOPAUSE) && (next_char == ' ')) | if((tr->langopts.numbers & NUM_NOPAUSE) && (next_char == ' ')) | ||||
utf8_in(&next_char,p); | utf8_in(&next_char,p); | ||||
if(!iswalpha(next_char) && !((wtab[thousandplex].flags & FLAG_HYPHEN_AFTER) && (thousands_exact != 0))) | |||||
if(!iswalpha(next_char) && (thousands_exact==0)) | |||||
// if(!iswalpha(next_char) && !((wtab[thousandplex].flags & FLAG_HYPHEN_AFTER) && (thousands_exact != 0))) | |||||
strcat(ph_out,str_pause); // don't add pause for 100s, 6th, etc. | strcat(ph_out,str_pause); // don't add pause for 100s, 6th, etc. | ||||
} | } | ||||
#include "translate.h" | #include "translate.h" | ||||
#include "wave.h" | #include "wave.h" | ||||
const char *version_string = "1.47.03 21.Mar.13"; | |||||
const char *version_string = "1.47.03a 21.Mar.13"; | |||||
const int version_phdata = 0x014701; | const int version_phdata = 0x014701; | ||||
int option_device_number = -1; | int option_device_number = -1; |
tr->langopts.max_initial_consonants = 3; | tr->langopts.max_initial_consonants = 3; | ||||
tr->langopts.replace_chars = NULL; | tr->langopts.replace_chars = NULL; | ||||
tr->langopts.ascii_language[0] = 0; // Non-Latin alphabet languages, use this language to speak Latin words, default is English | tr->langopts.ascii_language[0] = 0; // Non-Latin alphabet languages, use this language to speak Latin words, default is English | ||||
tr->langopts.alt_alphabet_lang = L('e','n'); | |||||
SetLengthMods(tr,201); | SetLengthMods(tr,201); | ||||
// tr->langopts.length_mods = length_mods_en; | // tr->langopts.length_mods = length_mods_en; | ||||
tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels | tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels | ||||
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA; | tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA; | ||||
tr->langopts.numbers2 = 0x2 | NUM2_MULTIPLE_ORDINAL; // variant form of numbers before thousands | |||||
tr->langopts.numbers2 = 0x2 | NUM2_MULTIPLE_ORDINAL | NUM2_ORDINAL_NO_AND; // variant form of numbers before thousands | |||||
if(name2 == L_grc) | if(name2 == L_grc) | ||||
{ | { | ||||
tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels | tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels | ||||
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ROMAN | NUM_ROMAN_AFTER; | tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ROMAN | NUM_ROMAN_AFTER; | ||||
tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL; | |||||
tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_ORDINAL_NO_AND; | |||||
if(name2 == L('c','a')) | if(name2 == L('c','a')) | ||||
{ | { | ||||
if(name2 == L('a','n')) | if(name2 == L('a','n')) | ||||
{ | { | ||||
tr->langopts.stress_flags = S_FINAL_SPANISH | S_FINAL_DIM_ONLY | S_FINAL_NO_2; | tr->langopts.stress_flags = S_FINAL_SPANISH | S_FINAL_DIM_ONLY | S_FINAL_NO_2; | ||||
tr->langopts.numbers2 = 0; | |||||
tr->langopts.numbers2 = NUM2_ORDINAL_NO_AND; | |||||
} | } | ||||
else | else | ||||
if(name2 == L_pap) | if(name2 == L_pap) | ||||
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable | tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable | ||||
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_INITIAL_2 | S_PRIORITY_STRESS; | tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_INITIAL_2 | S_PRIORITY_STRESS; | ||||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN; | tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN; | ||||
tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS; | |||||
tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS | NUM2_ORDINAL_NO_AND; | |||||
SetLetterVowel(tr,'y'); | SetLetterVowel(tr,'y'); | ||||
ResetLetterBits(tr,0x2); | ResetLetterBits(tr,0x2); | ||||
SetLetterBits(tr,1,"bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y | SetLetterBits(tr,1,"bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y |
#define NUM2_THOUSANDS_VAR4 0x100 | #define NUM2_THOUSANDS_VAR4 0x100 | ||||
#define NUM2_THOUSANDS_VAR5 0x140 | #define NUM2_THOUSANDS_VAR5 0x140 | ||||
#define NUM2_ORDINAL_NO_AND 0x800 | |||||
#define NUM2_MULTIPLE_ORDINAL 0x1000 | #define NUM2_MULTIPLE_ORDINAL 0x1000 | ||||
#define NUM2_NO_TEEN_ORDINALS 0x2000 | #define NUM2_NO_TEEN_ORDINALS 0x2000 | ||||
#define NUM2_MYRIADS 0x4000 | #define NUM2_MYRIADS 0x4000 | ||||
// 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 | ||||
// bit11=(LANG=es,an) don't say 'and' between tens and units for ordinal numbers | |||||
// bit12=(LANG=el,es) use ordinal form of hundreds and tens as well as units | // bit12=(LANG=el,es) use ordinal form of hundreds and tens as well as units | ||||
// bit13=(LANG=pt) don't use 11-19 numbers to make ordinals | // bit13=(LANG=pt) don't use 11-19 numbers to make ordinals | ||||
// bit14=(LANG=ko) use myriads (groups of 4 digits) not thousands (groups of 3) | // bit14=(LANG=ko) use myriads (groups of 4 digits) not thousands (groups of 3) |