Files
espeak-ng/phsource/ph_danish
T
jonsd 394869c5c2 [1.47.03f]
Fix, speak letter names of Hangul (Korean) characters.
Fix, ChangePhoneme(NULL) caused problems for word-gap options.
Recognize Arabic comma U+060C.
Languages changes: pt, nl, bn, te, da.


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@336 d46cf337-b52f-0410-862d-fd96e6ae7743
2013-03-31 23:05:17 +00:00

658 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// PB General rules for vowels:
// Short vowels
// ACC: Short "pille" [p?el@-], "andre" [AndRV]
// AC[V]: Short "piler" [p?ilV] - verbs, not nouns, which is a problem
// A[N]: Short "bange" [b?AN@-]
// Long vowels
// A + @- OR V: Long "ae" "aer" [&:@-]
// AC + @- OR V: Long "pile" [pi:l@-]
// AC[i]: Long "smidig" [smi:Di]
// Change the length of short vowels (?+vowel)
procedure ShortVowelLength
// "endelig" - Short initial vowel sounds too short
IF thisPh(isWordStart) THEN
length 160
RETURN
ENDIF
// "slutte" t/d + @- makes the u too long
IF next2PhW(@-) THEN
IF nextPhW(t) OR nextPhW(d) THEN
//length 100
LengthAdd -50
// Don't shorten it further if it comes after an "r" sound
// Exit the procedure
RETURN
ENDIF
ENDIF
// "bygget" - consonant + [@-D] makes the vowel too long
IF next2PhW(@-) THEN
IF next3PhW(t) OR next3PhW(d) OR next3PhW(D) THEN
LengthAdd -50
// Don't shorten it further if it comes after an "r" sound ("brygget")
// Exit the procedure
RETURN
ENDIF
ENDIF
// "bygger" - consonant + [V] makes the vowel too long
IF nextPhW(isNotVowel) AND next2PhW(V) THEN
LengthAdd -50
// Don't shorten it further if it comes after an "r" sound ("brygger")
// Exit the procedure
RETURN
ENDIF
// "rigtigt", "fred", "frem", "centralen" - R makes the vowel too long
IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
// length 100
LengthAdd -50
ENDIF
// "ring", "ringe", "fængsel"
IF nextPhW(N) THEN
// length 100
LengthAdd -10
ENDIF
// "sigte" t/d + @- makes the vowel too long
IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) THEN
IF next3PhW(@-) THEN
// length 100
LengthAdd -50
ENDIF
ENDIF
endprocedure
// Change the length of normal vowels (without ? in front of them)
procedure LongVowelLength
// "alene" - Short initial vowel sounds too short at length 140
IF thisPh(isWordStart) THEN
length 160
RETURN
ENDIF
// "forlade" - [D@-] makes the vowel too long
IF nextPhW(D) AND next2PhW(@-) THEN
length 180
RETURN
ENDIF
// PB long vowel followed by [@-] or [V](vowel+vowel) - "pigen" [p'i@-n]
IF nextPhW(@-) OR nextPhW(V) THEN
length 225
ENDIF
// PB "enig", "enige", "evig", "stædig" - vowel+consolant+[i]
IF nextPhW(isNotVowel) AND next2PhW(i) THEN
length 225
ENDIF
// "ræve", "dele", "mene", "røve", "møve"
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(3) OR next3PhW(@-) THEN
length 225
ENDIF
// "vilje", "nedladende" [n'eDl&D@-n@-], "delte" - short followed by 2 consonants
IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
// Don't make "møve" [m'Ww_!@-_!] short
IF NOT next2PhW(_!) THEN
length 140
ENDIF
ENDIF
// "bryde", "bryder", "strålen", "henrivende" R makes the vowel too long
IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
IF next2PhW(@-) OR next2PhW(V) THEN
// length 180
LengthAdd -70
ENDIF
ENDIF
// "syste", "sylte" t/d/D + @- makes the vowel too long
// "international", - added [V] TEST
IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) OR next2PhW(D) THEN
IF next3PhW(@-) OR next3PhW(V) THEN
length 110
ENDIF
ENDIF
// "glimrende" [l/3] makes the following vowel too long
// LengthAdd doesn't work here. The length could be 225 or 140 - 30
IF prevPhW(l/3) THEN
// LengthAdd -30
length 110
ENDIF
// "længe" - short - 2 consonants => 1 consonant (ng => [N])
IF nextPhW(N) THEN
length 140
ENDIF
endprocedure
// A bit longer than [@-]
phoneme @
vowel starttype #@ endtype #@
unstressed
length 60
FMT(vowel/@_3)
endphoneme
phoneme @- // very short schwa
vowel starttype #@ endtype #@
unstressed nonsyllabic
ipa ə
IF nextPhW(*) OR nextPhW(r) THEN
ipa NULL // @-* is used to make 'r'
ENDIF
length 50
// "femten", "manden" - only a short "n" sound
IF nextPhW(n) THEN
length 15
ENDIF
IF prevPhW(isNotVowel) AND thisPh(isWordEnd) THEN
length 15
ENDIF
// "lige" [li@-]
IF prevPhW(i) AND thisPh(isWordEnd) THEN
length 15
ENDIF
FMT(vowel/@-)
endphoneme
// ToDo: change [@] to [a#] if adjacent to [r] or [R]
phoneme 3
vowel starttype #a endtype #a
unstressed
length 40
FMT(vowel/a#_3)
endphoneme
// PB sort of schwa [ɐ] (0250+032F)
// "spurgt" [sp'o3-d] – ipa [spˈoɐ̯d]
phoneme 3- // used for 'r' after a vowel (to create a diphthong)
liquid
lengthmod 7
ipa ɐ̯
FMT(r/a_)
endphoneme
phoneme i
vowel starttype #i endtype #i
length 140
// Long vowel followed by consonant and @- "gide", "pile"
IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
// length 225
ENDIF
// "gider", vrider"
IF nextPhW(D) AND next2PhW(V) OR next2PhW(?V) THEN
length 140
ENDIF
//"skider" short
IF nextPhW(D) AND next2PhW(V) THEN
length 140
ENDIF
//"skideren" long
IF nextPhW(D) AND next2PhW(V) AND next3PhW(V) THEN
length 225
ENDIF
CALL LongVowelLength
FMT(vowel/i_4)
endphoneme
// PB short i
// sviret vs. svirret
phoneme ?i
vowel starttype #i endtype #i
length 140
CALL ShortVowelLength
IfNextVowelAppend(;)
FMT(vowel/i_4)
endphoneme
// PB English i - Tim
phoneme I
vowel starttype #i endtype #i
length 130
IfNextVowelAppend(;)
FMT(vowel/ii_2)
endphoneme
phoneme e
vowel starttype #e endtype #e
length 140
CALL LongVowelLength
CALL ShortVowelLength
FMT(vowel/e)
endphoneme
// PB short e
// "skille" vs. "skele", "pille" vs. "pile"
phoneme ?e
vowel starttype #e endtype #e
length 140
CALL ShortVowelLength
FMT(vowel/e)
endphoneme
phoneme E
vowel starttype #e endtype #e
length 140
// no link with next vowel
IF thisPh(isWordEnd) THEN
IfNextVowelAppend(_!)
ENDIF
// "ære", "kærester", "ærefrygt" - vowel + vowel
IF nextPhW(V) THEN
length 225
ENDIF
// "dræber" TEST shortened by -70 in procedure because of the "r" sound
IF prevPhW(R) OR prevPhW(r) OR prevPhW(3-) AND next2PhW(V) THEN
length 225
ENDIF
CALL LongVowelLength
// "værelse" [v'E3-Vls@_!]
IF nextPhW(3-) AND next2PhW(V) THEN
length 100
ENDIF
FMT(vowel/e_mid2)
endphoneme
// PB short E
// "læsse" vs. "læse"
phoneme ?E
vowel starttype #e endtype #e
ipa ε
length 140
CALL ShortVowelLength
FMT(vowel/e_mid2)
endphoneme
phoneme &
vowel starttype #e endtype #e
ipa æ
length 140
// "same", "sale", "bade" - consonant + @-: long
// but NOT "hinanden"
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(@) THEN
IF NOT next3PhW(n) THEN
length 225
ENDIF
ENDIF
// ThisPh + V or @-
// "ae", "aer" vowel + vowel: extra length
IF nextPhW(@-) OR nextPhW(V) THEN
length 260
ENDIF
CALL LongVowelLength
FMT(vowel/ee_2)
endphoneme
// Short &
// e.g. the last a in "staldkarl"
// "sale" vs. "sal"
phoneme ?&
vowel starttype #e endtype #e
length 140
FMT(vowel/ee_2)
endphoneme
// Added for the æ in "dræbt"
phoneme &#
vowel starttype #e endtype #e
length 140
ipa a
CALL LongVowelLength
// CALL ShortVowelLength
FMT(vowel/&)
endphoneme
// PB short &#
// "revl" vs. "tremme"
phoneme ?&#
vowel starttype #e endtype #e
length 140
CALL ShortVowelLength
FMT(vowel/&)
endphoneme
phoneme A // PB changed to a_8
vowel starttype #a endtype #a
length 140
CALL LongVowelLength
// "fare" [f'A:A]
IF nextPhW(A) THEN
length 225
ENDIF
FMT(vowel/a_8)
endphoneme
// PB short A
// "krabbe" vs. "drabelig"
phoneme ?A
vowel starttype #a endtype #a
length 140
CALL ShortVowelLength
FMT(vowel/a_8)
endphoneme
phoneme u
vowel starttype #u endtype #u
length 140
// "suge", "uge", "bluse", "julegave"
IF nextPhW(@-) OR nextPhW(V) OR next2PhW(@-) OR next2PhW(V)THEN
length 225
ENDIF
CALL LongVowelLength
FMT(vowel/u_bck)
endphoneme
// Short u
// "tude" vs. "tuden" - [tuD3] [t?uD@n]
phoneme ?u
vowel starttype #u endtype #u
length 140
CALL ShortVowelLength
FMT(vowel/u_bck)
endphoneme
phoneme o
vowel starttype #o endtype #o
length 140
// "bore", "borer" [boV] o + V
IF nextPhW(V) OR nextPhW(@-) THEN
length 225
ENDIF
// "kone", "koner" o + consonant + V or @-
IF next2PhW(V) OR next2PhW(@-) THEN
length 225
ENDIF
CALL LongVowelLength
FMT(vowel/o_2)
endphoneme
// PB Short o
// "patron" vs. "kone"
phoneme ?o
vowel starttype #o endtype #o
length 140
FMT(vowel/o_2)
endphoneme
phoneme O
vowel starttype #o endtype #o
length 140
ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
// "sove", "sover" - consonant + @ or V: long
IF next2PhW(@-) OR next2PhW(V) THEN
length 225
ENDIF
// PB "gået" - ThisPh + V or @-
IF nextPhW(V) OR nextPhW(@-) THEN
length 225
ENDIF
// "såre", "sårede" [s'O:?OD@-]
IF nextPhW(O) OR nextPhW(?O) THEN
length 225
ENDIF
CALL LongVowelLength
FMT(vowel/o_5)
endphoneme
// Short O
// "toget" vs. "tåget"
phoneme ?O
vowel starttype #o endtype #o
length 140
FMT(vowel/o_5)
endphoneme
phoneme V
vowel starttype #@ endtype #@
length 140
CALL LongVowelLength
FMT(vowel/V_4)
endphoneme
// PB Short V
// "forstår" vs. "kåre"
phoneme ?V
vowel starttype #@ endtype #@
length 140
FMT(vowel/V_4)
endphoneme
phoneme 0
vowel starttype #o endtype #o
length 140
ipa ɔ
FMT(vowel/oo_2)
endphoneme
// Short 0 "sukker"
phoneme ?0
vowel starttype #o endtype #o
length 140
ipa ɔ
FMT(vowel/oo_2)
endphoneme
phoneme y
vowel starttype #i endtype #i
length 140
// PB long vowel followed by consonant and certain vowels
// "gyde", "gyder"
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
// not "gebyret" TEST
IF NOT nextPhW(3-) AND NOT nextPhW(R) AND NOT nextPhW(r) THEN
length 225
ENDIF
ENDIF
// "syge" [sy@-] vowel + vowel: extra length, but NOT "fyret" [fyVD]
IF nextPhW(@-) OR nextPhW(3) AND NOT next2PhW(D) THEN
length 225
ENDIF
// "tyve"
IF nextPhW(w) AND next2PhW(@-) THEN
length 225
ENDIF
CALL LongVowelLength
FMT(vowel/y)
endphoneme
// PB Short y
// "kylling" vs. "kyle", "krybbe" vs. "krybe"
phoneme ?y
vowel starttype #i endtype #i
length 140
CALL ShortVowelLength
FMT(vowel/y)
endphoneme
phoneme Y
vowel starttype #i endtype #i
length 140
IF nextPhW(V) OR nextPhW(@-) THEN
length 225
ENDIF
FMT(vowel/yy)
endphoneme
phoneme W
vowel starttype #@ endtype #@
length 140
// "røveri" but NOT "surfer" [sWfV] TEST
IF next2PhW(V) OR next2PhW(?V) AND NOT next2PhW(isFinalVowel) THEN
length 140
ENDIF
// "børnebog" - short
IF nextPhW(r) AND next2PhW(n) AND next3PhW(@-) THEN
length 140
ENDIF
CALL LongVowelLength
FMT(vowel/oe)
endphoneme
// Short W
// "prøv" vs. "prøve"
phoneme ?W
vowel starttype #@ endtype #@
length 140
CALL ShortVowelLength
FMT(vowel/oe)
endphoneme
// Added for the ø in "røv", "røg", "øje" instead of [V3]
phoneme W#
vowel starttype #@ endtype #@
length 140 //225
// PB long vowel followed by consonant and certain vowels
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(@) OR next2PhW(3) OR next2PhW(V) OR next2PhW(?V) THEN
length 225
ENDIF
FMT(vowel/V)
endphoneme
// Short W#
// "rømme"
phoneme ?W#
vowel starttype #@ endtype #@
length 140
CALL ShortVowelLength
FMT(vowel/V)
endphoneme
phoneme aI
vowel starttype #a endtype #i
length 300
IF NOT next2Ph(3) AND NOT next2Ph(V) AND NOT next2Ph(@-) AND nextPhW(isNotVowel) THEN
glstop
length 225
ENDIF
// "dreje" [dR'aI@-_!]
IF nextPhW(3) OR nextPhW(V) OR nextPhW(@) OR nextPhW(@-) THEN
length 280
ENDIF
// PB "drej" vs. "dreje"
IF thisPh(isWordEnd) THEN
length 140
ENDIF
// "lejde" [l'aId@-_!], "lejder" [l'aIdV_!]
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
length 190
ENDIF
FMT(vdiph/ai)
endphoneme
// CONSONANTS
// PB added l/3
phoneme l
liquid
lengthmod 7
// [ll] => [-l] - avoid double l
IF nextPhW(l) THEN
// ChangePhoneme(-)
ENDIF
ChangePhoneme(l/3)
// CALL base/l
endphoneme
phoneme l/3 // Replacement for [l/]
liquid
lengthmod 7
FMT(l/l_)
endphoneme
phoneme v // approximant, not fricative
import_phoneme base/v#
voicingswitch f
endphoneme
// PB Actually a kind of schwa = [ɐ]? - "byder" [bˈyðɐʌ]
phoneme r // used for 'r' after a vowel (to create a diphthong)
liquid
lengthmod 7
ipa ɐ̯
IF nextPhW(isVowel) AND NOT nextPhW(?V) AND NOT nextPhW(V) AND NOT nextPhW(@-) THEN
ChangePhoneme(R)
ENDIF
FMT(r/a_)
endphoneme
phoneme R
lengthmod 6
liquid
ipa ʁ
FMT(r/aa)
endphoneme
// don't weaken consonants at end of word or before a stop
phoneme s
vls alv frc sibilant
voicingswitch z
lengthmod 3
Vowelin f1=0 f2=1700 -300 300 f3=-100 80
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
IF nextPh(p) OR nextPh(t) OR nextPh(k) THEN
WAV(ufric/s!)
ENDIF
WAV(ufric/s)
endphoneme
phoneme p
vls blb stop
voicingswitch b
lengthmod 7
Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 amp=11
Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=22
IF nextPh(isPause2) THEN
WAV(ustop/p_unasp)
ELIF nextPh(r) THEN
WAV(ustop/pr, 70)
ELIF nextPh(R) OR nextPh(R2) THEN
WAV(ustop/pr)
ELIF nextPh(@-) THEN
WAV(ustop/p_unasp)
ELIF nextPh(l) THEN
WAV(ustop/pl)
ENDIF
WAV(ustop/p)
endphoneme
phoneme t
vls alv stop
voicingswitch d
lengthmod 7
Vowelin f1=0 f2=1700 -300 300 f3=-100 80
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
IF nextPh(r) OR nextPh(R) OR nextPh(R2) THEN
WAV(ustop/tr)
ENDIF
// "respekt" [REsp'Egd]
IF thisPh(isWordEnd) THEN
// ChangePhoneme(d)
ENDIF
WAV(ustop/t, 90)
endphoneme
phoneme j
liquid palatal
lengthmod 7
// no link with next vowel
IF thisPh(isWordEnd) THEN
IfNextVowelAppend(_!)
ENDIF
IF nextPhW(isVowel) THEN
NextVowelStarts
VowelStart(j/j@)
VowelStart(j/ja)
VowelStart(j/je,-35)
VowelStart(j/ji)
VowelStart(j/jo,-65) // "kjole"
VowelStart(j/ju)
EndSwitch
Vowelout len=70
VowelEnding(j/xj, -30)
IF prevPh(isPause) THEN
FMT(j/_j)
ENDIF
ELSE
// no vowel follows
Vowelout len=70
FMT(j/j_)
ENDIF
endphoneme