mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 13:38:47 +00:00
945 lines
21 KiB
Plaintext
945 lines
21 KiB
Plaintext
// 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]
|
||
|
||
// Vowel length changed by eSpeak
|
||
// Between two voiced consonants
|
||
// After [l/3]
|
||
// Before [l/3]
|
||
// After an "r" sound
|
||
// Before [N]
|
||
// Before voiced consonant + [i]
|
||
|
||
// PROCEDURES
|
||
|
||
// Change the length of SHORT vowels (?+vowel)
|
||
procedure ShortVowelLength
|
||
// "endelig", "ånder", "ynde" - Short initial vowel sounds too short TEST
|
||
IF thisPh(isWordStart) AND nextPhW(n) THEN
|
||
IF next2PhW(@-) OR next2PhW(V) THEN
|
||
IF next2PhW(isWordEnd) THEN // NOT "ondeste"
|
||
length 170
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "blod" "slutte", "løn" l/3 makes the vowel too long
|
||
// NOT "mel'oner"
|
||
IF prevPhW(l/3) AND thisPh(isFirstVowel) THEN
|
||
IF thisPh(isStressed) THEN
|
||
length 100
|
||
IF nextPhW(N) THEN // [N] makes it even longer - "længden"
|
||
LengthAdd -20
|
||
ENDIF
|
||
// Don't shorten it further if it comes after an "r" sound
|
||
// Exit the procedure
|
||
RETURN
|
||
ENDIF
|
||
// "transplantation" - the second a - between 2 voiced consonants
|
||
IF nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
|
||
length 100
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "bygge", "bygget", "byggede" - consonant + [@-] makes the vowel too long
|
||
IF NOT thisPh(?V) THEN // NOT "fjollet"
|
||
IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN
|
||
IF next2PhW(@-) THEN //AND next3PhW(D) THEN
|
||
IF thisPh(isFirstVowel) THEN // NOT "cellof'anet"
|
||
length 100
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "byttet", "lyttet", "flyttet"
|
||
IF prevPhW(isVoiced) AND prevPhW(isNotVowel) THEN
|
||
IF nextPhW(isNotVowel) AND next2PhW(@-) AND next3PhW(D) THEN
|
||
length 100
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "firmaet", "politiet - 140 sounds too short
|
||
IF nextPhW(@-) AND next2PhW(D) AND next2PhW(isWordEnd) THEN
|
||
length 180
|
||
ENDIF
|
||
|
||
// "forsøgte" stressed second vowel too long TEST
|
||
IF thisPh(isMaxStress) AND thisPh(isSecondVowel) THEN
|
||
IF nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN // NOT "papirer"
|
||
// 2 voiced consonants seem to add further length ([gd] in "forsøgte")
|
||
IF next2PhW(isVoiced) AND next2PhW(isNotVowel) THEN // NOT "moral"
|
||
length 110
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "bygge", "forbandelse", "lynlås", "centralen" vowel between 2 voiced consonants - too long
|
||
IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN // voiced
|
||
IF prevPhW(isNotVowel) AND nextPhW(isNotVowel) THEN // consonants
|
||
IF NOT nextPhW(isWordEnd) THEN // NOT "smil"
|
||
IF NOT next2PhW(j) AND NOT prevPhW(R) THEN // NOT "vilje", "krympe"
|
||
IF NOT nextPhW(r) AND NOT nextPhW(3-) THEN // NOT "moderne" - vowel + r/3-
|
||
IF thisPh(isStressed) THEN // NOT [W] in "f'indelønnen"
|
||
IF thisPh(isFirstVowel) THEN
|
||
// IF NOT nextPhW(@-) THEN // NOT "væbne"
|
||
IF NOT nextPhW(isNotVowel) AND NOT next2PhW(isNotVowel) THEN // NOT "væbne"
|
||
length 110
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
IF prevPhW(R) THEN // "krympe" R makes the vowel longer than other voiced consonants
|
||
// NOT [o] in "rod'eo", NOT [æ] in "trængte"
|
||
IF thisPh(isMaxStress) AND NOT nextPhW(N) THEN
|
||
length 90
|
||
RETURN
|
||
ENDIF
|
||
// "trængte" - [N] after the vowel makes it even longer
|
||
IF thisPh(isMaxStress) AND nextPhW(N) THEN
|
||
length 75
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "buske" - only sg/sk? TEST
|
||
IF prevPhW(isNotVowel) AND nextPhW(s) AND next2PhW(isNotVowel) AND next3PhW(@-) THEN
|
||
length 100
|
||
ENDIF
|
||
|
||
// "projektet"
|
||
IF prevPhW(S) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
|
||
length 100
|
||
ENDIF
|
||
|
||
// "rigtigt", "fred", "frem", "frikvarter" - R makes the vowel too long
|
||
IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
|
||
IF nextPhW(isNotVowel) THEN // NOT "krigen"
|
||
IF thisPh(isFirstVowel) THEN // NOT the a in "moral"
|
||
length 110
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// R makes the vowel too long
|
||
IF thisPh(isWordEnd) THEN // "maleri"
|
||
length 120
|
||
RETURN
|
||
ENDIF
|
||
|
||
// "forbrydelse" between 2 voiced consonants
|
||
IF nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
|
||
length 110
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "ring", "ringe", "fængsel", "spinkel", "vindspejl", "enke"
|
||
IF nextPhW(N) THEN
|
||
length 100
|
||
ENDIF
|
||
|
||
// "sigte", "henter" t/d + @-/V makes the vowel too long
|
||
// ?? is this just between 2 voiced consonants ??
|
||
// ?? does [h] act as a voiced consonant ??
|
||
IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) THEN
|
||
IF next3PhW(@-) OR next3PhW(V) OR next3PhW(?V) THEN
|
||
IF thisPh(isFirstVowel) THEN // NOT [i] in "forsp'ildte"
|
||
length 110
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "himlen", "pøblen" l/3 makes the vowel too long
|
||
IF nextPhW(isNotVowel) AND next2PhW(l/3) AND next3PhW(@-) OR next3PhW(V) THEN
|
||
length 110
|
||
ENDIF
|
||
|
||
// "filmen" vowel + l/3 makes the vowel too long
|
||
// Probably due to 2 voiced consonants (lm) - Change the condition?
|
||
IF nextPhW(l/3) AND next3PhW(@-) THEN
|
||
IF NOT next2PhW(j) THEN // NOT "vilje"
|
||
IF next2PhW(isVoiced) THEN // NOT [e] in "folkevogn"
|
||
length 100
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
//"musikken", "piggen", "trafikken" consonant + [@-] makes the vowel too long
|
||
// Probably wrong. Only k and g? Only [i]?
|
||
// Could this be due to an English word like "physique" [fIz'i:k]?
|
||
IF nextPhW(k) OR nextPhW(g)AND next2PhW(@-) THEN
|
||
IF thisPh(?i) THEN
|
||
length 100
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "rodeo", lianen" abnormal stress sounds too short
|
||
IF thisPh(isMaxStress) AND NOT thisPh(isFirstVowel) THEN
|
||
IF NOT nextPhW(k) AND NOT nextPhW(g) THEN // NOT "ant'ikt" - Like "physique" above?
|
||
IF NOT nextPhW(N) AND NOT next2PhW(isNotVowel) THEN // NOT "omkr'ing", "eks'empel"
|
||
IF NOT nextPhW(isVoiced) AND NOT next2PhW(isVoiced) THEN // NOT "bestemme" TEST
|
||
length 170
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
endprocedure
|
||
|
||
//--------------------------------------------------------------------
|
||
|
||
// Change the length of NORMAL vowels (without ? in front of them)
|
||
procedure LongVowelLength
|
||
// "guldmine" [ul/3] makes the vowel extremely short
|
||
IF prevVowel(l/3) AND prev2PhW(u) THEN
|
||
length 350
|
||
RETURN
|
||
ENDIF
|
||
|
||
// "guldur" [ul/3] makes the vowel extremely short
|
||
IF prev2PhW(u) AND prevPhW(l/3) THEN
|
||
IF NOT thisPh(isWordEnd) THEN // NOT "umulig"
|
||
IF NOT nextPhW(t) AND NOT nextPhW(d) THEN // NOT "umuligt"
|
||
IF NOT nextPhW(s) AND NOT nextPhW(S) THEN // NOT Drakulas, spekulationer ???
|
||
length 325
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "dage", "dagevis", fødselsdage" STRANGE BEHAVIOUR - too short at 240
|
||
IF prevPhW(d) AND nextPhW(@-) THEN
|
||
IF NOT next2PhW(D) THEN
|
||
length 350
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "tjeneste" TEST
|
||
IF prevPhW(tS) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
|
||
length 180
|
||
RETURN
|
||
ENDIF
|
||
|
||
// "havet", "lavet"
|
||
IF nextPhW(isVoiced) AND next2PhW(@-) AND next3PhW(D) THEN
|
||
length 180
|
||
RETURN
|
||
ENDIF
|
||
|
||
// "videre"
|
||
IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN // voiced
|
||
IF prevPhW(isNotVowel) AND nextPhW(isNotVowel) THEN // consonants
|
||
IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
|
||
length 180
|
||
RETURN
|
||
ELSE // [A] in "begravelse" - "r" adds extra length
|
||
length 120
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "alene" - Short initial vowel sounds too short at length 140
|
||
IF thisPh(isWordStart) THEN
|
||
length 160
|
||
// "år? [O] - The word is only 1 vowel: make it long
|
||
IF thisPh(isWordEnd) THEN
|
||
length 180
|
||
ENDIF
|
||
// "ønske" The vowel should have been made short becauce of 3 x consonant.
|
||
// Take care of it here
|
||
IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) AND next3PhW(isNotVowel) THEN
|
||
length 140
|
||
ENDIF
|
||
// "ære"
|
||
IF nextPhW(V) AND nextPhW(isFinalVowel) THEN
|
||
length 240
|
||
ENDIF
|
||
// "øge", "øgede"
|
||
IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
|
||
length 225
|
||
ENDIF
|
||
// RETURN
|
||
ENDIF
|
||
|
||
// "døre" vowel + vowel: long
|
||
IF nextPhW(@-) OR nextPhW(?V) THEN
|
||
length 225
|
||
ENDIF
|
||
|
||
// "pæne" vowel + consonant + [@-]: long
|
||
IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
|
||
IF thisPh(isFirstVowel) THEN
|
||
IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN // "vide"
|
||
length 180
|
||
ELSE // "pæne"
|
||
length 225
|
||
ENDIF
|
||
RETURN
|
||
ENDIF
|
||
// Stressed second syllable in words with initial be- and for-
|
||
IF NOT thisPh(isSecondVowel) AND thisPh(isMaxStress) THEN // "beb'ude", "form'ode"
|
||
length 140
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "vildrede"
|
||
IF nextPhW(D) AND next2PhW(@-) THEN
|
||
IF NOT thisPh(isMaxStress) THEN
|
||
length 225
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "guderne", "møde"
|
||
IF nextPhW(isNotVowel) AND next2PhW(?V) OR next2PhW(V) OR next2PhW(@-) THEN
|
||
length 225
|
||
ENDIF
|
||
|
||
// "mødes", "vred", "møve", "mene", "dele" - vowel too long between 2 voiced consonants
|
||
IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN
|
||
IF prevPhW(isNotVowel) AND nextPhW(isNotVowel) THEN
|
||
IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) AND NOT prevPhW(l/3) THEN
|
||
IF NOT next2PhW(isVoiced) THEN // NOT "bælte", "bomben"
|
||
length 180 // mødes, dele
|
||
RETURN
|
||
ENDIF
|
||
IF next2PhW(isNotVowel) THEN // bælte, svælge
|
||
length 120
|
||
ENDIF
|
||
ELIF NOT prevPhW(l/3) AND thisPh(isMaxStress) THEN
|
||
IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
|
||
length 120 // "vred", "vrede"
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
IF prevPhW(R) AND prevPhW(isWordStart) THEN // "råderet"
|
||
length 180
|
||
RETURN
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "huske" - hACC@- vowel too long
|
||
// 2 consonants - should have been short in da_rules
|
||
// 140 too long because of [h]??
|
||
IF prevPhW(h) AND nextPhW(isNotVowel) AND next2PhW(isNotVowel) AND next3PhW(@-) THEN
|
||
length 110
|
||
RETURN
|
||
ENDIF
|
||
|
||
// PB long vowel followed by [@-] or [V](vowel+vowel) - "pigen" [p'i@-n]
|
||
IF nextPhW(@-) OR nextPhW(V) THEN
|
||
IF thisPh(isFirstVowel) THEN // NOT "best'yrelse", "geb'yrer"
|
||
length 225
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "lydig"
|
||
IF prevPhW(l/3) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
|
||
length 180
|
||
RETURN
|
||
ENDIF
|
||
|
||
// PB "enig", "enige", "evig", "stædig" - vowel+consolant+[i]
|
||
IF nextPhW(isNotVowel) AND next2PhW(i) THEN
|
||
length 225
|
||
RETURN
|
||
ENDIF
|
||
|
||
// "føden"
|
||
IF nextPhW(D) AND next2PhW(@-) AND next3PhW(n) THEN
|
||
IF thisPh(isFirstVowel) THEN
|
||
length 180
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// l/3 + vowel makes the vowel too long
|
||
IF prevPhW(l/3) AND nextPhW(isNotVowel) THEN
|
||
// "klub", "klud", "slut"
|
||
// The vowel should have been short but we fix it here
|
||
IF NOT next2PhW(@-) AND NOT next2PhW(V) AND NOT next2PhW(?V) THEN // NOT "slæde"
|
||
length 100
|
||
ELSE
|
||
// "slæde", "lader", "forlader"
|
||
length 160
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// l/3 + vowel + voiced consonant makes the vowel too long
|
||
IF prevPhW(l/3) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
|
||
length 130
|
||
ENDIF
|
||
|
||
// "fryser", "rige"
|
||
IF prevPhW(r) OR prevPhW(R) OR prevPhW(3-) THEN
|
||
length 130
|
||
IF nextPhW(@-) THEN // "rige" [@-] seems to cancel the "r" effect
|
||
length 240
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "længe" - short - 2 consonants => 1 consonant (ng => [N])
|
||
// Don't use isNasal here!
|
||
IF nextPhW(N) THEN
|
||
IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
|
||
length 140
|
||
ENDIF
|
||
ENDIF
|
||
|
||
// "buskene", "krøbling" The vowel should have been made short becauce og 2 x consonant.
|
||
// Take care of it here
|
||
IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
|
||
IF NOT nextPhW(l/3) THEN
|
||
IF NOT nextPhW(r) AND NOT prevPhW(R) AND NOT prevPhW(3-) THEN // NOT "Maria"
|
||
length 110
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
endprocedure
|
||
//----------------------------------------------------------------------
|
||
|
||
// PHONEMES
|
||
|
||
// A bit longer than [@-]
|
||
phoneme @
|
||
vwl starttype #@ endtype #@
|
||
unstressed
|
||
length 60
|
||
IfNextVowelAppend(_!)
|
||
FMT(vowel/@_3)
|
||
endphoneme
|
||
|
||
phoneme @- // very short schwa
|
||
vwl starttype #@ endtype #@
|
||
unstressed nsy
|
||
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
|
||
IF nextPhW(isVowel) THEN
|
||
ChangePhoneme(@)
|
||
ENDIF
|
||
FMT(vowel/@-)
|
||
endphoneme
|
||
|
||
// ToDo: change [@] to [a#] if adjacent to [r] or [R]
|
||
phoneme 3
|
||
vwl 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
|
||
vwl starttype #i endtype #i
|
||
length 140
|
||
CALL LongVowelLength
|
||
FMT(vowel/i_4)
|
||
endphoneme
|
||
|
||
// PB short i
|
||
// sviret vs. svirret
|
||
phoneme ?i
|
||
vwl starttype #i endtype #i
|
||
length 140
|
||
CALL ShortVowelLength
|
||
// Don't link with the next vowel with [;] - vowel too short
|
||
// IfNextVowelAppend(;)
|
||
FMT(vowel/i_4)
|
||
endphoneme
|
||
|
||
// PB English i - Tim
|
||
phoneme I
|
||
vwl starttype #i endtype #i
|
||
length 130
|
||
IfNextVowelAppend(;)
|
||
FMT(vowel/ii_2)
|
||
endphoneme
|
||
|
||
phoneme e
|
||
vwl starttype #e endtype #e
|
||
length 140
|
||
CALL LongVowelLength
|
||
FMT(vowel/e)
|
||
endphoneme
|
||
|
||
// PB short e
|
||
// "skille" vs. "skele", "pille" vs. "pile"
|
||
phoneme ?e
|
||
vwl starttype #e endtype #e
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/e)
|
||
endphoneme
|
||
|
||
phoneme E
|
||
vwl 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
|
||
vwl starttype #e endtype #e
|
||
ipa ε
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/e_mid2)
|
||
endphoneme
|
||
|
||
phoneme &
|
||
vwl starttype #e endtype #e
|
||
ipa a
|
||
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 ?&
|
||
ipa a
|
||
vwl starttype #e endtype #e
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/ee_2)
|
||
endphoneme
|
||
|
||
// Added for the æ in "dræbt"
|
||
phoneme &#
|
||
vwl starttype #e endtype #e
|
||
length 140
|
||
ipa a
|
||
CALL LongVowelLength
|
||
FMT(vowel/&)
|
||
endphoneme
|
||
|
||
// PB short &#
|
||
// "revl" vs. "tremme"
|
||
phoneme ?&#
|
||
vwl starttype #e endtype #e
|
||
ipa ?a
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/&)
|
||
endphoneme
|
||
|
||
phoneme A // PB changed to a_8
|
||
vwl starttype #a endtype #a
|
||
ipa ɑ
|
||
length 140
|
||
CALL LongVowelLength
|
||
// "fare" [f'A:A]
|
||
IF nextPhW(A) THEN
|
||
length 225
|
||
ENDIF
|
||
FMT(vowel/a_8)
|
||
endphoneme
|
||
|
||
// Short A
|
||
// "krabbe" vs. "drabelig"
|
||
phoneme ?A
|
||
vwl starttype #a endtype #a
|
||
ipa ?ɑ
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/a_8)
|
||
endphoneme
|
||
|
||
phoneme u
|
||
vwl starttype #u endtype #u
|
||
length 140
|
||
// "suge", "uge", "bluse", "julegave"
|
||
IF nextPhW(@-) OR nextPhW(V) OR next2PhW(@-) OR next2PhW(V)THEN
|
||
length 225
|
||
ENDIF
|
||
IF NOT thisPh(isWordStart) THEN // NOT "undøvendig"
|
||
CALL LongVowelLength
|
||
ENDIF
|
||
FMT(vowel/u_bck)
|
||
endphoneme
|
||
|
||
// Short u
|
||
// "tude" vs. "tuden" - [tuD3] [t?uD@n]
|
||
phoneme ?u
|
||
vwl starttype #u endtype #u
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/u_bck)
|
||
endphoneme
|
||
|
||
phoneme o
|
||
vwl starttype #o endtype #o
|
||
length 140
|
||
// "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
|
||
vwl starttype #o endtype #o
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/o_2)
|
||
endphoneme
|
||
|
||
phoneme O
|
||
vwl starttype #o endtype #o
|
||
length 140
|
||
ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
|
||
// "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
|
||
vwl starttype #o endtype #o
|
||
ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/o_5)
|
||
endphoneme
|
||
|
||
phoneme V
|
||
vwl starttype #@ endtype #@
|
||
length 140
|
||
CALL LongVowelLength
|
||
FMT(vowel/V_4)
|
||
endphoneme
|
||
|
||
// PB Short V
|
||
// "forstår" vs. "kåre"
|
||
phoneme ?V
|
||
vwl starttype #@ endtype #@
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/V_4)
|
||
endphoneme
|
||
|
||
phoneme 0
|
||
vwl starttype #o endtype #o
|
||
length 140
|
||
ipa ɔ
|
||
CALL LongVowelLength
|
||
FMT(vowel/oo_2)
|
||
endphoneme
|
||
|
||
// Short 0 "sukker", "provst"
|
||
phoneme ?0
|
||
vwl starttype #o endtype #o
|
||
length 140
|
||
ipa ɔ
|
||
CALL ShortVowelLength
|
||
FMT(vowel/oo_2)
|
||
endphoneme
|
||
|
||
phoneme y
|
||
vwl starttype #i endtype #i
|
||
length 140
|
||
CALL LongVowelLength
|
||
FMT(vowel/y)
|
||
endphoneme
|
||
|
||
// PB Short y
|
||
// "kylling" vs. "kyle", "krybbe" vs. "krybe"
|
||
phoneme ?y
|
||
vwl starttype #i endtype #i
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/y)
|
||
endphoneme
|
||
|
||
phoneme Y
|
||
vwl starttype #i endtype #i
|
||
length 140
|
||
IF nextPhW(V) OR nextPhW(@-) THEN
|
||
length 225
|
||
ENDIF
|
||
CALL LongVowelLength
|
||
FMT(vowel/yy)
|
||
endphoneme
|
||
|
||
phoneme W
|
||
vwl starttype #@ endtype #@
|
||
length 140
|
||
CALL LongVowelLength
|
||
FMT(vowel/oe)
|
||
endphoneme
|
||
|
||
// Short W
|
||
// "prøv" vs. "prøve"
|
||
phoneme ?W
|
||
vwl starttype #@ endtype #@
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/oe)
|
||
endphoneme
|
||
|
||
// Added for the ø in "røv", "røg", "øje" instead of [V3]
|
||
phoneme W#
|
||
vwl starttype #@ endtype #@
|
||
length 140
|
||
CALL LongVowelLength
|
||
FMT(vowel/V)
|
||
endphoneme
|
||
|
||
// Short W#
|
||
// "rømme"
|
||
phoneme ?W#
|
||
vwl starttype #@ endtype #@
|
||
length 140
|
||
CALL ShortVowelLength
|
||
FMT(vowel/V)
|
||
endphoneme
|
||
|
||
phoneme aI
|
||
vwl 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(NULL)
|
||
ENDIF
|
||
ChangePhoneme(l/3)
|
||
// CALL base/l
|
||
endphoneme
|
||
|
||
phoneme l/3 // Replacement for [l/]
|
||
liquid
|
||
lengthmod 7
|
||
length 80
|
||
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
|
||
// "generer" [Sen'e:Vr], "mysterier" - delete the r
|
||
IF prevPhW(V) OR prevPhW(?V) AND thisPh(isWordEnd) THEN
|
||
ChangePhoneme(_!)
|
||
ENDIF
|
||
// "plamagers" [pl&m'&SVrs] - delete the r
|
||
IF prevPhW(V) OR prevPhW(?V) AND nextPhW(s) AND nextPhW(isWordEnd) THEN
|
||
ChangePhoneme(NULL)
|
||
ENDIF
|
||
// "plamagerne" [pl&m'&SVrn@-] - delete the r
|
||
IF prevPhW(V) OR prevPhW(?V) AND nextPhW(n) AND next2PhW(@-) THEN
|
||
ChangePhoneme(NULL)
|
||
ENDIF
|
||
// "kreaturer" [kR,?E?&t'ur?V] - delete the r
|
||
// Previous vowel stressed by $alt rule
|
||
IF nextPhW(V) OR nextPhW(?V) AND nextPh(isWordEnd) THEN
|
||
IF prevPhW(isMaxStress) THEN
|
||
ChangePhoneme(NULL)
|
||
ENDIF
|
||
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 sib
|
||
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 stp
|
||
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 stp
|
||
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 pal
|
||
lengthmod 7
|
||
// no link with next vowel
|
||
IF thisPh(isWordEnd) THEN
|
||
IfNextVowelAppend(_!)
|
||
ENDIF
|
||
IF nextPhW(isVowel) THEN
|
||
NextVowelStarts
|
||
VowelStart(j/j@) // jøderne
|
||
VowelStart(j/ja)
|
||
VowelStart(j/je)
|
||
VowelStart(j/ji)
|
||
VowelStart(j/jo) // "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
|