Browse Source

Added Faroese language (#1914)

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
Juho Hiltunen 11 months ago
parent
commit
6dace09267
No account linked to committer's email address

+ 1
- 0
ChangeLog.md View File

@@ -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

+ 4
- 0
Makefile.am View File

@@ -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
dictsource/fo_emoji View File


+ 228272
- 0
dictsource/fo_list
File diff suppressed because it is too large
View File


+ 179
- 0
dictsource/fo_rules View File

@@ -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



+ 4
- 0
espeak-ng-data/lang/gmq/fo View File

@@ -0,0 +1,4 @@
name Faroese
language fo
maintainer iSolveIT ApS (Andras Eliassen) <[email protected]>
status testing

+ 458
- 0
phsource/ph_faroese View File

@@ -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


+ 3
- 0
phsource/phonemes View File

@@ -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


+ 11
- 0
src/libespeak-ng/tr_languages.c View File

@@ -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);

+ 8
- 0
src/windows/installer/Product.wxs View File

@@ -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" />

+ 1
- 0
tests/language-phonemes.test View File

@@ -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"

Loading…
Cancel
Save