Co-authored-by: Baybars Külebi <[email protected]> Co-authored-by: gullabi <[email protected]> Co-authored-by: mllopartbsc <[email protected]>master
@@ -235,4 +235,4 @@ jobs: | |||
- name: test | |||
run: | | |||
${{ matrix.config_env }} ${{ matrix.runenv }} cmake --build build --target tests | |||
${{ matrix.config_env }} ${{ matrix.runenv }} ctest --test-dir build -T test -j8 --output-on-failure | |||
${{ matrix.config_env }} ${{ matrix.runenv }} ctest --test-dir build -T test -j8 --output-on-failure |
@@ -30,4 +30,4 @@ jobs: | |||
- name: make | |||
run: cmake --build build --config ${{ matrix.config }} | |||
- name: make check | |||
run: ctest --test-dir build -T test -C ${{ matrix.config }} -j8 --output-on-failure | |||
run: ctest --test-dir build -T test -C ${{ matrix.config }} -j8 --output-on-failure |
@@ -135,3 +135,9 @@ taken from the NetBSD `getopt_long` implementation, which is licensed under a | |||
[2-clause BSD](COPYING.BSD2) license. | |||
Android is a trademark of Google LLC. | |||
## Acknowledgements | |||
The catalan extension was funded by [Departament de la Vicepresidència i de Polítiques Digitals i Territori de la Generalitat de Catalunya](https://politiquesdigitals.gencat.cat/ca/inici/index.html#googtrans(ca|en) | |||
within the framework of | |||
[Projecte AINA](https://politiquesdigitals.gencat.cat/ca/economia/catalonia-ai/aina). |
@@ -12,6 +12,7 @@ | |||
$textmode | |||
// 0000..007F : C0 Controls and Basic Latin | |||
//+ plus // [002B] other (no translation) |
@@ -1,2 +1,4 @@ | |||
name Catalan | |||
language ca | |||
dictrules 1 |
@@ -0,0 +1,7 @@ | |||
name Catalan (Balearic) | |||
language ca-ba | |||
phonemes ca-ba | |||
dictrules 1 | |||
dictrules 4 |
@@ -0,0 +1,6 @@ | |||
name Catalan (North-western) | |||
language ca-nw | |||
phonemes ca-nw | |||
dictrules 2 |
@@ -0,0 +1,7 @@ | |||
name Catalan (Valencian) | |||
language ca-va | |||
phonemes ca-va | |||
dictrules 2 | |||
dictrules 3 |
@@ -2,56 +2,108 @@ | |||
//==================================================== | |||
// Catalan - based on Spanish and Base2 | |||
//==================================================== | |||
// in our project we decided not to use elisions, but they could be managed here by using "ipa NULL" | |||
// vowels | |||
//============= | |||
phoneme a | |||
vwl starttype #a endtype #a | |||
length 180 | |||
ChangeIfUnstressed(a#) | |||
IF thisPh(isUnstressed) THEN | |||
ChangePhoneme(@) | |||
ENDIF | |||
FMT(vowel/a_6) | |||
endphoneme | |||
phoneme a# | |||
vwl starttype #@ endtype #@ | |||
ipa ɐ | |||
unstressed | |||
length 170 | |||
FMT(vowel/a#_3) | |||
phoneme a2 // don't reduce | |||
vwl starttype #a endtype #a | |||
length 180 | |||
FMT(vowel/a_6) | |||
endphoneme | |||
phoneme e | |||
vwl starttype #e endtype #e | |||
length 170 | |||
ChangeIfUnstressed(@) | |||
IF thisPh(isUnstressed) THEN | |||
ChangePhoneme(@) | |||
ENDIF | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme e2 // don't reduce | |||
vwl starttype #e endtype #e | |||
length 170 | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme E | |||
vwl starttype #e endtype #e | |||
length 180 | |||
ChangeIfUnstressed(@) | |||
IF thisPh(isUnstressed) THEN | |||
ChangePhoneme(@) | |||
ENDIF | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme E2 // don't reduce | |||
vwl starttype #e endtype #e | |||
length 180 | |||
ChangeIfUnstressed(e2) | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme O | |||
vwl starttype #o endtype #o | |||
length 170 | |||
ChangeIfUnstressed(U) | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordEnd) AND nextPh(isVowel) THEN | |||
IF nextPh(i) THEN | |||
ChangePhoneme(u) | |||
ELSE | |||
ChangePhoneme(w) | |||
ENDIF | |||
ELIF thisPh(isWordStart) AND prevPh(isVowel) THEN | |||
ChangePhoneme(w) | |||
ELSE | |||
ChangePhoneme(u) | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/oo) | |||
endphoneme | |||
phoneme o | |||
vwl starttype #o endtype #o | |||
length 170 | |||
ChangeIfUnstressed(U) | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordEnd) AND nextPh(isVowel) THEN | |||
IF nextPh(i) THEN | |||
ChangePhoneme(u) | |||
ELSE | |||
ChangePhoneme(w) | |||
ENDIF | |||
ELIF thisPh(isWordStart) AND prevPh(isVowel) THEN | |||
ChangePhoneme(w) | |||
ELSE | |||
ChangePhoneme(u) | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme o2 | |||
vwl starttype #o endtype #o | |||
length 170 | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme O2 | |||
vwl starttype #o endtype #o | |||
length 170 | |||
FMT(vowel/oo) | |||
endphoneme | |||
phoneme U | |||
vwl starttype #u endtype #u | |||
unstressed | |||
@@ -62,15 +114,408 @@ endphoneme | |||
phoneme u | |||
vwl starttype #u endtype #u | |||
length 160 | |||
ChangeIfUnstressed(U) | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVowel) THEN | |||
IF nextPh(i) THEN | |||
ELSE | |||
ChangePhoneme(w) | |||
ENDIF | |||
ENDIF | |||
ELIF thisPh(isWordStart) THEN | |||
IF prevPh(isVowel) THEN | |||
ChangePhoneme(w) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/u_bck) | |||
endphoneme | |||
phoneme i | |||
vwl starttype #i endtype #i | |||
length 170 | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVowel) THEN | |||
IF nextPh(u) THEN | |||
ELSE | |||
ChangePhoneme(j) | |||
ENDIF | |||
ENDIF | |||
ELIF thisPh(isWordStart) THEN | |||
IF prevPh(isVowel) THEN | |||
ChangePhoneme(j) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/i) | |||
endphoneme | |||
// nasals | |||
//============== | |||
phoneme M | |||
vls lbd nas | |||
ipa ɱ | |||
IF nextPh(v) THEN | |||
ChangePhoneme(m) | |||
ENDIF | |||
endphoneme | |||
phoneme m | |||
vcd blb nas | |||
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk | |||
lengthmod 4 | |||
IF KlattSynth THEN | |||
Vowelin f1=0 f2=1000 -50 -200 f3=-200 80 | |||
IF nextPh(isPause2) THEN | |||
FMT(klatt/m_) | |||
ENDIF | |||
FMT(klatt/m) | |||
ENDIF | |||
NextVowelStarts | |||
VowelStart(m/m@) | |||
VowelStart(m/ma) | |||
VowelStart(m/me) | |||
VowelStart(m/mi) | |||
VowelStart(m/mo) | |||
VowelStart(m/mu) | |||
EndSwitch | |||
IF nextPh(f) OR nextPh(v) THEN | |||
ChangePhoneme(M) | |||
ENDIF | |||
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | |||
FMT(m/mj) | |||
ELIF prevPh(isPause) THEN | |||
FMT(m/_m) | |||
ELIF nextPh(isNotVowel) THEN | |||
FMT(m/m_) | |||
ENDIF | |||
endphoneme | |||
phoneme n | |||
vcd alv nas | |||
Vowelout f1=2 f2=1500 -300 250 f3=-100 80 rms=20 brk | |||
lengthmod 4 | |||
IF KlattSynth THEN | |||
Vowelin f1=0 f2=1500 -200 200 f3=0 80 | |||
FMT(klatt/n) | |||
ENDIF | |||
NextVowelStarts | |||
VowelStart(n/n@) | |||
VowelStart(n/na) | |||
VowelStart(n/ne) | |||
VowelStart(n/ni) | |||
VowelStart(n/no) | |||
VowelStart(n/nu) | |||
EndSwitch | |||
IF nextPh(f) THEN | |||
ChangePhoneme(M) | |||
ELIF nextPh(k) OR nextPh(g) THEN | |||
ChangePhoneme(N) | |||
ELIF nextPh(p) OR nextPh(b) OR nextPh(v) OR nextPh(m) THEN | |||
ChangePhoneme(m) | |||
ELIF nextPh(l^) OR nextPh(n^) THEN | |||
ChangePhoneme(n^) | |||
ENDIF | |||
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | |||
FMT(n/nj) | |||
ELIF prevPh(isPause) OR prevPh(n) THEN | |||
FMT(n/_n) | |||
ELIF nextPh(isNotVowel) THEN | |||
FMT(n/n_) | |||
ENDIF | |||
endphoneme | |||
phoneme l | |||
import_phoneme en/l // use 'dark' [l] after a vowel | |||
endphoneme | |||
// fricatives | |||
//================ | |||
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 prevPh(isPalatal) OR nextPh(S) OR nextPh(Z) THEN | |||
IF prevPh(j) THEN | |||
ELIF nextPh(isVoiced) THEN | |||
ChangePhoneme(Z) | |||
ELSE | |||
ChangePhoneme(S) | |||
ENDIF | |||
ENDIF | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) THEN | |||
ChangePhoneme(z) | |||
ENDIF | |||
ENDIF | |||
IF nextPh(isPause) THEN | |||
WAV(ufric/s_) | |||
ELIF nextPh(p) OR nextPh(t) OR nextPh(k) THEN | |||
WAV(ufric/s!) | |||
ENDIF | |||
WAV(ufric/s) | |||
endphoneme | |||
phoneme z | |||
vcd alv frc sib | |||
voicingswitch s | |||
lengthmod 6 | |||
Vowelout f1=0 f2=1700 -300 300 f3=-100 60 len=50 | |||
IF prevPh(isPalatal) OR nextPh(Z) THEN | |||
IF prevPh(j) THEN | |||
ELSE | |||
ChangePhoneme(Z) | |||
ENDIF | |||
ENDIF | |||
IF KlattSynth THEN | |||
Vowelin f1=0 f2=1390 -300 300 f3=0 0 | |||
Vowelout f1=1 f2=1390 -300 300 f3=-100 60 len=50 brk | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(voc/z_) addWav(ufric/s_, 70) | |||
ENDIF | |||
FMT(voc/z) addWav(ufric/s_, 85) | |||
endphoneme | |||
phoneme f | |||
vls lbd frc | |||
voicingswitch v | |||
lengthmod 3 | |||
Vowelout f1=0 f2=1000 -500 -350 f3=-200 80 | |||
IF thisPh(isWordStart) THEN | |||
ELSE | |||
IF nextPh(isVoiced) THEN | |||
IF thisPh(isWordEnd) THEN | |||
ipa v | |||
ELSE | |||
IF nextPh(isVowel) OR nextPh(l) OR nextPh(**) OR nextPh(R) THEN | |||
ELSE | |||
ipa v | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
IF nextPh(isPause) THEN | |||
WAV(ufric/f_) | |||
ENDIF | |||
WAV(ufric/f) | |||
endphoneme | |||
phoneme v // = b | |||
vcd blb stp | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ELIF prevPh(m) THEN | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ChangePhoneme(b) | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(B) | |||
ELSE | |||
ChangePhoneme(b) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(b) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
CALL base1/b | |||
endphoneme | |||
// R | |||
//===================== | |||
phoneme R | |||
liquid trl | |||
lengthmod 6 | |||
ipa r | |||
IF thisPh(isWordEnd) AND nextPh(R) THEN | |||
ipa NULL | |||
ENDIF | |||
Vowelin f1=0 f2=1600 -300 300 f3=-200 80 | |||
Vowelout f1=2 f2=1600 -300 300 f3=-200 80 brk | |||
FMT(r3/r_trill2) addWav(r3/r_trill2.wav, 65) | |||
endphoneme | |||
// plosives (oclusives) | |||
// ==================== | |||
phoneme b | |||
vcd blb stp | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ELIF prevPh(m) THEN | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(B) | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
CALL base1/b | |||
endphoneme | |||
phoneme g | |||
vcd vel stp | |||
lengthmod 5 | |||
voicingswitch k | |||
Vowelin f1=2 f2=2300 200 300 f3=-300 80 | |||
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ELSE | |||
ChangePhoneme(k) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(Q) | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(k) | |||
ENDIF | |||
IF PreVoicing THEN | |||
FMT(g/xg) | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(g/g_) addWav(x/g_) | |||
ENDIF | |||
FMT(g/g) addWav(x/g2) | |||
endphoneme | |||
phoneme d | |||
vcd dnt stp | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ELSE | |||
ChangePhoneme(t) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(**) OR prevPh(R) OR prevPh(j) OR prevPh(w) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(D) | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(t) | |||
ENDIF | |||
CALL base2/d | |||
endphoneme | |||
phoneme p | |||
vls blb stp | |||
lengthmod 2 | |||
voicingswitch b | |||
Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 | |||
Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 | |||
IF nextPh(isPause2) THEN | |||
WAV(ustop/p_unasp_, 80) | |||
ELIF nextPh(isRhotic) THEN | |||
WAV(ustop/pr) | |||
ELIF nextPh(l) THEN | |||
WAV(ustop/pl) | |||
ELIF thisPh(isWordStart) THEN // don't change it if it's word start | |||
ELIF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
IF nextPh(w) OR nextPh(j) THEN | |||
ELSE | |||
ChangePhoneme(b) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(b) | |||
ENDIF | |||
WAV(ustop/p_unasp) | |||
endphoneme | |||
phoneme t // dental variant of /t/ | |||
vls dnt stp | |||
lengthmod 2 | |||
voicingswitch d | |||
Vowelin f1=0 f2=1600 -300 300 f3=-100 80 | |||
Vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 | |||
IF nextPh(isPause2) THEN | |||
WAV(ustop/t_dnt, 30) | |||
ELIF thisPh(isWordStart) THEN // don't change it if it's word start | |||
ELIF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
IF nextPh(**) OR nextPh(w) OR nextPh(j) THEN | |||
ELSE | |||
ChangePhoneme(d) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(d) | |||
ENDIF | |||
WAV(ustop/t_dnt2, 60) | |||
endphoneme | |||
phoneme k | |||
vls vel stp | |||
lengthmod 2 | |||
voicingswitch g | |||
Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
Vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 | |||
IF nextPh(isPause2) THEN | |||
WAV(ustop/k_) | |||
ELIF nextPh(isRhotic) THEN | |||
WAV(ustop/kr) | |||
ELIF thisPh(isWordStart) THEN // don't change it if it's word start | |||
ELIF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
IF nextPh(w) OR nextPh(j) THEN | |||
ELIF nextPh(n) OR nextPh(d) OR nextPh(z) THEN | |||
ChangePhoneme(g) | |||
ELIF thisPh(isWordEnd) THEN | |||
ChangePhoneme(g) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(g) | |||
ENDIF | |||
WAV(ustop/k_unasp, 70) | |||
endphoneme | |||
phoneme tS | |||
vls pla afr sib | |||
voicingswitch dZ | |||
lengthmod 2 | |||
Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
IF thisPh(isWordEnd) AND nextPh(isVoiced) THEN | |||
ChangePhoneme(dZ) | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(dZ) | |||
ENDIF | |||
WAV(ustop/tsh) | |||
endphoneme |
@@ -0,0 +1,490 @@ | |||
//==================================================== | |||
// Catalan balearic - based on Catalan (and Spanish and Base2) | |||
//==================================================== | |||
// plosives (oclusives) | |||
// ==================== | |||
// following https://giec.iec.cat/textgramatica/codi/4.2.1 | |||
phoneme p | |||
vls blb stp | |||
lengthmod 2 | |||
voicingswitch b | |||
Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 | |||
Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 | |||
IF thisPh(isWordEnd) AND nextPh(isNotVowel) AND NOT nextPh(isPause) THEN | |||
IF prevPh(isNasal) OR prevPh(isLiquid) OR prevPh(R) OR prevPh(**) OR prevPh(j) THEN | |||
ipa NULL | |||
ELIF nextPh(t) OR nextPh(s) OR nextPh(ts) THEN | |||
ChangePhoneme(t) | |||
ELIF nextPh(g) THEN | |||
ChangePhoneme(g) | |||
ELIF nextPh(Z) THEN | |||
ChangePhoneme(d) | |||
ELIF nextPh(f) THEN | |||
ChangePhoneme(f) | |||
ELIF nextPh(R) OR nextPh(j) THEN | |||
ipa NULL | |||
ELIF nextPh(m) THEN | |||
ChangePhoneme(m) | |||
ELIF nextPh(isVoiced) THEN | |||
ChangePhoneme(b) | |||
ENDIF | |||
ELIF nextPh(isRhotic) THEN | |||
WAV(ustop/pr) | |||
ELIF nextPh(l) THEN | |||
WAV(ustop/pl) | |||
ELIF thisPh(isWordStart) THEN // don't change it if it's word start | |||
ELIF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ChangePhoneme(b) | |||
ELIF nextPh(t) THEN | |||
ChangePhoneme(t) | |||
ELIF nextPh(s) THEN | |||
IF nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(d) | |||
ELSE | |||
ChangePhoneme(t) | |||
ENDIF | |||
ENDIF | |||
WAV(ustop/p_unasp) | |||
endphoneme | |||
phoneme t // dental variant of /t/ | |||
vls dnt stp | |||
lengthmod 2 | |||
voicingswitch d | |||
Vowelin f1=0 f2=1600 -300 300 f3=-100 80 | |||
Vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 | |||
IF nextPh(isPause2) THEN | |||
WAV(ustop/t_dnt, 30) | |||
ELIF thisPh(isWordEnd) AND nextPh(isNotVowel) AND NOT nextPh(isPause) THEN | |||
IF prevPh(isNasal) OR prevPh(isLiquid) OR prevPh(R) OR prevPh(**) OR prevPh(j) THEN | |||
ipa NULL | |||
ELIF nextPh(k) THEN | |||
ChangePhoneme(k) | |||
ELIF nextPh(b) THEN | |||
ChangePhoneme(b) | |||
ELIF nextPh(f) THEN | |||
ChangePhoneme(f) | |||
ELIF nextPh(p) THEN | |||
ChangePhoneme(p) | |||
ELIF nextPh(isVoiced) THEN | |||
ChangePhoneme(d) | |||
ENDIF | |||
ELIF nextPh(isWordEnd) AND nextPh(s) THEN | |||
IF next2Ph(k) THEN | |||
ChangePhoneme(k) | |||
ELIF next2Ph(b) THEN | |||
ChangePhoneme(b) | |||
ELIF next2Ph(isVoiced) THEN | |||
ChangePhoneme(d) | |||
ENDIF | |||
ELIF thisPh(isWordStart) THEN // don't change it if it's word start | |||
ELIF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
IF nextPh(**) THEN | |||
ELSE | |||
ChangePhoneme(d) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(d) | |||
ENDIF | |||
WAV(ustop/t_dnt2, 60) | |||
endphoneme | |||
phoneme k | |||
vls vel stp | |||
lengthmod 2 | |||
voicingswitch g | |||
Vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
Vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 | |||
IF nextPh(isPause2) THEN | |||
WAV(ustop/k_) | |||
ELIF nextPh(isRhotic) THEN | |||
WAV(ustop/kr) | |||
ELIF thisPh(isWordEnd) AND nextPh(isNotVowel) AND NOT nextPh(isPause) THEN | |||
IF prevPh(isNasal) OR prevPh(isLiquid) OR prevPh(R) OR prevPh(**) OR prevPh(j) THEN | |||
ipa NULL | |||
ELIF nextPh(t) OR nextPh(s) OR nextPh(ts) THEN | |||
ChangePhoneme(t) | |||
ELIF nextPh(isVoiced) THEN | |||
ChangePhoneme(g) | |||
ENDIF | |||
ELIF thisPh(isWordStart) THEN // don't change it if it's word start | |||
ELIF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
IF nextPh(w) THEN | |||
ELIF nextPh(n) OR nextPh(d) OR nextPh(z) THEN | |||
ChangePhoneme(g) | |||
ENDIF | |||
ELIF nextPh(t) OR nextPh(ts) THEN | |||
ChangePhoneme(t) | |||
ELIF nextPh(s) THEN | |||
IF nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(d) | |||
ELSE | |||
ChangePhoneme(t) | |||
ENDIF | |||
ENDIF | |||
WAV(ustop/k_unasp, 70) | |||
endphoneme | |||
phoneme b | |||
vcd blb stp | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isNotVowel) AND NOT nextPh(isPause) THEN | |||
IF prevPh(isNasal) OR prevPh(isLiquid) OR prevPh(R) OR prevPh(**) OR prevPh(j) THEN | |||
ipa NULL | |||
ELIF NOT nextPh(isVoiced) THEN | |||
ChangePhoneme(p) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(s) OR nextPh(t) THEN | |||
ChangePhoneme(t) | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(B) | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
CALL base1/b | |||
endphoneme | |||
phoneme g | |||
vcd vel stp | |||
lengthmod 5 | |||
voicingswitch k | |||
Vowelin f1=2 f2=2300 200 300 f3=-300 80 | |||
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isNotVowel) AND NOT nextPh(isPause) THEN | |||
IF prevPh(isNasal) OR prevPh(isLiquid) OR prevPh(R) OR prevPh(**) OR prevPh(j) THEN | |||
ipa NULL | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF NOT nextPh(isVoiced) THEN | |||
ChangePhoneme(k) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(k) | |||
ENDIF | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(m) THEN | |||
ChangePhoneme(m) | |||
ELIF nextPh(d) THEN | |||
ChangePhoneme(g) | |||
ELIF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(Q) | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(k) | |||
ENDIF | |||
IF PreVoicing THEN | |||
FMT(g/xg) | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(g/g_) addWav(x/g_) | |||
ENDIF | |||
FMT(g/g) addWav(x/g2) // weaker [g] | |||
endphoneme | |||
phoneme d | |||
vcd dnt stp | |||
IF thisPh(isWordEnd) AND nextPh(isNotVowel) AND NOT nextPh(isPause) THEN | |||
IF prevPh(isNasal) OR prevPh(isLiquid) OR prevPh(R) OR prevPh(**) OR prevPh(j) THEN | |||
ipa NULL | |||
ELIF nextPh(p) THEN | |||
ChangePhoneme(p) | |||
ELIF NOT nextPh(isVoiced) THEN | |||
ChangePhoneme(t) | |||
ENDIF ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(m) THEN | |||
ChangePhoneme(m) | |||
ELIF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(**) OR prevPh(R) OR prevPh(j) OR prevPh(w) OR prevPh(s) OR prevPh(z) THEN | |||
ChangePhoneme(D) | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(t) | |||
ENDIF | |||
CALL base2/d | |||
endphoneme | |||
// vowels | |||
//===================================================== | |||
phoneme e | |||
vwl starttype #e endtype #e | |||
length 170 | |||
IF thisPh(isUnstressed) THEN | |||
ChangePhoneme(@) | |||
ENDIF | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme O | |||
vwl starttype #o endtype #o | |||
length 170 | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(o) OR nextPh(O) THEN | |||
ipa NULL | |||
ELSE | |||
ChangeIfUnstressed(o) | |||
ENDIF | |||
ELIF thisPh(isUnstressed) THEN | |||
ChangePhoneme(o) | |||
ENDIF | |||
FMT(vowel/oo) | |||
endphoneme | |||
phoneme o | |||
vwl starttype #o endtype #o | |||
length 170 | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme @ // Schwa, e.g. alph**a** | |||
vwl starttype #@ endtype #@ | |||
length 140 | |||
FMT(vowel/@) | |||
endphoneme | |||
// fricatives | |||
// ==================================== | |||
phoneme v | |||
vcd lbd frc | |||
voicingswitch f | |||
lengthmod 6 | |||
Vowelin f1=0 f2=1000 -300 -200 f3=-300 100 | |||
Vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 | |||
IF thisPh(isWordEnd) AND prevPh(**) AND nextPh(isNotVowel) THEN | |||
ipa NULL | |||
ENDIF | |||
IF KlattSynth THEN | |||
Vowelout f1=1 f2=1000 -500 -300 f3=-300 60 len=50 brk | |||
IF nextPh(isPause2) THEN | |||
FMT(klatt/v_) addWav(vocw/v) | |||
ENDIF | |||
FMT(klatt/v) addWav(vocw/v, 150) | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(voc/v_) addWav(vocw/v) | |||
ENDIF | |||
IF thisPh(isWordStart) AND nextPhW(isLiquid) THEN | |||
length 70 | |||
ENDIF | |||
FMT(voc/v) addWav(vocw/v) | |||
endphoneme | |||
phoneme f | |||
vls lbd frc | |||
voicingswitch v | |||
lengthmod 3 | |||
Vowelout f1=0 f2=1000 -500 -350 f3=-200 80 | |||
IF thisPh(isWordEnd)THEN | |||
IF prevPh(**) THEN | |||
ipa NULL | |||
ELIF nextPh(isVoiced) THEN | |||
ipa v | |||
ENDIF | |||
ELIF nextPh(s) THEN | |||
IF nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // sonority propagation | |||
ChangePhoneme(d) | |||
ELSE | |||
ChangePhoneme(t) | |||
ENDIF | |||
ENDIF | |||
IF nextPh(isPause) THEN | |||
WAV(ufric/f_) | |||
ENDIF | |||
WAV(ufric/f) | |||
endphoneme | |||
// liquid | |||
// ===================================== | |||
phoneme ** // "cara" | |||
liquid alv rhotic | |||
ipa ɾ | |||
lengthmod 3 | |||
Vowelout f1=3 f2=1600 -300 300 f3=-300 80 rms=35 len=15 | |||
Vowelin f1=2 f2=1600 -300 300 f3=-100 80 len=20 | |||
IF nextPh(isWordEnd) AND nextPh(isNasal) THEN | |||
ipa NULL | |||
ENDIF | |||
IF prevPh(#i) OR prevPh(#e) THEN | |||
FMT(r3/@tap2) | |||
ENDIF | |||
FMT(r3/@tap) | |||
endphoneme | |||
phoneme l^ // "calla" | |||
liquid | |||
ipa ʎ | |||
lengthmod 7 | |||
Vowelout len=60 lenadd rate | |||
length 100 | |||
NextVowelStarts | |||
VowelStart(l^/j2@) | |||
VowelStart(l^/j2a) | |||
VowelStart(l^/j2e) | |||
VowelStart(l^/j2i) | |||
VowelStart(l^/j2o) | |||
VowelStart(l^/j2u) | |||
EndSwitch | |||
IF prevPh(isPause) THEN | |||
FMT(l^/_l^) | |||
ELIF prevPh(isVowel) THEN | |||
IF nextPh(isPause) THEN | |||
ChangePhoneme(j) | |||
ELIF nextPh(s) AND next2Ph(isPause) THEN | |||
ChangePhoneme(j) | |||
ELIF nextPh(isVowel) AND NOT thisPh(isWordEnd) AND NOT thisPh(isWordStart) THEN | |||
IF nextPh(isStressed) THEN | |||
IF nextPh(i) OR nextPh(e) THEN | |||
ipa NULL | |||
ELSE | |||
ChangePhoneme(j) | |||
ENDIF | |||
ELIF prevPh(isStressed) THEN | |||
IF prevPh(i) OR prevPh(e) THEN | |||
ipa NULL | |||
ELSE | |||
ChangePhoneme(j) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(j) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
FMT(l^/l^) | |||
endphoneme | |||
// fricatives | |||
//================================0 | |||
phoneme s // dissimilation | |||
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 thisPh(isWordEnd) AND nextPh(isVoiced) THEN | |||
ChangePhoneme(z) | |||
ELIF thisPh(isWordStart) THEN | |||
IF prevPh(t) THEN | |||
ChangePhoneme(ts) | |||
ENDIF | |||
ENDIF | |||
IF nextPh(isPause) THEN | |||
WAV(ufric/s_) | |||
ELIF nextPh(p) OR nextPh(t) OR nextPh(k) THEN | |||
WAV(ufric/s!) | |||
ENDIF | |||
WAV(ufric/s) | |||
endphoneme | |||
// nasals | |||
// =========================== | |||
phoneme m | |||
vcd blb nas | |||
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk | |||
lengthmod 4 | |||
IF KlattSynth THEN | |||
Vowelin f1=0 f2=1000 -50 -200 f3=-200 80 | |||
IF nextPh(isPause2) THEN | |||
FMT(klatt/m_) | |||
ENDIF | |||
FMT(klatt/m) | |||
ENDIF | |||
NextVowelStarts | |||
VowelStart(m/m@) | |||
VowelStart(m/ma) | |||
VowelStart(m/me) | |||
VowelStart(m/mi) | |||
VowelStart(m/mo) | |||
VowelStart(m/mu) | |||
EndSwitch | |||
IF nextPh(f) OR nextPh(v) THEN | |||
ChangePhoneme(M) | |||
ELIF nextPh(t) OR nextPh(d) OR nextPh(s) OR nextPh(z) OR nextPh(R) OR nextPh(S) OR nextPh(Z) THEN | |||
ChangePhoneme(n) | |||
ELIF nextPh(l^) OR nextPh(n^) THEN | |||
ChangePhoneme(n^) | |||
ELIF nextPh(k) OR nextPh(g) THEN | |||
ChangePhoneme(N) | |||
ELIF thisPh(isWordEnd) THEN | |||
IF nextPh(j) THEN | |||
ChangePhoneme(j) | |||
ELIF nextPh(l) THEN | |||
ChangePhoneme(l) | |||
ENDIF | |||
ENDIF | |||
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | |||
FMT(m/mj) | |||
ELIF prevPh(isPause) THEN | |||
FMT(m/_m) | |||
ELIF nextPh(isNotVowel) THEN | |||
FMT(m/m_) | |||
ENDIF | |||
endphoneme | |||
phoneme n | |||
vcd alv nas | |||
Vowelout f1=2 f2=1500 -300 250 f3=-100 80 rms=20 brk | |||
lengthmod 4 | |||
IF KlattSynth THEN | |||
Vowelin f1=0 f2=1500 -200 200 f3=0 80 | |||
FMT(klatt/n) | |||
ENDIF | |||
NextVowelStarts | |||
VowelStart(n/n@) | |||
VowelStart(n/na) | |||
VowelStart(n/ne) | |||
VowelStart(n/ni) | |||
VowelStart(n/no) | |||
VowelStart(n/nu) | |||
EndSwitch | |||
IF nextPh(f) OR nextPh(v) THEN | |||
ChangePhoneme(M) | |||
ELIF nextPh(k) OR nextPh(g) THEN | |||
ChangePhoneme(N) | |||
ELIF nextPh(p) OR nextPh(b) OR nextPh(v) OR nextPh(m) THEN | |||
ChangePhoneme(m) | |||
ELIF thisPh(isWordEnd) THEN | |||
IF nextPh(l^) OR nextPh(n^) THEN | |||
ChangePhoneme(n^) | |||
ELIF nextPh(j) THEN | |||
ChangePhoneme(j) | |||
ENDIF | |||
ENDIF | |||
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | |||
FMT(n/nj) | |||
ELIF prevPh(isPause) OR prevPh(n) THEN | |||
FMT(n/_n) | |||
ELIF nextPh(isNotVowel) THEN | |||
FMT(n/n_) | |||
ENDIF | |||
endphoneme |
@@ -0,0 +1,160 @@ | |||
//==================================================== | |||
// Catalan valencian - based on Catalan (and Spanish and Base2) | |||
//==================================================== | |||
// vowels | |||
//============= | |||
phoneme a | |||
vwl starttype #a endtype #a | |||
length 180 | |||
IF thisPh(isWordEnd) AND thisPh(isUnstressed) THEN | |||
ChangePhoneme(E) | |||
ENDIF | |||
FMT(vowel/a_6) | |||
endphoneme | |||
phoneme a2 // does not change in central accent | |||
vwl starttype #a endtype #a | |||
length 180 | |||
FMT(vowel/a_6) | |||
endphoneme | |||
phoneme e | |||
vwl starttype #e endtype #e | |||
length 170 | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordStart) THEN | |||
IF nextPh(s) OR nextPh(n) OR nextPh(m) OR nextPh(**) OR nextPh(R) THEN | |||
ChangePhoneme(a) | |||
ELIF nextPh(j) AND next2Ph(S) THEN | |||
ChangePhoneme(a) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme e2 // don't reduce: "aeri", "aeròdrom". | |||
vwl starttype #e endtype #e | |||
length 170 | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme E | |||
vwl starttype #e endtype #e | |||
length 180 | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordStart) THEN | |||
IF nextPh(s) OR nextPh(n) OR nextPh(m) OR nextPh(**) OR nextPh(R) THEN | |||
ChangePhoneme(a) | |||
ELIF nextPh(j) AND next2Ph(S) THEN | |||
ChangePhoneme(a) | |||
ELSE | |||
ChangePhoneme(e) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(e) | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme E2 // don't reduce | |||
vwl starttype #e endtype #e | |||
length 180 | |||
ChangeIfUnstressed(e2) | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme O | |||
vwl starttype #o endtype #o | |||
length 170 | |||
IF thisPh(isUnstressed) THEN | |||
ChangePhoneme(o) | |||
ENDIF | |||
FMT(vowel/oo) | |||
endphoneme | |||
phoneme o | |||
vwl starttype #o endtype #o | |||
length 170 | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme o2 | |||
vwl starttype #o endtype #o | |||
length 170 | |||
ChangeIfStressed(o) | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme i | |||
vwl starttype #i endtype #i | |||
length 170 | |||
IF thisPh(isUnstressed) AND nextPh(isVowel) THEN | |||
ChangePhoneme(j) | |||
ENDIF | |||
FMT(vowel/i) | |||
endphoneme | |||
// affricates | |||
//================ | |||
phoneme Z | |||
vcd pla frc sib | |||
voicingswitch S | |||
lengthmod 6 | |||
Vowelin f1=0 f2=2000 0 300 f3=-200 80 | |||
Vowelout f1=2 f2=2000 0 300 f3=-200 80 brk | |||
IF thisPh(isWordStart) OR prevPh(isNotVowel) THEN | |||
IF prevPh(d) THEN | |||
ELSE | |||
ChangePhoneme(dZ) | |||
ENDIF | |||
ENDIF | |||
endphoneme | |||
phoneme S | |||
vls pla frc sib | |||
voicingswitch Z | |||
lengthmod 3 | |||
Vowelin f1=0 f2=2100 100 300 f3=-100 80 | |||
Vowelout f1=0 f2=2100 100 300 f3=-100 80 | |||
IF thisPh(isWordStart) THEN // initial or post-consonant position | |||
ChangePhoneme(tS) | |||
ELIF prevPh(isNotVowel) THEN | |||
IF prevPh(j) THEN | |||
IF thisPh(isWordEnd) AND nextPh(isVoiced) THEN | |||
ChangePhoneme(Z) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(tS) | |||
ENDIF | |||
ENDIF | |||
WAV(ufric/sh) | |||
endphoneme | |||
phoneme v | |||
vcd lbd frc | |||
voicingswitch f | |||
lengthmod 6 | |||
Vowelin f1=0 f2=1000 -300 -200 f3=-300 100 | |||
Vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 | |||
IF KlattSynth THEN | |||
Vowelout f1=1 f2=1000 -500 -300 f3=-300 60 len=50 brk | |||
IF nextPh(isPause2) THEN | |||
FMT(klatt/v_) addWav(vocw/v) | |||
ENDIF | |||
FMT(klatt/v) addWav(vocw/v, 150) | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(voc/v_) addWav(vocw/v) | |||
ENDIF | |||
IF thisPh(isWordStart) AND nextPhW(isLiquid) THEN | |||
length 70 | |||
ENDIF | |||
FMT(voc/v) addWav(vocw/v) | |||
endphoneme |
@@ -0,0 +1,282 @@ | |||
//==================================================== | |||
// Catalan valencian - based on Catalan (and Spanish and Base2) | |||
//==================================================== | |||
// vowels | |||
//============= | |||
phoneme a | |||
vwl starttype #a endtype #a | |||
length 180 | |||
FMT(vowel/a_6) | |||
endphoneme | |||
phoneme a2 // does not change in central accent | |||
vwl starttype #a endtype #a | |||
length 180 | |||
FMT(vowel/a_6) | |||
endphoneme | |||
phoneme e | |||
vwl starttype #e endtype #e | |||
length 170 | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordStart) THEN | |||
IF nextPh(s) OR nextPh(n) OR nextPh(m) OR nextPh(**) OR nextPh(R) THEN | |||
ChangePhoneme(a) | |||
ELIF nextPh(j) AND next2Ph(S) THEN | |||
ChangePhoneme(a) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme e2 // don't reduce | |||
vwl starttype #e endtype #e | |||
length 170 | |||
FMT(vowel/e) | |||
endphoneme | |||
phoneme E | |||
vwl starttype #e endtype #e | |||
length 180 | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordStart) THEN | |||
IF nextPh(s) OR nextPh(n) OR nextPh(m) OR nextPh(**) OR nextPh(R) THEN | |||
ChangePhoneme(a) | |||
ELIF nextPh(j) AND next2Ph(S) THEN | |||
ChangePhoneme(a) | |||
ELSE | |||
ChangePhoneme(e) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(e) | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme E2 // don't reduce | |||
vwl starttype #e endtype #e | |||
length 180 | |||
ChangeIfUnstressed(e2) | |||
FMT(vowel/e_mid) | |||
endphoneme | |||
phoneme O | |||
vwl starttype #o endtype #o | |||
length 170 | |||
ChangeIfUnstressed(o) | |||
FMT(vowel/oo) | |||
endphoneme | |||
phoneme o2 | |||
vwl starttype #o endtype #o | |||
length 170 | |||
ChangeIfStressed(O) | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme o | |||
vwl starttype #o endtype #o | |||
length 170 | |||
FMT(vowel/o) | |||
endphoneme | |||
phoneme u | |||
vwl starttype #u endtype #u | |||
length 160 | |||
IF thisPh(isUnstressed) THEN | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVowel) THEN | |||
IF nextPh(u) OR nextPh(w) THEN | |||
ELSE | |||
ChangePhoneme(w) | |||
ENDIF | |||
ENDIF | |||
ELIF thisPh(isWordStart) THEN | |||
IF prevPh(isVowel) THEN | |||
ChangePhoneme(w) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
FMT(vowel/u_bck) | |||
endphoneme | |||
phoneme i | |||
vwl starttype #i endtype #i | |||
length 170 | |||
IF thisPh(isUnstressed) AND nextPh(isVowel) THEN | |||
ChangePhoneme(j) | |||
ENDIF | |||
FMT(vowel/i) | |||
endphoneme | |||
// nasals | |||
//============== | |||
phoneme n | |||
vcd alv nas | |||
Vowelout f1=2 f2=1500 -300 250 f3=-100 80 rms=20 brk | |||
lengthmod 4 | |||
IF KlattSynth THEN | |||
Vowelin f1=0 f2=1500 -200 200 f3=0 80 | |||
FMT(klatt/n) | |||
ENDIF | |||
NextVowelStarts | |||
VowelStart(n/n@) | |||
VowelStart(n/na) | |||
VowelStart(n/ne) | |||
VowelStart(n/ni) | |||
VowelStart(n/no) | |||
VowelStart(n/nu) | |||
EndSwitch | |||
IF nextPh(f) OR nextPh(v) THEN | |||
ChangePhoneme(M) | |||
ELIF nextPh(k) OR nextPh(g) THEN | |||
ChangePhoneme(N) | |||
ELIF nextPh(p) OR nextPh(b) OR nextPh(m) THEN | |||
ChangePhoneme(m) | |||
ENDIF | |||
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | |||
FMT(n/nj) | |||
ELIF prevPh(isPause) OR prevPh(n) THEN | |||
FMT(n/_n) | |||
ELIF nextPh(isNotVowel) THEN | |||
FMT(n/n_) | |||
ENDIF | |||
endphoneme | |||
// R | |||
//===================== | |||
phoneme R | |||
liquid trl | |||
lengthmod 6 | |||
ipa r | |||
IF thisPh(isWordEnd) THEN | |||
ChangePhoneme(**) | |||
ENDIF | |||
Vowelin f1=0 f2=1600 -300 300 f3=-200 80 | |||
Vowelout f1=2 f2=1600 -300 300 f3=-200 80 brk | |||
FMT(r3/r_trill2) addWav(r3/r_trill2.wav, 65) | |||
endphoneme | |||
// affricates | |||
//================ | |||
phoneme Z | |||
vcd pla frc sib | |||
voicingswitch S | |||
lengthmod 6 | |||
Vowelin f1=0 f2=2000 0 300 f3=-200 80 | |||
Vowelout f1=2 f2=2000 0 300 f3=-200 80 brk | |||
ChangePhoneme(dZ) | |||
endphoneme | |||
phoneme S | |||
vls pla frc sib | |||
voicingswitch Z | |||
lengthmod 3 | |||
Vowelin f1=0 f2=2100 100 300 f3=-100 80 | |||
Vowelout f1=0 f2=2100 100 300 f3=-100 80 | |||
IF prevPh(i) OR prevPh(j) THEN | |||
IF thisPh(isWordEnd) AND nextPh(isVoiced) THEN | |||
ChangePhoneme(Z) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(tS) | |||
ENDIF | |||
WAV(ufric/sh) | |||
endphoneme | |||
phoneme v | |||
vcd lbd frc | |||
voicingswitch f | |||
lengthmod 6 | |||
Vowelin f1=0 f2=1000 -300 -200 f3=-300 100 | |||
Vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 | |||
IF KlattSynth THEN | |||
Vowelout f1=1 f2=1000 -500 -300 f3=-300 60 len=50 brk | |||
IF nextPh(isPause2) THEN | |||
FMT(klatt/v_) addWav(vocw/v) | |||
ENDIF | |||
FMT(klatt/v) addWav(vocw/v, 150) | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(voc/v_) addWav(vocw/v) | |||
ENDIF | |||
IF thisPh(isWordStart) AND nextPhW(isLiquid) THEN | |||
length 70 | |||
ENDIF | |||
FMT(voc/v) addWav(vocw/v) | |||
endphoneme | |||
// Occlusive stops | |||
//================= | |||
phoneme b | |||
vcd blb stp | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ELIF prevPh(m) THEN | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
IF prevPh(**) OR prevPh(R) THEN //***"embarbussa"*** | |||
ELSE | |||
ChangePhoneme(B) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(p) | |||
ENDIF | |||
CALL base1/b | |||
endphoneme | |||
phoneme g | |||
vcd vel stp | |||
lengthmod 5 | |||
voicingswitch k | |||
Vowelin f1=2 f2=2300 200 300 f3=-300 80 | |||
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk | |||
IF thisPh(isWordEnd) THEN | |||
IF nextPh(isVoiced) AND nextPh(isNotVowel) THEN | |||
ELSE | |||
ChangePhoneme(k) | |||
ENDIF | |||
ELIF nextPh(s) AND nextPh(isWordEnd) AND next2Ph(isVoiced) THEN // keep sonority | |||
ELIF nextPh(isVoiced) THEN | |||
IF nextPh(isVowel) OR nextPh(isRhotic) OR nextPh(l) OR nextPh(j) OR nextPh(w) THEN | |||
IF prevPh(isVowel) OR prevPh(isLiquid) OR prevPh(isVFricative) THEN | |||
ChangePhoneme(Q) | |||
ENDIF | |||
ELIF nextPh(n) THEN | |||
ChangePhoneme(N) | |||
ENDIF | |||
ELSE | |||
ChangePhoneme(k) | |||
ENDIF | |||
IF PreVoicing THEN | |||
FMT(g/xg) | |||
ENDIF | |||
IF nextPh(isPause2) THEN | |||
FMT(g/g_) addWav(x/g_) | |||
ENDIF | |||
FMT(g/g) addWav(x/g2) | |||
endphoneme | |||
@@ -826,7 +826,6 @@ phoneme n^ // Spanish **ñ** | |||
ENDIF | |||
endphoneme | |||
phoneme N // si**ng** | |||
vcd vel nas | |||
Vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk | |||
@@ -1944,6 +1943,15 @@ include ph_spanish_la | |||
phonemetable ca es | |||
include ph_catalan | |||
phonemetable ca-nw ca | |||
include ph_catalan_nw | |||
phonemetable ca-va ca | |||
include ph_catalan_va | |||
phonemetable ca-ba ca | |||
include ph_catalan_ba | |||
phonemetable an es | |||
include ph_aragon | |||
@@ -1023,7 +1023,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
if (phoneme_tab[final_ph]->type != phVOWEL) { | |||
mnem = phoneme_tab[final_ph]->mnemonic; | |||
if (tr->translator_name == L('a', 'n')) { | |||
if ((tr->translator_name == L('a', 'n')) || (tr->translator_name == L('c', 'a'))) { | |||
if (((mnem != 's') && (mnem != 'n')) || phoneme_tab[final_ph2]->type != phVOWEL) | |||
stressed_syllable = vowel_count - 1; // stress on last syllable | |||
} else if (tr->translator_name == L('i', 'a')) { |
@@ -768,7 +768,7 @@ Translator *SelectTranslator(const char *name) | |||
if (name2 == L('c', 'a')) { | |||
// stress last syllable unless word ends with a vowel | |||
tr->punct_within_word = ca_punct_within_word; | |||
tr->langopts.stress_flags = S_FINAL_SPANISH | S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2; | |||
tr->langopts.stress_flags = S_FINAL_SPANISH | S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2 | S_FIRST_PRIMARY; | |||
} else if (name2 == L('i', 'a')) { | |||
tr->langopts.stress_flags = S_FINAL_SPANISH | S_FINAL_DIM_ONLY | S_FINAL_NO_2; | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ROMAN | NUM_ROMAN_AFTER; |
@@ -27,7 +27,10 @@ test_phwav bg 3020acb23ac0f93d5479de3b305b71fc07b5e738 "ma na n^a Na m;a pa ba t | |||
test_phwav bn 7fc6c8c6b347677885c6e973ff4dc6b2b6fa6d59 "ma na Na pa ta t.a tSa ka p#a t#a t.#a tS#a k#a ba da d.a dZa ga b#a d#a d.#a g#a fa Ba sa za Sa Za ha Ha wa la ja ra *a Ra _:_ ma mE mO me mi mi mu m& mV" | |||
test_phwav bpy 7fc6c8c6b347677885c6e973ff4dc6b2b6fa6d59 "ma na Na pa ta t.a tSa ka p#a t#a t.#a tS#a k#a ba da d.a dZa ga b#a d#a d.#a g#a fa Ba sa za Sa Za ha Ha wa la ja ra *a Ra _:_ ma mE mO me mi mi mu m& mV" | |||
test_phwav bs f3b9ea69a52d9cabc18007c0bb49c16583acef1b "ma na Na pa ta ka ba da ga tsa tSa tS;a dZa dZ;a fa sa Sa xa va za Za ja la l^a Ra r*a _:_ m@ m@2 ma ma: me me: mo mo: mi mi: mu mu: mA m& mE mU maI" | |||
test_phwav ca 563b93f7de72fb4832f2908484bad4908680d7da "ma na n^a Na pa ta ka ba da ga tsa tSa dza dZa sa Sa za Za fa Ta xa va Q\"a ja wa la l^a Ra *a _:_ ma ma# me mE mE2 mO mo mi mU mu" | |||
test_phwav ca 4954e404110f20ce89e77a784996678aa1c7caf7 "ma na n^a Na pa ta ka ba da ga tsa tSa dza dZa sa Sa za Za fa Ta xa va Q\"a ja wa la l^a Ra *a _:_ ma ma# me mE mE2 mO mo mi mU mu" | |||
test_phwav ca-ba 8446e6833ba24abb13006a081d5ece232322d6ad "ma na n^a Na pa ta ka ba da ga tsa tSa dza dZa sa Sa za Za fa Ta xa va Q\"a ja wa la l^a Ra *a _:_ ma ma# me mE mE2 mO mo mi mU mu" | |||
test_phwav ca-nw c79f0b9bb228feab4db57e44822cd900793803d9 "ma na n^a Na pa ta ka ba da ga tsa tSa dza dZa sa Sa za Za fa Ta xa va Q\"a ja wa la l^a Ra *a _:_ ma ma# me mE mE2 mO mo mi mU mu" | |||
test_phwav ca-va e32d68647ebac8cfc16fcf0401cefbfc92681a5b "ma na n^a Na pa ta ka ba da ga tsa tSa dza dZa sa Sa za Za fa Ta xa va Q\"a ja wa la l^a Ra *a _:_ ma ma# me mE mE2 mO mo mi mU mu" | |||
test_phwav chr 90c90ca6f4c77cb6bbfaff2a6583825088aaa5cb "ma na Na pa ta ka ba da ga fa Ta sa Sa xa ha va Da za Za tSa dZa la ra ja wa t2a t#a d#a z#a r-a z/2a w#a m- n- N- _:_ mI mE ma m0 mV mU mi: mA: mO: mu: m3: mA@ mO@ mo@ mU@ mi@3 mIR mVR mi@ me@ mi m@ m3 me# mI# mI2 meI maI mOI moU maU maa mO2 maI@ maI3 maU@" | |||
test_phwav cmn 368d0fd8e646e37e402377328df39b1d6e832401 "na Na la ja pa pha fa ta tha ka kha tS;a tS;ha S;a s.a tsa tsha ts.a ts.ha N-a _:_ ma mA mai mAu m@ m@r mE mei mi mi[ mi. miA miAu miE mio miou mo mo- mou mong mu muA mua muai mu@ mei muo my myu my& myE my@ myi _:_ ma11 ma21 ma214 ma22 ma33 ma35 ma44 ma51 ma53 ma55" | |||
test_phwav cmn-Latn-pinyin 368d0fd8e646e37e402377328df39b1d6e832401 "na Na la ja pa pha fa ta tha ka kha tS;a tS;ha S;a s.a tsa tsha ts.a ts.ha N-a _:_ ma mA mai mAu m@ m@r mE mei mi mi[ mi. miA miAu miE mio miou mo mo- mou mong mu muA mua muai mu@ mei muo my myu my& myE my@ myi _:_ ma11 ma21 ma214 ma22 ma33 ma35 ma44 ma51 ma53 ma55" |
@@ -56,10 +56,9 @@ dZ'ader 'at.Ok k'O*a h'OtS#e | |||
t,ader pr'aj 'O*d#ek,Oi b'aNlad,eSi n'agO*,ik" "মালয়েশিয়ায় অবৈধ শ্রমিকদের বিরুদ্ধে চলমান 'মেগা-থ্রি' অভিযানে সে দেশে শত শত অভিবাসীকে আটক করেছে সে দেশের ইমিগ্রেশন পুলিশ। যাদের আটক করা হয়েছে, তাদের প্রায় অর্ধেকই বাংলাদেশী নাগরিক।" "Beng" | |||
test_phon bs "l^'ub&znI f'En^eRdZ,Ij& tS'adZ;&vog l'its& x'otS;E d'a m'i p'ok&ZE St'os" "Љубазни фењерџија чађавог лица хоће да ми покаже штос." "Cyrl" | |||
test_phon bs "l^'ub&znI f'En^eRdZ,Ij& tS'adZ;&vog l'its& x'otS;E d'a m'i p'ok&ZE St'os" "Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos." "Latn" | |||
test_phon ca "d'ona# a#m'o* k'E s@**,as f'Elis | |||
a#jS;'O | |||
ill'us k'ompa#n^ Q@nj'ut | |||
Z;'a es Un l^w'it *R'EtUl Bla#B'is D'onz@_:_: k'e v#,e D,oBl@'ak" "Dóna amor que seràs feliç. Això, il·lús company geniüt, ja és un lluït rètol blavís d’onze kWh." "Latn" | |||
test_phon ca "d'on@ @m'oR k@ s@**'as f@l'is | |||
si n'o @nz @nt@n'Em p@** l^@Ngw'adZ@ | |||
@nt@Ng'Emnus p@** @m'oR" "Dóna amor que seràs feliç. Si no ens entenem per llenguatge, entenguem-nos per amor." "Latn" | |||
test_phon cs "n'exc j'iS hR^'i:Sne: s'aksof,oni J'a:blu: R'ozezv,utSi: s'i:n^ 'u:Jesn,i:mi t'o:ni v'aldzu | |||
t'aNga_! a kv'itskstepu | |||
pR^'i:liZ Zl'ucoUtSki: k'u:n^ 'u:pjel J'a:belske: 'o:di" "Nechť již hříšné saxofony ďáblů rozezvučí síň úděsnými tóny waltzu, tanga a quickstepu. Příliš žluťoučký kůň úpěl ďábelské ódy." "Latn" |