Monday, August 22, 2005

Number To Text : Speech API (SAPI) in Flash?

Script ini saya tulis setelah seorang teman bertanya kepada saya tentang bagaimana cara membuat agar sebuah input berupa angka dapat dirubah menjadi teks. Dan kemungkinan membuat sebuah Speech API (SAPI) dalam Flash. Konsep idenya adalah dengan memanfaatkan Array class dan String class. Jadi outputnya berupa array. Jadi jika kemudian hendak dimunculkan dalam teks tinggal menampilkan output dari array tadi. Khusus untuk sound karena diperlukan time interval untuk selesainya pengucapkan satu kata maka disini saya gunakan SetInterval(). Namun bisa juga sebenarnya menggunakan Sound class misalnya Sound.OnSoundComplete untuk menentukan bahwa 1 kata telah diucapkan.
var satuan = [ "nol", "satu", "dua", "tiga", "empat", "lima","enam","tujuh","delapan","sembilan" ]; var belasan = [ "sepuluh", "sebelas", "duabelas", "tigabelas", "empatbelas", "limabelas", "enambelas", "tujuhbelas", "delapanbelas", "sembilanbelas" ]; var kelompok = [ "nol", "se", "puluh", "ratus", "ribu" ]; var startN = 0; var voiceList = new Array(); check_angka = function(n){ // set menjadi string var input = n.toString(); // check harus format angka if(isNaN(input)) { trace(input + " bukan angka"); return; } var voiceArray = new Array(); var angka = input.substr(0,1); // triliunan if(input.length > 12){ var triliun = input.substr(0,input.length-12); triliun = check_angka_ribuan(triliun); voiceArray = voiceArray.concat(triliun); if(triliun.length > 0){ voiceArray.push("triliun"); } var miliar = input.substr(input.length-12,input.length); miliar = check_angka(miliar); voiceArray = voiceArray.concat(miliar); // milliaran } else if(input.length > 9){ var miliar = input.substr(0,input.length-9); miliar = check_angka_ribuan(miliar); voiceArray = voiceArray.concat(miliar); if(miliar.length > 0){ voiceArray.push("miliar"); } var jutaan = input.substr(input.length-9,input.length); jutaan = check_angka(jutaan); voiceArray = voiceArray.concat(jutaan); // jutaan } else if(input.length > 6){ var jutaan = input.substr(0,input.length-6); jutaan = check_angka_ribuan(jutaan); voiceArray = voiceArray.concat(jutaan); if(jutaan.length > 0){ voiceArray.push("juta"); } var ribuan = input.substr(input.length-6,input.length); ribuan = check_angka(ribuan); voiceArray = voiceArray.concat(ribuan); // ribuan } else if(input.length > 3){ if(input.length == 4){ var ribuan = check_angka_ribuan(input); voiceArray = voiceArray.concat(ribuan); } else { var ribuan = input.substr(0,input.length-3); ribuan = check_angka_ribuan(ribuan); voiceArray = voiceArray.concat(ribuan); if(ribuan.length > 0){ voiceArray.push("ribu"); } var ratusan = input.substr(input.length-3,input.length); ratusan = check_angka_ribuan(ratusan); voiceArray = voiceArray.concat(ratusan); } } else { var ribuan = check_angka_ribuan(input); voiceArray = voiceArray.concat(ribuan); } return voiceArray; } check_angka_ribuan = function(n){ // created array sususan voice var voiceArray = new Array(); //lakukan looping var angkaCount = ""; // ---> string var nextLength = n.length; for(var a=0 ; a 2 and angka != 0){ if(angka != 1 or (nextLength-a) == 1){ voiceArray.push(satuan[angka]); angkaCount = n.substr(a,n.length); } else { voiceArray.push("se"); voiceArray.push(kelompok[nextLength-a]); } // belasan } else if((nextLength-a) > 1){ if(angka > 1){ voiceArray.push(satuan[angka]); angkaCount = n.substr(a,n.length); } else if(angka == 1){ var angka = n.substr(a+1,1); voiceArray.push(belasan[angka]); break; } else { if(angka != 0) { var angka = n.substr(a+1,1); voiceArray.push(satuan[angka]); } } } else { if(angka != 0){ voiceArray.push(satuan[angka]); } break; } // set satuan if(angkaCount.length > 1){ if(angka != 1){ voiceArray.push(kelompok[angkaCount.length]); } else { voiceArray.push(belasan[n.substr(a,1)]); break; } } } return voiceArray; } loadNplaySound = function(){ clearInterval(myDelay); suara = new Sound(); //suara.loadSound(voiceList[startN]+".mp3", true); suara.start(); trace("playSound "+voiceList[startN]); startN++; if(startN < voiceList.length){ // loop with interval myDelay = setInterval(loadNplaySound,700); } else { startN = 0; trace("--------------stop-------------"); } } // contoh voiceList = check_angka(100100000100314); //trace(voiceList); trace("--------------start-------------"); loadNplaySound();
Untuk dapat mengerti script di atas anda harus paham Array dan String dalam flash. Karena sifatnya berupa test labs aja jadi masih ada batasan-2 dari coding saya ini. Sementara masih terbatas sampai ratusan triliun. Codingnya juga masih kotor jadi masih bisa dibuat lebih simple dan manis. Jadi jika ada yang mau komen silahkan.

10 comments:

I Nengah Januartha said...

Coding sebelumnya ada 2 bug. Yang pertama dimana saat input angka berisi 1000. Misal: 1001000. Seharusnya: "satu juta seribu" tapi yang muncul "satu juta satu ribu".
Untuk mengatasinya pada kira-kira baris ke-74:

ribuan = check_angka_ribuan(ribuan);
voiceArray = voiceArray.concat(ribuan);


Diganti menjadi:

if(Number(ribuan) == 1) {
voiceArray.push("se");
} else {
ribuan = check_angka_ribuan(ribuan);
voiceArray = voiceArray.concat(ribuan);
}


Kemudian yang kedua adalah pada angka ratusan yang tidak ada puluhannya misal: 201 seharusanya "dua ratus satu" tapi yg muncul "dua ratus ratus satu".
Masalah ini ada pada kira-kira baris ke-138

voiceArray.push(kelompok[angkaCount.length]);

Diganti dengan:

if(angka != 0){
voiceArray.push(kelompok[angkaCount.length]);
}

Anonymous said...

hai januMedia, lo keren juga, thanx buat scriptnya, oke.
gw lagi mulai belajar flash, tapi gw mang dah tertarik ama desain dari dulu.

Anonymous said...

ma Janu hebat oi... gmn biar bisa ky masjanu ya...!
mas janu... aku pury dari bandung mas aku ada kesulitan di flash..!
gini..
aku bikin guestbook trs
aku pengen nampilin data dari database ke flash movie scriptnya pk PHP database nya pk mysql dan ternyata berhasil... cuma knp halman yang aku buat di script php ga mau muncul di flash move alias data nya aja yang msk tanpa halaman... hehe jd garing masa guest book ga ada halaman nya msgdnya PAGE gt lho... hehe mas janu minta tolong dong gimana biar PAGE nya jg msk di movie flash..
Terimakasih Sebelumnya...
E-mail: pangeran_koddok@yahoo.com

Anonymous said...

wah! keren! mas belajar dimana? saya Arief, masih kelas 2 smp, tertarik banget dengan macromedia flash MX mas, mas bisa kirim source yang keren ke email saya? di giri_mymail@yahoo.com, saya tunggu ya mas!
NB:oh ya mas, bisa ajarin bikin flashgame?
salam

Anonymous said...

mas djanoux, kenapa cript diatas ada scrip looping dengan for tapi kenapa kondisi untuk looping tidak lengkap. kalau tidak salah baca script nya hanya for(var a=0 ; a
dan tidak ada lanjutannya.

I Nengah Januartha said...

Oh iya. harusnya:

for( var a=0 ; a < n.length ; a++ )

Anonymous said...

keren banget dah mas!
O iya mas. apakah program flash bisa dipake buat aplikasi hitung2an akar-akaran dan pokoknya matematika tingkat tinggi dah.Bisa ga mas? Pokoknya hampir mirip aplikasi delphi gt? Bisa ga mas

I Nengah Januartha said...

Tentu bisa. Selama kamu mengerti dan bisa menjabarkannya dengan baik.

Anonymous said...

Cckckk..weleh.weleh kowe ki mangan opo to mas kok isok koyo ngono, mohon bimbingannya, aku arek Suroboyo-yg baru bljar Flash-tanx atas ilmunya-
loro_lima@yahoo.com

Unknown said...

Gw salut banget bro sama lo, jadi inget pertama2 kenal sama lo, orangnya cool, kalem, klemak klemek kalo wong suroboyo ngomong.

Tapi gak nyangka perkembangan lo bisa sampe seperti skr. Salut banget bro.

Kayaknya mesti banyak belajar neh.
Jok bosen2 yo boss nek aku takon.

Jok golek duwit tok yo boss.
Ilmune di bagi2-bagi.

Kasih tips juga dong piye kok iso
jadi pakar ngene ...

salam and sukses bro.
adhis-surabaya