1 LAMPIRAN2 LAMPIRAN A Hidden Markov Model (HMM)[9] Hidden Markov Model (HMM) merupakan sebuah metode statistikal untuk mengkarakterisasi sampel data ...
Hidden Markov Model (HMM) merupakan sebuah metode statistikal untuk mengkarakterisasi sampel data dari discrete time series. Sampel data dapat didistribusikan secara kontinu ataupun diskrit dan dapat berupa skalar maupun vektor. HMM telah menjadi metode paling populer dalam memodelkan ucapan manusia dan sukses digunakan pada ASR, sintesis ucapan, pemodelan bahasa secara statistik dan area berhubungan lainnya. Untuk mendefinisikan HMM perlu dilakukan pembahasan mengenai Markov Chain.
A.1 Markov Chain Markov chain pada dasarnya adalah sebuah metode pemodelan kelas proses yang acak, dengan memanfaatkan memori dalam jumlah yang terbatas. Anggap X = X1, X2, . . . , Xn sebagai urutan variabel acak dari sebuah alfabet diskrit terhingga O = o1, o2,..., oM. Berdasarkan aturan Bayes': n
P X 1 , X 2 ,... , X n = P X 1 ∏ P X i∣X i1−1
(a.1)
i=2
dengan X i1−1 = X 1 , X 2 ,... , X i −1 . Variabel acak X dikatakan membentuk orde pertama dari Markov Chain dengan ditentukannya i−1
P X i∣X 1 = P X i∣X i−1
(a.2)
Persamaan A.1 menjadi n
P X 1 , X 2 ,... , X n = P X 1 ∏ P X i∣X i −1
(a.3)
i=2
82
Universitas Sumatera Utara
83 Persamaan a.2 disebut sebagai asumsi Markov. Asumsi Markov menyatakan bahwa probabilitas dari variabel acak pada waktu tertentu hanya tergantung kepada probabilitasnya pada waktu pendahulunya. Asumsi ini memungkinkan urutan data dinamis dimodelkan menggunakan memori yang sangat kecil. Jika Xi diasosiakan dengan sebuah stata, maka Markov chain dapat direpresentasikan oleh sebuah mesin stata hingga dengan transisi antara stata s dan s' yang dinyatakan dengan fungsi probabilitas '
'
(a.4)
P s∣s = P X i = s∣X i−1 = s
Dengan representasi ini, asumsi Markov diterjemahkan menjadi: Probabilitas bahwa Markov chain akan berada di stata tertentu pada waktu tertentu bergantung kepada stata Markov chain pada waktu sebelumnya. Anggap sebuah Markov chain dengan N stata yang diberi tanda 1,..., N, dengan stata pada waktu t yang dinyatakan dengan st. Maka parameter sebuah Markov chain dapat dinyatakan sebagai berikut: a ij = P s t = j∣s t −1 = i i = P s 1 = i
1i , jN 1iN
(a.5) (a.6)
dengan aij sebagai probabilitas transisi dari stata i ke stata j dan πi sebagai probabilitas inisial bahwa Markov Chain akan dimulai pada stata i. Probabilitas transisi dan inisial diikat oleh batasan: N
∑ aij = 1
1iN
(a.7)
j=1 N
∑ i = 1
(a.8)
i=1
Universitas Sumatera Utara
84 Markov chain yang diterangkan ini juga disebut sebagai observable Markov model, karena keluaran dari proses merupakan set stata pada tiap waktu t, dimana setiap stata berkorespondensi pada sebuah observable event Xi. Ada korespondensi satu-satu antara urutan observable event X dan urutan stata Markov chain S = s1, s1, ..., sn. Gambar A.3 menggambarkan sebuah Markov chain tiga-stata sederhana. pada gambar ini tiga stata mewakili kinerja suatu pasar saham yang dibandingkan dengan hari sebelumnya. Simbol keluaran ditentukan oleh O = {naik, turun, tidak berubah}. stata 1 - naik stata 2 - turun stata 3 - tidak berubah Parameter dari contoh pasar saham mencakup sebuah matriks probabilitas transisi-stata:
[
0.6 0.2 0.2 A = {aij } = 0.5 0.3 0.2 0.4 0.1 0.5
]
(a.9)
dan sebuah matriks probabilitas inisial:
0.5 = i t = 0.2 0.3
(a.10)
Sebagai contoh, probabilitas dari lima hari berturut-turut dapat dicari dengan: P 5 hari berurutan = P 1,1,1 ,1 ,1 = 1 a 11 a 11 a11 a11 = 0.5×0.64 = 0.0648
(a.11)
Universitas Sumatera Utara
85
Gambar A.3 Contoh Markov chain.
A.2 Hidden Markov Model Hidden Markov model merupakan perluasan dari Markov chain. Alih-alih setiap stata berkorespondensi dengan sebuah observable event deterministik, hidden Markov model mencirikan sebuah proses non-deterministik yang menghasilkan keluaran simbol-simbol observasi pada tiap stata. Observasi menjadi fungsi probabilistik dari stata. Dengan cara ini, hidden Markov model dapat dianggap sebagai sebuah proses stokastik double-embedded dengan proses stokastik pokok (urutan stata) yang tidak langsung observable. Hidden Markov model pada dasarnya merupakan sebuah Markov chain dimana keluaran observasi merupakan sebuah variabel X acak yang dihasilkan menurut suatu keluaran fungsi probabilistik yang berkaitan dengan tiap stata.
Universitas Sumatera Utara
86 Gambar A.4 menggambarkan contoh pasar saham dari subbab sebelumnya. Setiap stata dapat menghasilkan semua keluaran observasi: naik, turun, tidak berubah, menurut keluaran fungsi probabilitas densitasnya. Tidak ada lagi pemetaan satusatu antara urutan observasi dan urutan stata. Untuk urutan observasi tertentu, urutan stata tidak langsung dapat diobservasi, inilah yang dinamakan Hidden Markov models.
Gambar A.4 Contoh sebuah Hidden Markov Model
Secara formal, sebuah hidden Markov model didefinisikan dengan: •
O = {o1, o2,..., oM}–Alfabet keluaran observasi. Simbol observasi bertalian dengan keluaran fisik dari sistem yang dimodelkan. Pada contoh, Alfabet keluaran observasi merupakan kumpulan dari tiga kategori O = {naik, turun, tidak berubah}.
Universitas Sumatera Utara
87 •
Ω = {1, 2, ..., N}–Set stata yang merepresentasikan ruang stata. disini st diartikan sebagai stata pada waktu t.
•
A = {aij}–Matriks probabilitas transisi, dimana aij merupakan probabilitas pengambilan transisi dari stata i ke stata j. a ij = P s t = j∣s t −1 = i
•
1i , jN
(a.12)
B = {bi(k)}–Sebuah matriks probabilitas keluaran, dengan bi(k) merupakan probabilitas dari simbol emitting ok saat stata i dimasuki. Anggap X = X1, X2,...,Xt,... sebagai keluaran diobservasi HMM. Urutan stata S = s1, s2,...,st,... tidak diobservasi dan bi(k) dapat ditulis ulang sebagai berikut: b i k = P X t = o k∣s t = i
•
1i N
(a.13)
π = {πi}–Sebuah distribusi stata inisial dengan: = P s 0 = i
1i N
(a.14)
Batasan berikut ini harus dipenuhi: a ij 0,
b i k 0,
i 0
∀i, j, k
(a.15)
N
∑ aij = 1
(a.16)
j=1 M
∑ bi k = 1
(a.17)
k =1 N
∑ i = 1
(a.18)
i=1
Spesifikasi lengkap dari sebuah HMM yakni mencakup dua ukuran-konstan parameter N dan M, mewakili jumlah keseluruhan stata dan ukuran dari alfabet
Universitas Sumatera Utara
88 observasi, alfabet observasi O dan tiga matriks probabilitas: A, B, dan π. HMM lengkap dapat dilambangkan dengan = A , B ,
(a.19)
Model yang dideskripsikan persamaan a.19 merupakan hidden Markov model orde-satu dan diatur oleh dua asumsi. Yang pertama adalah asumsi Markov sesuai dengan yang diterangkan pada Markov chain: t −1
(a.20)
P s t∣s1 = P st∣s t −1
dengan urutan stata s1t−1 yakni s1, s2,..., st-1. Yang kedua adalah asumsi output independence: P X t∣X t1−1 , s t1 = P X t∣s t
(a.21)
dengan urutan stata X 1t−1 yakni X1, X2, ..., Xt-1. Asumsi output independence menyatakan bahwa probabilitas dari simbol tertentu di pancarkan pada waktu t hanya tergantung kepada stata st dan independen secara kondisional dari observasi-observasi lampau. Dengan definisi HMM ini, ada tiga masalah utama yang perlu diatasi. 1. Masalah Evaluasi Ditentukan sebuah model Φ dan sebuah urutan observasi X = (X1, X2, ..., XT), apakah probabilitas dari P(X|Φ) yakni probabilitas bahwa model menghasilkan observasi? 2. Masalah Decoding Ditentukan sebuah model Φ dan sebuah urutan observasi X = (X1, X2, ..., XT), apa urutan stata S = (s0, s1, s2, ...., sT) yang paling mungkin
Universitas Sumatera Utara
89 menghasilkan observasi? 3. Masalah Learning Ditentukan sebuah model Φ dan sebuah urutan observasi, bagaimana dapat disesuaikan untuk memaksimalkan joint parameter model
probability
P X∣ ∏ X
?
Untuk menggunakan HMM pada pengenalan pola, masalah evaluasi perlu diselesaikan, yang akan memberikan sebuah metode untuk menentukan seberapa tepatkah kecocokan HMM tertentu dengan sebuah urutan observasi tertentu. Kemungkinan P X∣ dapat digunakan untuk menghitung probabilitas a posteriori P ∣X , dan HMM dengan probabilitas terbesar dapat ditentukan sebagai pola untuk urutan observasi terbaik. Penyelesaian masalah decoding akan memungkinkan pencarian urutan stata yang paling cocok dari urutan observasi tertentu (yakni, urutan stata hidden). Hal ini sangatlah pokok pada pengenalan ucapan. Jika masalah pembelajaran dapat diselesaikan, maka parameter model Φ dapat diestimasi secara otomatis dari data pelatihan.
A.2.1 Evaluasi HMM Metode paling mengarah untuk menghitung probabilitas P X∣ dari urutan observasi X = (X1, X2, ..., XT), ditentukan HMM Φ yakni dengan menjumlahkan probabilitas dari semua urutan stata yang mungkin: P X∣ = ∑ P S∣ P X∣S , all S
(a.22)
Secara mendasar, semua kemungkinan urutan stata S dengan panjang T
Universitas Sumatera Utara
90 yang menghasilkan urutan observasi X dienumerasi, setelah itu probabilitas dijumlahkan. Untuk urutan stata tertentu S = (s1, s2, ..., sT), probabilitas urutan stata pada persamaan a.22 dapat ditulis kembali dengan menerapkan asumsi Markov: T
P S∣ = P s1∣ ∑ P st∣s t −1 ,
(a.23)
t =2
= s a s s ... a s 1
dengan a s
0
s1
1 2
s = a s s a s s ... a s
T −1 T
0 1
1
2
s
T −1 t
melambangkan s untuk penyederhanaan. Untuk urutan stata S 1
yang sama, joint probability pada persamaan a.22 dapat ditulis kembali dengan menerapkan output-independence assumption: T
P X∣S , = P X T1∣s T1 , =∏ P X t∣st , t =1
(a.24)
= bs X 1 b s X 2 ... b s X T 1
2
T
Dengan mensubstitusi persamaan a.23 dan a.24 ke dalam persamaan a.22, persamaan a.22 dapat ditulis kembali menjadi: P X∣ = ∑ P S∣ P X∣S , all S
= ∑ a s s b s X 1 a s s b s X 2 ... as all S
0
1
1
1
2
2
T −1
s1
bs X T
(a.25)
T
Evaluasi langsung dari persamaan a.25 layak secara komputasi, karena ia membutuhkan enumerasi dari O(NT) urutan-urutan stata yang mungkin. Terdapat algoritma yang sederhana dan efisien untuk mengevaluasi persamaan a.25. Algoritma ini disebut algoritma Forward dan dijelaskan dalam Tabel A.1. Ide dasarnya adalah untuk menyimpan hasil antara dan menggunakannya untuk perhitungan stata urutan berikutnya. Anggap αt(t) adalah probabilitas HMM di stata i pada waktu t, setelah dihasilkan observasi parsial X 1t =X 1 , X 2 , ... , X t .
Universitas Sumatera Utara
91 t
(a.26)
t i = P X 1 , st = i∣
Tabel A.1 Algoritma Forward Algoritma 2.1 algoritma Forward Langkah 1: Inisialisasi 1 i=i bi X 1
1iN
Langkah 2: Induksi
[∑
]
N
t j =
i =1
t−1 i aij b j X t
2tT ;
1 jN
Langkah 3: Terminasi N
P X∣ =∑ T i i=1
Jika diperlukan untuk diakhiri pada stata final
P X∣ = T s F
Perhitungan dari αt(i) dapat diilustrasikan dalam sebuah trellis, yang ditunjukkan pada Gambar A.5. Gambar ini mengilustrasikan komputasi forward probabilities α dalam sebuah kerangka kerja trellis untuk contoh pasar saham, yang dijelaskan sebelumnya pada subbab ini. Di dalam setiap noda terdapat probabilitas Forward yang bertalian dengan setiap stata pada waktu t. Ditentukan dua hari naik berururutan, probabilitas Forward inisial α pada waktu t = 1 dihitung sebagai berikut: 1 i 1 1 1 2 1 3
= = = =
i bi X 1 1 b1 X 1 = 0.5⋅0.7 = 0.35 2 b 2 X 1 = 0.2⋅0.1 = 0.02 3 b 3 X 1 = 0.3⋅0.3 = 0.09
(a.27)
Universitas Sumatera Utara
92
Gambar A.5 Komputasi Forward trellis untuk contoh pasar saham.
Probabilitas Forward pada waktu t = 2 untuk stata j = 1 dihitung sebagai berikut:
= 1 1 a13 1 2 a23 1 3a 33 b 3 X 2 = 0.0357 Ketika stata-stata pada kolom terakhir selesai dihitung, maka jumlah dari seluruh probabilitas pada kolom final adalah probabilitas dari pembangkitan urutan observasi. Kompleksitas dari algoritma Forward adalah O(N2T) daripada eksponensial.
A.2.2 Decoding HMM Algoritma Forward yang dipaparkan pada subbab sebelumnya, digunakan untuk menghitung probabilitas pembangkitan sebuah urutan observasi HMM dengan menjumlahkan probabilitas semua lintasan yang mungkin. Tetapi algoritma ini tidak memberikan lintasan yang terbaik (yakni urutan stata). Pada kebanyakan aplikasi HMM, seperti ASR, menemukan lintasan terbaik sangatlah penting. Lintasan terbaik merupakan urutan stata yang memiliki probabilitas tertinggi yang diambil sambil menghasilkan urutan observasi. Secara formal, ini adalah urutan stata S = (s1, s2, ..., sT) yang memperbesar P(S, X|Ф). Terdapat algoritma efisien untuk mencari urutan stata terbaik untuk sebuah HMM yang dikenal sebagai algoritma Viterbi (dideskripsikan pada Tabel A.2). Pada praktiknya, algoritma ini dapat juga digunakan untuk mengevaluasi HMM, dikarenakan algoritma ini memberikan sebuah solusi perkiraan mendekati solusi yang didapatkan dengan menggunakan algoritma Forward. Algoritma Viterbi dapat dianggap sebagai modifikasi algoritma Forward. Alih-alih menjumlahkan
Universitas Sumatera Utara
94 probabilitas dari lintasan berbeda yang menuju ke stata tujuan yang sama, Algoritma Viterbi mengambil dan mengingat lintasan terbaik. Anggap Vt(i) didefinisikan sebagai probabilitas dari urutan stata yang paling mungkin pada waktu t, yang telah menghasilkan observasi X 1t dan berakhir di stata i. t
t−1
(a.30)
V t i=P X 1 , S 1 , s t=i∣
Algoritma Viterbi dapat diilustrasikan dalam sebuah kerangka kerja trellis yang serupa dengan yang ada pada algoritma Forward. Gambar A.6 menggambarkan perhitungan Vt untuk contoh pasar saham sebelumnya. Angka pada tiap sel menunjukkan skor Vt terbaik. Garis hitam menunjukkan lintasan terbaik yang mengarah ke tiap sel. Nilai inisial untuk Vt (i) dihitung sebagai berikut: V 1 i = i b i X 1 V 1 1 = 1 b1 X 1 = 0.5⋅0.7 = 0.35 V 1 2 = 2 b2 X 1 = 0.2⋅0.1 = 0.02 V 1 3 = 3 b3 X 1 = 0.3⋅0.3 = 0.09
(a.31)
Gambar A.6 Komputasi trellis Viterbi untuk contoh pasar saham.
Universitas Sumatera Utara
95 Tabel A.2 Algoritma Viterbi Algoritma 2.2: Algoritma Viterbi Langkah 1: Inisialisasi V i i = i bi X i Bi i = 0
1iN
Langkah 2: Induksi V t j = max [ V t −1 i aij ] b j X t
2tT ; 1 j N
Bt j = arg max [ V t −1 ia ij ]
2tT ; 1 j N
1i N
1i N
Langkah 3: Terminasi skor terbaik = max [ V t i ] 1iN
∗ T
s = arg max [ BT i ] 1i N
Langkah 4: Backtracking ∗
∗
s t = Bt 1 s t 1
t = T −1, T −2, ... , 1
S ∗ = s ∗1 , s ∗2 ,... , s T∗ merupakan urutan terbaik
Nilai berurutan dari Vt(i) didapatkan sebagai berikut: V t j = max [ V t −1 i aij ] b j X t 1i N
V 2 1 = max [ V 1 i a i1 ] b 1 X 2 1i3
(a.32)
= max [ V 1 1a 11 ,V 1 2 a 21 ,V 1 3a 31] b 1 X 2 1i3
Nilai V2(2) dan V2(3) juga didapatkan dengan cara yang sama:
Universitas Sumatera Utara
96 V 2 2 = max [ V 1 i ai2 ] b 2 X 2 1i3
= max [ V 1 1a 12 , V 1 2 a 22 ,V 1 3a 32 ] b 2 X 2 = 0.007 1i3
(a.33)
V 2 3 = max [ V 1 i a i3 ] b 3 X 2 1i3
= max [ V 1 1a 13 ,V 1 2 a 23 ,V 1 3a 33] b 3 X 2 = 0.021 1i3
Kalkulasi berhenti pada waktu t = T. Pada titik ini urutan stata terbaik S∗ dapat ditemukan dengan menggunakan pointer backtracking Bt(i), yang menyimpan indeks stata dengan skor Vt(i) terbaik dari setiap kolom trellis.
A.2.3 Estimasi Parameter HMM Estimasi akurat dari parameter-parameter model Φ = (A, B, π) merupakan masalah yang paling pelik diantara ketiga masalah. Masalah ini dapat dipecahkan menggunakan algoritma iteratif yang dikenal dengan nama algoritma BaumWelch, terkadang juga disebut sebagai algoritma forward-backward. Estimasi dari parameter-parameter HMM merupakan kasus dari unsupervised learning, karena terdapat ketidaklengkapan data yang disebabkan oleh urutan stata tersembunyi dari HMM. Terdapat algoritma iteratif untuk unsupervised learning, dikenal sebagai algoritma expectation maximization (EM), yang mendasari algoritma Baum-Welch. Algoritma ini menemukan estimasi parameter model dengan memperbesar kemungkinan-log dari data yang tak lengkap dan secara iteratif memperbesar dugaan kemungkinan-log dari data yang lengkap. Sebelum algoritma Baum-Welch dijelaskan, penting untuk mendefinisikan probabilitas backward βt(i) sebagai: T
t i = P X t1∣st = i ,
(a.34)
Ini merupakan probabilitas dari pembangkitan observasi parsial X Tt1
Universitas Sumatera Utara
97 dengan HMM berada pada stata i pada waktu t. Kalkulasi dari βt(i) dapat dilakukan secara induktif, ditunjukkan oleh Tabel 2.3. Ditentukan αt(i) dan βt(i), maka
sekarang
dapat
dimungkinkan
untuk
mendefinisikan
probabilitas
pengambilan transisi dari stata i ke stata j pada waktu t, γt(i,j), dimana model dan urutan observasi ditentukan. T
(a.35)
t i , j = P s t −1 = i , s t = j∣X 1 ,
=
P s s −1 = i , s t = j∣X T1 , P X T1∣ =
t −1 i aij b j X t t j N
∑ T k k=1
Kalkulasi dari persamaan a.3.4 diilustrasikan pada Gambar A.7.
Gambar A.7 Operasi yang diperlukan untuk mengkalkulasi γt(i,j)
Universitas Sumatera Utara
98 Vektor parameter HMM Φ dapat direfinasi secara iteratif yakni dengan memperbesar kemungkinan P(X|Φ) untuk setiap iterasi. Parameter vektor baru . yang diturunkan dari Φ pada iterasi sebelumnya dilambangkan dengan Sesuai dengan algoritma EM, fungsi berikut harus diperbesar: = ∑ P X , S∣ log P X , S∣ Q , P X∣ all S
(a.36)
Persamaan a.36 dapat ditulis kembali menjadi: = Q , a Q , b Q , a i b j i
(a.37)
j
Tabel 2.3 Kalkulasi dari probabilitas backward. Algoritma 2.3: Mengkalkulasi Probabilitas Backward Langkah 1: Inisialisasi T i = 1 / N
1i N
Langkah 2: Induksi t i =
[
N
∑ a ij b j X t1 t 1 j j=1
]
t = T −1,... ,1 ;
1iN
dengan, Qa , ai = ∑ ∑ ∑ j
i
j
Qb , b j = ∑ ∑ j
j
k
t
P X , st −1 = i , st = j∣ log aij P X∣
∑
t ∈ X t = ok
P X , s t = j∣ log b j k P X∣
(a.38)
(a.39)
Persamaan a.38 dan a.39 keduanya dalam bentuk: F x = ∑ y i log x i i
(a.40)
Universitas Sumatera Utara
99 yang mencapai nilai maksimumnya pada: xi =
yi
(a.41)
∑ yi i
Jadi, T
aij =
1 ∑ P X , s t −1 = i , s t = j∣ P X∣ t =1 T
1 ∑ P X , s t −1 = i∣ P X∣ t =1
T
∑ t i , j =
T
t=1 N
∑ ∑ t i , k t=1 k =1
T
b j k =
1 ∑ P X , st = j∣ X t , o k P X∣ t =1 T
1 ∑ P X , s t = j∣ P X∣ t =1
(a.42)
∑ ∑ t i , j
=
t ∈ X t =ok T
i
(a.43)
∑ ∑ t i , j t=1
i
Dibandingkan dengan algoritma EM, algoritma Baum-Welch menjamin perbaikan monotonik dari kemungkinan di setiap iterasi. Alhasil, kemungkinan akan berkonvergensi ke sebuah maksimum lokal. Tabel 2.4 memaparkan algoritma Baum-Welch (Forward-backward). Algoritma, sesuai yang dipaparkan, didasarkan kepada urutan observasi tunggal, meskipun dalam praktiknya banyak urutan observasi akan digunakan. Algoritma ini dapat dengan mudah digeneralisasi untuk digunakan pada pengambilan urutan observasi pelatihan yang banyak. Tabel 2.4 Algoritma Forward-backward Algoritma 2.4 Algoritma Forward-backward Langkah 1: Inisialisasi Ambil sebuah estimasi inisial Φ. Langkah 2: Langkah-E
Universitas Sumatera Utara
100 berdasarkan Φ. Hitung fungsi pembantu Q , Langkah 3: Langkah-M berdasarkan re-estimasi persamaan a.42 dan a.43 untuk Hitung memperbesar fungsi-Q pembantu. Langkah 4: Iterasi , ulangi kembali ke langkah 2 hingga konvergen. Set =
Universitas Sumatera Utara
LAMPIRAN B LISTING SOURCE CODE B.1 Listing Code Penghasil Kamus Pelafalan Ind_wlist2dict #!/usr/bin/perl -w # Script to make Indonesian pronounciation dictionary from # Indonesian wordlist in HTK format. This can be done # because Indonesian language is phonemic language with # almost one-to-one relation between orthography and # pronounciation. # # The phoneme set to determine the pronounciation of a word #is based on "Indonesian phoneme set" from # Darjowidjodjo, S., Indonesia Syntax, Ph.D dissertation, # Georgetown University, Washington, 1966 # # Example: # selamat # become: # SELAMAT [SELAMAT] s e l a m a t # # The generated pronounciation list is used for making # acoustic model created with HTK Tools in speech # recognition system. # # Author : Juan Rio Sipayung aka Joielechong # Date : 06 August 2010, Friday. Medan, Indonesia # Copyright 2010, License Under GNU GPL V2 use strict; my ($wlist, $dictlist, $w, $word_length, $count, @char_array, $char, $pronoun, $pronoun_list, $w2uppercase); # check usage if (@ARGV != 2) { print "Generate Indonesian pronounciation list from Indonesian word list\n\n"; print "usage: $0 wordlist dictlist\n\n"; print "wordlist : Indonesian word list input\n"; print "dictlist : Indonesian pronounciation list output\n"; exit (0); } # read in command line arguments ($wlist, $dictlist) = @ARGV; # open files open (WLIST, "$wlist") || die ("Unable to open wordlist $wlist for reading"); open (DICTLIST, ">$dictlist") || die ("Unable to open dictlist $dictlist file for writing"); # Process each line word one at a time to find the # pronounciation while ($w = <WLIST>) {
101
Universitas Sumatera Utara
102 chomp ($w); # Remove "\n" from word line # Get the word length $word_length = length($w); #print $word_length; # Separate each character in word and save to an array @char_array = unpack("A1" x length($w), $w); #print @char_array; # clear save pronounciation variable for next # reading word $pronoun = ""; # Read each letter in word and find its phoneme for ($count = 0; $count < $word_length; $count++ ) { #print $count; $char = $char_array[$count]; #print $char; #----------Vowels: a e E i o u--------------------# # Determine "a" phoneme # Letter "a" exist in diphthong "ai" and "au" # so the determination of that diphthong phoneme # are related to the determination of "a" phoneme if ($char eq "a") { # if "a" is the second letter from the end #letter in word if (($word_length-$count) == 2) { #------------------Diphthong: ai----------# # if "i" is the next letter # then the phoneme is diphthong "ai" if ($char_array[$count+1] eq "i") { $pronoun .= "ai "; # skip next letter reading $count++; } #-----------------------------------------# #------------Diphthong: au----------------# # if "u" is the next letter # then the phoneme is diphthong "au" elsif ($char_array[$count+1] eq "u") { $pronoun .= "au "; $count++; } #-----------------------------------------# # the phoneme is "a" else { $pronoun .= "a "; } } # the phoneme is "a" else { $pronoun .= "a "; } } # We set the vowel "e" and # the phoneme is "e" elsif ($char eq "e") { $pronoun .= "e "; } # the phoneme is "i" elsif ($char eq "i") { $pronoun .= "i ";
"E" as the same
Universitas Sumatera Utara
103 } #----------------Diphthong: oi-------------------# # Letter "o" exist in diphthong "oi" # so the determination of that diphthong phoneme # related to the determination of "a" phoneme elsif ($char eq "o") { # if "o" is the second letter from end # letter in word if (($word_length-$count) == 2) { # if "i" is the next letter # then the phoneme is diphthong "ai" if ($char_array[$count+1] eq "i") { $pronoun .= "oi "; # skip next letter reading $count++; } #------------------------------------------------# # the phoneme is "o" else { $pronoun .= "o "; } } # the phoneme is "o" else { $pronoun .= "o "; } } # the phoneme is "u" elsif ($char eq "u") { $pronoun .= "u "; } #-------------------------------------------------# #------------Semi-Vowels: w y---------------------# # the phoneme is "w" elsif ($char eq "w") { $pronoun .= "w "; } # the phoneme is "y" elsif ($char eq "y") { $pronoun .= "y "; } #-------------------------------------------------# #-------Plosives: b p d t g k kh------------------# # the phoneme is "b" elsif ($char eq "b") { $pronoun .= "b "; } # the phoneme is "p" elsif ($char eq "p") { $pronoun .= "p "; } # the phoneme is "d" elsif ($char eq "d") { $pronoun .= "d "; } # the phoneme is "t" elsif ($char eq "t") { $pronoun .= "t "; } # the phoneme is "g" elsif ($char eq "g") {
Universitas Sumatera Utara
104 $pronoun .= "g "; } # Determination of "k" dan "kh" phoneme elsif ($char eq "k") { # if "k" is not the last letter in the word if (($word_length-$count) > 1) { # if "h" is the next letter # then the phoneme is "kh" if ($char_array[$count+1] eq "h") { $pronoun .= "kh "; $count++; } # the phoneme is "k" else { $pronoun .= "k "; } } # the phoneme is "k" else { $pronoun .= "k "; } } #-------------------------------------------------# #-------------Africatives: j c--------------------# elsif ($char eq "j") { $pronoun .= "j "; } elsif ($char eq "c") { $pronoun .= "c "; } #-------------------------------------------------# #----------Fricatives: v f z s sy h---------------# # the phoneme is "v" elsif ($char eq "v") { $pronoun .= "v "; } # the phoneme is "f" elsif ($char eq "f") { $pronoun .= "f "; } # the phoneme is "z" elsif ($char eq "z") { $pronoun .= "z "; } # Determination of "s" and "sy" phoneme elsif ($char eq "s") { # if "s" is not the last letter in the word if (($word_length-$count) > 1) { # if "y" is the next letter # then the phoneme is "sy" if ($char_array[$count+1] eq "y") { $pronoun .= "sy "; $count++; } # the phoneme is "s" else { $pronoun .= "s "; } } # the phoneme is "s" else {
Universitas Sumatera Utara
105 $pronoun .= "s "; } } # the phoneme is "h" elsif ($char eq "h") { $pronoun .= "h "; } #-------------------------------------------------# #----------------Liquids: r l---------------------# elsif ($char eq "r") { $pronoun .= "r "; } elsif ($char eq "l") { $pronoun .= "l "; } #-------------------------------------------------# #------------Nasals: m n ny ng--------------------# # the phoneme is "m" elsif ($char eq "m") { $pronoun .= "m "; } # Determination of "n", "ny", dan "ng" phoneme elsif ($char eq "n") { # if "n" not the last letter in th word if (($word_length-$count) > 1) { # if "y" is the next letter # then the phoneme is "ny" if ($char_array[$count+1] eq "y") { $pronoun .= "ny "; $count++; } # if "g" is the next letter # then the phoneme is "ng" elsif ($char_array[$count+1] eq "g") { $pronoun .= "ng "; $count++; } # the phoneme is "n" else { $pronoun .= "n "; } } # the phoneme is "n" else { $pronoun .= "n "; } #-------------------------------------------------# } #--------------SPECIAL TREATMENT------------------# # We do special treatment for character "x" and "q" #because there is no phoneme for "x" and "q" # letter in "indonesian phoneme set". # for "x" letter # we treat "x" as "s" in phonemic if it the first # letter in word # "x" as "k h" if it other than first letter. elsif ($char eq "x") { # if "x" is the first letter then the
Universitas Sumatera Utara
106 # phoneme is "s" if ($count == 0) { $pronoun .= "s "; } # if not, then the phoneme is "k s" else { $pronoun .= "k s "; } } # for "q" letter # we treat "q" letter as "k" in phoneme elsif ($char eq "q") { $pronoun .= "k "; } #-------------------------------------------------# } # Uppercase the word $w2uppercase = uc $w; # Remove "\b" at the end of $pronoun, # generated from the preceding code. chop ($pronoun); #print "$w2uppercase \t [$w2uppercase] \t $pronoun","\n"; # Make word become: # ---> WORD [WORD] pronounciation <--# and save it. $pronoun_list .= $w2uppercase . " [$w2uppercase]" . " $pronoun" . "\n"; } # finally write out to pronounciation list file printf(DICTLIST "%s\n", $pronoun_list); close(WLIST); close(DICTLIST);
B.2 Listing Code Sistem Pengenalan Ucapan USUara B.2.1 aboutUSUaraDialog.h /*! \class aboutUSUaraDialog * \brief Show dialog about application. * \details Class for showing dialog about USUara application. * \author: Juan Rio Sipayung * \date: 2010 */ #ifndef ABOUTUSUARADIALOG_H #define ABOUTUSUARADIALOG_H #include #include "ui_aboutUSUaraDialog.h" class aboutUSUaraDialog : public QDialog, private Ui::aboutUSUaraDialog { Q_OBJECT public: //! Constructor. /*!
Universitas Sumatera Utara
107 Constructor will call setupUi function that initializes aboutUSUaraDialog UI. Inherit QDialog and Ui::aboutUSUaraDialog. \param parent Specifies the parent widget. */ aboutUSUaraDialog(QWidget *parent = 0); //! Destructor. /*! Destructor will delete aboutUi member when object destroyed. */ ~aboutUSUaraDialog(); private: //! aboutUSUaraDialog UI handler /*! Member for aboutUSUaraDialog UI handler. UI will be initializes in constructor. \see aboutUSUaraDialog constructor */ Ui::aboutUSUaraDialog *aboutUi; }; #endif // ABOUTUSUARADIALOG_H
<span style=" font-weight:400; color:#202020;">Aplikasi ini dibangun sebagai Tugas akhir pada tahun 2009-2010 di <span style=" color:#202020;">Universitas Sumatera Utara
B.2.4 preferenceDialog.h /*! \class preferenceDialog * \brief Class to show preference Dialog. * \details This class will show a preference dialog so that user
Universitas Sumatera Utara
114 * can change a couple application behaviour. * \author Juan Rio Sipayung * \version 0.1 Alpha * \date 2010 */ #ifndef PREFERENCEDIALOG_H #define PREFERENCEDIALOG_H #include #include "ui_preferenceDialog.h" class preferenceDialog : public QDialog, private Ui::preferenceDialog { Q_OBJECT public: //! Constructor. /*! This class inherited QDialog and preferenceDialog.ui. Make the UI accessible, call the preferenceDialogReadSettings() method and connecting buttonSave click signal to slot save(). \param parent Specifies the parent widget. */ preferenceDialog(QWidget *parent = 0); //! Destructor. /*! prefUi will be deleted when the class terminated so used memory by the UI is reclaimed back. */ ~preferenceDialog(); private: //! Read saved setting. /*! Read saved setting and apply it to preferenceDialog Dialog. */ void preferenceDialogReadSettings(); //! preferenceDialog Ui Handler. /*! Member for UI preferenceDialog.ui handler. */ Ui::preferenceDialog *prefUi; public slots: //! Read saved setting and save it. /*! Read preference options saved setting and save it to setting file. */ void setScan(); private slots: //! Save options. /*! Save preference options by calling setScan() method then send accept signal and exit. */ void save(); private:
Universitas Sumatera Utara
115 /// Variable to read check bool StartOnRun; /// Variable to read check bool AlwaysHide; /// Variable to read check itself bool CloseButtonHide; /// Variable to read check bool HideSplash; }; #endif // PREFERENCEDIALOG_H
box StartOnRun UI setting and set to itself box AlwaysHide UI setting and set to itself box CloseButtonHide UI setting and set to box HideSplash UI setting and set to itself
118 QSettings ptrFile("USUara" "USUara"); preferenceDialogReadSettings(); // Read and set Setting to preferenceDialog connect(prefUi->buttonSave, SIGNAL(clicked()), this, SLOT(save())); //this->setProfile(); //set profile preference } preferenceDialog::~preferenceDialog() { delete prefUi; } void preferenceDialog::save() { this->setScan(); // save Options this->close(); // send accept signal and exit } void preferenceDialog::setScan() { // Update checklog from configuration file QSettings ptrFile("USUara", "USUara"); if(prefUi->cb_StartOnRun->isChecked()) ptrFile.setValue("StartOnRun", "true"); else ptrFile.setValue("StartOnRun", "false"); if(prefUi->cb_AlwaysHide->isChecked()) ptrFile.setValue("AlwaysHide", "true"); else ptrFile.setValue("AlwaysHide", "false"); if(prefUi->cb_CloseBtnHide->isChecked()) ptrFile.setValue("CloseButtonHide", "true"); else ptrFile.setValue("CloseButtonHide", "false"); if(prefUi->cb_HideSplash->isChecked()) ptrFile.setValue("HideSplash", "true"); else ptrFile.setValue("HideSplash", "false"); } //=====================================================================// // Read saved setting then set to preferenceDialog // //=====================================================================// void preferenceDialog::preferenceDialogReadSettings() { QSettings settings("USUara", "USUara"); /// Read check box StartOnRun UI setting and set to itself StartOnRun = settings.value("StartOnRun", false).toBool(); prefUi->cb_StartOnRun->setChecked(StartOnRun); /// Read check box AlwaysHide UI setting and set to itself AlwaysHide = settings.value("AlwaysHide", false).toBool(); prefUi->cb_AlwaysHide->setChecked(AlwaysHide); /// Read check box CloseButtonHide UI setting and set to itself CloseButtonHide = settings.value("CloseButtonHide", false).toBool(); prefUi->cb_CloseBtnHide->setChecked(CloseButtonHide);
Universitas Sumatera Utara
119 /// Read check box HideSplash UI setting and set to itself HideSplash = settings.value("HideSplash", false).toBool(); prefUi->cb_HideSplash->setChecked(HideSplash); }
B.2.7 getApplication.h /*! \class getApplication * \brief Class to Generate application list. * \details This class will scan directory where application is listed then populate it to a single file list. * \author Juan Rio Sipayung * \author Highly adopted from Milot Shala code. * \version 0.1 Alpha * \date 2010 */ #ifndef GETAPPLICATION_H #define GETAPPLICATION_H #include class getApplication : public QDir { public: //! Constructor /*! This constructor will call selectDirAndGetApplication() function when created. */ getApplication(); //! Function to scan application list. /*! Given directory in directory_path QString member will be scanned and all application in the directory will be listed to a single file called application.list. */ void selectDirAndGetApplication(); private: //! Handler for scanning output /*! Output from match file scanning process is directed to this QString */ QString list; //! Directory scan path /*! Path of directory where application listed. */ QString directory_path; }; #endif // GETAPPLICATION_H
Universitas Sumatera Utara
120
B.2.8 getApplication.cpp // Class for create application list from /usr/share/applications folder. // This part of code highly adopted from Milot Shala code. // Thanks a lot for the code :). #include #include "include/getApplication.h" getApplication::getApplication() { selectDirAndGetApplication(); } void getApplication::selectDirAndGetApplication() { directory_path = "/usr/share/applications"; // Then create an instance of our QDirIterator, which takes as parameters // the directory, a QDir filter and an option flag which the QDirIterator is told // to go on the subdirectories also. // I have combined the QDir filters to list files and not to get the symbolic links (shortcuts in Windows). QDirIterator directory_walker(directory_path, QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories); // QDirIterator object has a boolean method called hasNext() which returns true // if the directory have more files, false otherwise and based on that information, // we can write a while loop like the one below while(directory_walker.hasNext()) { // Make "application.list" file as a place to store the application list. QFile app_list("/tmp/application.list"); // then we tell our directory_walker object to explicitly take next element until the loop finishes directory_walker.next(); // I want to list just desktop files! if(directory_walker.fileInfo().completeSuffix() == "desktop") { // then we take a filename and display it to a file like the code below: if (!app_list.open(QIODevice::WriteOnly | QIODevice::Text)) return; // Remove the file type and append it to the list of application list +=directory_walker.fileInfo().baseName() + "\n"; QTextStream out(&app_list); out << list;// << "\n"; } } }
Universitas Sumatera Utara
121
B.2.9 checkGrammar.h /*! \class checkGrammar * \brief Check grammar of string output from getCommandText class. * \details Class for checking text generated resulted from julius recognition with simple grammar. * The grammar use BNF syntax. The grammar then converted to code by hand. * The syntax is: * <syntax> ::= | <syntax> * * <syntax> ::= <start> | <stop> * <start> ::= jalankan | mulai | buka * <stop> ::= matikan | hentikan | tutup * ::= komputer | pengenalan | program * * program is one of application from application list generated by getApplication class * * Example: * matikan komputer * matikan aplikasi * jalankan aplikasi * \author Juan Rio Sipayung * \date 2010 */ #ifndef CHECKGRAMMAR_H #define CHECKGRAMMAR_H #include #include class checkGrammar : public QFile { public: //! Constructor /*! This constructor will call processString() function. \param string String to be processed. The string will be directed to processString() function. Obtained from getCommandText class. */ checkGrammar(QString string); //! Function to process string parameter. /*! String being directed from checkGrammar constructor will be split to 2 word. First word for <start> or <stop>. Second word for . */ void processString(QString string); private: //! List string from recognition generated text. /*!
Universitas Sumatera Utara
122 This variable is a handler for string list generated by removing space from string variable directed from checkGrammar constructor. */ QStringList commandWord; QString str1; /**< First word handler generated from commandWord */ QString str2; /**< Second word handler generated from commandWord */ QString Memberlist; /**< Application member handler from application list generated by getApplication class */ //! Application match flag. /*! This variable used to mark whether the application in Memberlist match with str2 variable or not. If match, found set to true and process to find the match will be terminated. If not match, found set to false and process to find the match will be terminated after each member of application list generated by getApplication have been scanned. */ bool found; QProcess process; /**< Proces launcher handler for each str2 match event. */ }; #endif // CHECKGRAMMAR_H
B.2.10 checkGrammar.cpp /*! This part for checking text generated resulted from julius recognition with simple grammar. * The grammar use BNF syntax. The grammar then converted to code by hand. * The syntax is: * <syntax> ::= | <syntax> * * <syntax> ::= <start> | <stop> * <start> ::= jalankan | mulai | buka * <stop> ::= matikan | hentikan | tutup * ::= komputer | pengenalan | program * * program is one of application from application list. * * Example: * - matikan komputer * - matikan aplikasi * - jalankan aplikasi * * Note: - For word "komputer" and "aplikasi" there is only "<stop>" rule. Cause we can only * turn off computer or main application when main application is running.
Universitas Sumatera Utara
123 * - This grammar ignore words after the 2 main words. Ex: * "jalankan komputer ini" --> grammar will ignore the third word which become: * "jalankan komputer" */ #include #include #include #include #include #include #include "include/checkGrammar.h" checkGrammar::checkGrammar(QString string) { processString(string); } void checkGrammar::processString(QString s) { qDebug() << "STRING: " << s; /*QFile command("/tmp/command.log"); // File contain command word from Julius Output if (!command.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&command); // read file /tmp/result.log */ QFile appList("/tmp/application.list"); // File contain Application list. if (!appList.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream file_list(&appList); //QString line = in.readLine();
// Get generated string from julius
commandWord = s.split(" ", QString::SkipEmptyParts); // remove space from string str1 = commandWord.first(); // Get first word str1 = str1.toLower(); str2 = commandWord.at(1); // Get Second word. str2 = str2.toLower(); qDebug() << "STR1:" << str1; qDebug() << "STR2:" << str2; // This is special case handler for grammars: // <syntax> ::= matikan | komputer // <syntax> ::= hentikan | matikan pengenalan // <syntax> ::= jalankan | mulai pengenalan // <syntax> ::= hentikan | matikan aplikasi QString lines = str1 + " " + str2; qDebug() << "LINES:" << lines; if (lines == "matikan komputer" || lines == "hentikan komputer") { process.setProcessChannelMode(QProcess::MergedChannels); process.startDetached("sudo /sbin/poweroff"); } else if (lines == "hentikan pengenalan" || lines == "matikan pengenalan") {
Universitas Sumatera Utara
124 // pauseJulius(); } else if (lines == "jalankan pengenalan" || lines == "mulai pengenalan") { // startJulius(); } else if (lines == "matikan aplikasi" || lines == "hentikan aplikasi") { //quit(); // Quit main application } // <syntax> ::= <start> | <stop> // <start> ::= jalankan | mulai | buka if (str1 == "jalankan" || str1 == "mulai" || str1 == "buka") { //Memberlist = file_list.readLine(); qDebug() << "Memberlist" << Memberlist; found = false; int i = 1; while (!file_list.atEnd()) //|| !found) { Memberlist = file_list.readLine(); qDebug() << "found:" << found << " "; if (Memberlist == str2) { // if we found the application, run it. process.setProcessChannelMode(QProcess::MergedChannel s); // run the application // The started process will run in its own session and act like a daemon. process.startDetached(str2); found = true; // we have found the application, terminate looping. } i++; qDebug() << i << " "; bool atend = file_list.atEnd(); qDebug() << atend ; } } // <stop> ::= matikan | hentikan | tutup else if (str1 == "matikan" || str1 == "hentikan" || str1 == "tutup") { // if (str2.isRunning) // Check if program run // kill str2; // terminate program // else // Message("Program not running"); // No str2 program run } }
B.2.11 getCommandText.h /*! \class getCommandText * \brief Class to get specific string. * \details This Code Get string between "sentence1: <s>" and " " \n * For Example:\n
Universitas Sumatera Utara
125 * sentence1: <s> COMPUTER WAKE \n * becomes: \n * COMPUTER WAKE.\n * \author Juan Rio Sipayung * \version 0.1 Alpha * \date 2010 */ #ifndef GETCOMMANDTEXT_H #define GETCOMMANDTEXT_H #include class getCommandText : public QFile { public: //! Constructor /*! This constructor will call processText() function when created. */ getCommandText(const QString&); //! Function to process input. /*! This function will receive input stream and trying to find specific text between <s> and */ void processText(const QString&); //! Loop terminating flag. /*! Flag to determine if string have being found or not. If found is true means the string have being found then the searching loop will be terminated. */ bool found; }; #endif // GETCOMMANDTEXT_H
B.2.12 getCommandText.cpp //=====================================================================// // This Code Get string between "sentence1: <s>" and " " // // For Example: // // sentence1: <s> COMPUTER WAKE // // ====> becomes COMPUTER WAKE // //=====================================================================// #include #include #include
Universitas Sumatera Utara
126 #include #include "include/getCommandText.h" #include "include/checkGrammar.h" getCommandText::getCommandText(const QString &Sentence) { processText(Sentence); } void getCommandText::processText(const QString &sentence) { //QFile file("/tmp/result.log"); // File from julius Output QFile command("/tmp/command.log"); // File contain command word //from Julius Output // QString received from juliussimple class is in format // " <s> SENTENCE1 SENTENCE2 " // so we need to remove " <s> " and " " // to remove " <s> ", we need to remove 5 char at the beginning // of sentence QString commandStr = sentence.mid(5); // to remove " ", we need to chop 5 char at the end // of sentence commandStr.chop(5); // save string result to /tmp/command.log if (!command.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&command); out << commandStr; // And check it. checkGrammar checkgrammar(commandStr); }
127 static void put_hypo_phoneme(WORD_ID *seq, int n, WORD_INFO *winfo); QString m_sentence; public slots: void sendResult(const QString&); signals: void recogSentences(const QString&); }; #endif // JULIUSSIMPLE_H
B.2.14 juliussimple.cpp #include #include /* include top Julius library header */ #include <julius/juliuslib.h> #include "include/juliussimple.h" /** * Callback to be called when start waiting speech input. * */ void JuliusSimple::status_recready(Recog *recog, void *dummy) { if (recog->jconf->input.speech_input == SP_MIC) { fprintf(stderr, "<<< please speak >>>"); } } /** * Callback to be called when speech input is triggered. * */ void JuliusSimple::status_recstart(Recog *recog, void *dummy) { if (recog->jconf->input.speech_input == SP_MIC) { fprintf(stderr, "\r \r"); } } /** * Sub function to output phoneme sequence. * */ void JuliusSimple::put_hypo_phoneme(WORD_ID *seq, int n, WORD_INFO *winfo) { int i,j; WORD_ID w; static char buf[MAX_HMMNAME_LEN]; if (seq != NULL) { for (i=0;i 0) printf(" |"); w = seq[i]; for (j=0;j<winfo->wlen[w];j++) { center_name(winfo->wseq[w][j]->name, buf);
Universitas Sumatera Utara
128 printf(" %s", buf); } } } printf("\n"); } /** * Callback to output final recognition result. * This function will be called just after recognition of an input ends * */ void JuliusSimple::output_result(Recog *recog, void *dummy) { int i, j; int len; WORD_INFO *winfo; WORD_ID *seq; int seqnum; int n; Sentence *s; QString fullsentence; QString spaceChar; QString wseq; QString phseq; QString cmscore; RecogProcess *r; HMM_Logical *p; SentenceAlign *align; fullsentence = ""; spaceChar = " "; /* all recognition results are stored at each recognition process instance */ for(r=recog->process_list;r;r=r->next) { /* skip the process if the process is not alive */ if (! r->live) continue; /* result are in r->result.
See recog.h for details */
/* check result status */ if (r->result.status < 0) { /* no results obtained */ /* output message according to the status code */ switch(r->result.status) { case J_RESULT_STATUS_REJECT_POWER: printf("\n"); break; case J_RESULT_STATUS_TERMINATE: printf("\n"); break; case J_RESULT_STATUS_ONLY_SILENCE: printf("\n"); break; case J_RESULT_STATUS_REJECT_GMM: printf("\n"); break; case J_RESULT_STATUS_REJECT_SHORT: printf("\n"); break; case J_RESULT_STATUS_FAIL: printf("<search failed>\n"); break; }
Universitas Sumatera Utara
129 /* continue to next process instance */ continue; } /* output results for all the obtained sentences */ winfo = r->lm->winfo; for(n = 0; n < r->result.sentnum; n++) { /* for all sentences */ s = &(r->result.sent[n]); seq = s->word; seqnum = s->word_num; /* output word sequence like Julius */ printf("sentence%d:", n+1); for(i=0;i<seqnum;i++) { printf(" %s", winfo->woutput[seq[i]]); fullsentence += spaceChar + winfo->woutput[seq[i]]; } getCommandText getcommandtext(fullsentence); printf("\n"); /* LM entry sequence */ printf("wseq%d:", n+1); for(i=0;i<seqnum;i++) printf(" %s", winfo->wname[seq[i]]); printf("\n"); /* phoneme sequence */ printf("phseq%d:", n+1); put_hypo_phoneme(seq, seqnum, winfo); printf("\n"); /* confidence scores */ printf("cmscore%d:", n+1); for (i=0;i<seqnum; i++) { printf(" %5.3f", s->confidence[i]); } printf("\n"); /* AM and LM scores */ printf("score%d: %f", n+1, s->score); if (r->lmtype == LM_PROB) { /* if this process uses N-gram */ printf(" (AM: %f LM: %f)", s->score_am, s->score_lm); } printf("\n"); if (r->lmtype == LM_DFA) { /* if this process uses DFA grammar */ /* output which grammar the hypothesis belongs to when using multiple grammars */ if (multigram_get_all_num(r->lm) > 1) { printf("grammar%d: %d\n", n+1, s->gram_id); } } /* output alignment result if exist */ for (align = s->align; align; align = align->next) { printf("=== begin forced alignment ===\n"); switch(align->unittype) { case PER_WORD: printf("-- word alignment --\n"); break; case PER_PHONEME: printf("-- phoneme alignment --\n"); break; case PER_STATE: printf("-- state alignment --\n"); break; } printf(" id: from to n_score unit\n");
Universitas Sumatera Utara
130 printf(" ----------------------------------------\n"); for(i=0;inum;i++) { printf("[%4d %4d] %f ", align->begin_frame[i], align>end_frame[i], align->avgscore[i]); switch(align->unittype) { case PER_WORD: printf("%s\t[%s]\n", winfo->wname[align->w[i]], winfo>woutput[align->w[i]]); break; case PER_PHONEME: p = align->ph[i]; if (p->is_pseudo) { printf("{%s}\n", p->name); } else if (strmatch(p->name, p->body.defined->name)) { printf("%s\n", p->name); } else { printf("%s[%s]\n", p->name, p->body.defined->name); } break; case PER_STATE: p = align->ph[i]; if (p->is_pseudo) { printf("{%s}", p->name); } else if (strmatch(p->name, p->body.defined->name)) { printf("%s", p->name); } else { printf("%s[%s]", p->name, p->body.defined->name); } if (r->am->hmminfo->multipath) { if (align->is_iwsp[i]) { printf(" #%d (sp)\n", align->loc[i]); } else { printf(" #%d\n", align->loc[i]); } } else { printf(" #%d\n", align->loc[i]); } break; } } printf("re-computed AM score: %f\n", align->allscore); printf("=== end forced alignment ===\n"); } } } /* flush output buffer */ fflush(stdout); } int JuliusSimple::mainJulius() { /** * configuration parameter holder * */ Jconf *jconf; /** * Recognition instance *
Universitas Sumatera Utara
131 */ Recog *recog; int ret; /* by default, all messages will be output to standard out */ /* to disable output, uncomment below */ jlog_set_output(NULL); /* output log to a file */ //FILE *fp; fp = fopen("log.txt", "w"); jlog_set_output(fp); /************/ /* Start up */ /************/ /* 1. load configurations from a jconf file */ jconf = j_config_load_file_new("/root/VOXFORGE/manual/julian.conf"); /* 2. create recognition instance according to the jconf */ /* it loads models, setup final parameters, build lexicon and set up work area for recognition */ recog = j_create_instance_from_jconf(jconf); if (recog == NULL) { fprintf(stderr, "Error in startup\n"); return -1; } /*********************/ /* Register callback */ /*********************/ /* register result callback functions */ callback_add(recog, CALLBACK_EVENT_SPEECH_READY, status_recready, NULL); callback_add(recog, CALLBACK_EVENT_SPEECH_START, status_recstart, NULL); callback_add(recog, CALLBACK_RESULT, output_result, NULL); /**************************/ /* Initialize audio input */ /**************************/ /* initialize audio input device */ /* ad-in thread starts at this time for microphone */ if (j_adin_init(recog) == FALSE) { /* error */ return -1; } /* output system information to log */ //j_recog_info(recog); /***********************************/ /* Open input stream and recognize */ /***********************************/ if (jconf->input.speech_input == SP_MIC) { /* raw speech input (microphone) */ switch(j_open_stream(recog, NULL)) { case 0: /* succeeded */ break; case -1: /* error */
Universitas Sumatera Utara
132 fprintf(stderr, "error in input stream\n"); return 1; case -2: /* end of recognition process */ fprintf(stderr, "failed to begin input stream\n"); return -2; } /**********************/ /* Recognization Loop */ /**********************/ /* enter main loop to recognize the input stream */ /* finish after whole input has been processed and input reaches end */ ret = j_recognize_stream(recog); if (ret == -1) return -1; /* error */ /*******/ /* End */ /*******/ } else { fprintf(stderr, "\ninput stream not from mic...Terminated :(\n"); } /* calling j_close_stream(recog) at any time will terminate recognition and exit j_recognize_stream() */ j_close_stream(recog); j_recog_free(recog); /* exit program */ return(0); } JuliusSimple::JuliusSimple(QObject *parent) { mainJulius(); } void JuliusSimple::sendResult(const QString &Sentence ) { if (m_sentence == Sentence) return; m_sentence = Sentence; emit recogSentences(m_sentence); } JuliusSimple::~JuliusSimple() { qDebug() << "Juliussimple terminated"; }
B.2.15 threadProcess.h /*! \class ThreadProcess * \brief Class to call getCommandText class in a thread. * \details This class will call getCommandText by using thread so * that main GUI will not freeze when this class doing the looping scan. * \author Juan Rio Sipayung
Universitas Sumatera Utara
133 * \version 0.1 Alpha * \date 2010 */ #ifndef THREADPROCESS_H #define THREADPROCESS_H #include #include class ThreadProcess : public QThread { Q_OBJECT public: //! Constructor. /*! This constructor will set stopped variable to false so the calling thread can be run. \param parent Specifies the parent widget. */ ThreadProcess(QObject *parent = 0); //! Destructor. /*! This destructor will set stopped variable to true and then destroy the class. */ ~ThreadProcess(); //! Function to stop the thread. /*! The stop() function set stopped variable to true, thereby telling run() to stop. */ void stop(); public slots: //! Receiving stop thread signal. /*! Receiving signal to stop the thread by setting stopped variable to true. */ void stopProcess(); protected: //! Function To start the thread. /*! The run() function is called to start executing the thread. As long as the stopped variable is false, the function will always run. */ void run(); private: //! Thread Stop flag. /*! The stopped variable is declared volatile because it is accessed from different threads and we want to be sure that it is freshly
Universitas Sumatera Utara
134 read every time it is needed. If we omitted the volatile keyword, the compiler might optimize access to the variable, possibly leading to incorrect results. If stopped is true, thread will be quit, if false thread can be run. */ volatile bool stopped; //! QMutex class to protecting variable stopped. /*! This QMutex class provides a means of protecting stopped variable so that only one thread can access it at a time. */ QMutex mutex; }; #endif // THREADPROCESS_H
B.2.17 USUaraMain.h /*! \class USUaraMain * * \brief this class contain all required definitions and basic utilities functions * of main GUI. * \details In this class main GUI will be initialized. Initialized including creating * GUI buttons, Menu, Tab widget and Tray Icon. * \author Juan Rio Sipayung * \version 0.1 Alpha * \date 2010 */ #ifndef USUARAMAIN_H #define USUARAMAIN_H #include #include #include #include
#include "ui_USUaraMain.h" #include "include/threadProcess.h" //! Enabling Ui configuration /*! This namespace is required to enable configuration of USUaraMain UI */ namespace Ui { class USUaraMain; } /// contain all required definitions and basic utilities functions of main GUI. class USUaraMain : public QMainWindow { Q_OBJECT public: //! Constructor /*! This constructor will set startIt variable to false which mean the recognition process not yet begin also set keluarButtonClickedValue to false which means keluarButton not clicked. Tray Icon UI will be initialized.Setting of the program will be read and applied to main GUI by calling readSetting function. All application in DE menu will be listed on an application file list by calling getApplication class. \param parent Specifies the parent widget. */ USUaraMain(QWidget *parent = 0); //! Destructor /*! Destroy main UI when class destroyed. */
Universitas Sumatera Utara
136 ~USUaraMain(); //! Set visibility of main GUI /*! Function to set visibility of main GUI by reading variable visible from main window GUI. If visible is true then when user click hide Button, main GUI will be hide so that otherwise. \param visible Variable of Visibility. */ void setVisible(bool visible); //! Flag if keluarButton is clicked or not. /*! This variable will be true if user click keluarButton UI then main GUI will be quit. */ bool keluarButtonClickedValue; //! Flag if Start or Stop button clicked. NOT IMPLEMENTED YET !!!! /*! If Start Button clicked this flag will be true then recognition will be started. */ bool startIt; protected: //! Event Handler for close and quit. /*! This is an Event Handler when user choose close and quit in main GUI. \param event Pointer to click or quit event. */ void closeEvent(QCloseEvent *event); private slots: //! Function handler of tray icon activation. /*! This slot will handle signal of icon activated. \n If tray icon is single clicked or double clicked while main window is hidden then main window will be show.But if window is visible, it hide main window. \param reason Reason the system tray was activated. */ void iconActivated(QSystemTrayIcon::ActivationReason reason); //! Data from julius handler. PLEASE CORRECT THIS FUNCTION WITH STDOUT STREAM !!!!! /*! Handling output data from julius and save it to a file. */ void on_cmdExec_data_available(); public slots: void showKnownCommand(); recognition. */ void showHowToUse(); application. */ void preference();
/**< Show known command for /**< Show how to use USUara /**< Show preference Dialog window. */
/**< Show about USUara application /**< Starting recognition process. */ /**< Stopping recognition process. */ /**< set keluarButtonClickedValue to true if keluarButton is
clicked. */ private: Ui::USUaraMain *ui;
/**< Member handler of main window UI. */
// For calling another process QProcess process; QString output; /**< Output handler for on_cmdExec_data_available function. */ void createTrayIcon();
/**< Create tray icon for main window
GUI. */ void createUSUaraActionHandler(); main window GUI and Tray Icon. */
/**< Create Action Handler for
void readSettings(); /**< Read application setting and set it to application. */ void writeSettings(); /**< Save setting and set to application. */ //------for TrayIcon--------// QSystemTrayIcon *trayIcon; /**< QMenu *trayIconMenu; /**< // QAction untuk TrayIcon QAction *minimizeAction; /**< minimize action. */ QAction *restoreAction; /**< restore action. */ QAction *quitAction; /**< quit action. */ //----------------------------// //QFile *log; ThreadProcess *thread; ThreadProcess. */
Member to create tray icon */ Member for tray icon menu */ Tray icon action handler for Tray icon action handler for Tray icon action handler for
createUSUaraActionHandler(); createTrayIcon(); ui->statusbar->showMessage("Ready........."); ui->textEdit_Output->append("Ready.........\n"); //=================================================================// // Install icon for Main Window and Tray System // //=================================================================// QIcon icon = QIcon("./icons/heart.svg"); setWindowIcon(icon); trayIcon->setIcon(icon); readSettings(); getApplication(); // Handler if Icon Tray is activated connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); trayIcon->show(); } //=====================================================================// // Destructor USUaraMain // //=====================================================================// USUaraMain::~USUaraMain() { //if(dialog) dialog->close(); delete ui; } void USUaraMain::setVisible(bool visible) { minimizeAction->setEnabled(visible); /* maximizeAction->setEnabled(!isMaximized()); */ restoreAction->setEnabled(isMaximized() || !visible); QMainWindow::setVisible(visible); } //=====================================================================// // Event Handler for Close on Main window // //=====================================================================// void USUaraMain::closeEvent(QCloseEvent *event) { // Is application is hidden in Tray Manager? if (trayIcon->isVisible()) {
Universitas Sumatera Utara
139 // Read CloseButtonHide setting on preferensi QSettings settings("USUara", "USUara"); bool CloseButtonHide = settings.value("CloseButtonHide", false).toBool(); //=============================================================// // Here checking is done if Close or KeluarButton is clicked // //=============================================================// //----------------If close button is clicked-------------------// if (keluarButtonClickedValue) { // If Recognition process is running. // Ask if application need to stay running or not if (!ui->actionStart->isEnabled()) { // Is need to hide it in Tray manager? int r = QMessageBox::warning(this, tr("USUara"), tr("Program sedang berjalan.\nTetap jalankan " "program dan sembunyikan kesystem tray?"), QMessageBox::Yes | QMessageBox::No); // If yes, hide to tray. if (r == QMessageBox::Yes) { hide(); keluarButtonClickedValue = false; event->ignore(); } // If not, quit application else { qApp->quit(); } } // If recognition not run, quit application. else { qApp->quit(); } } //-------------------------------------------------------------// //----------------If Close is clicked--------------------------// // If "Close Button Sembunyikan ke Tray" setting is enabled // Hide main window to tray manager else { // If "Close Button Sembunyikan ke Tray"setting disabled // and recognition process is running. if (!CloseButtonHide) { // If recognition is running, what must we do? if (!ui->actionStart->isEnabled()) { // Hide application to Tray? int r = QMessageBox::warning(this, tr("USUara"), tr("Program sedang berjalan.\nTetap jalankan " "program dan sembunyikan kesystem tray?"), QMessageBox::Yes | QMessageBox::No); // If yes, hide application to tray. if (r == QMessageBox::Yes) { hide(); event->ignore(); } // If not, stop application. else { qApp->quit();
Universitas Sumatera Utara
140 } } // If process not running, quit application. else { qApp->quit(); } } } //-------------------------------------------------------------// } } void USUaraMain::showKnownCommand() { statusBar()->showMessage(tr("Perintah yang diketahui.....")); } void USUaraMain::showHowToUse() { statusBar()->showMessage(tr("Cara Menggunakan Program....")); } //=====================================================================// // Show preferensi dialog // //=====================================================================// void USUaraMain::preference() { preferenceDialog preferencedialog(this); preferencedialog.exec(); // Read AlwaysHide setting in preferensi QSettings settings("USUara", "USUara"); bool AlwaysHide = settings.value("AlwaysHide", false).toBool(); // If always Hide checked, Hide main window when the dialog accepted. if (AlwaysHide) { hide(); } } //=====================================================================// // Show Dialog about USUara // //=====================================================================// void USUaraMain::aboutUSUara() { aboutUSUaraDialog aboutUSUaradialog(this); aboutUSUaradialog.exec(); } //====================================================================// // Action Handler for Menu // //====================================================================// void USUaraMain::createUSUaraActionHandler() { //================================================================// // Action Handler for Menu USUara // //================================================================// connect(ui->actionStart, SIGNAL(triggered()), this, SLOT(start())); connect(ui->actionStop, SIGNAL(triggered()), this, SLOT(stop())); connect(ui->actionHide, SIGNAL(triggered()), this, SLOT(hide()));
Universitas Sumatera Utara
141 connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(keluarButtonClicked())); //================================================================// // Action Handler for Menu Preferensi // //================================================================// connect(ui->actionPreference, SIGNAL(triggered()), this, SLOT(preference())); //================================================================// // Action Handler for Menu About // //================================================================// //connect(ui->actionHelp, SIGNAL(triggered()), this, SLOT(caraPakai())); //connect(ui->actionCommand, SIGNAL(triggered()), this, SLOT(daftarPerintah())); connect(ui->actionAboutUSUara, SIGNAL(triggered()), this, SLOT(aboutUSUara())); connect(ui->actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); //================================================================// // Action Handler for Button // //================================================================// connect(ui->sembunyiButton, SIGNAL(clicked()), this, SLOT(hide())); connect(ui->keluarButton, SIGNAL(clicked()), this, SLOT(keluarButtonClicked())); connect(ui->mulaiButton,SIGNAL(clicked()), this, SLOT(start())); connect(ui->berhentiButton,SIGNAL(clicked()), this, SLOT(stop())); //connect(ui->actionHelp, SIGNAL(triggered()), this, SLOT(aboutUSUara())); //================================================================// // Action in TrayIcon System tray // //================================================================// minimizeAction = new QAction(tr("Mi&nimize"), this); connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide())); restoreAction = new QAction(tr("&Restore"), this); connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal())); quitAction = new QAction(tr("&Keluar"), this); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); // Handler for juliusSimple // connect(sender, SIGNAL(recogSentences(const QString&)), this, SLOT(on_cmdExec_data_available())); } //=====================================================================// // Create TrayIcon for USUaraMain main window // //=====================================================================// void USUaraMain::createTrayIcon() { //=================================================================// // Menu for TrayIcon // //=================================================================// trayIconMenu = new QMenu(this);
Universitas Sumatera Utara
142 trayIconMenu->addAction(minimizeAction); trayIconMenu->addAction(restoreAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(quitAction); trayIcon = new QSystemTrayIcon(this); trayIcon->setToolTip("Aplikasi USUara"); trayIcon->setContextMenu(trayIconMenu); } //=====================================================================// // Read Setting save by preferenceDialog // //=====================================================================// void USUaraMain::readSettings() { QSettings settings("USUara", "USUara"); // Setting for start recognition or not when begin the program bool StartOnRun = settings.value("StartOnRun", false).toBool(); ui->actionStart->setDisabled(StartOnRun); ui->actionStop->setDisabled(!StartOnRun); ui->mulaiButton->setDisabled(StartOnRun); ui->berhentiButton->setDisabled(!StartOnRun); /* This part use to start recognition when starting program if(StartOnRun) { start(); } */ // Setting to hide Splash Screen bool HideSplash = settings.value("HideSplash", false).toBool(); // Test if it is working. if (!HideSplash) { QMessageBox::warning(this, tr("USUara"), tr("SplashScreen"), QMessageBox::Yes | QMessageBox::No); } // Setting to know if the program is running for the first time bool FirstRun = settings.value("FirstRun", "true").toBool(); // If yes, make application list if (FirstRun) { getApplication(); // Make application list from /usr/share/applications writeSettings(); // Flag that the program has been run. } } void USUaraMain::writeSettings() { QSettings settings("USUara", "USUara"); settings.setValue("FirstRun","false"); // Flag that program has been running. } //=====================================================================// // Start the Speech Recognition Program // //=====================================================================// void USUaraMain::start() { // If recognition is starting, disable Mulai button and Mulai menu // and enable stop button and stop menu.
Universitas Sumatera Utara
143 ui->actionStart->setDisabled(true); ui->mulaiButton->setDisabled(true); ui->actionStop->setEnabled(true); ui->berhentiButton->setEnabled(true); // Calling Output Handle with Thread thread = new ThreadProcess(); // If button berhentiButton is clicked, stop the thread //connect(ui->berhentiButton, SIGNAL(clicked()), thread, SLOT(stopProcess())); //process.setProcessChannelMode(QProcess::MergedChannels); //connect(&process, SIGNAL(readyRead()), this, SLOT(on_cmdExec_data_available())); output = ""; //JuliusSimple(); // process.start("julius"); thread->start(); } //=====================================================================// // Stopping Speech Recognition Process // //=====================================================================// void USUaraMain::stop() { // If recognition stopped, disable berhenti button and berhenti menu // and enable mulai button and mulai menu. ui->actionStop->setDisabled(true); ui->berhentiButton->setDisabled(true); ui->actionStart->setEnabled(true); ui->mulaiButton->setEnabled(true); startIt = true; // stop button clicked. Terminate loop in start() function thread->stopProcess(); } //=====================================================================// // Flag whether keluar Button is clicked or not // //=====================================================================// void USUaraMain::keluarButtonClicked() { keluarButtonClickedValue = true; close(); } //======================================================================= ==// // Handler for Icon Activated // //======================================================================= ==// void USUaraMain::iconActivated(QSystemTrayIcon::ActivationReason reason) { // For toggle show Main window static bool ToggleShow = true; switch (reason) {
Universitas Sumatera Utara
144 // If tray icon is clicked once when Main window is visible, then main // window will be hidden. // If tray icon is clicked once when Main window is hidden, then main // window will be shown. case QSystemTrayIcon::Trigger: if (ToggleShow) { show(); ToggleShow = false; } else { hide(); ToggleShow = true; } break; // Double Click on tray icon will show Main window case QSystemTrayIcon::DoubleClick: show(); break; /*case QSystemTrayIcon::MiddleClick: showMessage(); break; */ default: ; } } //=====================================================================// // Appending output from julius to TextEdit_output in Main window // //=====================================================================// void USUaraMain::on_cmdExec_data_available() { // Show on Window Log output +=process.readAll() + "\n"; ui->textEdit_Output->append(output); //---------------Save the current result from julius---------------// // Output result will be compared with grammar // then will be executed by the program // Get the absolute path of temp directory QString temp = QDir::temp().absolutePath(); QFile log(temp+"/usuara.log"); if (!log.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&log); out << output << "\n"; //----------------------------------------------------------------// }
145 * This application is created for My Electrical Engineering undergraduate thesis 2009-2010 at Universitas Sumatera Utara. * * \section intro_sec INTRODUCTION * This application use julius speech recognition tools for speech recognition * and HTK as it acoustic model and language modal generator. * Application when starting the recognition process, will capturing user speech * audio input from microphone connected to the computer then trying to find matching * utterance with the grammar which have defined before. Matching utterance then will * be executed. * * \subsection thanks THANKS * Special thank to my Lord Jesus Christ for his sacrifice in the cross to carry my sin, * for his aboundant love, grace, and mercy to this unworthy being. * * My Father and Mother who take care of me eventhough i always give you more and more * burden. * * My Sister Famela. God have a beautiful plan on your life. * * My Little Brother Egyon. I have a faith in you that you will have a bright future as long * as you walking in Our Lord Jesus Christ way. * * My Lecturer ir. Pernantin Tarigan M.Sc. Your guide form a great foundation in my life. * * My Friend Jhoni Hidayat, maintainer of medan-slackware.blogspot.com. * When do we will having a time like we used to be, playing game together with all our friend?. * * Milot Shala. Thanks for your code ;) * * \subsection author AUTHOR * Juan Rio Sipayung at [email protected] or [email protected] * * \subsection license LICENSE * This software license under GNU GPL V3. */ #include #include #include "include/USUaraMain.h" //! Main Function /*! Main function for terminal argument. */ int main(int argc, char *argv[]) { /// Resource initialization at USUaraMain.qrc file /// This macro is essential at some platform for resource saving in static library.
Universitas Sumatera Utara
146 Q_INIT_RESOURCE(USUaraMain); QApplication app(argc, argv); /* if (!QSystemTrayIcon::isSystemTrayAvailable()) { QMessageBox::critical(0, QObject::tr("Systray"), QObject::tr("I couldn't detect any system tray " "on this system.")); return 1; } */ QApplication::setQuitOnLastWindowClosed(false); /**< Program will not exit with Qt::WA_QuitOnClose when main window is visible */ //USUaraMainWindow *usuara = new USUaraMain; //usuara->show(); USUaraMain USUaraMainWindow; //USUaraMainWindow.show(); // Read AlwaysHide setting in preferenceDialog QSettings settings("USUara", "USUara"); bool AlwaysHide = settings.value("AlwaysHide", false).toBool(); // If always Hide is choosen, Hide Main Window when Application is started. // is accepted. if (AlwaysHide) { USUaraMainWindow.hide(); } else { USUaraMainWindow.show(); } return app.exec(); }
LAMPIRAN C BERKAS-BERKAS YANG DIBUTUHKAN JULIUS C.1 Berkas sample.grammar S : NS_B SENT NS_E SENT: EXECUTE APPLICATION SENT: STOP TASK
C.2 Berkas sample.voca % NS_B <s>
sil
% NS_E
sil
% EXECUTE JALANKAN MULAI BUKA
j a l a n k a n m u l ai b u k a
% STOP MATIKAN HENTIKAN TUTUP
m a t i k a n h e n t i k a n t u t u p
% TASK KOMPUTER PENGENALAN
k o m p u t e r p e ng e n a l a n
% APPLICATION KCHARSELECT k c h a r s e l e c t KFLOPPY k f l o p p y KMAIL k m a i l KMAIL k a m a i l KMAIL k a m e i l KNODE k n o d e KNODE k n o d e KNODE k a n o d KNODE k a n o d e KINO k i n o KJOTS k j o t s KJOTS k a j o t s KONTACT k o n t a k KONTACT k o n t e k KPPP k a p e p e p e RSSOWL e r e s e s o w l RSSOWL e r e s e s o l URBANTERROR u r b a n t e r r o r AKREGATOR a k r e g a t o r AMAROK a m a r o k ARK a r k ASSISTANT a s s i s t a n ASSISTANT a s s i s t e n ASSISTANT e s s i s t e n
148
Universitas Sumatera Utara
149 ASSISTANT a s i s t a n ASSISTANT a s i s t e n ATUNES a t u n e s ATUNES a t u n s ATUNES e t u n e s ATUNES e t u n s AUDACITY a u d a s i t i BLOGILO b l o g i l o CHMSEE c e h a e m s e CHMSEE c e h a e m s i CHROMIUM k r o m i u m CLAWS-MAIL k l a w e s m a i l CLAWS-MAIL k l a w s m e l CLAWS-MAIL k l o w e s m e i l CLEMENTINE k l e m e n t i n e CLEMENTINE k l e m e n t i n CODEBLOCKS k o d e b l o k s CODEBLOCKS k o d b l o k s COMIX k o m i k s DEADBEEF d e d b e f DEADBEEF d e d b i f DESIGNER d e s i g n e r DESIGNER d i s a i n e r DIA d i a DIA d a i e DRAGONPLAYER d r a g o n p l a y e r DRAGONPLAYER d r a g o n p l e y e r DRAGONPLAYER d r e g o n p l a y e r EBOARD e b o r d ECLIPSE e k l i p s e ECLIPSE e k l i p s EMACS e m a k s EXAILE e k s a i l e EXAILE e k s a i l EXFALSO e k s f a l s o FREEMIND f r e m i n FREEMIND f r i m i n FREEMIND f r e m a i n GIMP g i m p GMUSICBROWSER g m u s i k b r o w s e r GOGGLESMM g o g e l s e m e m GOGGLESMM g u g e l s e m e m GPA g e p e a GPARTED g e p a r t e d GPARTED g p a r t e d GPARTED g p a r t i d GPICVIEW g e p i k v i u GUCHARMAP g u c h ar m a p GVIM g e v i m GWENVIEW g w e n v i u GXINE g s i n e GXINE g s i n GXINE g s a i n JAMIN j a m i n JAMIN j e m i n JUK j u k K3B k a t i g a b e KALARM k a l a r a m KAPPFINDER k a a p f i n d e r KAPPFINDER k a p f a i n d e r KATE k a t e KATE k e t KAUDIOCREATOR k a u d i o k r e a t o r
Universitas Sumatera Utara
150 KCALC k a k a l KCALC k a k a l s KCOLORCHOOSER k a k o l o r c h o s e r KCOLORCHOOSER k a k o l o r c u s e r KDEVELOP k a d e v e l o p KDF k a d e e f KDF k a d e f KFILEREPLACE k f i l e r e p l a c e KFILEREPLACE k f a i l r i p l e s KFIND k a f i n KFIND k a f a i n KFONTVIEW k a f o n v i u KGET k a g e t KGPG k a g e p e g e KMENUEDIT k a m e n u e d i t KMIX k a m i k s KNOTES k a n o t e s KNOTES k a n o t s KOLOURPAINT k o l o u r p a i n KOLOURPAINT k o l o r p a i n KOLOURPAINT k o l o r p e i n KOMPARE k o m p a r e KOMPARE k o m p a r KOMPARE k o m p e r KONQUEROR k o n g u e r o r KONSOLE k o n s o l e KONSOLE k o n s o l KRDC k a e r d e s e KRENAME k a r e n a m e KRENAME k a r i n e m KRFB k a e r e f b e KSNAPSHOT k a s n a p s h o t KSYSGUARD k a s i s g u a r d KSYSTEMLOG k a s i s t e m l o g KTIMER k t i m e r KTIMER k t a i m e r KWALLETMANAGER k a w a l l e t m a n a g e r KWIKDISK k w i k d i s k KWIKDISK k w i k d i s KWRITE k a w r i t e KWRITE k a w r a i t KWRITE k a w r i t LINGOT l i ng o t LMMS e l e m e m e s LMMS e l m e m e s LXAPPEARANCE e l e k s a p i a r a n c e LXAPPEARANCE e l e k s a p p e a r a n c e LXAPPEARANCE e l e k s e p i a r a n c e LXAPPEARANCE e l e k s e p i r e n s LXDELOGOUT e l e k s d e l o g o u t LXINPUT e l e k s i n p u t LXTASK e l e k s t a s k LXTASK e l e k s t a s LXTASK e l e k s t e k s LXTERMINAL e l e k s t e r m i n a l MINITUNES m i n i t u n e s MINITUNES m i n i t u n s FIREFOX f i r e f o k s FIREFOX f a y e r f o k s THUNDERBIRD t h u n d e r b i r d THUNDERBIRD t a n d e r b e r d THUNDERBIRD t a n d e r b e d MPLAYER e m p l a y e r
Universitas Sumatera Utara
151 MPLAYER e m p l e y e r NETBEANS n e t b e a n s NETBEANS n e t b i n s NTED e n t e d OKULAR o k u l a r OPENOFFICE.ORG3 o p e n o f i c e OPENOFFICE.ORG3 o p e n o f i s OPENOFFICE.ORG3 o p e n o f f i s PAN p a n PAN p e n PARTITIONMANAGER p a r t i t i o n m a n a g e r PARTITIONMANAGER p a r t i s i o n m a n a g e r PARTITIONMANAGER p a r t i sy o n m a n a g e r PARTITIONMANAGER p a r t i s i o n m a n a j e r PARTITIONMANAGER p a r t i t i o n m a n e j e r PCMANFM p e s e m a n e f e m PCMANFM p i s i m a n e f e m PCMANFM p i s i m a n e f e m PGADMIN3 p g a d m i n PIDGIN p i d g i n QJACKCTL k i j a k c e t e e l QJACKCTL k i j a k c e t e l QJACKCTL k i j e k c e t e e l QJACKCTL k i j e k c e t e l QSTARDICT k i s t a r d i c QSTARDICT k i s t a r d i k QTCREATOR k i t i k r e a t o r QTCREATOR k y u t e k r e a t o r QUODLIBET k u o d l i b e t REALPLAYER r e a l p l a y e r REALPLAYER r e a l p l e y e r REALPLAYER r i l p l a y e r REALPLAYER r i l p l e y e r REDNOTEBOOK r e d n o t e b o k REDNOTEBOOK r e d n o t e b u k SEAMONKEY s e a m o n k e y SEAMONKEY s i m o n k e y SEAMONKEY s i m o n g k e y SEAMONKEY s i m o n g k i y SEAMONKEY s i m o n g k i SEAMONKEY s i m o n k i SKANLITE s k a n l i t e SKANLITE s k a n l i t SKANLITE s k a n l a i t SMPLAYER e s e m p l a y e r SMPLAYER e s e m p l e y e r STARDICT s t a r d i c STARDICT s t a r d i k SUPERKARAMBA s u p e r k a r a m b a SWEEPER s w i p e r SWEEPER s w e p e r TABU t a b u TEXMAKER t e k s m a k e r TEXMAKER t e k s m e k e r TRUECRYPT t r u e k r i p t TRUECRYPT t r u k r i p t TUXGUITAR t u k s g u i t a r TUXGUITAR t u k s g i t a r TUXGUITAR t a k s g u i t a r TUXGUITAR t a k s g i t a r UMBRELLO u m b r e l l o UMBRELLO u m b r e l o VIRTUALBOX v i r t u a l b o k s
Universitas Sumatera Utara
152 VLC v i e l s i VLC v e e l c e VYM v i m VYM v i y e m WICD w e i c e d e WICD w e i s e d e WINE w i n e WINE w a i n WIRESHARK w a y e r s h a r k WIRESHARK w a y e r sy a r k WXCAM w e e k s c a m WXCAM w e e k s k a m WXCAM w e e k s k e m XARCHIVER e k s a r c i v e r XARCHIVER e k s a r k i v e r XARCHIVER e k s a r s i v e r XBOARD e k s b o r d XCHAT e k s c h a t XCHAT e k s c a t XCHAT e k s c h e t XCHAT e k s c e t XINE s i n e XINE s a i n XMMS e k s e m e m e s XMOTO e k s m o t o XNOISE e k s n o i s e XNOISE e k s n o i s XPDF e k s p e d e e f XSANE e k s s a n e XSANE e k s s a n XSANE e k s s e n YAKUAKE y a k u a k e ZENMAP z e n m a p
C.3 Berkas sample.term 0 1 2 3 4 5
NS_B NS_E EXECUTE STOP TASK APPLICATION
C.4 Berkas sample.dict Berkas ini merupakan kamus pelafalan yang diperlukan oleh Julius dalam proses pengenalan ucapan. Pada Berkas sample.dict ini, angka di sebelah kiri merupakan nomor kategori kata. String yang diapit oleh "[" dan "]" merupakan kata yang pelafalannya berada di sebelah kanannya. String "[<s>]" dan "[]" pada baris pertama dan kedua merupakan penanda silence. 0 1 2 2 2 2
[<s>] sil [] sil [JALANKAN] j a l a n k a n [MULAI] m u l ai [BUKA] b u k a [MATIKAN] m a t i k a n
[HENTIKAN] h e [TUTUP] t u [MATIKAN] m a [HENTIKAN] h e [TUTUP] t u [KOMPUTER] k o [PENGENALAN] p e [KCHARSELECT]k c [KFLOPPY] k f [KMAIL] k a [KNODE] k a [KINO] k i n o [KJOTS] k a [KONTACT] k o [KONTACT] k o [RSSOWL] e r [URBANTERROR]u r [AKREGATOR] a k [AMAROK] a m [ARK] a r k [ASSISTANT] a s [ASSISTANT] a s [ASSISTANT] e s [ATUNES] a t [ATUNES] a t [AUDACITY] a u [BLOGILO] b l [CHMSEE] c e [CHROMIUM] k r [CLAWS-MAIL] k l [CLAWS-MAIL] k l [CLEMENTINE] k l [CLEMENTINE] k l [COMIX] k o [DEADBEEF] d e [DEADBEEF] d e [DESIGNER] d i [DIA] d i a [DOLPHIN] d o [DRAGONPLAYER] [DRAGONPLAYER] [EBOARD] e b [EMACS] e m [EXAILE] e k [EXAILE] e k [EXFALSO] e k [FREEMIND] f r [FREEMIND] f r [FREEMIND] f r [FSLINT] e f [GIMP] g i m p [GMUSICBROWSER] [GOGGLESMM] g u [GPA] g e p e a [GPARTED] g e [GPICVIEW] g e [GUCHARMAP] g u [GVIM] g e v i m [GWENVIEW] g w [GXINE] g s [GXINE] g s [JAMIN] j a [JAMIN] j e
n t i k a n t u p t i k a n n t i k a n t u p m p u t e r ng e n a l a n h a r s e l e c t l o p p y m a i l n o d j n n e b r a
o t t s a e r
t a e e n g o
s k k s o l t e r r o r a t o r k
i i i u u d o h o a a e e m d d s
s s s n n a g a m w w m m i b b a
t t t e s s i e i s s e e k e i i
a n e n e n s i l m u m m n n s f f n
t o s m a e t t
i i i l l i n e i n
e r
l p h i n d r a g o n p l a y e r d r a g o n p l e y e r o r d a k s s a i l e s a i l s f a l s o e m i n i m i n e m a i n e s l i n g m u s i k b r o w s e r g e l s e m e m p a r t e d p i k v i u c a r m a p e i i m m
[JUK] j u k [K3B] k a t i g a b e [KALARM] k a l a r a m [KAPPFINDER] k a a p f i n d e r [KAPPFINDER] k a p f i n d e r [KATE] k a t e [KATE] k e t [KAUDIOCREATOR] k a u d i o k r e a [KCALC] k a k a l [KCALC] k a k a l s [KCOLORCHOOSER] k a k o l o r c u s [KDEVELOP] k a d e v e l o p [KDF] k a d e e f [KDF] k a d e f [KFILEREPLACE] k f i l e r e p l a [KFIND] k a f i n [KFIND] k a f a i n [KFONTVIEW] k a f o n v i u [KGET] k a g e t [KGPG] k a g e p e g e [KINFOCENTER]k a i n f o c e n t e r [KINFOCENTER]k a i n f o s e n t e r [KLIPPER] k l i p e r [KMENUEDIT] k a m e n u e d i t [KMIX] k a m i k s [KNOTES] k a n o t e s [KNOTES] k a n o t s [KOMPARE] k o m p a r e [KOMPARE] k o m p a r [KOMPARE] k o m p e r [KONQUEROR] k o n g u e r o r [KONSOLE] k o n s o l e [KONSOLE] k o n s o l [KOPETE] k o p e t e [KOPETE] k o p e t [KORGANIZER] k a o r g a n i s e r [KRDC] k a e r d e s e [KRENAME] k a r e n a m e [KRENAME] k a r i n e m [KRFB] k a e r e f b e [KSNAPSHOT] k a s n a p s h o t [KSYSGUARD] k a s i s g u a r d [KSYSTEMLOG] k a s i s t e m l o g [KTIMER] k t i m e r [KUSER] k u s e r [KUSER] k a u s e r [KWALLETMANAGER] k a w a l l e t m a [KWIKDISK] k w i k d i s [KWRITE] k a w r i t e [KWRITE] k a w r i t [LINGOT] l i ng o t [LMMS] e l e m e m e s [LMMS] e l m e m e s [LOKALIZE] l o k a l i s e [LOKALIZE] l o k a l i s [LXAPPEARANCE] e l e k s e p i r e [LXDELOGOUT] e l e k s d e l o g o u t [LXINPUT] e l e k s i n p u t [LXTASK] e l e k s t a s k [LXTASK] e l e k s t a s [LXTASK] e l e k s t e k s [LXTERMINAL] e l e k s t e r m i n a l [MINITUNES] m i n i t u n e s
[MINITUNES] m i n i t u n s [FIREFOX] f i r e f o k s [THUNDERBIRD]t u n d e r b e r d [THUNDERBIRD]t a n d e r b e r d [THUNDERBIRD]t a n d e r b e d [MPLAYER] e m p l a y e r [MPLAYER] e m p l e y e r [NETBEANS] n e t b i n s [NTED] e n t e d [OKULAR] o k u l a r [OPENOFFICE.ORG3] o p e n o f i s [PAN] p a n [PAN] p e n [PARTITIONMANAGER] p a r t i t i o n m a n a g e r [PCMANFM] p e s e m a n e f e m [PCMANFM] p i s i m a n e f e m [PCMANFM] p i s i m a n e f e m [PGADMIN3] p g a d m i n [PIDGIN] p i d g i n [QSTARDICT] k i s t a r d i c [QSTARDICT] k i s t a r d i k [QTCREATOR] k e t e k r e a t o r [QTCREATOR] k y u t e k r e a t o r [QUODLIBET] k u o d l i b e t [REALPLAYER] r e a l p l a y e r [REALPLAYER] r e a l p l e y e r [REALPLAYER] r i l p l a y e r [REALPLAYER] r i l p l e y e r [SEAMONKEY] s e a m o n k e y [SEAMONKEY] s i m o n k e y [SEAMONKEY] s i m o n k i [SKANLITE] s k a n l i t e [SKANLITE] s k a n l i t [SKANLITE] s k a n l a i t [SMPLAYER] e s e m p l a y e r [SMPLAYER] e s e m p l e y e r [STARDICT] s t a r d i c [STARDICT] s t a r d i k [SUPERKARAMBA] s u p e r k a r a m b a [TABU] t a b u [TEXMAKER] t e k s m a k e r [TRUECRYPT] t r u k r i p t [TRUECRYPT] t r u k r i p t [TUXGUITAR] t u k s g i t a r [TUXGUITAR] t a k s g i t a r [VIRTUALBOX] v i r t u a l b o k s [VLC] v e l s e [VYM] v i m [WICD] w e i c e d e [WINE] w i n e [WINE] w a i n [WIRESHARK] w a y e r s h a r k [WIRESHARK] w a y e r s a r k [WIRESHARK] w a y e r s a k [XARCHIVER] e k s a r c i v e r [XBOARD] e k s b o r d [XCHAT] e k s c a t [XINE] s i n e [XINE] s a i n [XMMS] e k s e m e m e s [XNOISE] e k s n o i s e [XNOISE] e k s n o i s [XPDF] e k s p e d e e f
Universitas Sumatera Utara
156 5 5 5 5 5
[XSANE] [XSANE] [XSANE] [YAKUAKE] [ZENMAP]
e e e y z
k k k a e
s s s k n
a a e u m
n e n n a k e a p
Universitas Sumatera Utara
LAMPIRAN D DAFTAR APLIKASI DAN FUNGSINYA komputer
= Komputer
pengenalan
= Aplikasi pengenalan ucapan yang dibangun pada tugas akhir ini
akregator
= Feed Reader pada desktop KDE
amarok
= Pemutar audio
ark
= Perkakas pengarsipan
atunes
= Pemutar dan manajer musik
audacity
= Editor sudio
blogilo
= Klien blogging desktop KDE
chromium
= Penjelajah web
claws-mail
= Klien mail berbasis GTK+
clementine
= Pemutar musik
codeblocks
= Integrated Development Environment (IDE) pemrograman
comix
= Viewer untuk komik elektronik
deadbeef
= Pemutar audio
designer
= Desainer untuk GUI Qt
dia
= Editor diagram
dragonplayer = Pemutar video dan audio eboard
= Frontend grafis engine catur
eclipse
= Eclipse SDK IDE
emacs
= Teks editor
exaile
= Pemutar musik
exfalso
= Editor untuk tag audio
freemind
= Perkakas Mind Mapping
gimp
= Program manipulasi gambar GNU
gmusicbrowser = Jukebox untuk koleksi mp3/ogg/flac/mpc yang besar gogglesmm
= Pemutar musik
gpa
= GNU Privacy Assistant, editor untuk keyring
gparted
= Editor partisi sistem berkas
gpicview
= Viewer untuk gambar 157
Universitas Sumatera Utara
158 gucharmap
= Map karakter
gwenview
= Viewer untuk gambar
gxine
= Pemutar video
jamin
= Pengantaraan untuk JACK Audio Mastering
juk
= Pemutar musik
k3b
= Program penulis CD
kalarm
= Penjadwal alarm pribadi
kappfinder
= Perkakas pemuthakir menu
kate
= Teks editor canggih
kcalc
= Kalkulator ilmiah
kcharselect
= Pemilih karakter
kcolorchooser = Pemilih warna kdevelop
= Integrated Development Environment (IDE) untuk desktop KDE
= Perkakas logout, shutdown, atau reboot untuk dekstop LXDE
lxtask
= Task manager desktop LXDE
minitunes
= Pemutar musik
mplayer
= Pemutar multimedia
netbeans
= IDE untuk pemrograman Java
nted
= Editor score musik
okular
= Viewer dokumen
openoffice.org3 = Office Suite pan
= News Reader
partitionmanager = Manajer partisi untuk desktop KDE pcmanfm
= Manajer berkas
pidgin
= Internet Messenger
qjackctl
= GUI Qt pengantaraan untuk JACK Audio Connection Kit
qstardict
= Perkakas kamus
qtcreator
= IDE framework Qt
quodlibet
= Pemutar musik
realplayer
= Pemutar multimedia
rednotebook = Jurnal harian dengan kalender, template dan pencarian kata kunci rssowl
= RSS News Reader
Universitas Sumatera Utara
160 seamonkey
= Penjelajah web
skanlite
= Aplikasi scanning gambar
smplayer
= Frontend untuk pemutar multimedia Mplayer
stardict
= Aplikasi kamus
superkaramba = Engine untuk desktop eyecandy sweeper
= Pembersih sistem
tabu
= Pemutar audio dasar dengan GTK+
texmaker
= Editor berkas Latex
thunderbird
= Perkakas surat elektronik
truecrypt
= Perangkat lunak untuk enkripsi disk
tuxguitar
= Aplikasi untuk mengedit, dan memutar kembali tablature gitar
umbrello
= UML Modeller
urbanterror
= Game First Person Shooter (FPS)
virtualbox
= Aplikasi Virtual Machine
vlc
= pemutar media VideoLAN
vym
= Perkakas perencanaan dan brainstorming
wicd
= Manajer jaringan
wireshark
= Analyzer jaringan
wxcam
= Aplikasi webcam
xarchiver
= Manajer arsip dengan GTK+2
xboard
= Frontend grafis engine catur
xine
= Pemutar media
xmms
= Pemutar audio
xmoto
= Game Motorcross
xnoise
= Pemutar media
xpdf
= Viewer PDF
xsane
= Aplikasi untuk mendapatkan gambar dari scanner
yakuake
= Drop-down Terminal
zenmap
= Scanner Port berbasis GUI
Universitas Sumatera Utara
LAMPIRAN E DATA HASIL PENGUJIAN A. Pengujian Pertama Tabel A.1. Pengujian Pertama Pengujar1 (kata yang ada dalam database). Pengujar1 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
matikan firefox
1
1
-
1
-
-
6 matikan virtualbox
matikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan stardict
1
1
-
1
-
-
8 hentikan kalarm
hentikan okular
1
1
-
1
-
-
9 buka vlc
buka kfilereplace
1
1
-
1
-
-
10 buka vlc
buka kfilereplace
1
1
-
1
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup kjots
2
-
1
-
-
-
18 tutup kjots
tutup kjots
2
-
1
-
-
-
19 matikan tabu
matikan tabu
2
-
1
-
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
23
7
13
7
0
0
Total
161
Universitas Sumatera Utara
162 Tabel A.2 Pengujian Pertama Pengujar1 (kata yang tidak ada dalam database). Pengujar1 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
hentikan pengenalan
-
2
-
1
-
-
2 ucapkan perintah
hentikan akregator
-
2
-
1
-
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
-
-
-
-
-
1
-
8 tunda pengaturan
-
-
-
-
-
1
-
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
-
-
-
-
-
1
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
-
2
1
-
-
16 perhitungan
buka kgpg
17 putar media player
-
-
-
-
-
1
-
18 putar media player
-
-
-
-
-
1
-
19 tampilkan daftar
hentikan tuxguitar
-
2
-
1
-
-
20 tampilkan daftar
hentikan tuxguitar
-
2
-
1
-
-
0
10
0
5
15
0
Total
Universitas Sumatera Utara
163 Tabel A.3 Pengujian Pertama Pengujar2 (kata yang ada dalam database). Pengujar2 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
matikan virtualbox
2
-
1
-
-
-
6 matikan virtualbox
matikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
8 hentikan kalarm
matikan kalarm
1
1
-
1
-
-
9 buka vlc
buka vlc
2
-
1
-
-
-
10 buka vlc
buka vlc
2
-
1
-
-
-
11 mulai jamin
mulai jamin
2
-
1
-
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup kjots
2
-
1
-
-
-
18 tutup kjots
tutup kjots
2
-
1
-
-
-
19 matikan tabu
matikan tabu
2
-
1
-
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
39
2
18
2
0
0
Total
Universitas Sumatera Utara
164 Tabel A.4 Pengujian Pertama Pengujar2 (kata yang tidak ada dalam database). Pengujar2 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
-
-
-
-
-
1
-
2 ucapkan perintah
-
-
-
-
-
1
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
-
-
-
-
-
1
-
8 tunda pengaturan
-
-
-
-
-
1
-
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
hentikan gxine
-
2
-
1
-
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
buka klipper
-
2
1
-
-
17 putar media player
-
-
-
-
-
1
-
18 putar media player
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
0
6
0
3
17
0
19 tampilkan daftar
buka texmaker
20 tampilkan daftar
Total
Universitas Sumatera Utara
165 Tabel A.5 Pengujian Pertama Pengujar3 (kata yang ada dalam database). Pengujar3 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
matikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
8 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
9 buka vlc
buka vlc
2
-
1
-
-
-
10 buka vlc
buka vlc
2
-
1
-
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup kjots
2
-
1
-
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
35
5
15
5
0
0
Total
Universitas Sumatera Utara
166 Tabel A.6 Pengujian Pertama Pengujar3 (kata yang tidak ada dalam database). Pengujar3 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
mulai tuxguitar
-
2
-
1
-
-
2 ucapkan perintah
hentikan truecrypt
-
2
-
1
-
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
hentikan truecrypt
-
2
-
1
-
-
6 mainkan program
hentikan truecrypt
-
2
-
1
-
-
7 tunda pengaturan
-
-
-
-
-
1
-
8 tunda pengaturan
-
-
-
-
-
1
-
-
2
-
1
-
-
9 tempel teks
hentikan knotes
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
-
-
-
-
-
1
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
-
-
-
-
-
1
-
17 putar media player
-
-
-
-
-
1
-
18 putar media player
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
0
12
0
6
14
0
19 tampilkan daftar
buka pcmanfm
20 tampilkan daftar
Total
Universitas Sumatera Utara
167
B. Pengujian Kedua
Tabel B.1 Pengujian kedua Pengujar4 (kata yang ada dalam database). Pengujar4 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
hentikan lingot
1
1
-
1
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
matikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
8 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
9 buka vlc
buka vlc
2
-
1
-
-
-
10 buka vlc
buka vlc
2
-
1
-
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup knotes
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
33
7
13
7
0
0
Total
Universitas Sumatera Utara
168 Tabel B.2 Pengujian Kedua Pengujar4 (kata yang tidak ada dalam database). Pengujar4 (kata yang tidak ada dalam database) No. Kata yang diucapkan 1 ucapkan perintah 2 ucapkan perintah
Hasil Pengenalan
H
S TP FP TN FN
-
-
-
-
-
1
-
-
2
-
1
-
-
buka konqueror
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
-
2
-
1
-
-
6 mainkan program
hentikan okular
7 tunda pengaturan
-
8 tunda pengaturan
hentikan urbanterror
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
-
2
-
1
-
-
12 pilih aplikasi
hentikan freemind
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
-
-
-
-
-
1
-
17 putar media player
-
-
-
-
-
1
-
-
2
-
1
-
-
18 putar media player
buka realplayer
19 tampilkan daftar
-
-
-
-
-
1
-
20 tampilkan daftar
-
-
-
-
-
1
-
0
10
0
5
15
0
Total
Universitas Sumatera Utara
169 Tabel B.3 Pengujian kedua Pengujar5 (kata yang ada dalam database). Pengujar5 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
hentikan lingot
1
1
-
1
-
-
5 matikan virtualbox
hentikan kdevelop
0
2
-
1
-
-
6 matikan virtualbox
hentikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
8 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
9 buka vlc
buka kfilereplace
-
2
-
1
-
-
10 buka vlc
buka kfilereplace
-
2
-
1
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai freemind
1
1
-
1
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup knotes
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
0
0
Total
27 13 10 10
Universitas Sumatera Utara
170 Tabel B.4 Pengujian Kedua Pengujar5 (kata yang tidak ada dalam database). Pengujar5 (kata yang tidak ada dalam database) No. Kata yang diucapkan 1 ucapkan perintah
Hasil Pengenalan hentikan qtcreator
H
S TP FP TN FN
-
2
-
1
-
-
2 ucapkan perintah
-
-
-
-
-
1
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
hentikan akregator
-
2
-
1
-
-
8 tunda pengaturan
hentikan urbanterror
-
2
-
1
-
-
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
-
-
-
-
-
1
-
13 kembali ke awal
buka urbanterror
-
2
-
1
-
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
-
-
-
-
-
1
-
17 putar media player
-
-
-
-
-
1
-
18 putar media player
hentikan lxterminal
-
2
-
1
-
-
19 tampilkan daftar
hentikan realplayer
-
2
-
1
-
-
-
-
-
-
1
-
0
12
0
6
14
0
20 tampilkan daftar
Total
Universitas Sumatera Utara
171 Tabel B.5 Pengujian kedua Pengujar6 (kata yang ada dalam database). Pengujar6 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
7 hentikan kalarm
hentikan kalarm
2
-
-
-
-
1
8 hentikan kalarm
hentikan kalarm
2
-
-
-
-
1
9 buka vlc
buka kfilereplace
-
2
-
1
-
-
10 buka vlc
buka kfilereplace
-
2
-
1
-
-
11 mulai jamin
mulai jamin
2
-
1
-
-
-
12 mulai jamin
mulai pgadmin
1
1
-
1
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup knotes
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
9
9
0
2
Total
29 11
Universitas Sumatera Utara
172 Tabel B.6 Pengujian Kedua Pengujar6 (kata yang tidak ada dalam database). Pengujar6 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
-
-
-
-
-
1
-
2 ucapkan perintah
-
-
-
-
-
1
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
-
-
-
-
-
1
-
-
2
-
1
-
-
8 tunda pengaturan
hentikan kfilereplace
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
-
-
-
-
-
1
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
-
1
-
17 putar media player
hentikan dragonplayer
-
2
-
1
-
-
18 putar media player
buka realplayer
-
2
-
1
-
-
15 perhitungan
buka realplayer
16 perhitungan
19 tampilkan daftar
-
-
-
-
-
1
-
20 tampilkan daftar
-
-
-
-
-
1
-
0
8
0
4
16
0
Total
Universitas Sumatera Utara
173
C. Pengujian Ketiga Tabel C.1. Pengujian Ketiga Pengujar1 (kata yang ada dalam database). Pengujar1 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
hentikan lingot
1
1
-
1
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
7 hentikan kalarm
hentikan gucharmap
1
1
-
1
-
-
8 hentikan kalarm
hentikan tabu
1
1
-
1
-
-
9 buka vlc
buka kfilereplace
1
1
-
1
-
-
10 buka vlc
buka kfilereplace
1
1
-
1
-
-
11 mulai jamin
mulai jamin
2
-
1
-
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan gparted
1
1
-
1
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup kjots
2
-
1
-
-
-
18 tutup kjots
tutup kjots
2
-
1
-
-
-
19 matikan tabu
matikan tabu
2
-
1
-
-
-
20 matikan tabu
hentikan tabu
2
-
1
-
-
-
31
9
11
9
0
0
Total
Universitas Sumatera Utara
174 Tabel C.2 Pengujian Ketiga Pengujar1 (kata yang tidak ada dalam database). Pengujar1 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
buka krename
-
2
-
1
-
-
2 ucapkan perintah
buka krename
-
2
-
1
-
-
3 salin berkas
hentikan kcharselect
-
2
-
1
-
-
4 salin berkas
hentikan stardict
-
2
-
1
-
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
-
-
-
-
-
1
-
8 tunda pengaturan
-
-
-
-
-
1
-
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
hentikan audacity
-
2
-
1
-
-
11 pilih aplikasi
hentikan qstardict
-
2
-
1
-
-
12 pilih aplikasi
-
-
-
-
-
1
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
17 putar media player
hentikan realplayer
18 putar media player
-
19 tampilkan daftar
hentikan tuxguitar
-
2
-
1
-
-
20 tampilkan daftar
buka texmaker
-
2
-
1
-
-
0
18
0
8
12
0
Total
Universitas Sumatera Utara
175 Tabel C.3 Pengujian Ketiga Pengujar2 (kata yang ada dalam database). Pengujar2 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
7 hentikan kalarm
hentikan okular
1
1
-
1
-
-
8 hentikan kalarm
hentikan tabu
1
1
-
1
-
-
9 buka vlc
buka kfilereplace
1
1
-
1
-
-
10 buka vlc
buka kfilereplace
1
1
-
1
-
-
11 mulai jamin
mulai jamin
2
-
1
-
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
buka kgpg
0
2
-
1
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup korganizer
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
matikan tabu
2
-
1
-
-
-
20 matikan tabu
hentikan tabu
1
1
-
1
-
-
28 12
9
11
0
0
Total
Universitas Sumatera Utara
176 Tabel C.4 Pengujian Ketiga Pengujar2 (kata yang tidak ada dalam database). Pengujar2 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
-
-
-
-
-
1
-
2 ucapkan perintah
-
-
-
-
-
1
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
hentikan truecrypt
-
2
-
1
-
-
6 mainkan program
hentikan truecrypt
-
2
-
1
-
-
7 tunda pengaturan
-
-
-
-
-
1
-
8 tunda pengaturan
-
-
-
-
-
1
-
9 tempel teks
buka knotes
-
2
-
1
-
-
10 tempel teks
hentikan chmsee
-
2
-
1
-
-
11 pilih aplikasi
hentikan truecrypt
-
2
-
1
-
-
12 pilih aplikasi
hentikan xarchiver
-
2
-
1
-
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
buka klipper
-
2
1
-
-
17 putar media player
hentikan realplayer
-
2
-
1
-
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
0
18
0
9
11
0
18 putar media player
-
19 tampilkan daftar
buka texmaker
20 tampilkan daftar
Total
Universitas Sumatera Utara
177 Tabel C.5 Pengujian Ketiga Pengujar3 (kata yang ada dalam database). Pengujar3 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka thunderbird
1
1
-
1
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
hentikan firefox
0
2
-
1
-
-
6 matikan virtualbox
matikan firefox
1
1
-
1
-
-
7 hentikan kalarm
hentikan tabu
1
1
-
1
-
-
8 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
9 buka vlc
buka krdc
1
1
-
1
-
-
10 buka vlc
buka kfilereplace
1
1
-
1
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
buka kgpg
1
1
-
1
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup kjots
2
-
1
-
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
35
5
15
5
0
0
Total
Universitas Sumatera Utara
178 Tabel C.6 Pengujian Ketiga Pengujar3 (kata yang tidak ada dalam database). Pengujar3 (kata yang tidak ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 ucapkan perintah
-
-
-
-
-
1
-
2 ucapkan perintah
-
-
-
-
-
1
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
hentikan dragonplayer
-
2
-
1
-
-
8 tunda pengaturan
-
-
-
-
-
1
-
-
2
-
1
-
-
9 tempel teks
hentikan knotes
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
-
-
-
-
-
1
-
-
2
-
1
-
-
13 kembali ke awal
buka urbanterror
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
-
2
-
1
-
-
16 perhitungan
buka realplayer
17 putar media player
-
-
-
-
-
1
-
18 putar media player
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
0
10
0
5
15
0
19 tampilkan daftar
hentikan stardict
20 tampilkan daftar
Total
Universitas Sumatera Utara
179
D. Pengujian Keempat Tabel D.1 Pengujian Keempat Pengujar4 (kata yang ada dalam database). Pengujar4 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
hentikan lingot
1
1
-
1
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
matikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
8 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
9 buka vlc
buka vlc
2
-
1
-
-
-
10 buka vlc
buka vlc
2
-
1
-
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai jamin
2
-
1
-
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup knotes
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
33
7
13
7
0
0
Total
Universitas Sumatera Utara
180 Tabel D.2 Pengujian Keempat Pengujar4 (kata yang tidak ada dalam database). Pengujar4 (kata yang tidak ada dalam database) No. Kata yang diucapkan 1 ucapkan perintah
Hasil Pengenalan
H
S TP FP TN FN
-
-
-
-
-
1
-
2 ucapkan perintah
hentikan okular
-
2
-
1
-
-
3 salin berkas
hentikan stardict
-
2
-
1
-
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
-
2
-
1
-
-
-
-
-
-
1
-
-
2
-
1
-
-
6 mainkan program
buka konqueror
7 tunda pengaturan
-
8 tunda pengaturan
hentikan urbanterror
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
matikan gxine
-
2
-
1
-
-
12 pilih aplikasi
hentikan jamin
-
2
-
1
-
-
13 kembali ke awal
-
-
-
-
-
1
-
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
-
-
-
-
-
1
-
17 putar media player
-
-
-
-
-
1
-
18 putar media player
buka realplayer
-
2
-
1
-
-
19 tampilkan daftar
buka realplayer
-
2
-
1
-
-
-
-
-
-
1
-
0
16
0
8
12
0
20 tampilkan daftar
Total
Universitas Sumatera Utara
181 Tabel D.3 Pengujian Keempat Pengujar5 (kata yang ada dalam database). Pengujar5 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
hentikan lingot
1
1
-
1
-
-
5 matikan virtualbox
hentikan kdevelop
0
2
-
1
-
-
6 matikan virtualbox
hentikan virtualbox
2
-
1
-
-
-
7 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
8 hentikan kalarm
hentikan kalarm
2
-
1
-
-
-
9 buka vlc
buka kfilereplace
-
2
-
1
-
-
10 buka vlc
buka kfilereplace
-
2
-
1
-
-
11 mulai jamin
mulai pgadmin
1
1
-
1
-
-
12 mulai jamin
mulai freemind
1
1
-
1
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup knotes
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
0
0
Total
27 13 10 10
Universitas Sumatera Utara
182 Tabel D.4 Pengujian Keempat Pengujar5 (kata yang tidak ada dalam database). Pengujar5 (kata yang tidak ada dalam database) No. Kata yang diucapkan 1 ucapkan perintah
Hasil Pengenalan hentikan qtcreator
H
S TP FP TN FN
-
2
-
1
-
-
2 ucapkan perintah
-
-
-
-
-
1
-
3 salin berkas
-
-
-
-
-
1
-
4 salin berkas
-
-
-
-
-
1
-
5 mainkan program
-
-
-
-
-
1
-
6 mainkan program
-
-
-
-
-
1
-
7 tunda pengaturan
hentikan akregator
-
2
-
1
-
-
8 tunda pengaturan
hentikan urbanterror
-
2
-
1
-
-
9 tempel teks
-
-
-
-
-
1
-
10 tempel teks
-
-
-
-
-
1
-
11 pilih aplikasi
-
-
-
-
-
1
-
12 pilih aplikasi
-
-
-
-
-
1
-
-
2
-
1
-
-
13 kembali ke awal
mulai urbanterror
14 kembali ke awal
-
-
-
-
-
1
-
15 perhitungan
-
-
-
-
-
1
-
16 perhitungan
-
-
-
-
-
1
-
17 putar media player
-
-
-
-
-
1
-
18 putar media player
hentikan realplayer
-
2
-
1
-
-
19 tampilkan daftar
hentikan realplayer
-
2
-
1
-
-
-
-
-
-
1
-
0
12
0
6
14
0
20 tampilkan daftar
Total
Universitas Sumatera Utara
183 Tabel D.5 Pengujian Keempat Pengujar6 (kata yang ada dalam database). Pengujar6 (kata yang ada dalam database) No. Kata yang diucapkan
Hasil Pengenalan
H
S TP FP TN FN
1 buka konqueror
buka konqueror
2
-
1
-
-
-
2 buka konqueror
buka konqueror
2
-
1
-
-
-
3 matikan lingot
hentikan lingot
1
1
-
1
-
-
4 matikan lingot
matikan lingot
2
-
1
-
-
-
5 matikan virtualbox
hentikan virtualbox
1
1
-
1
-
-
6 matikan virtualbox
hentikan firefox
0
2
-
1
-
-
7 hentikan kalarm
matikan kalarm
1
1
-
1
-
-
8 hentikan kalarm
hentikan urbanterror
1
1
-
1
-
-
9 buka vlc
buka kfilereplace
-
2
-
1
-
-
10 buka vlc
buka kfilereplace
-
2
-
1
-
-
11 mulai jamin
mulai jamin
2
-
1
-
-
-
12 mulai jamin
mulai pgadmin
1
1
-
1
-
-
13 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
14 jalankan yakuake
jalankan yakuake
2
-
1
-
-
-
15 mulai dia
mulai dia
2
-
1
-
-
-
16 mulai dia
mulai dia
2
-
1
-
-
-
17 tutup kjots
tutup knotes
1
1
-
1
-
-
18 tutup kjots
tutup knotes
1
1
-
1
-
-
19 matikan tabu
hentikan tabu
1
1
-
1
-
-
20 matikan tabu
matikan tabu
2
-
1
-
-
-
9
11
0
0
Total
26 14
Universitas Sumatera Utara
184 Tabel D.6 Pengujian Keempat Pengujar6 (kata yang tidak ada dalam database). Pengujar6 (kata yang tidak ada dalam database) No. Kata yang diucapkan