PERANCANGAN DAN IMPLEMENTASI INDONESIAN TEXT TO SPEECH ENGINE (SAPI COMPLIANCE) Mufraeli Rahman (13203084)
[email protected]
Program Studi Teknik Elektro Sekolah Teknik Elektro dan Informatika Institut Teknologi Bandung ABSTRAKSI Indo TTS adalah text to speech pertama bahasa Indonesia. Text to speech ini sudah dibuat sedemikian rupa sehingga mudah untuk dikembangkan. Microsoft Speech Application Programming Interface (SAPI) menawarkan cara yang mudah bagi para pengembang speech engine agar speech engine mereka dapat diaksses di semua sistem operasi Windows. Tulisan ini membahas tentang pengembangan Indo TTS menjadi text to speech yang memenuhi spesifikasi SAPI (SAPI compliance). Ada dua interface yang harus diimplementasi oleh engine yaitu ISpObjectWithToken dan ISpTTSEngine. Implementasi dari interface tersebut menggunakan Indo TTS sebagai bagian text to fonem dan MBROLA sebagai bagian fonem to speech. Dari hasil pengujian dapat disimpulkan bahawa IndoTTSEngine sudah memenuhi sebagian besar spesifikasi SAPI, namun ada beberapa hal yang tidak didukung oleh IndoTTSEngine yaitu tag XML Pron, PartOfSp dan Emph. Kata kunci: Text To Speech, Indo TTS Engine, Indo TTS, TTS Engine, SAPI compliance.
1
2) engine dapat membuat format XML sendiri karena SAPI hanya memparsing XML SAPI 5. XML tag milik engine tidak disentuh oleh SAPI, dan diteruskan ke engine, 3) SAPI sudah melakukan validasi parameter sebelum diteruskan ke engine, 4) SAPI 5 memiliki fitur manajemen lexicon, 5) engine yang sudah memenuhi spesifikasi SAPI, secara otomatis dapat diakses oleh semua aplikasi standard Windows.
PENDAHULUAN
Microsoft Speech Application Programming Interface (SAPI) adalah Application Programming Interface (API) yang dikembangkan oleh Microsoft. SAPI dibuat agar menjadi jembatan antara aplikasi dan speech engine (text to speech atau speech recognition). Hal ini memudahkan para pengembang aplikasi untuk menggunakan speech engine. Disisi lain, SAPI juga memudahkan para pengembang speech engine dalam pembuatannya.
Indo TTS adalah text to speech pertama bahasa Indonesia. Text to speech ini sudah dibuat sedemikian rupa sehingga mudah untuk dikembangkan. Dengan membuat Indo TTS memenuhi spesifikasi SAPI, maka Indo TTS akan menjadi speech engine berbahasa Indonesia. Dan dengan demikian Indo TTS akan menjadi salah satu pilihan text to speech pada Windows.
SAPI sudah menjadi standar bagi para pengguna sistem operasi Windows dalam menggunakan speech engine. Microsoft pun telah melengkapi berbagai aplikasinya dengan dukungan speech engine. Salah satu contoh aplikasi Windows yang menggunakan SAPI untuk mengakses speech engine adalah Microsoft Office, Microsoft Agent dan Microsoft Speech Server.
2
Bagi para pengembang text to speech engine, sangat mungkin bagi mereka untuk memproduksi text to speech engine sendiri atau mengadaptasi text to speech engine yang sudah ada sehingga memenuhi spesifikasi SAPI. Dilihat dari sisi pengembang, ada beberapa keuntungan yang bisa diperoleh ketika text to speech engine mereka sudah memenuhi spesifikasi SAPI:
2.1
TINJAUAN PUSTAKA IndoTTS
IndoTTS menggunakan teknologi diphone concatenation, dengan diphone database yang dipakai adalah id1. Seperti dapat dilihat pada gambar konfigurasi IndoTTS dibawah. Masukan berupa teks akan diproses menggunakan konversi teks ke fonem yang menggunakan model intonasi berbahasa Indonesia. Hasil konversi ke fonem ini lalu diproses oleh MBROLA dengan menggunakan
1) SAPI sudah menghandle semua konversi format audio, 1
diphone database (id1) yang akan menghasilkan keluaran berupa suara.
IndoTTS_SaveToWave(LPTSTR StrToSay, LPTSTR OutputFilename) adalah fungsi penyimpanan hasil konversi suara ke dalam file berbentuk .wav. IndoTTS_Stop() melakukan pemberhentian penyuaraan sampai akhir kalimat. IndoTTS_ProsodyON() dan IndoTTS_ProsodyOFF() digunakan untuk menghidupkan dan mematikan model prosodi. IndoTTS_SpeakOFF() melakukan pemberhentian penyuaraan keseluruhan setelah kalimat yang sedang disuarakan dan satu kalimat selanjutnya selesai disuarakan. Sementara IndoTTS_SepakON() melakukan fungsi yang akan membatalkan perintah IndoTTS_SpeakOFF() dan harus dilakukan pada kalimat yang sama dengan kalimat saat IndoTTS_SpeakOFF() dipanggil. IndoTTS_IsPlaying digunakan utnuk melakukan pengecekan apkah IndoTTS sedang melakukan penyuaraan atau tidak. IndoTTS_SetPitchRatio(float pr) digunakan untuk melakukan setting terhadap rasio pitch.
Gambar 2-1. Konfigurasi IndoTTS [1] Spesifikasi dari aplikasi IndoTTS adalah sebagai berikut: [1] 1) masukan berupa kalimat atau paragraf (banyak kalimat), 2) intonasi berbahasa Indonesia yang dinamis, 3) keluaran berupa suara langsung ke soundcard, 4) menggunakan teknologi penyambungan diphone berkualitas tinggi, 5) menggunakan diphopne database berbahasa Indonesia, 6) didukung oleh database yang dapat diupdat yang mengandung 2500 entri untuk mengeja “e” di dalam bahasa Indonesia, 7) memiliki antarmuka untuk aplikasi Borland Delphi, Visual Basic, dan C++.
2.2
Microsoft Speech API
Microsoft Speech API (SAPI) adalah layer aplikasi yang berada diantara aplikasi yang menggunakan speech technology dan speech engine. SAPI membuat standard komunikasi antara aplikasi dan speech engine. Salah satu tujuan dari SAPI adalah untuk mempermudah para pengembang aplikasi dalam membuat aplikasi yang menggunakan speech technology. Tujuan lainnya dilihat dari para pengembang speech engine adalah untuk memcahkan masalah yang berhubungan dengan speech engine seperti manipulasi devais audio, masalah threading, sehingga para pengembang dapat fokus pada pembuatan speech engine saja.
IndoTTS SDK (Software Development Kit) berisi file-file yang perlu disertakan untuk membuat aplikasi plugin IndoTTS. SDK ini tersedia dalam bahasa pemrograman Borland Delphi, Visual Basic, dan C++. File utama pada IndoTTS SDK untuk bahasa C++ adalah ITTS_DLL.dll. Aplikasi lain yang memanggil IndoTTS akan memanggil librari ini. Fungsi-fungsi yang ada di dalamnya bisa dilihat pada ITTS_DLL.h. Berikut ini adalah fungsi-fungsi yang tertera pada ITTS_DLL.h dan dapat dipanggil dari program lain:
Ada dua objek yang perlu diperhatikan oleh para pengembang speech engine, khususnya pengembang text to speech engine, yaitu objek SpVoice dan TTSEngine. Objek ketiga yaitu TokenUI adalah pilihan, boleh diimplementasi boleh tidak.
IndoTTS_Say(LPTSTR StrToSAY); IndoTTS_SayToWave(LPTSTR StrToSay, LPTSTR OutputFilename); IndoTTS_SayToPCM(LPTSTR StrToSay, LPTSTR OutputFilename); IndoTTS_SayToFile(LPTSTR StrToSay, LPTSTR OutputFilename); IndoTTS_Stop(); IndoTTS_ProsodyON(); IndoTTS_ProsodyOFF(); IndoTTS_SpeakON(); IndoTTS_SpeakOFF(); IndoTTS_SetPitchRatio(float pr); IndoTTS_IsPlaying();
Gambar 2-2. Overview arsitektur SAPI 5 [3]
3 3.1
PERANCANGAN Usecase Diagram
Usecase bisa dipandang secara keseluruhan (menyangkut keseluruhan sistem yang terkait) atau
Fungsi IndoTTS_Say(LPTSTR StrToSay) merupakan fungsi penyuaraan dengan string yang akan diucapkan adalah StrToSay, 2
secara fungsional perangkat lunak yang akan dikembangkan. Usecase secara keseluruhan mulai dari aktor (manusia) yang menggunakan suatu aplikasi di Windows. Aplikasi ini memiliki berbagai fungsi tertentu berkaitan dengan text to speech. Misalnya fungsi untuk mengubah teks pada web menjadi suara dan mengirimkannya ke pelanggan sebagai salah satu layanan mobile. Untuk melakukan fungsi ini aplikasi harus memanggil fungsi SAPI. aplikasi harus membuat objek COM ISpVoice, baru kemudian dapat menggunakannya. Dari segi aplikasi, SAPI menyediakan berbagai macam fungsi seperti: penyuaraan, mendapatkan status penyuaraan, flow kontrol (stop, pause, resume), memodifikasi atribut speech (rate, pitch, volume), dan fungsi yang berhubungan dengan output audio.
Gambar 3-2. UseCase Diagram Usecase diatas menggambarkan fungsi-fungsi yang akan dipanggil oleh SAPI ke TTS Engine.
Untuk mengerjakan fungsi-fungsi tersebut SAPI harus memanggil fungsi dari TTS Engine (dalam hal ini yang berperan sebagai TTS Engine adalah IndoTTSEng). Dilihat dari sisi SAPI, TTS Engine menyediakan empat fungsi yaitu SetObjectToken, GetObjectToken, GetOutputFormat dan Speak.
3.2
Class Diagram
Class diagram menunjukkan hubungan statik diantara kelas-kelas yang menyusun sistem.
IndoTTSEng yang berperan sebaga engine, tidak melakukan semua fungsi itu sendirian. IndoTTSEng memanggil fungsi dari Indo TTS yaitu untuk mengkonversi dari teks menjadi fonem. Berikut ini adalah gambaran usecase dipandang secara keseluruhan.
Gambar 3-3. Class diagram IndoTTSEng
Kelas CObjIndoTTS Kelas CObjIndoTTS adalah kelas utama yang diturunkan dari kelas dan interface sebagai berikut: 1) CComObjectRootEx. Kelas ini menyediakan metode untuk menghandle manajemen referensi objek untuk objek yang bertipe aggregated maupun non aggregrated. 2) CComCoClass. Kelas ini menyediakan metode untuk membuat instance dari sebuah kelas dan mendapatkan propertiesnya. 3) IDispatchImpl. Kelas ini adalah implementasi dari IDispatch. 4) ISpObjectWithToken. Spesifikasi dari SAPI, setiap objek yang berhubungan dengan objek token termasuk speech engine harus mengimplementasi interface ini. 5) ISpTTSEngine. Spesifikasi dari SAPI, setiap text to speech engine harus mengimplementasi interface ini. Interface ini menyediakan fungsi
Gambar 3-1. Usecase secara keseluruhan Usecase diagram juga dapat dipandang secara aspek fungsional sistem dilihat dari sisi pemakai sistem (dalam hal ini pemakai adalah SAPI yang menggunakan sistem secara langsung). 3
SentenceFragList berguna pada saat sintesis, terutama untuk peniriman event kalimat. Struktur SentenceFragList didefinisiskan:
speak yang merupakan fungsi utama dalam sintesis suara.
Kelas CTextFragList
struct SentenceFragList { SentenceFragList* pNext; char sentence[1000]; ULONG offset; ULONG length; int WordOffset; int nWord; char SentenceFonem[10000]; };
Kelas CTextFragList adalah kelas yang membungkus linked list dari struktur SPVTEXTFRAG. Kelas ini menyediakan fungsifungsi untuk navigasi (next, prev, goto) untuk berpindah dari satu node ke node yang lain pada linked list. Selain itu kelas ini juga menyediakan fungsi set dan get untuk menetapkan dan mendapatkan variabel internal.
1) pNext. Pointer ke fragment kalimat berikutnya 2) sentence. Buffer untuk menyimpan string kalimat 3) offset. Nilai offset karakter pertama dari kalimat yang berkaitan. 4) length. Panjang kalimat 5) WordOffset. Offset kata pertama. 6) nWord. Jumlah kata dalam kalimat 7) SentenceFonem. Hasil sintesis kalimat menjadi fonem.
SPVTEXTFRAG adalah struktur yang berisi input text yang akan disintesis. Struktur ini didefinisikan: typedef struct SPVTEXTFRAG { struct SPVTEXTFRAG *pNext; SPVSTATE State; LPCWSTR pTextStart; ULONG ulTextLen; ULONG ulTextSrcOffset; } SPVTEXTFRAG; 1) pNext adalah pointer ke text fragment selanjutnya. Nilai NULL berarti akhir dari fragment. 2) State adalah struktur dari SPVSTATE yang berisi XML state dari fragment text yang diberikan.
Kelas CWordFragList Kelas CWordFragList adalah kelas yang membungkus linked list dari struktur WordFragList. Sama seperti kelas CTextFragList, kelas ini menyediakan fungsi-fungsi navigasi, set dan get variabel.
Kelas CTextFragList membungkus struktur yang rumit diatas menjadi fungsi get sebagai berikut: 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15)
Struktur WordFragList digunakan untuk menyimpan informasi dari struktur SPVTESXFRAGLIST per kata. WordFragList digunakan ketika sintesis dan pengiriman event kata ke SAPI. Struktu WordFragList didefinisikan:
WCHAR* GetTextW() char* GetTextA(bool SpeakPunc) ULONG GetTextLen() ULONG GetTextOffset() SPVACTIONS GetAction() SPVACTIONS GetAction(int offset) LANGID GetLangID() long GetEmph() long GetRate() ULONG GetVolume() long GetPitch() ULONG GetSilence() char* GetContext() char* GetRawText() int GetRawTextLength()
struct WordFragList { WordFragList* pNext; char word[100]; ULONG offset; ULONG length; char fonem[500]; SPVACTIONS action; LANGID langID; long emph; long rate; ULONG volume; long pitch; ULONG SilenceMSecs; char context[100]; };
Kelas CSentenceFragList Kelas CSenteceFragList adalah kelas yang membungkus linked list dari struktur SentenceFragList. Sama seperti kelas CTextFragList, kelas ini menyediakan fungsifungsi navigasi, set dan get variabel. Struktur SentenceFragList menyimpan informasi SPVTESXFRAGLIST
1) 2) 3) 4) 5) 6)
digunakan untuk dari struktur per kalimat. 4
pNext. Pointer ke kata selanjutnya. word. Buffer untuk menyimpan string kata. offset. Offset dari karakter pertama. length. Panjang kata. fonem. Hasil sintesis kata menjadi fonem. action. Aksi yang didapat dari SPVTEXTFRAG
HRESULT hr = SpGenericSetObjectToken(pToken, m_cpToken);
7) 8) 9) 10) 11) 12)
langID. Language ID. emph. emphasis rate. Kecepatan penyuaraan volume. Volume penyuaraan pitch. Pitch penyuaraan silenceMSec. Nilai silence dalam milisecond 13) context. Context dari kata yang akan diudapkan.
2) Set diphone database. a. Untuk dapat mengeset diphone database, yang terlebih dahulu dilakukan adalah mendapatkan database path. Database path ini tersimpan di dalam registry. Untuk mendapatkannya bisa menggunakan fungsi IspObjectToken::GetStringValue. Kode untuk melakukan hal ini adalah:
Kelas StringTokenizer Kelas StringTokenizer akan sering digunakan dalam prmrosesan text pada implementasi fungsi speak.
WCHAR* DatabasePath = new WCHAR[100]; memset(DatabasePath, 0, 100); m_cpToken>GetStringValue(L"VoiceData", &DatabasePath);
Kelas StringTokenizer digunakan untuk memisahkan suatu text menjadi token-token tertentu dengan delimiter tertentu. Contoh jika diberikan suatu text:
“3+6-9*8/7”
b.
Dengan delimiter:
int ec = MBR_SetDatabase((LPCTSTR)WideToCha r(DatabasePath)); if (ec<0) { MessageBoxA(NULL, "Error loading id1 database", "Fatal Error", MB_OK); }
“+-*/” Maka text tersebut akan terpisah menjadi tokentoken:
3, +, 6 ,- ,9 ,* ,8 ,/ ,7 Kelas StringTokenizer memisahkan teks menjadi token-token melalui konstruktornya dan mengembalikan token-token dalam bentuk linked list. Untuk mempermudah menggunakan linked list ini maka kelas StringTokenizer juga harus menyediakan fungsi-fungsi untuk mengakses nilainilai yang terdapat pada linked list dan fungsi navigasi untuk berpindah dari suatu node pada linked list ke node lain.
4
4.2
Fungsi GetObjectToken
Fungsi ini kebalikan dari SetObjectToken. STDMETHODIMP CObjIndoTTS::GetObjectToken(ISpObj ectToken * * ppToken)
IMPLEMENTASI DAN PENGUJIAN
4.1
Setelah mendapatkan database path, kemudian mengeset diphone database
Fungsi ini memiliki satu buah parameter yaitu pointer ke pointer ppToken. Parameter ini dijadikan output yang akan menerima hasil dari fungsi.
Fungsi SetObjectToken
Fungsi ini mengeset nilai variabel m_cpToken (pada kelas CObjIndoTTS) menjadi objek yang diberikan pada parameter dan melakukan inisialisasi diphone database untuk engine.
Algoritma fungsi: 1) Mengembalikan instance dari ISpObjectToken yang sudah diset ke parameter fungsi. Untuk
STDMETHODIMP CObjIndoTTS::SetObjectToken(ISpObj ectToken * pToken)
melakukan hal ini bisa dengan memanggil
Fungsi ini memiliki satu buah parameter yaitu pToken yang bertipe pointer ke objek ISpObjectToken.
SAPI
helper function yang sudah disediakan oleh yaitu
SpGenericGetObjectToken.
Berikut adalah kodenya: HRESULT hr = SpGenericGetObjectToken(ppToken, m_cpToken);
Algoritma fungsi: 1) Set object token. Untuk mengeset objek token bisa digunakan helper function yang sudah disediakan oleh SAPI yaitu SpGenericSetObjectToken. Kode untuk melakukan hal ini adalah:
4.3
Fungsi GetOutputFormat
Fungsi ini melakukan query ke engine tentang output format. Engine harus memeriksa output 5
const SPVTEXTFRAG * pTextFragList, ISpTTSEngineSite * pOutputSite )
format yang diminta dan mengembalikan output format yang terdekat yang didukung oleh engine. STDMETHODIMP CObjIndoTTS::GetOutputFormat( const GUID * pTargetFmtId, const WAVEFORMATEX * pTargetWaveFormatEx, GUID * pOutputFormatId, WAVEFORMATEX * * ppCoMemOutputWaveFormatEx )
Fungsi ini memiliki lima buah parameter: 1) dwSpeakFlags [in]. Nilai yang menunjukkan mode pengucapan. Nilai ini hanya memiliki dua kemungkinan yaitu SPF_DEFAULT dan SPF_NLP_SPEAK_PUNC. Jika dwSpeakFlags bernilai SPF_NLP_SPEAK_PUNC maka engine harus mengucapkan kalimat dan tanda bacanya. 2) rguidFormatId [in]. Stream format yang mendeskripsikan output format 3) pWaveFormatEx [in]. Struktur yang mendeskripsikan output format. 4) pTextFragList [in]. Linked list ke SPVTEXTFRAG yang harus disintesis 5) pOutputSite [in]. Pointer ke objek ISpTTSEngineSite dimana event dan audio data harus ditulis.
Fungsi ini memiliki empat buah parameter, yaitu: 1) pTargetFmtId [in]. menunjukkan alamat GUID yang mendeskripsikan output format yang diinginkan. 2) pTargetWaveFormatEx [in]. pointer ke struktur WAVEFORMATEX yang mendeskripsikan output format yang diinginkan. 3) pOutputFormatId [out]. Alamat GUID yang menunjukkan output format yang didukung oleh engine 4) ppCoMemOutputWaveFormatEx [out]. Struktur yang mendeskripsikan format ouput yang didukung oleh engine.
Algoritma Fungsi: Langkah-langkah yang dikerjakan fungsi bisa dibagi menjadi dua bagian besar yaitu proses text dan sintesis. Tahapan proses text mengubah bentuk linked list SPVTEXTFRAG menjadi SenteceFragList kemudian mengubahnya lagi menjadi WordFragList. Termasuk dalam tahap ini adalah mengubah dari text ke fonem (format string yang bisa langsung disintesis oleh mbrola).
Algoritma fungsi: 1) Mengubah format yang didukung oleh engine menjadi
format
yang
diinginkan.
Untuk
melakukan hal ini bisa dengan memanggil
SPVTEXTFRAG adalah hasil dari proses XML parsing yang dilakukan oleh SAPI. Raw text yang dimasukkan oleh user ke aplikasi, dibagi-bagi menjadi tag-tag oleh SAPI, kemudian setiap tag itu diberi atribut-atribut pengucapan seperti volume, pitch, context dan lain-lain. Hasilnya adalah linked list dari struktur SPVTEXTFRAG.
helper function yang disediakan oleh SAPI, SpConvertStreamFormatEnum. Format audio data yang didukung oleh IndoTTSEng adalah format audio data bawaan mbrola. Format audio
bawaan
mbrola
adalah:
frekuensi
SentenceFragList membagi-bagi raw text berdasarkan kalimat-kalimat beserta atributatributnya yang didapat dari SPVTEXTFRAG. SentenceFragList mempunyai atribut tambahan yaitu SentenceFonem. SentenceFonem adalah format (dalam bentuk string) fonem yang bisa langsung disintesis oleh mbrola. SentenceFonem didapat dari Indo TTS, yang berperan sebagai text to fonem. Perubahan Sentence to fonem dilakukan karena Indo TTS memiliki model intonasi bahasa Indonesia untuk untuk setiap kalimat yang diberikan. Contoh: kalimat “ucapkan saya” jika diubah menjadi fonem oleh Indo TTS adalah:
sampling = 16 KHz, jumlah bit per sample = 16, jumlah channel = 1 (mono). Beriku adalah kode untuk melakukan hal ini: HRESULT hr = SpConvertStreamFormatEnum(SPSF_16k Hz16BitMono, pOutputFormatId, ppCoMemOutputWaveFormatEx);
4.4
Fungsi Speak
Fungsi speak melakukan sintesis dari teks menjadi suara.
U 50 0 tS 124 V 65 0 p 97 0 k 87 0
STDMETHODIMP CObjIndoTTS::Speak( DWORD dwSpeakFlags, REFGUID rguidFormatId, const WAVEFORMATEX * pWaveFormatEx, 6
96 50 96 0 96 50 97 97 50 97 98 50 98 98 50 99
V n _ s V j V _
65 0 99 50 99 65 0 100 50 100 5 100 0 100 50 102 65 0 105 50 106 90 0 108 25 104 50 101 75 97 150 0 94 25 91 50 89 75 86 500
b) Silence c) Spell d) Pronounce e) Rate f) Volume g) Pitch h) Emphasis i) Context j) Part of speech 6) Perubahan state real time a) Perubahan rate real time b) Perubahan volume real time c) Skip 7) Audio control a) Stop b) Pause c) Resume
WordFragList membagi-bagi raw text berdasarkan kata beserta atributnya. Atribut kata didapatkan dari TextFragList dan SentenceFragList. WordFragList juga mempunyai fonem yang didapatkan dari sentence fonem. Bentuk WordFragList adalah bentuk akhir yang siap disintesis. Tahapan sintesis melakukan tiga hal yaitu membuat raw data audio, menulis event ke SAPI dan menulis audio data ke SAPI.
Skenario pengujian 1) Gunakan perangkat lunak TTSAppVb.exe
Membuat raw audio data dilakukan dengan fungsi mbrola yaitu mbrplay. LONG MBR_Play( LPCTSTR lpszText, DWORD dwFlags, LPCTSTR lpszOutFile, DWORD dwCallback ); 1) lpszText. Berisi string phoneme yang siap disintesis, atau nama file yang berisi file pho. Pengartiannya tergantung dari flag yang diberikan 2) dwFlags. Setting untuk mensintesis 3) lpszOutFile. Nama file keluaran. Format file bisa dalam bentuk raw, wave, au atau aiff. 4) dwCallback. Window hanle yang akan menerima pesan notifikasi.
2) Masukkan input kedalam text area pada perangkat lunak TTSAppVB.exe 3) Klik tombol speak 4) Periksa hasil pada file IndoTTSEngDebug.ini atau dengarkan
Sebelum memanggil fungsi mbrplay, terlebih dahulu engine harus mengeset atribut-atribut penyuaraan, yaitu volume, rate dan pitch. Urutan tahapan-tahapan pada fungsi speak dapat dirangkum sebagai berikut:
Hasil pengujian
1) process text a. membuat objek CTextFragList dari parameter fungsi pTextFragList b. membuat SentenceFragList c. membuat WordFragList 2) synthesis a. mengeset atribut-atribut pengucapan b. membuat raw audio data c. mengirim event ke SAPI d. menulis audio data ke SAPI
4.5
Pengujian
item
sub item
hasil
TTS XML markup
bookmark
SUKSES
silence
SUKSES
spell
SUKSES
pronounce
GAGAL
rate
SUKSES
volume
SUKSES
pitch
SUKSES
Hal-hal yang diuji adalah sebagai berikut:
emphasis
GAGAL
1) TTS XML markup a) Bookmark
context
SUKSES
7
perubahan state real time Audio control
5
part of speech
GAGAL
rate
SUKSES
volume
SUKSES
skip
SUKSES
stop
SUKSES
pause
SUKSES
resume
SUKSES
KESIMPULAN
Berbagai kesimpulan yang bisa diambil dari tugas akhir ini adalah. 1) IndoTTSEng sudah dapat dikatakan memenuhi spesifikasi SAPI, namun tidak semua fitur tersedia dalam IndoTTSEng. 2) Tag-tag XML yang tidak didukung oleh IndoTTSEng yaitu: a. Pron b. Emph c. PartOfSp
6
DAFTAR PUSTAKA [1]. Arman, A. A. (n.d.). Indonesian Text To Speech. Retrieved April 3, 2008, from IndoTTS: http://indotts.melsa.net.id/ [2]. Arman, A. A. (2003, June 12). Perkembangan Teknologi TTS Dari Masa ke Masa. Bandung, Jawa barat, Indonesia. [3]. Microsoft Corporation. (2000). Microsoft Speech Software Development Kit. [4]. Microsoft Corporation. (2005). MSDN Library for Vsual Studio 2005. [5]. Wikipedia. (2008, March 14). Speech Application Programming Interface. Retrieved April 4, 2008, from Wikipedia the free encyclopedia: http://en.wikipedia.org/microsoft_sapi [6]. Wikipedia. (2008, March 26). Speech Synthesis. Retrieved Aplril 3, 2008, from Wikipedia the free encyclopedia: http://en.wikipedia.org/text_to_speech
8