WELCOME

Senin, 29 November 2010

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.


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) :
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 . What city ?
U : Umm... Big Apple, please.
S : For what date ?
U : Uh, tommorow.
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 . 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 :



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 :

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,
because it:
• 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 are not motivated to use the speech
interface.
Users will not have access to a computer
keyboard when they want to use the application. The nature of the application requires a lot of graphics or other visuals (for example, maps).
Users want to use the application in a “hands-free” or “eyes-free” environment. Users will be operating the application in an
extremely noisy environment (due to simultaneous conversations, background
noise, etc.)
Users are visually impaired or have limited use
of their hands. Users are hearing impaired or have difficulty
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.

Tidak ada komentar:

Posting Komentar