mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 05:35:35 +00:00
These are some improvements to the german voices, both default and mbrola. It fixes some sounds of phonemes and also pronunciation of words. I also modified the mbrola phoneme and voice files to make them sound more natural. The stressLength setting is that it matches the way espeak deals with the lengths.
509 lines
7.4 KiB
Plaintext
509 lines
7.4 KiB
Plaintext
|
|
|
|
//=========================================================
|
|
// German
|
|
//=========================================================
|
|
|
|
|
|
|
|
phoneme @ // Schwa
|
|
vwl starttype #@ endtype #@
|
|
unstressed
|
|
length 80
|
|
IF nextPh(r) THEN
|
|
IF next2Ph(isVowel) THEN
|
|
ELSE
|
|
ChangePhoneme(3)
|
|
ENDIF
|
|
ENDIF
|
|
IF nextPh(n) THEN
|
|
length 15
|
|
ENDIF
|
|
FMT(vowel/@_4)
|
|
endphoneme
|
|
|
|
|
|
phoneme A~
|
|
vowel starttype #a endtype #a
|
|
length 260
|
|
FMT(vnasal/aa_n4)
|
|
endphoneme
|
|
|
|
|
|
phoneme l2 // as [l] but devoice previous phoneme
|
|
liquid lengthmod 7
|
|
ChangePhoneme (l)
|
|
endphoneme
|
|
|
|
|
|
phoneme b
|
|
vcd blb stp
|
|
voicingswitch p
|
|
IF nextPh(l2) THEN
|
|
ChangePhoneme(p)
|
|
ENDIF
|
|
CALL base/b
|
|
endphoneme
|
|
|
|
|
|
phoneme d
|
|
vcd alv stp
|
|
voicingswitch t
|
|
IF nextPh(l2) THEN
|
|
ChangePhoneme(t)
|
|
ENDIF
|
|
lengthmod 5
|
|
Vowelin f1=1 f2=1700 -300 300 f3=-100 80
|
|
Vowelout f1=2 f2=1700 -300 300 f3=-100 80 brk
|
|
|
|
IF PreVoicing THEN
|
|
FMT(d/xd)
|
|
ENDIF
|
|
|
|
IF nextPh(isPause2) THEN
|
|
FMT(d/d_) addWav(x/d_)
|
|
ELIF nextPh(r) THEN
|
|
FMT(d/dr) addWav(x/d)
|
|
ENDIF
|
|
|
|
FMT(d/d) addWav(x/d)
|
|
endphoneme
|
|
|
|
phoneme g
|
|
vcd vel stp
|
|
voicingswitch k
|
|
IF nextPh(l2) THEN
|
|
ChangePhoneme(k)
|
|
ENDIF
|
|
CALL base/g
|
|
endphoneme
|
|
|
|
|
|
phoneme k
|
|
vls vel stp
|
|
voicingswitch g
|
|
lengthmod 2
|
|
Vowelin f1=0 f2=2300 200 300 f3=-200 80
|
|
Vowelout f1=0 f2=2300 300 400 f3=-200 80 rms=20
|
|
|
|
IF KlattSynth THEN
|
|
Vowelout f1=0 f2=2300 200 300 f3=-200 80 rms=20
|
|
ENDIF
|
|
|
|
IF nextPh(isPause2) THEN
|
|
WAV(ustop/k_)
|
|
ELIF nextPh(r) OR nextPh(R) OR nextPh(R2) THEN
|
|
WAV(ustop/k_)
|
|
ELIF nextPh(i:) OR nextPh(;) THEN
|
|
WAV(ustop/ki)
|
|
ELIF nextPh(l) THEN
|
|
WAV(ustop/kl)
|
|
ELIF nextPh(@-) THEN
|
|
WAV(ustop/k_unasp, 70)
|
|
ENDIF
|
|
WAV(ustop/k)
|
|
endphoneme
|
|
|
|
|
|
phoneme p
|
|
vls blb stp
|
|
voicingswitch b
|
|
lengthmod 2
|
|
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_)
|
|
ELIF nextPh(r) THEN
|
|
WAV(ustop/p)
|
|
ELIF nextPh(@-) THEN
|
|
WAV(ustop/p_unasp)
|
|
ELIF nextPh(l) THEN
|
|
WAV(ustop/pl)
|
|
ENDIF
|
|
WAV(ustop/p)
|
|
endphoneme
|
|
|
|
|
|
phoneme 3 // Schwa+r
|
|
vwl starttype #a endtype #a
|
|
unstressed flag1
|
|
length 140
|
|
IF thisPh(isWordEnd) THEN
|
|
FMT(vowel/V_3)
|
|
ELSE
|
|
FMT(vowel/V_3)
|
|
ENDIF
|
|
endphoneme
|
|
|
|
phoneme 3: // Schwa+r
|
|
vwl starttype #a endtype #a
|
|
unstressed flag1
|
|
length 220
|
|
IF thisPh(isWordEnd) THEN
|
|
FMT(vowel/V_3)
|
|
ELSE
|
|
FMT(vowel/a#_3)
|
|
ENDIF
|
|
endphoneme
|
|
|
|
|
|
phoneme a
|
|
vwl starttype #a endtype #a
|
|
length 110
|
|
FMT(vowel/a)
|
|
endphoneme
|
|
|
|
|
|
phoneme E
|
|
vwl starttype #e endtype #e
|
|
length 120
|
|
FMT(vowel/e_mid2)
|
|
endphoneme
|
|
|
|
|
|
phoneme E2 // as[E] but reduces to @ if unstressed
|
|
vwl starttype #e endtype #e
|
|
length 120
|
|
ChangeIfDiminished(@)
|
|
FMT(vowel/e_mid2)
|
|
endphoneme
|
|
|
|
|
|
phoneme I
|
|
vwl starttype #i endtype #i
|
|
length 120
|
|
IfNextVowelAppend(;)
|
|
FMT(vowel/ii)
|
|
endphoneme
|
|
|
|
|
|
phoneme I:
|
|
vwl starttype #i endtype #i
|
|
length 190
|
|
FMT(vowel/ii)
|
|
endphoneme
|
|
|
|
|
|
phoneme iR // TEST "vier" = [f'iR] not successful
|
|
vwl starttype #i endtype #@
|
|
ipa i?
|
|
flag1
|
|
length 240
|
|
FMT(vdiph2/i@_3)
|
|
endphoneme
|
|
|
|
|
|
phoneme O
|
|
vwl starttype #o endtype #o
|
|
length 120
|
|
FMT(vowel/oo)
|
|
endphoneme
|
|
|
|
|
|
phoneme U
|
|
vwl starttype #u endtype #u
|
|
length 120
|
|
IF nextPh(r) THEN
|
|
IF next2Ph(isVowel) THEN
|
|
ELSE
|
|
ChangePhoneme(UR)
|
|
ENDIF
|
|
ENDIF
|
|
FMT(vowel/uu_2)
|
|
endphoneme
|
|
|
|
|
|
phoneme A:
|
|
vwl starttype #a endtype #a
|
|
length 250
|
|
FMT(vowel/aa_6)
|
|
endphoneme
|
|
|
|
|
|
phoneme A // reduces to [a] if not stressed
|
|
vwl starttype #a endtype #a
|
|
length 250
|
|
ChangeIfUnstressed(a)
|
|
FMT(vowel/aa_6)
|
|
endphoneme
|
|
|
|
|
|
phoneme i:
|
|
vwl starttype #i endtype #i
|
|
length 180
|
|
IF prevPh(w) THEN
|
|
VowelStart(w/wi2)
|
|
ENDIF
|
|
FMT(vowel/i_2)
|
|
endphoneme
|
|
|
|
|
|
phoneme i2
|
|
vwl starttype #i endtype #i
|
|
length 180
|
|
ChangeIfNotStressed(I)
|
|
IF prevPh(w) THEN
|
|
VowelStart(w/wi2)
|
|
ENDIF
|
|
FMT(vowel/i_2)
|
|
endphoneme
|
|
|
|
|
|
phoneme u:
|
|
vwl starttype #u endtype #u
|
|
length 190
|
|
FMT(vowel/u)
|
|
endphoneme
|
|
|
|
|
|
phoneme aU
|
|
vwl starttype #a endtype #u
|
|
length 220
|
|
FMT(vdiph/aau_6)
|
|
endphoneme
|
|
|
|
|
|
phoneme aI
|
|
vwl starttype #a endtype #i
|
|
length 210
|
|
FMT(vdiph/ai_5)
|
|
endphoneme
|
|
|
|
|
|
phoneme EI
|
|
import_phoneme en-us/eI
|
|
endphoneme
|
|
|
|
|
|
|
|
phoneme OY
|
|
vwl starttype #o endtype #e
|
|
length 220
|
|
FMT(vwl_de/eu)
|
|
endphoneme
|
|
|
|
|
|
phoneme E:
|
|
vwl starttype #e endtype #e
|
|
length 200
|
|
FMT(vowel/e_8)
|
|
endphoneme
|
|
|
|
|
|
phoneme e:
|
|
vwl starttype #e endtype #e
|
|
length 200
|
|
FMT(vowel/e_2)
|
|
endphoneme
|
|
|
|
|
|
phoneme o:
|
|
vwl starttype #o endtype #o
|
|
length 210
|
|
FMT(vowel/o)
|
|
endphoneme
|
|
|
|
|
|
phoneme y:
|
|
vwl starttype #u endtype #u
|
|
length 200
|
|
FMT(vowel/y)
|
|
endphoneme
|
|
|
|
|
|
phoneme y
|
|
vwl starttype #@ endtype #u
|
|
ipa ?
|
|
length 110
|
|
FMT(vwl_de/ue_short)
|
|
endphoneme
|
|
|
|
|
|
phoneme Y:
|
|
vwl starttype #@ endtype #u
|
|
length 220
|
|
FMT(vwl_de/y#)
|
|
endphoneme
|
|
|
|
|
|
phoneme W
|
|
vwl starttype #@ endtype #@
|
|
length 150
|
|
FMT(vowel/oe)
|
|
endphoneme
|
|
|
|
|
|
|
|
// CONSONANTS
|
|
//===========
|
|
|
|
|
|
phoneme t
|
|
vls alv stp
|
|
voicingswitch d
|
|
lengthmod 2
|
|
Vowelin f1=0 f2=1700 -300 300 f3=-100 80
|
|
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
|
|
|
|
IF nextPh(isPause2) THEN
|
|
WAV(ustop/t_)
|
|
ELIF nextPh(r) THEN
|
|
WAV(ustop/t_)
|
|
ELIF nextPh(@-) THEN
|
|
WAV(ustop/t_dnt, 50)
|
|
ENDIF
|
|
WAV(ustop/t, 90)
|
|
endphoneme
|
|
|
|
|
|
phoneme ts
|
|
import_phoneme consonants/ts
|
|
endphoneme
|
|
|
|
|
|
phoneme pF
|
|
vls blb afr
|
|
ipa pf
|
|
Vowelout f1=0 f2=1000 -500 -350 f3=-200 80
|
|
lengthmod 2
|
|
WAV(ufric/f) // could replace this with a [pf] wav file
|
|
endphoneme
|
|
|
|
|
|
phoneme g# // for "ig" -> [IC] or [Ig]
|
|
vls pal frc
|
|
lengthmod 3
|
|
|
|
IF nextPhW(isVoiced) THEN
|
|
ChangePhoneme(g)
|
|
ELSE
|
|
ChangePhoneme(C)
|
|
ENDIF
|
|
endphoneme
|
|
|
|
|
|
|
|
phoneme l/ // used for [l] when not before a vowel
|
|
liquid
|
|
lengthmod 7
|
|
|
|
IF nextPh(isVowel) THEN
|
|
ChangePhoneme(l)
|
|
ENDIF
|
|
|
|
PrevVowelEndings
|
|
VowelEnding(l/L1_@L, -60)
|
|
VowelEnding(l/L1_aL, -40)
|
|
VowelEnding(l/L1_eL, -30)
|
|
VowelEnding(l/L1_iL, -30)
|
|
VowelEnding(l/L1_oL, -40)
|
|
VowelEnding(l/L1_uL, -40)
|
|
EndSwitch
|
|
|
|
FMT(l/l_3)
|
|
endphoneme
|
|
|
|
|
|
phoneme j
|
|
liquid pal
|
|
lengthmod 7
|
|
|
|
IF nextPh(isVowel) THEN
|
|
NextVowelStarts
|
|
VowelStart(j/j@)
|
|
VowelStart(j/ja)
|
|
VowelStart(j/je)
|
|
VowelStart(j/ji)
|
|
VowelStart(j/jo)
|
|
VowelStart(j/ju)
|
|
EndSwitch
|
|
|
|
VowelEnding(j/xj, -30)
|
|
|
|
IF prevPh(isPause) THEN
|
|
FMT(j/_j_short) // difference from base/j
|
|
ENDIF
|
|
ELSE
|
|
// no vowel follows
|
|
Vowelout len=70
|
|
FMT(j/j_)
|
|
ENDIF
|
|
endphoneme
|
|
|
|
|
|
phoneme r
|
|
liquid uvl
|
|
ipa ʀ
|
|
lengthmod 6
|
|
length 110
|
|
IF nextPhW(isVowel) THEN
|
|
FMT(r3/r_uvl) addWav(r3/r_uvl.wav, 50)
|
|
ELSE
|
|
IF prevPh(isFlag1) THEN
|
|
ChangePhoneme(NULL) // 'r' is already included in the previous vowel
|
|
ELSE
|
|
ChangePhoneme(V#)
|
|
ENDIF
|
|
ENDIF
|
|
endphoneme
|
|
|
|
|
|
phoneme V# // used for 'r' after a vowel (to create a diphthong)
|
|
liquid
|
|
lengthmod 7
|
|
IF nextPhW(isVowel) THEN
|
|
ChangePhoneme(r)
|
|
ENDIF
|
|
|
|
ipa ?
|
|
IF prevPh(#a) THEN
|
|
FMT(r/V_2_)
|
|
ENDIF
|
|
IF prevPh(e:) OR prevPh (Y:) THEN
|
|
FMT(vowel/V_3)
|
|
ENDIF
|
|
IF prevPh(E) THEN
|
|
FMT(r/V_2_)
|
|
ENDIF
|
|
IF prevPh(#u) THEN
|
|
FMT(r/@_)
|
|
ENDIF
|
|
FMT(r/V_)
|
|
endphoneme
|
|
|
|
|
|
phoneme UR
|
|
vwl starttype #u endtype #@
|
|
ipa ??
|
|
flag1
|
|
length 180
|
|
FMT(vwl_de/uu_@)
|
|
endphoneme
|
|
|
|
|
|
phoneme r2
|
|
vcd alv flp
|
|
|
|
IF prevPhW(isVowel) THEN
|
|
ChangePhoneme(*)
|
|
ENDIF
|
|
|
|
InsertPhoneme(@-)
|
|
ChangePhoneme(*)
|
|
endphoneme
|
|
|
|
|
|
|
|
phoneme oU // for English words
|
|
import_phoneme en-us/oU
|
|
endphoneme
|
|
|
|
|
|
phoneme W~
|
|
vwl starttype #@ endtype #@
|
|
length 200
|
|
FMT(vnasal/W_n)
|
|
endphoneme
|
|
|