I added initial support for Faroese language. Did the rules for most common phonetic rules that are in place for Faroese, and the ability to more easily make improvements to the phonemes, rules, and exceptions. Current status is early testing, but voice is mostly understandable at this point, and pronounces numbers by the correct rules now.master
@@ -41,6 +41,7 @@ updated languages: | |||
new languages: | |||
* ti (Tigrinya) -- Biniam Gebremichael | |||
* mto (Totontepec Mixe) -- Bill Dengler, Elizabeth Resendiz | |||
* fo (Faroese) -- Andras Eliassen, iSolveIT ApS and Setur.fo/Ravnur | |||
* kaa (Karakalpak) -- atabekm | |||
### 1.51 |
@@ -471,6 +471,7 @@ dictionaries: \ | |||
espeak-ng-data/eu_dict \ | |||
espeak-ng-data/fa_dict \ | |||
espeak-ng-data/fi_dict \ | |||
espeak-ng-data/fo_dict \ | |||
espeak-ng-data/fr_dict \ | |||
espeak-ng-data/ga_dict \ | |||
espeak-ng-data/gd_dict \ | |||
@@ -656,6 +657,9 @@ espeak-ng-data/fa_dict: dictsource/fa_list dictsource/fa_rules dictsource/fa_ext | |||
fi: espeak-ng-data/fi_dict | |||
espeak-ng-data/fi_dict: dictsource/fi_list dictsource/fi_rules dictsource/fi_extra dictsource/fi_emoji | |||
fo: espeak-ng-data/fo_dict | |||
espeak-ng-data/fo_dict: dictsource/fo_list dictsource/fo_rules dictsource/fo_extra dictsource/fo_emoji | |||
fr: espeak-ng-data/fr_dict | |||
espeak-ng-data/fr_dict: dictsource/fr_list dictsource/fr_rules dictsource/fr_extra dictsource/fr_emoji | |||
@@ -0,0 +1,179 @@ | |||
// Faroese prepared by Andras Eliassen, iSolveIT ApS (VoisIT) | |||
// This file is UTF8 encoded. | |||
// letter group B voiceless consonants c,f,h,k,p,t,x,þ | |||
// letter group F p,t,k,s | |||
// letter group H j,r,v, | |||
.L01 e i í y ý æ j // front vowels | |||
.L02 c f h k p t x s // voiceless consonants | |||
.L03 p t k | |||
.replace | |||
x xz // so that it behaves as 2 letters | |||
.group a | |||
a a | |||
.group á | |||
á %oa | |||
.group b | |||
b b | |||
bb b | |||
.group c | |||
c k | |||
c (e s | |||
c (i s | |||
.group d | |||
d d | |||
dd d | |||
.group ð | |||
ð v | |||
.group e | |||
e E: | |||
.group é | |||
é jE: | |||
.group f | |||
f f | |||
ff f | |||
.group g | |||
g g | |||
gg g | |||
e) g | |||
g (i dj | |||
.group h | |||
h h | |||
.group i | |||
i I: | |||
.group í | |||
í ui: | |||
.group j | |||
j j | |||
.group k | |||
_) k k | |||
k k | |||
k (i tj | |||
.group l | |||
l l | |||
.group m | |||
m m | |||
.group n | |||
n n | |||
nn n: | |||
.group o | |||
o O: | |||
o (CC o | |||
.group ó | |||
ó oU: | |||
.group p | |||
p p | |||
.group q | |||
q k | |||
.group r | |||
r r | |||
o) rn dn | |||
e) rn dn | |||
.group s | |||
s s | |||
ss ss2 | |||
.group t | |||
_) t t | |||
t t | |||
tt t | |||
.group u | |||
u u | |||
.group ú | |||
ú u: | |||
.group v | |||
v v | |||
.group w | |||
w v | |||
.group x | |||
x ks | |||
xz ks | |||
.group y | |||
y y | |||
.group ý | |||
ý ui: | |||
.group z | |||
z z | |||
zz ts // pizza | |||
.group æ | |||
æ @: | |||
.group ö | |||
ö W: | |||
.group ø | |||
ø W: | |||
.group | |||
$ dOllari | |||
@@ -0,0 +1,4 @@ | |||
name Faroese | |||
language fo | |||
maintainer iSolveIT ApS (Andras Eliassen) <[email protected]> | |||
status testing |
@@ -0,0 +1,458 @@ | |||
//========================================================= | |||
// Faroese | |||
//========================================================= | |||
phoneme : // Lengthen previous vowel by "length" | |||
virtual | |||
length 110 | |||
endphoneme | |||
// Vowels | |||
//======= | |||
phoneme i | |||
vwl starttype #i endtype #i | |||
length 130 | |||
IfNextVowelAppend(;) | |||
FMT(vowel/ii_6) | |||
endphoneme | |||
phoneme i: | |||
vwl starttype #i endtype #i | |||
length 230 | |||
IfNextVowelAppend(;) | |||
ChangeIfNotStressed(i) | |||
FMT(vowel/i_4) | |||
endphoneme | |||
phoneme I | |||
vwl starttype #i endtype #i | |||
length 130 | |||
IfNextVowelAppend(;) | |||
FMT(vowel/ii) | |||
endphoneme | |||
phoneme I: | |||
vwl starttype #i endtype #i | |||
length 230 | |||
IfNextVowelAppend(;) | |||
ChangeIfNotStressed(I) | |||
FMT(vowel/ii) | |||
endphoneme | |||
phoneme E | |||
vwl starttype #e endtype #e | |||
length 130 | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme E: | |||
vwl starttype #e endtype #e | |||
length 130 | |||
FMT(vowel/e_e) | |||
endphoneme | |||
phoneme A | |||
vwl starttype #@ endtype #@ | |||
length 130 | |||
FMT(vowel/a#_2) | |||
endphoneme | |||
phoneme a | |||
vwl starttype #a endtype #a | |||
length 130 | |||
FMT(vowel/a#_2) | |||
endphoneme | |||
phoneme a: | |||
vwl starttype #a endtype #a | |||
length 230 | |||
ChangeIfNotStressed(a) | |||
FMT(vowel/aa_8) | |||
endphoneme | |||
phoneme O | |||
vwl starttype #o endtype #o | |||
length 130 | |||
FMT(vowel/oo_5) | |||
endphoneme | |||
phoneme O: | |||
vwl starttype #o endtype #o | |||
length 230 | |||
ChangeIfNotStressed(O) | |||
FMT(vdiph2/o_oo) | |||
endphoneme | |||
phoneme 2 | |||
vwl starttype #o endtype #e | |||
length 130 | |||
FMT(vowel/oe) | |||
endphoneme | |||
phoneme 2: | |||
vwl starttype #o endtype #e | |||
length 230 | |||
ChangeIfNotStressed(2) | |||
FMT(vowel/oe_4) | |||
endphoneme | |||
phoneme 3 | |||
vwl starttype #e endtype #u | |||
length 130 | |||
FMT(vowel/e_6) | |||
endphoneme | |||
phoneme 3: | |||
vwl starttype #e endtype #u | |||
length 230 | |||
ChangeIfNotStressed(2) | |||
FMT(vowel/e_6) | |||
endphoneme | |||
phoneme 4 | |||
vwl starttype d endtype d | |||
length 130 | |||
WAV(x/d) | |||
endphoneme | |||
phoneme 4: | |||
vwl starttype d endtype d | |||
length 230 | |||
ChangeIfNotStressed(4) | |||
WAV(x/d_) | |||
endphoneme | |||
phoneme 5 | |||
vwl starttype t endtype h | |||
length 130 | |||
WAV(ustop/th_rfx) | |||
endphoneme | |||
phoneme 5: | |||
vwl starttype t endtype h | |||
length 230 | |||
ChangeIfNotStressed(5) | |||
WAV(ustop/th_rfx2) | |||
endphoneme | |||
phoneme 8 | |||
vwl starttype #@ endtype #@ | |||
length 130 | |||
FMT(vowel/@) | |||
endphoneme | |||
phoneme 8: | |||
vwl starttype #@ endtype #@ | |||
length 230 | |||
ChangeIfNotStressed(2) | |||
FMT(vowel/@) | |||
endphoneme | |||
phoneme 9 | |||
vwl starttype #e endtype #a | |||
length 130 | |||
FMT(vowel/@_2) | |||
endphoneme | |||
phoneme 9: | |||
vwl starttype #e endtype #a | |||
length 230 | |||
ChangeIfNotStressed(9) | |||
FMT(vowel/@_4) | |||
endphoneme | |||
phoneme u | |||
vwl starttype #u endtype #u | |||
length 130 | |||
FMT(vowel/u_2) | |||
endphoneme | |||
phoneme u: | |||
vwl starttype #u endtype #u | |||
length 230 | |||
ChangeIfNotStressed(u) | |||
FMT(vowel/u_bck) | |||
endphoneme | |||
phoneme U | |||
vwl starttype #u endtype #u | |||
length 110 | |||
FMT(vowel/u_2) | |||
endphoneme | |||
phoneme y | |||
vwl starttype #@ endtype #@ | |||
length 130 | |||
FMT(vowel/y##) | |||
endphoneme | |||
phoneme y: | |||
vwl starttype #i endtype #i | |||
length 230 | |||
ChangeIfNotStressed(y) | |||
FMT(vowel/yy_4) | |||
endphoneme | |||
phoneme W | |||
vwl starttype #@ endtype #@ | |||
length 130 | |||
FMT(vowel/y#_3) | |||
endphoneme | |||
phoneme W: | |||
vwl starttype #@ endtype #@ | |||
length 130 | |||
ChangeIfNotStressed(W) | |||
FMT(vowel/y#_3) | |||
endphoneme | |||
phoneme aI | |||
vwl starttype #a endtype #i | |||
length 170 | |||
FMT(vdiph/ai_7) | |||
endphoneme | |||
phoneme aI: | |||
vwl starttype #a endtype #i | |||
length 230 | |||
ChangeIfNotStressed(aI) | |||
FMT(vdiph/ai_7) | |||
endphoneme | |||
phoneme eI | |||
vwl starttype #e endtype #i | |||
length 170 | |||
FMT(vdiph/ei) | |||
endphoneme | |||
phoneme eI: | |||
vwl starttype #e endtype #i | |||
length 230 | |||
ChangeIfNotStressed(eI) | |||
FMT(vdiph/ei) | |||
endphoneme | |||
phoneme aU | |||
vwl starttype #a endtype #u | |||
length 170 | |||
FMT(vdiph/aau) | |||
endphoneme | |||
phoneme aU: | |||
vwl starttype #a endtype #u | |||
length 230 | |||
ChangeIfNotStressed(aU) | |||
FMT(vdiph/aau) | |||
endphoneme | |||
phoneme oU | |||
vwl starttype #o endtype #u | |||
length 170 | |||
FMT(vdiph/ou_3) | |||
endphoneme | |||
phoneme oU: // long version for óf | |||
vwl starttype #o endtype #u | |||
length 230 | |||
ChangeIfNotStressed(oU) | |||
FMT(vdiph/ou_3) | |||
endphoneme | |||
phoneme Yy | |||
vwl starttype #@ endtype #i | |||
length 150 | |||
FMT(vdiph/y#i_2) | |||
endphoneme | |||
phoneme Y | |||
vwl starttype #@ endtype #i | |||
length 150 | |||
FMT(vdiph/y#i_2) | |||
endphoneme | |||
phoneme Yy: | |||
vwl starttype #@ endtype #i | |||
length 220 | |||
ChangeIfNotStressed(Yy) | |||
FMT(vdiph/y#i_2) | |||
endphoneme | |||
phoneme OI | |||
vwl starttype #o endtype #i | |||
length 210 | |||
FMT(vdiph/oi) | |||
endphoneme | |||
phoneme yI | |||
vwl starttype #i endtype #i | |||
length 180 | |||
FMT(vowel/yy_4) | |||
endphoneme | |||
// Consonants | |||
//=========== | |||
phoneme m# | |||
vcd blb nas | |||
lengthmod 6 | |||
ipa m# | |||
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk | |||
FMT(m/m#_) | |||
endphoneme | |||
phoneme M | |||
vcd blb nas | |||
lengthmod 6 | |||
ipa m# | |||
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk | |||
FMT(m/m#_) | |||
endphoneme | |||
phoneme n# | |||
vcd alv nas | |||
lengthmod 6 | |||
ipa n# | |||
Vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk | |||
NextVowelStarts | |||
VowelStart(n/n@) | |||
VowelStart(n/na) | |||
VowelStart(n/ne) | |||
VowelStart(n/ni) | |||
VowelStart(n/no) | |||
VowelStart(n/nu) | |||
EndSwitch | |||
FMT(n/n#_) | |||
endphoneme | |||
phoneme n^# | |||
vcd pal nas pzd | |||
lengthmod 6 | |||
ipa ɲ# | |||
Vowelout f1=3 f2=2300 300 400 f3=100 80 brk rate | |||
FMT(n^/n^#_) | |||
endphoneme | |||
phoneme N# | |||
vcd vel nas | |||
lengthmod 6 | |||
ipa ŋ# | |||
Vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk | |||
NextVowelStarts | |||
VowelStart(nn/nn@) | |||
VowelStart(nn/nna) | |||
VowelStart(nn/nne) | |||
VowelStart(nn/nni) | |||
VowelStart(nn/nno) | |||
VowelStart(nn/nnu) | |||
EndSwitch | |||
FMT(nn/nn#_) | |||
endphoneme | |||
phoneme l# | |||
vls alv frc | |||
lengthmod 3 | |||
ipa l# | |||
WAV(ufric/l#, 25) | |||
endphoneme | |||
phoneme tl# | |||
vls alv stp | |||
lengthmod 2 | |||
ipa tl# | |||
Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | |||
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
WAV(ufric/tl#, 50) | |||
endphoneme | |||
phoneme r# // used for [r] when not preceding a vowel | |||
liquid | |||
lengthmod 2 // | |||
ipa r# | |||
FMT(r3/r#_) addWav(r3/rx) | |||
// before n r3/r_n+r3/rx | |||
endphoneme | |||
phoneme b | |||
vls blb stp | |||
lengthmod 5 | |||
Vowelin f1=1 f2=1000 -300 -200 f3=-200 80 amp=11 | |||
Vowelout f1=2 f2=1000 -300 -300 f3=-300 80 brk | |||
WAV(x/b) | |||
endphoneme | |||
phoneme d | |||
vls alv stp | |||
lengthmod 5 | |||
Vowelin f1=2 f2=1700 -300 300 f3=-100 80 | |||
Vowelout f1=2 f2=1700 -300 300 f3=-100 80 | |||
IF nextPh(isPause2) THEN | |||
WAV(x/d_) | |||
ENDIF | |||
WAV(x/d, 80) | |||
endphoneme | |||
phoneme g | |||
vls vel stp | |||
lengthmod 5 | |||
Vowelin f1=2 f2=2300 200 300 f3=-300 80 | |||
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk | |||
IF nextPh(isPause2) THEN | |||
WAV(x/g_) | |||
ENDIF | |||
WAV(x/g2, 150) | |||
endphoneme | |||
phoneme H | |||
vls glt frc | |||
ipa h | |||
WAV(h/h_phr) | |||
endphoneme | |||
phoneme v // no fricative noise | |||
import_phoneme base1/v# | |||
voicingswitch f | |||
endphoneme | |||
phoneme s2 // 2nd part of geminated s | |||
import_phoneme consonants/s2 | |||
endphoneme | |||
@@ -1708,6 +1708,9 @@ include ph_farsi | |||
phonemetable fi base1 | |||
include ph_finnish | |||
phonemetable fo base1 | |||
include ph_faroese | |||
phonemetable smj base1 | |||
include ph_lule_saami | |||
@@ -834,6 +834,17 @@ Translator *SelectTranslator(const char *name) | |||
SetLetterVowel(tr, 'y'); | |||
} | |||
break; | |||
case L('f', 'o'): // Faroese | |||
{ | |||
//static const short stress_lengths_da[8] = { 160, 140, 200, 200, 0, 0, 220, 230 }; | |||
//SetupTranslator(tr, stress_lengths_da, NULL); | |||
//tr->langopts.stress_rule = STRESSPOSN_1L; | |||
//tr->langopts.param[LOPT_PREFIXES] = 1; | |||
//SetLetterVowel(tr, 'y'); | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL; | |||
} | |||
break; | |||
case L('f', 'r'): // french | |||
{ | |||
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); |
@@ -144,6 +144,9 @@ | |||
<Component Id="fi_dict" Guid="A940BAEF-840D-4A76-AF8E-1971E88F9057"> | |||
<File Id="fi_dict" KeyPath="yes" Source="$(var.ProjectDir)\..\..\..\espeak-ng-data\fi_dict" /> | |||
</Component> | |||
<Component Id="fo_dict" Guid="68CBDAF4-8D0E-44CC-8523-3E0CF5343024"> | |||
<File Id="fo_dict" KeyPath="yes" Source="$(var.ProjectDir)\..\..\..\espeak-ng-data\fo_dict" /> | |||
</Component> | |||
<Component Id="fr_dict" Guid="437EC744-1AF9-49CF-8058-BEBDE579EF79"> | |||
<File Id="fr_dict" KeyPath="yes" Source="$(var.ProjectDir)\..\..\..\espeak-ng-data\fr_dict" /> | |||
</Component> | |||
@@ -532,6 +535,9 @@ | |||
<Component Id="da" Guid="F2056D5A-95BE-4141-9884-BDECCD20911F"> | |||
<File Id="da" KeyPath="yes" Source="$(var.ProjectDir)\..\..\..\espeak-ng-data\lang\gmq\da" /> | |||
</Component> | |||
<Component Id="fo" Guid="0786F902-D75C-4A41-956B-A6D2F25180A2"> | |||
<File Id="fo" KeyPath="yes" Source="$(var.ProjectDir)\..\..\..\espeak-ng-data\lang\gmq\fo" /> | |||
</Component> | |||
<Component Id="is" Guid="D77DC66C-17BA-425C-A1E4-18D9CAC03284"> | |||
<File Id="is" KeyPath="yes" Source="$(var.ProjectDir)\..\..\..\espeak-ng-data\lang\gmq\is" /> | |||
</Component> | |||
@@ -1490,6 +1496,7 @@ | |||
<ComponentRef Id="eu_dict" /> | |||
<ComponentRef Id="fa_dict" /> | |||
<ComponentRef Id="fi_dict" /> | |||
<ComponentRef Id="fo_dict" /> | |||
<ComponentRef Id="fr_dict" /> | |||
<ComponentRef Id="ga_dict" /> | |||
<ComponentRef Id="gd_dict" /> | |||
@@ -1695,6 +1702,7 @@ | |||
<ComponentRef Id="uz" /> | |||
<ComponentRef Id="et" /> | |||
<ComponentRef Id="fi" /> | |||
<ComponentRef Id="fo" /> | |||
<ComponentRef Id="hu" /> | |||
<ComponentRef Id="smj" /> | |||
<ComponentRef Id="be" /> |
@@ -53,6 +53,7 @@ test_phwav eu 804e3829faa40e6e48aa43ad5a372372808d66f6 "ma na n^a pa ta ca ka ba | |||
test_phwav fa d2bdd62b68a21cea12d095b5032c7eb19759c133 "ma na Na pa ba ta da ka ga qa ?a fa va sa za Sa Za xa Qa ha tSa dZa Ra la ja _:_ mA mi mu ma me mo meI moU" | |||
test_phwav fa-Latn d2bdd62b68a21cea12d095b5032c7eb19759c133 "ma na Na pa ba ta da ka ga qa ?a fa va sa za Sa Za xa Qa ha tSa dZa Ra la ja _:_ mA mi mu ma me mo meI moU" | |||
test_phwav fi 38e641b031af4f2d39ee150ca3f26f4bc84d9aa0 "ma na Na pa ba ta da ka ga ?a fa sa Sa ha va la ja Ra R2a s2a _:_ mi mI me m& ma ma2 mo mY mu mu1 mU my mai m&i moi mei mYi mui myi mau mou meu miu m&y mey mYy miy muo mie myY" | |||
test_phwav fo 13c22fcd8aa140bd22e3299fdcc75b5b2c2308ca "m#a ma n#a na n^#a n^a N#a Na pa ta ca ka fa va Ta Da sa Ca J^a xa Qa ha l#a la tl#a r#a ra _:_ mi mi: mI mI: mE mE: ma ma: mO mO: mu mu: my my: mW mW: maI maI: meI meI: maU maU: moU moU: mYy mOI myI" | |||
test_phwav fr 4e312a224c8976da90a7faec8edabbc2fe311310 "ma na n^a Na pa ta ka ba da ga fa sa Sa va za Za la ja ra Ra wa r2a r/a r/2a l/a l/2a w/a n2a p2a t2a t3a z2a z3a _:_ m@ m@- ma ma- me me- mE mE- mi mj/ mo mO moU mu mu: my my- mW mY mA~ mE~ mO~ mW~ _:_ ma# mI mI2 mW2 mV" | |||
test_phwav fr-BE 4e312a224c8976da90a7faec8edabbc2fe311310 "ma na n^a Na pa ta ka ba da ga fa sa Sa va za Za la ja ra Ra wa r2a r/a r/2a l/a l/2a w/a n2a p2a t2a t3a z2a z3a _:_ m@ m@- ma ma- me me- mE mE- mi mj/ mo mO moU mu mu: my my- mW mY mA~ mE~ mO~ mW~ _:_ ma# mI mI2 mW2 mV" | |||
test_phwav fr-CH 4e312a224c8976da90a7faec8edabbc2fe311310 "ma na n^a Na pa ta ka ba da ga fa sa Sa va za Za la ja ra Ra wa r2a r/a r/2a l/a l/2a w/a n2a p2a t2a t3a z2a z3a _:_ m@ m@- ma ma- me me- mE mE- mi mj/ mo mO moU mu mu: my my- mW mY mA~ mE~ mO~ mW~ _:_ ma# mI mI2 mW2 mV" |