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