Riset dan implementasi sistem fonem Bahasa Indonesia untuk keperluan Text-to-Speech (TTS) dan Speech Recognition (ASR).
Repo ini mendokumentasikan perjalanan dari riset linguistik dasar sampai implementasi G2P (Grapheme-to-Phoneme) berbasis rule yang divalidasi terhadap leksikon KBBI.
Artikel awal (2018): Menelisik Komponen Kebahasaan untuk STT dan TTS
Masalah utama Bahasa Indonesia untuk TTS: satu huruf bisa punya beberapa bunyi berbeda dan tidak ada tanda diakritik dalam tulisan standar. Yang paling kritis adalah huruf 'e' yang bisa menjadi tiga bunyi berbeda:
| Bunyi | Simbol | Contoh tulis | Lafal |
|---|---|---|---|
| e murni | e |
enak, sore, teh | /enak/, /sore/ |
| e terbuka | E (/ɛ/) |
nenek, bebek, ember | /nɛnɛk/, /bɛbɛk/ |
| schwa | @ (/ə/) |
gedung, besar, me- | /gədung/, /bəsar/ |
Tidak ada cara menentukan bunyinya hanya dari tulisan tanpa kamus atau konteks.
Phoneset native kirralabs — dirancang untuk pipeline TTS Bahasa Indonesia:
| Simbol | IPA | Bunyi | Contoh |
|---|---|---|---|
a |
/a/ | a | air, ada |
e |
/e/ | e murni | enak, sore, teh |
E |
/ɛ/ | e terbuka | nenek, bebek |
@ |
/ə/ | schwa | gedung, me-, ber- |
i |
/i/ | i | indah, tari |
I |
/ɪ/ | i lemah | kering, tarik |
o |
/o/ | o tertutup | obat, toko |
O |
/ɔ/ | o terbuka | tolong, bola |
u |
/u/ | u | ulir, cucu |
U |
/ʊ/ | u lemah | taruh, rapuh |
| Simbol | Contoh tulis | Lafal |
|---|---|---|
ay |
pantai, intai | /pantay/ |
aw |
kalau, kau | /kalaw/ |
oy |
amboi | /amboy/ |
ey |
mei | /mey/ |
| Simbol | IPA | Bunyi | Contoh |
|---|---|---|---|
b |
/b/ | b | buku |
c |
/tʃ/ | c | cara |
d |
/d/ | d | duta |
f |
/f/ | f | fakta |
g |
/g/ | g | gula |
h |
/h/ | h | hari |
j |
/dʒ/ | j | juga |
k |
/k/ | k | kasih |
l |
/l/ | l | lama |
m |
/m/ | m | makan |
n |
/n/ | n | nakal |
N |
/ŋ/ | ng | barang, paling |
ñ |
/ɲ/ | ny | nyanyi, banyak |
p |
/p/ | p | pintu |
r |
/r/ | r | raja |
s |
/s/ | s | sama |
S |
/ʃ/ | sy | syukur |
t |
/t/ | t | timpa |
v |
/v/ | v | visa |
w |
/w/ | w | wanita |
x |
/x/ | kh | khas, akhir |
y |
/j/ | y | yakin |
z |
/z/ | z | zaman |
? |
/ʔ/ | glotal stop | tidak→/tida?/, rusak→/rusa?/ |
| Simbol | Keterangan |
|---|---|
sp |
short pause (antar kata) |
sil |
silence (akhir kalimat) |
Tabel referensi lengkap dari berbagai sumber (Google, Tata Bahasa Baku, 33 fonem BI):
| No | Tata Bahasa Baku | 33 Fonem BI | Pelafalan | Contoh tulis | Contoh lafal | |
|---|---|---|---|---|---|---|
| 1 | a | a | a | a | air adik kanvas | /air/ /adik/ /kanvas/ |
| 2 | au | aw | aw | kalau, kau | /kalaw/ /kaw/ | |
| 3 | ai | ay | ay | intai | /intay/ | |
| 4 | b | b | b | b | bukan baru bantal | /bukan/ /baru/ |
| 5 | c | c | c | c | cara cari cinta | /cara/ /cari/ |
| 6 | d | d | d | d | damai duta | /damay/ /duta/ |
| 7 | e | e | e | e | enak sore | /enak/ /sore/ |
| 8 | e | e | e2 | ε | nenek bebek | /nεnε?/ /bεbεk/ |
| 9 | e | e | e3 | ə | gedung besar | /gədung/ /bəsar/ |
| 10 | ei | ey | mei | /mey/ | ||
| 11 | f | f | f | f | formal fakta | /formal/ |
| 12 | g | g | g | g | gundul ragu | /gundul/ |
| 13 | h | h | h | h | harap hari | /harap/ |
| 14 | h | ħ | lihat | /liat/ | ||
| 15 | i | i | i | i | indah tari | /indah/ |
| 16 | I | I | I | kering tarik | /keriŋ/ | |
| 17 | j | j | j | j | jumlah juga | /jumlah/ |
| 18 | k | k | k | k | kasih sukar | /kasih/ |
| 19 | k | k | ? | rakyat rusak | /ra?yat/ /rusa?/ | |
| 20 | k | k' | politik | /politik'/ | ||
| 21 | l | l | l | l | lama palsu | /lama/ |
| 22 | m | m | m | m | mandi makan | /mandi/ |
| 23 | n | n | n | n | nanas nakal | /nanas/ |
| 24 | ny | ny | ny | ñ | nyanyi banyak | /ñañi/ /bañak/ |
| 25 | ng | ng | ng | ŋ | barang pangkat | /baraŋ/ /paŋkat/ |
| 26 | o | o | o | obat toko | /obat/ /toko/ | |
| 27 | o | o | o | O | tolong bola | /tOlong/ /bOla/ |
| 28 | oi | oi | oi | oy | amboi | /amboy/ |
| 29 | p | p | p | p | pilih pintu | /pilih/ |
| 30 | p | p' | sedap tatap | /sedap'/ | ||
| 31 | r | r | r | r | rantai raja | /rantay/ |
| 32 | s | s | s | s | suara sama | /suara/ |
| 33 | sy | sy | sy | š | syukur | /šukur/ |
| 34 | t | t | t | t | taruh timpa | /taruh/ |
| 35 | t | t' | lompat tempat | /lompat'/ | ||
| 36 | u | u | u | u | ulir cucu | /ulir/ |
| 37 | u | u | U | taruh rapuh | /tarUh/ | |
| 38 | v | v | visa | /visa/ | ||
| 39 | w | w | w | w | wanita waktu | /wanita/ |
| 40 | kh | kh | kh | x | khas akhir | /xas/ /axir/ |
| 41 | y | y | y | y | karya yakin | /karya/ |
| 42 | z | z | z | zaman ijazah | /zaman/ |
Konsonan yang bunyinya berubah tergantung posisi dalam kata:
| Huruf | Posisi | Bunyi | Contoh tulis | Contoh lafal |
|---|---|---|---|---|
| b | awal/tengah | [b] | baru, tambal | /baru/ |
| b | akhir kata | [p] implosif | adab, peradaban | /adap/ |
| d | awal/tengah | [d] | duta, madu | /duta/ |
| d | akhir kata | [t'] implosif | tekad, abad | /tekat'/ |
| g | awal/tengah | [g] | gula, ragu | /gula/ |
| g | akhir kata | [k] | bedug, gudeg | /beduk/ |
| h | normal | [h] | hari, rumah | /hari/ |
| h | antara dua vokal | silent/lemah | tahu, lihat | /tau/, /liat/ |
| k | awal/tengah | [k] | kasih, sukar | /kasih/ |
| k | akhir kata | [?] glotal | rusak, tidak | /rusa?/, /tida?/ |
| k | akhir kata (formal) | [k'] | politik | /politik'/ |
| p | akhir kata | [p'] implosif | sedap, tatap | /sedap'/ |
| t | akhir kata | [t'] implosif | lompat | /lompat'/ |
Kumpulan konsonan dalam satu suku kata yang sama:
| Gugus | Contoh |
|---|---|
| /pl/ | pleonasme, kompleks, taplak |
| /bl/ | blangko, gemblang |
| /kl/ | klinik, klimaks, klasik |
| /gl/ | global, gladiator |
| /fl/ | flamboyan, flu |
| /sl/ | slogan |
| /pr/ | pribadi, semprot |
| /br/ | brahma, obral |
| /tr/ | tragedi, sastra |
| /dr/ | drama, drastis |
| /kr/ | kristen, akrab |
| /gr/ | gram, grafik |
| /fr/ | fragmen, diafragma |
| /sr/ | pasrah, Sriwijaya |
| /ps/ | psikologi, pseudo |
| /ks/ | ekstra, eksponen |
| /dw/ | dwifungsi, dwibahasa |
| /sw/ | swalayan, swasta |
| /kw/ | kuintal |
| /sp/ | spora, sponsor |
| /sm/ | smokel |
| /sn/ | snobisme |
| /sk/ | skala, skema |
| Deret | Contoh |
|---|---|
| /i u/ | tiup, nyiur |
| /i o/ | kios, radio |
| /i a/ | tiap, dia |
| /e a/ | beasiswa, kreasi |
| /a i/ | saing, mainan, kain |
| /a u/ | kaum, mau |
| /o a/ | soal, doa |
| /u a/ | dua, puasa |
| /ə i/ | seikat |
| /ə e/ | seekor |
| /ə a/ | seakan |
| /ə u/ | seutas |
| /ə o/ | seorang |
| Format | Contoh |
|---|---|
| V | /a/-ku |
| KV | /bu/-ku, /ra/-gam |
| VK | /im/-an, /in/-dah |
| VKK | /eks/-perimen |
| KKV | /kli/-maks, /kla/-sik |
| KVK | in-/dah/, /gel/-ap |
| KKVK | /prak/-tis |
| KKKVK | /struk/-tur |
| KKVKK | /trans/-migrasi |
| KVKKK | /korps/ |
| KKKV | in-/stru/-men |
Validasi phoneset ini dilakukan terhadap leksikon KBBI 62.715 entri menggunakan pipeline G2P otomatis. Temuan penting:
62,5% kata dalam KBBI mengandung huruf 'e'. Distribusi resolusi:
| Status | Jumlah | Keterangan |
|---|---|---|
| Resolved (E atau @) | 37.630 | Akurat dari diakritik KBBI atau rule jelas |
| MEDIUM confidence | 466 | Awalan me-/be-/pe-/se- → schwa jelas |
| LOW confidence | 1.108 | Kata daerah/teknis ultra-jarang |
| Error rate | 1.8% | Kata yang genuinely ambigu |
Kata serapan ilmiah/teknis (dominasi LOW confidence):
- Prefix:
pre-,res-,tel-,aer-,ste-,ant-,pal-,dek- - Suffix:
-asi,-isme,-sis,-bia,-ogi,-mia,-tik - 'e' dalam kata serapan hampir selalu e murni /e/, bukan schwa
Rule loanword detection yang dikembangkan dari analisis ini:
- Pola konsonan asing (
ph,th,str,sch,dh) - Panjang kata > 11 karakter → hampir pasti teknis
- Suffix ilmiah:
-asi,-isme,-sis,-bia, dll - Kata dimulai
a+ konsonan, panjang > 4 → serapan - Kata
ae-(Yunani: aerob, aeolus) → serapan
Field lafal dalam data KBBI menggunakan diakritik yang secara eksplisit menyelesaikan ambiguitas 'e':
| Diakritik | Bunyi | Contoh KBBI |
|---|---|---|
è |
/ɛ/ e terbuka | absèn → /absEn/ |
ê |
/ə/ schwa | adêm → /ad@m/ |
é |
/e/ murni | aboné → /abOne/ |
Hanya 23% entri KBBI yang memiliki lafal eksplisit — selebihnya membutuhkan heuristik atau loanword detection.
Rule-based G2P ini diimplementasikan sebagai bagian dari pipeline TTS Bahasa Indonesia:
styletts2-id/
├── g2p/
│ ├── rules.py # Rule fonem (repo ini)
│ ├── converter.py # G2P orchestrator
│ └── data/
│ └── lexicon.json # 62.715 kata dari KBBI
├── preprocessing/
│ └── pipeline.py # Audio preprocessing
└── ...
kbbi-lexicon-builder/
├── tts_lexicon_builder.py # Ekstrak KBBI → lexicon
└── lexicon_audit.py # Audit kualitas
Alur konversi:
Teks BI
↓
Lookup lexicon KBBI (62.715 kata, akurat)
↓ tidak ditemukan
Rule-based heuristik (rules.py)
↓
Phoneme sequence → StyleTTS2 / Piper TTS
Sumber lihat bagian akhir artikel
