Anda di halaman 1dari 22

BAB IV

IMPLEMENTASI DAN HASIL PENGUJIAN

4.1 Implementasi
Sistem yang dirancang merupakan “Sistem sintesa ucapan alami Bahasa
Melayu Pontianak berbasis HMM-based Speech Synthesis System (HTS)” berbasis
web yang bertujuan untuk mensintesa suara ucapan dari masukan berupa teks.
Antarmuka sistem yang dirancang terdiri dari dua yaitu halaman utama / beranda
dan halaman keterangan. Adapun hasil implementasinya sebagai berikut:
4.1.1 Antarmuka sistem
Antarmuka merupakan sebuah sarana bagi pengguna untuk menggunakan
beberapa fitur atau fungsi yang ditawarkan oleh sistem. Antarmuka memiliki
beberapa bagian secara umum yaitu bagian navigasi, bagian isi dan beberapa
bagian lain seperti footer. Bagian navigasi berfungsi untuk menampilkan beberapa
link untuk menuju halaman lain dan bagian isi yang berfungsi untuk
menyampaikan informasi atau menampilkan fitur dari sistem.
Antarmuka sistem sintesa ucapan alami bahasa Melayu Pontianak berupa
halaman web yang terdiri dari beberapa menu yaitu beranda, dan keterangan.
Setiap halaman web memiliki fungsi berbeda-beda.

Gambar 4.1 Antarmuka halaman beranda

69
70

4.1.1.1 Antarmuka halaman beranda


Antarmuka halaman beranda memiliki sebuah kotak masukan yang
digunakan oleh sistem untuk menerima masukan teks dari pengguna. Hasil
masukan dari pengguna akan diproses setelah pengguna menekan tombol sintesa.
Proses yang dilakukan oleh sistem secara umum adalah mengolah teks masukan
pengguna sehingga dapat menghasilkan suara ucapan yang sesuai dengan isi dari
teks masukan pengguna. Keluaran yang diterima oleh pengguna adalah sebuah
pemutar audio yang muncul dibawah tombol sintesa. Antarmuka halaman beranda
dapat dilihat pada gambar 4.1.

Gambar 4.2 Antarmuka halaman keterangan bagian informasi sekilas

4.1.1.2 Antarmuka halaman keterangan


Antarmuka halaman keterangan berfungsi untuk menampilkan beberapa
informasi mengenai sistem sintesa ucapan alami bahasa Melayu Pontianak.
Antarmuka terdiri dari tiga bagian yaitu informasi sekilas, daftar simbol atau
karakter yang dapat diolah dan daftar format yang dikonversi oleh sistem yang
masing-masing dapat dilihat pada gambar 4.2, 4.3, dan 4.4.
Bagian informasi sekilas berisi mengenai metode dalam membangun
sistem sintesa ucapan, beberapa alat dan library yang dipakai, penjelasan singkat
mengenai bahasa Melayu dialek Pontianak, dan beberapa keterbatasan dari sistem.
Bagian daftar simbol atau karakter berisi mengenai kumpulan karakter atau
simbol yang dapat ditanganin oleh sistem. Simbol atau karakter diluar daftar
71

tersebut tidak akan diproses atau dihilangkan oleh sistem. Bagian daftar format
berisi tentang daftar format teks yang memiliki makna tertentu yang dikonversi
sistem sehingga dapat diucapkan sesuai dengan makna yang dimaksud seperti
format tanggal atau format nominal angka.

Gambar 4.3 Antarmuka halaman keterangan bagian daftar format


yang akan dikonversi

Gambar 4.4 Antarmuka halaman keterangan bagian daftar simbol


atau karakter
72

4.2 Tahap Pengujian


Pengujian yang dilakukan terdiri dari lima jenis yaitu pengujian black box,
MOS, CMOS, AB dan WER. Variasi hasil sintesa, skema pengujian dan daftar
kalimat uji masing-masing dapat dilihat pada tabel 3.3, 3.4 dan 3.5. Pengujian
MOS menggunakan skala penilaian yang dapat dilihat pada tabel 3.6. Hasil
pengujian MOS tersebut akan dikonversi menjadi skala sesuai dengan standar
ITU-P.800.1
Total responden untuk seluruh pengujian berjumlah 90 orang. Sebagian
besar responden berasal dari mahasiswa teknik Untan dengan prodi teknik
Informatika. Daftar responden dapat dilihat pada lampiran N.
Sistem yang dibangun terdiri dari dua bagian secara umum yaitu bagian
pengolahan liguistik (front-end) dan bagian sintesa suara (back-end). Bagian
front-end terdiri dari tahap normalisasi teks, pembuatan file utterance, dan
pembuatan file kontekstual. Bagian back-end berupa tahap pembuatan gelombang
suara dengan menggunakan hts_engine dengan label kontekstual hasil dari bagian
front-end.
Model yang digunakan untuk bagian sintesa suara dihasilkan dari tahap
pelatihan yang telah dijelaskan di bab 3. Pada subbab ini akan dijelaskan beberapa
cara kerja sistem terutama yaitu bagian front-end dan back-end dengan beberapa
contoh kalimat yang dapat dilihat pada tabel 4.1.
Tabel 4.1 Tabel contoh kalimat masukan pengguna
No. Nama kalimat Isi kalimat
1. Kalimat A “ saye& die pegi same ----- same ke kapal
klotok pada tanggal ---- $$ () 12-09-2012 12:30 12
kali”
2. Kalimat B “### nomor undian 12-01-2----3---4---66-55555…….
Silekan ambek duitnye di kantor A.”
3. Kalimat C “!!! duit ! !! ! saye ,,,,,,sisak 10.000 rupiah>>>dari
kemaren. Habes dari pantai”
4.2.1 Normalisasi teks
Normalisasi teks merupakan proses mengolah masukan pengguna
sehingga masukan pengguna dapat diproses pada tahap berikutnya.
4.2.1.1 Penghapusan token tertentu
73

Tidak semua tanda baca dan simbol atau juga disebut dengan token akan
dikonversikan pada sistem sintesa. Token yang diproses oleh sistem dapat dilihat
pada tabel 3.1. Penghapusan token terdiri dari penghapusan token yang tidak
ditanganin oleh sistem dan menghapus token yang berlebihan. Pencarian,
substitusi dan penghapusan token dilakukan dengan menggunakan ekpresi regular
atau regex (regular expression). Terdapat dua implementasi penghapusan token
tertentu yang masing-masing dapat dilihat pada kode program 4.1 dan 4.2.
Kode program 4.1 Penghapusan token yang tidak ditanganin oleh sistem
1. $text = preg_replace("/[^A-Z|a-z|\d|\&|\
+|\=|\>|\<|\@|\s|\-|\~|\.|\:|\,|\'|\/|\n|\r]/", " ", $text)

Pada kode program 4.2, teks hasil masukan pengguna disaring dengan
menggunakan fungsi preg_replace() sehingga hasil masukan pengguna hanya
terdiri dari token yang ditanganin oleh sistem. Kode program 4.2 ditulis dalam
bahasa pemrograman PHP. Proses pengolahan teks selanjutkan akan ditulis dalam
bahasa pemrograman Python.
Kode program 4.2 Penghapusan token berlebihan
1. special_tokens = ["\&", "\+", "\=", '\>', '\<', '\@', "\/"]
2. default_tokens = ["\s",'\-','\~', '\.', "\:", '\,', "\'","\/"]
+ special_tokens
3.
4. def rmDblToken(text, tokens):
5. for token in tokens:
6. tmp = token
7. regex = r"({0}{0}+)"
8. text = re.sub(regex.format(token), (" " if token ==
"\s" else token[1:]), text)
9. normal_text = text
10. return normal_text

Pada kode program 4.2, token direpresentasi dalam bentuk larik dan setiap
token akan dibuat sebuah pola (pattern) regex. Contoh pola yang dihasilkan untuk
token “-“ adalah “ \-\-+ dan berikut beberapa penjelasan terkait pola tersebut:
1. Meta karakter \s bermakna spasi,
2. tanda garis miring terbalik atau backslash (\) berfungsi untuk
meloloskan karakter setelah garis miring,
3. tanda (+) bermakna kemuculan pola terkait minimal 1 kali atau lebih.
74

Setelah teks yang sesuai pola tersaring, pola akan disubstitusikan dengan
token terkait sehingga token yang berlebihan akan dapat dihapus. Contoh hasil
kalimat yang telah melalui prose penghapusan token tertentu dapat dilihat pada
tabel 4.2.
Tabel 4.2 Contoh kalimat hasil penghapusan token tertentu
No. Jenis kalimat Hasil perubahan
1. A “ saye& die pegi same - same ke kapal klotok pada
tanggal - 12-09-2012 12:30 12 kali”
2. B “ nomor undian 12-01-2-3-4-66-55555. Silehkan ambek
duitnye di kantor A.”
3. C “duit saye ,sisak 10.000 rupiah>dari kemaren. Habes
dari pantai”

4.2.1.2 Penambahan spasi pada token


Setelah token disaring, token kemudian akan diberikan spasi terutama pada
tanda baca titik dan koma pada akhir kalimat sehingga dapat mempermudah
proses pemecahan kalimat menjadi token yang lebih kecil.
Kode program 4.3 Penambahan spasi pada token
1. def addSpace(text):
2.   tokens = ["\.", "\,"]
3.   for token in tokens:
4.     regex = r"(({}\s+|{}$))"
5.     text = re.sub(regex.format(token, token)," "+token[1:]+"
", text)
6.   
7.   for token in special_tokens:
8. if token in ["\/"]: continue
9.     regex = r"({})"
10.     text = re.sub(regex.format(token)," "+token[1:]+" ", text)
11.   return text

Pada kode program 4.3, terdapat dua pola yang digunakan. Pola pertama
untuk dua token yaitu koma (,) dan titik (.) karena kedua token tersebut dapat
bermakna sebagai tanda akhir dari kalimat. Pola pada kedua token tersebut adalah
“semua tanda titik atau koma yang berada diakhir kalimat atau diakhiri oleh
spasi”. Sedangkan pola kedua adalah token selain untuk format tanggal, waktu
dan angka.
75

Setelah teks yang sesuai pola tersaring, pola akan disubstitusikan dengan
token terkait dengan spasi diantara token tersebut. Contoh kalimat hasil
penambahan spasi pada token dapat dilihat pada tabel 4.3.
Tabel 4.3 Contoh kalimat hasil penambahan spasi pada token
No. Jenis kalimat Hasil perubahan
1. A “ saye & die pegi same - same ke kapal klotok pada
tanggal - 12-09-2012 12:30 12 kali”
2. B “ nomor undian 12 - 01 - 2 - 3 - 4 - 66 – 55555 .
Silehkan ambek duitnye di kantor A .”
3. C “duit saye , sisak 10.000 rupiah > dari kemaren . habes
dari pantai”

4.2.1.3 Tokenisasi
Tokenisasi adalah proses memecahkan sebuah teks menjadi bagian yang
lebih kecil atau token. Tokenisasi pada umumnya menggunakan spasi sebagai
pemisah. Token yang dihasilkan berupa kata, tanda baca atau simbol.
Implementasi tokenisasi dapat dilihat pada kode program 4.4. Pada python, teks
dapat ditokenisasi dengan menggunakan fungsi split(). Contoh kalimat hasil
tokenisasi dapat dilihat pada tabel 4.4.
Kode program 4.4 Tokenisasi dan konversi teks
1 def checkRegex(text, format_regex):
2   regex = r"({})"
3   pattern = str.join("|", format_regex)
4   return re.match(regex.format(pattern), text) is not None
5
6 def convertToWord(text):
7   convert_text = []
8   for normal in text.split(" "):
9     if(checkRegex(normal, format_date) and isDate(normal)):
10       convert_text.append(dateToStr(normal))
11     elif(checkRegex(normal, format_time) and
isTime(normal)):
12       convert_text.append(timeToStr(normal))
13     elif(checkRegex(normal, format_num)):
14       convert_text.append(currNumToStr(normal))
15     elif(checkRegex(normal, format_text)):
16       convert_text.append(normal)
17     else:
18       tmp = numToStr(normal)
76

19       tmp = convertToken(tmp)
20       convert_text.append(tmp)
21   return addSpace(rmDblToken(str.join(" ", convert_text),
default_tokens))

Tabel 4.4 Contoh kalimat hasil tokenisasi


No. Jenis kalimat Hasil perubahan
1. A [“saye”, “&”, “die”, “pegi”, “same”, “-“, “same”, “ke”,
“kapal”, “klotok”, “pada”, “tanggal”, “-“, “12-09-
2012”, “12:30”, “12”, “kali”]
2. B [“nomor”, “undian”, “12”, “-“, “01”, “-“, “2”, “-“, “3”,
“-“, “4”, “-“, “66”, “-”, “55555”, “.”, “Silehkan”,
“ambek”, “duitnye”, “di”, “kantor”, “A”. “.”]
3. C [“duit”, “saye”, “,” “sisak”, “10.000”, “rupiah”, “>”,
“dari”, “kemaren”, “habes”, “.”, “dari”, “pantai”]

4.2.1.4 Konversi token menjadi teks


Setelah kalimat telah ditokenisasi, setiap token yang terbentuk akan
diperiksa sesuai dengan format dan akan dikonversi menjadi teks. Hasil konversi
teks dapt dilihat pada tabel 4.5
Tabel 4.5 Contoh kalimat hasil konversi token
No. Jenis kalimat Hasil perubahan
1. A [“saye”, “&”, “die”, “pegi”, “same”, “-“, “same”, “ke”,
“kapal”, “klotok”, “pada”, “tanggal”, “-“, “duak belas
September duak ribu duak belas”, “jam duak belas tige
puloh menit”, “duak belas”, “kali”]
2. B [“nomor”, “undian”, “duak belas”, “-“,”kosong”,
“satu”, “-“, “duak”, “-“, “tige”, “-“, “empat”, “-“, “enam
puloh enam”, “-“, “limak limak limak limak limak” “.”,
“sile~hkan”, “ambek”, “duitnye”, “di”, “kantor”, “a”.
“.”]
3. C [“duit”, “saye”, “,” “sisak”, “sepuluh ribu”, “rupiah”,
“>”, “dari”, “kemaren”, “.”, “habes”, “dari”, “pantai”]

4.2.1.4.1 Konversi tanggal


77

Format tanggal diubah menjadi pola regex. Setelah teks sesuai pola
tersaring, pola akan dicek kembali dengan menggunakan fungsi strptime dari
modul datetime dari python. Pengecekan kembali dilakukan untuk mengecek isi
dari teks yang telah tersaring. Setelah pengecekan, teks akan diubah secara
manual menjadi teks. Implementasi konversi tanggal dapat dilihat pada kode
program 4.5. Contoh hasil konversi tanggal dapat dilihat pada kalimat A di tabel
4.5.
Kode program 4.5 Pola regex untuk konversi tanggal
1 format_date =
['^\d{1,2}\/\d{1,2}\/\d{4}$','^\d{1,2}\-\d{1,2}\-\d{4}$',
'^\d{1,2}\/\d{4}$', '^\d{1,2}-\d{4}$']
2 format_time = ['^\d{1,2}\:\d{2}', '^\d{1,2}$\:\d{2}:\d{2}$']

4.2.1.4.2 Konversi waktu


Format waktu diubah menjadi pola regex. Setelah teks sesuai pola
tersaring, pola akan dicek kembali dengan menggunakan fungsi strptime dari
modul datetime dari python. Pengecekan kembali dilakukan untuk mengecek isi
dari teks yang telah tersaring. Setelah pengecekan, teks akan diubah secara
manual menjadi teks. Implementasi konversi tanggal dapat dilihat pada kode
program 4.6. Contoh hasil konversi tanggal dapat dilihat pada kalimat A di tabel
4.5.
Kode program 4.6 Pola regex untuk konversi waktu
1 format_time = ['^\d{1,2}\:\d{2}', '^\d{1,2}$\:\d{2}:\d{2}$']

4.2.1.4.3 Konversi angka sesuai dengan nominal


Terdapat empat pola untuk menyaring teks untuk konversi angka sesuai
dengan nominal. Pola tersebut dapat dilihat pada kode program 4.7. Pola tersebut
dalam regex. Teks akan disaring dan dicek tanda pemisah ribuan. Setelah tanda
pemisah ribuan didapatkan, teks akan diubah menjadi angka. Jika teks memiliki
angka desimal, angka desimal akan dipisahkan dan dikonversi sesuai digit.
Contoh hasil konversi tanggal dapat dilihat pada kalimat C di tabel 4.5.

Kode program 4.7 Pola regex untuk konversi angka sesuai dengan nominal
78

1 format_num = ['^(?:[1-9]{1}\d{0,2})(?:\.\d{3})*(?:\,\d+)*$',
'^(?:[1-9]{1}\d{0,2})(?:\,\d{3})*(?:\.\d+)*$', '^([1-9]
{1}\d{0,3})$']

4.2.1.4.4 Konversi angka sesuai digit


Teks dipecah dengan menggunakan regex dan pemisah teks berupa tanda
baca atau simbol. Setelah teks dipecah, teks dipecah kembali per huruf. Jika huruf
merupakan angka maka huruf tersebut akan dikonversi dan jika huruf bukan
angka maka huruf tidak dikonversi. Contoh hasil konversi tanggal dapat dilihat
pada kalimat B di tabel 4.5.

4.2.1.4.5 Konversi token tersisa


Token berupa tanda baca atau simbol yang belum dikonversi akan
dikonversi. Contoh hasil konversi tanggal dapat dilihat pada kalimat A di tabel
4.5.

4.2.1.5 Pengecekan kamus data


Setelah teks telah ternormalisasi, setiap kata dicek satu per satu
berdasarkan kamus data. Kamus data berupa sebuah file dengan ektensi txt yang
berisi daftar kata yang telah didefinisikan di file ut_my_ar_lexicon.scm. Jika
terdapat kata diluar kamus data, maka kata tersebut akan masuk ke tahap
berikutnya yaitu penerapan aturan letter-to-sound. Contoh kata diluar kamus hasil
pengecekan kamus data dapat dilihat pada tabel 4.6.
Kode program 4.8 Pengecekan kamus data dan penerapan aturan letter to sound.
1 def letterToSound(text_file):
2   char = ["q", "z", "f", "v", "-"]
3   char2 = ["k", "j", "p", "p", " "]
4   words = text_file
5   for x in char:
6     words = words.replace(x, char2[char.index(x)])
7 converted_words = words
8   words = words.split(" ")
9   pronounces = {}
10   special = ["e~","ny", "ng", "ai", "oi", "au"]
11   tmp = "({}|[a-z|A-Z|0-9])"
12   regex = tmp.format(str.join("|",special))
13
14   for word in words:
79

15     if(not findLex(word)):
16       if(len(re.findall(regex, word)) > 0):
17         pronounces[word] = re.findall(regex, word)
18   return pronounces, converted_words

Tabel 4.6 Contoh kalimat diluar kamus data


No. Jenis kalimat Kata yang tidak ada di kamus data
1. A [“die”, “pada”, “tanggal”, “september”, “menit”]
2. B [“nomor”, “undian”, “sile~hkan”, “ambek”, “duitnye”]
3. C [“duit”, “sisak”, “sepuluh”, “ribu”, “rupiah”, “habes”,
“pantai”]

4.2.1.6 Penerapan aturan letter to sound


Aturan letter-to-sound adalah sebuah aturan untuk memberikan
pengucapan secara default terhadap kata diluar kamus. Proses yang dilakukan
yaitu memecah kata menjadi huruf, kemudian terdapat beberapa huruf yang
dibunyikan bersamaan akan digabung seperti “ny”, “ng”, “ai”, “oi”, dan “au” dan
beberapa jenis huruf yang dikonversi menjadi huruf lain. Setelah aturan telah
dipenuhi, kumpulan huruf kemudian disimpan dengan format lexicon. Hasil
kamus data disimpan pada file yang berbeda dengan file lexicon utama.
Tabel 4.7 Contoh kata diluar kamus yang dikonversi menjadi format lexicon
Jenis
No
kalima Kata Format lexicon
.
t
1. A die (lex.add.entry '("die"    n ( ((d i e)0) )))  
pada (lex.add.entry '("pada"    n ( ((p a d a)0) )))  
tanggal (lex.add.entry '("tanggal"    n ( ((t a ng g a l)0) )))  
september (lex.add.entry '("september" n ( ((s e p t e m b e
r)0) )))  
menit (lex.add.entry '("menit"    n ( ((m e n i t)0) )))  
2. B nomor (lex.add.entry '("nomor"    n ( ((n o m o r)0) )))  
undian (lex.add.entry '("undian"    n ( ((u n d i a n)0) )))  
sile~hkan (lex.add.entry '("sile~hkan" n ( ((s i l e~ h k a
n)0) )))  
ambek (lex.add.entry '("ambek"    n ( ((a m b e k)0) )))  
duitnye (lex.add.entry '("duitnye"    n ( ((d u i t ny e)0) )))  
3. C duit (lex.add.entry '("duit"    n ( ((d u i t)0) )))  
sisak (lex.add.entry '("sisak"    n ( ((s i s a k)0) )))  
sepuluh (lex.add.entry '("sepuluh"    n ( ((s e p u l u h)0) )))  
80

ribu (lex.add.entry '("ribu"    n ( ((r i b u)0) )))  


rupiah (lex.add.entry '("rupiah"    n ( ((r u p i a h)0) )))  
habes (lex.add.entry '("habes"    n ( ((h a b e s)0) )))  
pantai (lex.add.entry '("pantai"    n ( ((p a n t ai)0) )))  

4.2.1.7 Penggabungan teks


Setiap token yang telah dikonversi dan terdefinisi dalam lexicon digabung
kembali menjadi sebuah teks. Teks ini akan diubah menjadi label kontekstual
sehingga dapat dibunyikan dengan menggunakan hts_engine. Contoh kalimat
ternormalisasi dapat dilihat pada tabel 4.8.
Tabel 4.8 Contoh kalimat ternormalisasi
Jenis
No. Hasil perubahan
kalimat
“saye dan die pegi same – same ke kapal klotok pada tanggal –
1. A duak belas september duak ribu duak belas jam duak belas tige
puloh menit duak belas kali”]
[“nomor undian duak belas – kosong satu – duak – tige –
2. B empat – enam puloh enam – limak limak limak limak limak .
sile~hkan ambek duitnye di kantor a .”]
[“duit saye , sisak sepuluh ribu rupiah lebih besak dari
3. C
kemaren . habes dari pantai”]

4.2.2 Pembuatan file utterance


Teks yang telah ternormalisasi dan terdefinisi dalam kamus data akan
dikonversi menjadi label kontekstual sehingga dapat dibunyikan dengan
menggunakan hts_engine. Implementasi pembuatan file utterance dapat dilihat
pada kode program 4.9.
Kode program 4.9 Pembuatan file utterance.
1 fest = festival_path+"/bin/festival"
2 lts = web_path+"/result/additional_lexicon.scm"
3 utt_name = "file_utt"
4 script1 = fest+" --heap 20000000 -b "+lts+" '(utt.save
(SynthText \""+text+"\") \""+utt_name+"\")'"
5 subprocess.run(script1, shell=True)

4.2.3 Pembuatan label kontekstual


81

Pengubahan file utterance menjadi format label kontekstual menggunakan


fitur dumptfeat dari Festival TTS. Dumpfeat menerima beberapa inputan dimana
salah satunya adalah label.feats, file utterance dan aturan tambahan yaitu
extra_feats.scm. Isi label.feats sama seperti file feats.list.
File extra_feats.scm merupakan aturan tambahan untuk menghitung
beberapa informasi prosodi lainnya. File extra_feats.scm didapatkan dari demo
HTS dan dimodifikasi sehingga dapat digunakan untuk bahasa Melayu dialek
Pontianak. File extra_feats.scm ditulis dalam bahasa pemrograman Lisp. File
extra_feats.scm dapat dilihat pada lampiran J.
File yang dihasilkan dari Dumpfeat adalah nilai dari informasi prosodi
sesuai dengan format label kontekstual. File tersebut akan diformat dengan
menjadi label kontekstual dan menggunakan awk. Script yang dijalankan dengan
menggunakan awk adalah label.awk yang dapat dilihat pada lampiran L. Script
label.awk didapatkan dari demo HTS. Implementasi pembuatan label kontekstual
dapat dilihat pada kode program 4.10.
Kode program 4.10 Pembuatan label kontekstual
1 lbl_full = web_path+"/scripts/label-full.awk"
2 extra_feat = web_path+"/scripts/extra_feats.scm"
3 lbl_feat = web_path+"/scripts/label.feats"
4 dumpfeat = festival_path+"/examples/dumpfeats"
5 utt = web_path+"/results/file_utt.utt"
6 hts_lab = web_path+"/results/file_lab.lab"
7 feat = web_path+"/results/file_feat.feats"
8
9 script2 = dumpfeat+" -eval "+extra_feat+" -relation Segment
-feats "+lbl_feat+" -output "+feat+" "+utt
10 script3 = "gawk -f "+lbl_full+" "+feat+" > "+hts_lab
11
12 if os.path.exists(utt) and os.path.isfile(utt):
13 subprocess.run(script2, shell=True)
14 if os.path.exists(feat) and os.path.isfile(feat):
15 subprocess.run(script3, shell=True)

4.2.4 Pembuatan gelombang suara


Pembangkitan gelombang suara dari teks yang telah diubah menjadi label
kontekstual menggunakan aplikasi hts_engine dan model HTS yang didapatkan
82

dari tahap pelatihan HMM. Implementasi pembuatan gelombang suara dapat


dilihat pada kode program 4.11.
Kode program 4.11 Pembuatan gelombang suara
1 hts_voice = web_path+"/voice/ut_my_ar.htsvoice"
2 hts_lab = web_path+"/results/file_lab.lab"
3 wav = web_path+"/results/file_wav.wav"
4
5 script4 = "hts_engine -m "+hts_voice+" -ow "+wav+" "+hts_lab
6 if os.path.exists(hts_lab) and os.path.isfile(hts_lab):
7 subprocess.run(script4, shell=True)

4.3 Hasil Pengujian


Terdapat lima jenis pengujian yang dilakukan yaitu pengujian pengujian
black box, MOS, CMOS, AB dan WER. Hasil Pengujian dapat dilihat pada
lampiran N.
4.3.1 Pengujian Black Box
Pengujian black box bertujuan untuk menguji fungsionalitas dari sistem.
Pengujian black box berdasarkan masukan pengguna. Sistem hanya memiliki satu
input sehingga pengujian black box dilakukan pada hasil proses dari masukan
pengguna. Beberapa token dan format teks yang diproses oleh sistem masing-
masing dapat dilihat pada tabel 3.2 dan 3.3. Hasil pengujian black box dapat
dilihat pada tabel 4.9.
Tabel 4.9 Hasil pengujian black box
No. Skenario Pengujian Hasil yang diharapkan Kesimpulan
1. Memasukan format Sistem mensintesa format dd- Valid
tanggal dd-mm-yyyy. mm-yyyy
Test case: 21-10-2018 Hasil Pengujian: “duak puluh
satu oktober duak ribu lapan
belas”
2. Memasukan format Sistem mensintesa format mm- Valid
tanggal mm-dd-yyyy. dd-yyyy
Test case: 12-21-2018 Hasil Pengujian: “duak puluh
satu desember duak ribu lapan
belas”
3. Memasukan format Sistem mensintesa format Valid
83

tanggal dd/mm/yyyy. dd/mm/yyyy


Test case: 21/10/2018 Hasil Pengujian: “duak puluh
satu oktober duak ribu lapan
belas”
4. Memasukan format Sistem mensintesa format Tidak Valid
tanggal mm/dd/yyyy. mm/dd/yyyy
Test case: 12/12/2018 Hasil Pengujian: “duak belas
desember duak ribu lapan
belas”
5. Memasukan format Sistem mensintesa format Valid
tanggal mm/dd/yyyy. mm/dd/yyyy
Test case: 12/21/2018 Hasil Pengujian: “duak puluh
satu desember duak ribu lapan
belas”
6. Memasukan format Sistem mensintesa format Valid
tanggal mm/dd/yyyy. mm/dd/yyyy
Test case: 12/21/2018 Hasil Pengujian: “duak puluh
satu desember duak ribu lapan
belas”
7. Memasukan format Sistem mensintesa format Valid
tanggal mm/dd/yyyy. mm/dd/yyyy
Test case: 12/21/2018 Hasil Pengujian: “duak puluh
satu desember duak ribu lapan
belas”
8. Memasukan format Sistem mensintesa format Valid
waktu hh:mm:ss. hh:mm:ss
Test case: 12:21:30 Hasil Pengujian: “jam duak
belas duak puluh satu menit
tiga puloh detik”
9. Memasukan format Sistem akan mensintesa ke Valid
waktu hh:mm yang sesuai dengan nominal angka.
salah Hasil Pengujian: “duak belas
Test case: 12:70 tujoh puloh”
10. Memasukan format Sistem mensintesa format Valid
84

waktu hh:mm. hh:mm


Test case: 12:30 Hasil Pengujian: “jam duak
belas tiga puloh menit”
11. Memasukan format Sistem mensintesa sesuai Valid
angka kurang dari 5 nominal angka
digit. Hasil Pengujian: “seribu duak
Test case: 1200 ratus”
12. Memasukan format Sistem mensintesa sesuai Valid
angka kurang dari nominal dari angka dengan
#.000.000,00. format #.000.000,00
Test case: Hasil Pengujian: “sejuta dua
1.200.500,250 ratus rebut limak ratus koma
duak lima kosong”
13. Memasukan format Sistem mensintesa sesuai Valid
angka kurang dari nominal dari angka dengan
#,000,000.00. format #,000,000.00
Test case: 210,500.76 Hasil Pengujian: “duak ratus
sepuloh ribu limak ratus koma
tujuh enam”
14. Memasukan format Sistem akan mensintesa Valid
angka lebih dari 4 digit. pengucapan angka sesuai digit
Test case: 1012300 Hasil Pengujian: “satu kosong
satu dua tige kosong kosong”
15. Memasukan kombinasi Sistem akan mensintesa Valid
token yang tidak sesuai pengucapan sesuai dengan
dengan format tanggal, token
waktu, dan angka yang Hasil Pengujian : “tige belas
telah ditentukan. duak ratus garing duak belas
Test case: 13-200/12a a”
16. Memasukan teks Sistem akan mensintesa Valid
dengan kata di dalam pengucapan sesuai teks
kamus. Hasil Pengujian : “semue mue
Test case: “semue mue tepat waktu”
tepat waktu”
85

17. Memasukan teks Sistem akan mensintesa Valid


dengan kata di luar pengucapan sesuai teks
kamus. Hasil Pengujian : “laptop dari
Test case : “laptop dari toko”
toko”
18. Memasukan kata Sistem akan mensintesa Tidak Valid
dengan mengandung pengucapan sesuai dengan
fonem yang pengucapan fonem.
penulisannya sama tapi Hasil Pengujian : “ǝmpat emas
memiliki dua ǝmpat ǝmas”
pengucapan fonem
seperti fonem e dan ǝ
Test case : “empat emas
e~mpat e~mas”
19. Memasukan kalimat Sistem akan mengkonversi Valid
dengan beberapa jenis teks masukan sesuai dengan
format yang telah format dan suara akan
didefinisikan disintesa sesuai dengan teks
sebelumnya. hasil konversi.
Test case : “ saye& die Hasil Pengujian : “saye dan
pegi same - same ke die pegi same - same ke kapal
kapal klotok pada klotok pada tanggal - duak
tanggal - 12-09-2012 belas september duak ribu
12:30 12 kali” duak belas jam duak belas tige
puloh menit duak belas kali”

4.3.2 Pengujian MOS dan CMOS


Pengujian MOS dan CMOS bertujuan untuk menguji tingkat kealamian
hasil sintesa ucapan. Hasil pengujian MOS dan CMOS dapat dilihat pada
lampiran N. Contoh perhitungan MOS pada responden nomor 1 untuk korpus latih
100 kalimat adalah sebagai berikut:
n

∑ x (i). k
MOS= i=0
N
86

x 1 + x 2+. . .+ x 10
MOS=
10
3+ 2+ 2+ 3+3+2+3+3+2+2
MOS=
10
25
MOS= =2.5
10
Hasil MOS yang didapatkan dari responden nomor 1 untuk korpus latih 1
adalah 2.5. Nilai MOS ini akan dikonversi menjadi skala ITU-800.1. Contoh hasil
konversi MOS pada pendengar satu untuk korpus latih 100 kalimat adalah sebagai
berikut:
5
MOS ITU− P .800 .1= MOS
4
5
MOS ITU− P .800 .1= x 2.5
4
5
MOS ITU− P .800 .1= x 2.5=3.125
4
Hasil MOS dari responden nomor 1 untuk korpus latih 1 adalah 3.125
(cukup). Konversi dapat dilakukan setelah MOS pada satu skema dirata-ratakan
atau dikonversi terlebih dahulu kemudian dirata-ratakan. Cara perhitungan nilai
CMOS sama dengan MOS. Hasil rata-rata MOS dan CMOS semua respoden
untuk semua variasi hasil sintesa dapat dilihat pada tabel 4.10.
Tabel 4.10 Hasil pengujian MOS dan CMOS
Variasi hasil sintesa
Pengujian X Y Z
MOS 2.9375 3.5 3.55
CMOS 3.2 3.4625 3.5

4.3.3 Pengujian AB
Pengujian AB bertujuan untuk memilih hasil sintesa yang terbaik dari
variasi hasil sintesa yang ada. Pengujian AB dilakukan dengan memberi pilihan
kepada responden dan menghitung rata-rata pilihan dari pilih responden setiap
variasi. Hasil pengujian AB dapat dilihat pada tabel 4.11.
Tabel 4.11 Hasil pengujian AB
Persentase
Jumlah pemilihan per kalimat total
(%)
Variasi 1 2 3 4 5 6 7 8 9 10
87

Sintesa
X 0 23 19 17 13 1 1 1 2 1 78 26
Y 5 5 0 7 8 3 23 12 10 16 89 29.67
Z 25 2 11 6 9 26 6 17 18 13 133 44.33
Total data 300 100%
4.3.4 Pengujian WER
Pengujian WER berupa pengujian dikte atau menulis kembali apa yang
telah diperdengarkan. Hasil pengujian WER dapat dilihat pada lampiran N.
Perhitungan WER menggunakan rumus 3.3 dan akurasi WER menggunakan
rumus 3.4. Contoh perhitungan WER pada responden nomor 1 untuk variasi hasil
sintesa B untuk urutan kalimat 1 adalah sebagai berikut:
K0 = “Mampu die ngasi motipasi masyarakat e supaye teros kerje keras
K1 = “mampu die kasi motipasi masalah supaye teros kerje keras”
Nr = [“mampu”, “die”, “ngasi”, “motipasi”, “masyarakat”, “e”, “supaye”,
“teros”, “kerje”, “keras”] = 10
I = [] = 0
S = [“masalah” => “masyarakat”] = 1
D = [“e”] = 1
S+ D+ I 1+ 0+1 2
WER= = = =0.2 AkurasiWER=1−0.2=0.8=80 %
Nr 10 10
Hasil perhitungan akurasi WER yang didapatkan oleh responden nomor 1
untuk variasil hasil sintesa B untuk urutan kalimat 1 adalah 0.8 atau 80 %. Hasil
Akurasi WER semua responden untuk semua variasi hasil sintesa dapat dilihat
pada tabel 4.12.
Tabel 4.12 Hasil pengujian WER
Variasi hasil sintesa (dalam %)
Pengujian X Y Z
Akurasi WER 26.790 56.376 64.572

4.4 Analisis Hasil Pengujian


Dari beberapa pengujian yang telah dilakukan pada sistem sintesa ucapan
alami bahasa Melayu dialek Pontianak, berikut adalah beberapa analisa sistem
sintesa ucapan.
1. Hasil pengujian black-box dapat dilihat pada tabel 4.9. Hasil pengujian
berupa sistem dapat mengolah teks sesuai dengan beberapa jenis format yang
88

telah definisikan sesuai tabel 3.3, kecuali pembunyian ucapan pada fonem
tertentu dan format tanggal. Bunyi fonem e dan ǝ yang dihasilkan tidak selalu
sama dengan bunyi fonem yang sesuai dengan teks masukan pengguna.
Ambiguitas yang terjadi disebabkan pemodelan suara yang statistik sehingga
suara yang dihasilkan tergantung terhadap probabilitas urutan fonem dan
informasi prosodi. Sedangkan pada konversi format tanggal, teks yang
dihasilkan akan secara standar dikonversi sesuai format pertama yaitu dd-
mm-yyyy dan dd/mm/yyyy sehingga ketika format tanggal yang diharapkan
adalah mm-dd-yyyy, hasil konversi tidak sesuai dengan format yang
diharapkan.
2. Hasil pengujian MOS pada variasi hasil sintesa x, y dan z adalah 2.9 (cukup
buruk), 3.5 (cukup / sedang) dan 3.55 (cukup / sedang). Hasil pengujian MOS
dapat dilihat pada tabel 4.10. Hasil MOS tertinggi adalah variasi hasil sintesa
z dengan jumlah korpus latih 300 kalimat dan terendah adalah variasi hasil
sintesa x dengan jumlah korpus latih 100 kalimat. Kualitas suara yang diuji
pada pengujian MOS adalah tingkat kealamian dimana penilaian secara
subjektif diberikan oleh responden. Berdasarkan hasil pengujian MOS,
semakin banyak korpus latih maka semakin tinggi tingkat kealamian hasil
sintesa.
3. Hasil pengujian CMOS pada variasi hasil sintesa x, y dan z adalah 3.2 (cukup
/ sedang), 3.46 (cukup / sedang) dan 3.5 (cukup/ sedang). Hasil pengujian
CMOS dapat dilihat pada tabel 4.10. Hasil MOS tertinggi adalah variasi hasil
sintesa z dengan jumlah korpus latih 300 kalimat dan terendah adalah variasi
hasil sintesa x dengan jumlah korpus latih 100 kalimat. Kualitas suara yang
diuji pada pengujian CMOS adalah tingkat kemiripan hasil sintesa dengan
korpus rekaman. Kemiripan hasil sintesa dapat direpresentasikan dengan gaya
berbicara seperti intonasi, tempo dan karakteristik suara. Berdasarkan hasil
pengujian CMOS, semakin banyak korpus latih maka hasil sintesa akan
semakin tinggi tingkat kemiripan dengan korpus latih.
4. Pengujian AB hanya dilakukan pada responden untuk variasi A karena pada
variasi x, variasi yang diperdengarkan pertama kali adalah variasi x dan
korpus rekaman sehingga penilaian AB yang didapatkan akan lebih baik
89

karena responden telah mendapatkan batas paling baik dan batas paling buruk
dari hasil sintesa. Hasil pengujian AB dapat dilihat pada tabel 4.11. Hasil
pengujian AB berupa 26% memilih variasi sintesa x, 29.67% memilih variasi
sintesa y, dan 44.33% memilih variasi sintesa z. Semakin banyak responden
yang memilih suatu variasi hasil sintesa maka semakin baik kualitas variasi
hasil sintesa yang dipilih. Variasi hasil sintesa yang terbaik adalah variasi
hasil sintesa z dan yang terburuk adalah variasi hasil sintesa x.
5. Pengujian WER dilakukan dengan variasi hasil sintesa x, y dan z yang dapat
dilihat pada tabel 4.12 adalah 29.79%, 56.38%, dan 64.57%. Hasil pengujian
WER yang paling akurat adalah variasi hasil sintesa z dan yang paling tidak
akurat adalah variasi hasil sintesa x. Pengujian WER bertujuan untuk menilai
tingkat kejelasan dari hasil sintesa. Semakin besar korpus latih, maka semakin
tinggi tingkat kejelasan hasil sintesa suara.
6. Suara hasil sintesa yang dihasilkan tidak datar dan karakteristik suara yang
dihasilkan menyerupai suara narasumber. Karakteristik suara ini dihasilkan
dari parameter-parameter yang telah diekstrak pada fase pelatihan. Parameter-
parameter yang didapatkan secara langsung dari rekaman suara menyebabkan
informasi prosodi lain seperti intonasi, aksen, penekanan nada, dan tempo
secara tak langsung tersimpan pada parameter tersebut. Sistem dapat
menghasilkan suara sintesa yang memiliki karakteristik dari narasumber
meskipun informasi prosodi yang digunakan hanya berupa fonem, dan durasi.
Kualitas dari hasil sintesa dapat ditingkatkan kembali dengan memberi
penandaan khusus pada informasi prosodi lainnya seperti intonasi dan
penambahan struktur kalimat seperti frase dan suku kata sehingga model
statistik yang dihasilkan dapat lebih spesifik sehingga suara yang dihasilkan
dapat lebih baik. Ambiguitas yang terjadi pada pengujian black box dapat
disebabkan karena jumlah korpus yang masih sedikit, informasi prosodi yang
belum spesifik serta kualitas korpus yang belum mencakup probabilitas yang
ada.
7. Hasil MOS, CMOS, AB, dan WER pada variasi hasil sintesa menujukan hasil
sintesa memiliki memiliki hubungan secara linear antara jumlah korpus latih
dengan tingkat kealamian, kemiripan dan kejelasan suara hasil sintesa.
90

Semakin banyak jumlah korpus latih maka semakin baik kualitas suara hasil
sintesa. Sedangkan hasil pengujian black box, sistem sudah dapat dijalankan
dengan baik karena telah dapat mengolah masukan pengguna. Namun pada
pengolahan teks, terutama pada format tertentu seperti tanggal masih perlu
ditingkatkan kembali.

Anda mungkin juga menyukai