Você está na página 1de 8

Mari berkenalam dengan voice web !

(Cokorda Raka Angga Jananuraga,


don_raka@yahoo.com)

Oke, singkat saja, kita akan membuat aplikasi yang memungkinkan user berinteraksi
dengan backend (enterprise, ceileee...) data (via web) dengan menggunakan voice,
ucapannya. We’ll make use of the latest advancement in speech recognition technology
(pheeww... finally speech recognition enters the main stream).

Pada saat ini, saya sama sekali bukanlah seorang pakar dalam teori speech recognition.
Saya hanya mengetahui beberapa hal-hal yang bersifat umum, common sense. Well,
untuk sementara kondisi ini okay saja bagi saya (dengan level pemahaman yang saat ini
saya miliki, dengan NuanceSpeechObject dan VoiceXML, bisa dikatakan, lumayanlah,
saya bisa membuat beberapa aplikasi voice web komersial, bersama-sama dengan tim
kerja saya). Saya harap, anda yang baru akan mulai belajar voice web ini juga berpikiran
seperti itu, jangan terlalu banyak khawatir. Anggap saja ini tidak ada bedanya dengan kita
membuat halaman web biasa dan applet (well, it is !,... almost). Kalau anda benar-benar
tertarik dengan low-level working continuous speech recognition, natural language
processing, dsb, sebaiknya anda mulai belajar kalkulus, DSP, hal-hal seperti itulah.

Oke, jadi pendekatan kita, or should I say ‘my approach’, dalam artikel ini adalah :
menunjukkan betapa mudahnya membangun voice enabled (web) appz dengan
NuanceSpeechObject (versi voiceXML akan kita bahas di artikel-artikel berikutnya),
dengan cara menunjukkan betapa sederhana kodenya (ok, kita bermain API saja dulu
disini. Hal-hal pelik semacam design, a very well design of auditory user interface,
design patterns, dsb berada di luar jangkauan artikel ini). I’ll show you how easy it is,
than you download the API, then you’ll start learning and tinkering by yourself, together
with us in our community (just as I did, I joined the team, they send me a couple of CDs,
I read the manuals, than get to work). That’s my devious plot !

Prasyarat untuk dapat memahami isi artikel ini adalah : you have to be able to read,
speak, think, and code in Java(tm) ! That’s all,... almost.

Oke, pertama, mari kita lihat bagannya. The components of typical voice web.

ponsel
www cloud

telephony board speech serv er HTTP serv er, some CGIs reside here

Database
telpon biasa
Workstation
Hmm, looks familiar to you ? :) (clue: WAP). Dimana kita bermain ? Saya sudah tandai
tempat bermain kita pada gambar diatas. Kita akan mendeploy object-object (speech
objects) aplikasi kita di seech server diatas. The telephony board accepts incoming
telephone calls (multiple of them. Dia punya beberapa port). Selain itu biasanya
telephony board dilengkapi dengan kemampuan preprocessing sinyal suara yang masuk,
seperti noise reduction, echo cancellation, dsb. Contoh telephony board adalah Dialogic,
keluaran Intel.

Pada speech server dijalankan proses-proses speech recognition. Proses-proses ini akan
melakukan beberapa tahap pengolahan sinyal digital (silahkan perhatikan diagram
dibawah, bagi yang benar-benar curious), sampai akhirnya aplikasi kita menerima
beberapa variabel (yang telah kita tentukan) terisi dengan nilai-nilai (string).

(dicopy dari Nuance Application Developer’s Guide)

Jadi, kerjaan kita bisa dibilang mudah sekali (yeah,... almost), kita menerima string-string
tersebut, lalu mengolahnya / menggunakannya. We’re at the rightmost end in the diagram
above.

Salah satu pekerjaan besar kita dalam merancang aplikasi voice web adalah mendesain
dialog, percakapan antara user dengan our humanoid operator :). Seperti berikut ini :

U (User) : <mengangkat telepon, dan mendial : 1-800-whatthehell>


S (Shanice, our humanoid operator) : Hi, welcome to What The Hell dot com. We’re
eyeballs dot com, no wait, should I say earballs dot com (?). Umm..., what the hell. Ok, I
can tell you weather info at many cities in this United States of America <star spangled
banner played in the background>. What city ?
U : Umm... Big Apple, please.
S : For what date <silence taken as today> ?
U : Uh, tommorow.
S : <performing query, perhaps to database, or to some CGI’s>. Ok, here’s weather info
for New York City at 2 July. Very cloudy, a very big dark cloud, almost as big as
Manhatttan. Has been over this city for about 1 week. The biggest cloud is now hanging
over the Empire State Bulding <ID4 ?>. Want to know info at the other city ?
U : No, thanks.
S : Ok, bye, thank you for using what the hell dot com. I hope you visit us often so that
we can gain a huge quarterly profit, so our stock will increase flying to the top like a
bubble in the stock market, so we --- the founder, ha ha ha, and NOT our employees ---
can get rich quick. I’m happy, the VCs happy, and you... what the hell.

Sebuah dialog dalam voice web bisa jadi sederhana seperti diatas, bisa juga kompleks,
misalnya pada aplikasi online shopping user menelusuri katalog daftar belanja,
menyebutkan julah yang ingin dibeli, lalu konfirmasi kartu kredit, dan seterusnya. Tapi
perlu diingat, kita harus berhati-hati dalam mendesain dialog. Beberapa faktor yang harus
dipertimbagkan misalnya adalah : keterbatasan daya ingat manusia. Jadi jangan sampai
kita terjebak menerjemahkan mentah-mentah versi website (visual) ke versi auditory.
Versi visual boleh jadi kompleks, misalnya menampilkan hirarki menu yang rumit dan
panjang. Kita harus melakukan beberapa penyesuaian. Ada beberapa textbook yang
khusus membahas UI, bagi yang benar-benar tertarik dengan ini, seperti Bruce Balentine
and David P. Morgan, How to Build a Speech Recognition Application — A Style Guide for
Telephony Dialogues. Enterprise Integration Group, San Ramon, CA, 1999.

Uh, I’ve been rambling around. Now let’s get to the real thing, coding, that is. Kita akan
coba mengimplementasikan dialog diatas. Sebenarnya, dialog diatas dibangun dari 3
dialog yang lebih kecil, yaitu : dialog yang menanyakan nama kota, dialog yang
menanyakan tanggal, dan dialog yang menanyakan apakah user ingin melakukan
pencarian lagi. Kita ‘membungkus’ ketiga dialog itu di dalam sebuah dialog manager.
Pada dialog manager, kita mendefinisikan state-state yang ada (ya, 3 dialog itu), serta
kondisi-kondisi yang menjadi prasyarat bagi transisi dari satu state ke state lainnya.
Diagramnya kira-kira sebagai berikut :

start DONTCARE Tany a nama kota

DONTCARE

Tany a tanggal

DONTCARE y es

Bla bla bla...

DONTCARE

Tany a : mo lagi nggak ?

no

exit

Uh, bosen ya ? Kita lihat dulu kode yok.


WeatherInfo.java

Sekarang saatnya kita bahas seuplik kode diatas.


Class “utama” kita adalah what.the.hell.WeatherInfo. Yang saya maksud dengan class
“utama” adalah class yang akan kita luncurkan dengan program khusus (aplikasi Java
juga) yang bernama Launcher...(uh, kaya’ roket aja).

Seperti saya katakan sebelumnya, dalam class utama ini kita instantiasi beberapa speech
objects (yang kalau digabung semuanya akan membangun dialog komplet dari aplikas
kita). Dua dari beberapa speech object pada aplikasi kita diatas adalah instance dari class
speech object siap pakai, off-the-shelf, yaitu instance dari nuance.so.SODate &
nuance.so.SOYesNo. Masing-masing kita gunakan untuk menanyakan tanggal dan
‘mendengarkan’ masukan tanggal dan masukan ‘ya / tidak’ dari user, respectively.
Sedangkan what.the.hell.SOCity adalah speech object custom buatan kita sendiri, untuk
menanyakan nama kota dari user.

Oh ya, sebuah speech object (semacam SODate, SOYesNo, dan SOCity) umumnya
ditemani oleh dua, umm..., teman tentunya; grammar dan prompts.

Grammar mendefinisikan kata / kalimat apa saja yang bisa dimengerti oleh speech object
yang bersangkutan. Kita bisa mendefinisikan grammar pada sebuah file text, atau di
RDBMS (khususnya jika grammarnya berukuran besar --- banyak kombinasi kata dan
kalimat --- dan dinamik --- kata-kata dan kalimat dalam grammar itu bisa bertambah,
berkurang, atau dimodifikasi sewaktu-waktu). Kita pun bisa mengenerate grammar secara
on-the-fly.

Format grammar yang digunakan pada platform kita (Nuance) adalag GSL (Grammar
Specification Language). Ada satu lagi format yang juga dipakai secara luas, yaitu JSGF
(Java Speech Grammar Format). Tapi di artikel ini kita bahas sedikit soal GSL saja.

Saya tidak dapat memprint-out grammar dari SODate dan SOYesNo disini, panjang. Tapi
jangan khawatoir, berikut ini adalah contoh grammar untuk SOCity.

city.grammar

Format GSL, seperti halnya JSGF, cukup fleksibel. Kita dapt mendeifinisikan beberapa
subgrammar (kadangkala kita menyebutnya sebagai rule) yang reusable.

Pada contoh diatas, kita membuat 4 subgrammar; CITY_PREFILLER,


CITY_POSTFILLER, CITY_CORE, dan CITY. Sebuah grammar memiliki satu RULE
utama, sebagai entry point. Pada contoh WeatherInfo kita ini, kita set rule CITY sebagai
rule utama dalam grammar milik SOCity.

Berikut ini adalah beberapa kalimat yang dapat dimengerti SOCity :

 uh new york
 um new york please
 new york city
 chicago please

Perlu diketahui bahwa dari keseluruhan hasil recognition, yang umumnya kita akses
adalah nilai-nilai slot. Contohnya, jika user mengucapkan “new york city please”, maka
slot citySlot akan terisi dengan nilai nyc.

Masih banyak detail-detail yang menarik dari grammar development (ya, selain
merancang dialog, tugas kita sebagai speech application developer adalah merancang
grammar. Hanya dua macam grammar yang bisa kita buat: yang baik atau yang jelek).
Kita perlu artikel tersendiri (mungkin some of them) untuk mengupas tuntas soal
grammar.

For now, I just need you to understand the idea: you define what sentences / words that
can be understood by a speech object, in a grammar. Dan dari sekian banyak parameter-
parameter keluaran proses speech recognition, yang biasanya kita akses adalah slot
values.

Sekarang tentang prompt. Kalau grammar berkenaan dengan input, prompt berkenaan
dengan output, prompts (yang biasanya berupa kalimat tanya) akan diperdengarkan
kepada user. Kita punya dua pilihan besar untuk prompt : recorded prompts atau TTS
(text-to-speech) prompts. Kendati kualitas text-to-speech makin baik dari hari ke hari,
recorded prompts lebih dianjurkan. Kita bisa memberikan personality khusus bagi
operator “humanoid” kita; apakah ramah, ceria, formal, dsb. Itu sulit dialkukan dengan
TTS. Penggunaan TTS umumnya terbatas untuk menyampaikan informasi-informasi
yang sifatnya unbounded, seperti email.

Terakhir, dimanakah --- pada definisi sebuah class speech object --- kita mengakses
outcome dari proses speech recognition ? Ada 3 “tempat” dimana kita bisa melakukan hal
tersebut. Tapi sebelumnya, saya perlu memberitahu terdapat semacam hirarki pada
outcome speech recognition tersebut. Pada bagian terluar (atau mungkin teratas, kalau
kita membayangkannya sebagai sebuah tree) adalah vcommerce.core.util.RecResult.
RecResult mengandung 1 atau lebih vcommerce.core.util.SingleResult. Dan akhirnya,
SingleResult mengandung 1 atau lebih vcommerce.core.util.Interpretation. Pada
Interpretation itulah terkandung slot-slot (beserta nilai-nilainya) dari hasil pengenalan.

Ada kasus-kasus dimana speech recognizer mengenali ucapan user itu sebagai lebih dari
1 kalimat. Maksudnya begini: Seandainya saja user mengucapkan “I want to go to new
york”. Speech recognizer mengenalinya sebagai “I want to go to new york”. Tapi, selain
itu, speech recognizer juga mengenalinya sebagai “I want to go to new jerk” (anggap saja
memang ada kota di US bernama New Jerk, dan itu telah kita sertakan dalam grammar).
Dimana masing-masing pengenalan diatas memiliki tingkat keyakinan yang berbeda.
Masing-masing kalimat itu terenkapsulasi sebagai sebuah object SingleResult.
SingleResult-SingleResult yang terdapat pada RecResult telah diurut dari tingkat
keyakinan yang tertinggi sampai ke yang terendah.
Kalau kita berkepentingan menghandle kasus semacam diatas, maka sudah seharusnya
kita mengoveride method processRecResult(SpeechChannel sc, DialogContext dc,
CallState callState, RecResult recResult) milik speech object yang bersangkutan.
Skenario yang mungkin dalam menangani kasus semacam itu adalah sebagai berikut :

S : Did you mean New York or New Jerk ? If New York press 1, if New Jersey press 2.
U : <press 1>

Nah, ada kasus lain yang kita kenal sebagai ambiguitas, dimana sebuah kalimat
mengandung berbagai interpretasi. Perhatikan grammar berikut :

cityambigu.grammar

Seandainya user berkata “I want to go to San Jose California”, maka jelas hanya ada satu
interpreatsi untuk kalimat tersebut. Tapi, karena kata “california” pada grammar diberi
notasi “?” (optional), maka system dapat juga menangkap kalimat “I want to go to San
Jose, please”. Ada ambiguitas disini; apakah yang dimaksud itu San Jose CA, San Jose
Costarica, atau yang di Philipine ? Masing-masing interprtasi itu terkemas dalam sebuah
object Interpretation. Jika kita berniat menangani kasus semacam itu, maka kita
mengoveride method processSingleResult(SpeechChannel sc, DialogContext dc,
CallState callState, SingleResult singleResult). Skenario yang mungkin kita rekayasa
adalah sebagai berikut :

S : Did you mean San Jose in California, Costarica, or Philipine ?


U : California.

Dan ynag terakhir, yang umumnya kita overide --- seandainya kasus-kasus seperti diatas
tidak mungkin kita jumpai pada aplikasi kita, atau kalaupun ada kita tidak berniat
menghandlenya --- adalah method processInterpretation(SpeechChannel sc,
DialogContext  dc, CallState callState, Interpreation interpretation).

Sebagai ilustrasi, katakanlah user mengucapkan “I want to go to New York”. Dan seperti
dibahas diatas, selain mengenalinya sebagai “I want to go to New York”, speech
recognizer juga mengenali ucapan user tadi sebagai “I want to go to New Jerk”. Sekarang
andaikan lagi tingkat keyakinan speech recognizer atas kalimat “I want to go to New
York” lebih tinggi ketimbang “rival”nya. Sekarang, andaikan lagi, selain di US, kota
New York juga terdapat di Uzbekistan. Tapi tingkat probability bahwa yang dimaksud
user adalah New York US lebih tinggi ketimbang New York Uzbekistan. Maka, pada
processInterpretation(SpeechChannel sc, DialogContext dc, CallState callState,
Interpreation  interpretation), yang kita proses interpretasi New York US tersebut
(Sebenarnya method processInterpretation akan diinvoke berulang kali, masing-masing
untuk masing-masing interpretasi yang terdapat dalam “recognition result
” tree” --- kita punya tree dengan kedalaman 2 disini. Tapi, kalau processInterpretation
itu me-return sesuatu --- non null --- maka proses preorder traversal akan exit).
Pfuf, semoga agak lebih jelas sekarang. Baiklah, saatnya berkemas. Bagi anda yang
tertarik dengan speech web development ini, dan sooo eager untuk segera mengopreknya,
anda bisa mulai dengan mengunjungi www.nuance.com. (Anda dapat mendownload
paket speech recognizernya yang ukurannya mencapai 400-500 Mbytes. Happy
downloading :) Just for development purposes, okay).

Mungkin ada satu pertanyaan yang belum terjawab, ... ‘ngapain juga membuat speech
interface, kita sudah punya web presence, wap presence ?’. My personal answer is : ‘you
are a web developer, an internet programmer, and possibly a geek. Aren’t you interested
in building speech interface, at least just for the heck of it ?’. Ha ha, well, ini ada tabel
saya dapatkan dari programmer guide dari IBM. Mungkin bisa jadi bahan pertimbangan
bagi anda :

Consider using speech if: Applications may not be suited to speech if:
Users are motivated to use the speech interface, Users are not motivated to use the speech
because it: interface.
• Saves them time or money.
• Is available 24 hours a day.
• Provides access to features not available
through other means.
• Allows them to remain anonymous and avoid
discussing sensitive subjects with a human.
Users will not have access to a computer The nature of the application requires a lot of
keyboard when they want to use the graphics or other visuals (for example, maps).
application.
Users want to use the application in a “hands- Users will be operating the application in an
free” or “eyes-free” environment. extremely noisy environment (due to
simultaneous conversations, background
noise, etc.)
Users are visually impaired or have limited use Users are hearing impaired or have difficulty
of their hands. speaking.

Point ke-3 pada tabel diatas saya pikir sangat relevan dengan kondisi negara Indonesia
sekarang, rate akses ke komputer (terutama yang dilengkapi akses Internet) masih relatif
rendah. Sayang sekali kalau hal tersebut menghalangi mereka dari mengakses informasi /
layanan secara online, yang sebenarnya bisa diakses lewat telepon. Selain itu, masih
banyak sekali orang yang merasa lebih nyaman menggunakan telepon (telepnon biasa /
ponsel, tentu saja voice mode) as a primary means of telecomunication. Well...

Oke, sampai disini dulu. Pada artikel selanjutnya kita akan mundur selangkah dan belajar
cara menginstall Nuance sehingga anda bisa memulai development voice web di
komputer anda. In this article I just want to notify you of the existence of this voice web
(and It’s --- speech recognition --- gonna be bigger by 2003, at least according to Fortune
magazine and Gartner Group, along with the VoIP). Tapi saya ingin sedikit meralat
ucapan saya tentang “mudah” tadi. Uh..., nggak 100% benar. I lied,..., um,... just a bit.
Tapi jangan khawatir, kita akan mempelajari yang lebih detail dan advance di artikel-
artikel berikutnya.
--raka : A dreamer (of being rich, so damn rich... ha ha). He codes, and writes in his
leisure time. Practicing telecommuting.

Você também pode gostar