Aplikasi Text To Speech atau TTS adalah sebuah aplikasi yang bisa merubah teks biasa menjadi suara sesuai dengan teks tersebut (ucapan). Sekarang banyak aplikasi yang dilengkapi dengan "tukang ngomong" (pinjem istilahnya software tukang omong buatannya kioss.com) Dengan, lalu bagaimana cara membuatnya?
Yang paling penting dalam TextToSpeech itu adalah database bahasanya, seperti misalnya yang telah dibuat oleh DR. Arry (lupa nama lengkapnya), dia telah membuat database bahasa indonesia (diphone bahasa indonesia) untuk membuat aplikasi Text To Speech bahasa Indonesia.
Pada artikel ini kita akan mencoba membuat aplikasi Text To Speech berbahasa Inggris, kenapa bahasa Inggris? jawabannya adalah simple karena "database bahasanya" udah dibikin oleh Microsoft (Microsoft SAPI) beserta fungsi Text To Speech. Jadi kita tinggal pakai, mudah2 an akan ada rilis untuk semua bahasa khususnya Indonesia, hehehe..
Tidak terlalu sulit untuk membuatnya, berikut ini gambaran sederhananya:
Pertama buatlah aplikasi delphi seperti biasa, kemudian pada Unit1 tambahkan kode berikut tepat dibawah klausa implemention
USES ComObj;
Kemudian buatlah procedure "Ngomong" untuk membangkitkan suara, kodenya seperti berikut :
procedure Ngomong(Teks : String);
const
SVSFDefault = $00000000;
SVSFlagsAsync = $00000001;
var
oVoice: OLEVariant;
begin
oVoice := CreateOLEObject('SAPI.SpVoice');
oVoice.Speak(Teks , SVSFlagsAsync);
Showmessage(Teks );
end;
Kemudian taruh komponen memo1 kedalam form dan taruh juga button1 kedalam form, kemudian buatlah procedure onclick pada button tersebut, sehingga kode lengkap untuk procedure itu seperti berikut :
procedure TForm1.Button1Click(Sender: TObject);
begin
Ngomong(Memo1.Text);
end;
Simpan dan jalankan klik Run|Run atau F9
Setelah itu coba masukkan kata pada kotak Memo1 dan tekan Button1, maka yang terjadi adalah muncul message dialog dibarengi dengan suara sesuai dengan teks pada kotak Memo1. gimana? gampang kan?
Anda mungkin bertanya (sori sok tau) gimana kalau seandainya nggak pakai showmessage bisa nggak? aku dulu juga berpikir bahwa itu adalah hal yang mudah kita lakukan tapi ternyata tidak, lho kok?
Lihat kode pada procedure Ngomong diatas jika showmessage dihilangkan Anda mungkin berpikir bahwa seharusnya nggak terjadi apa2 atau nggak bawa pegaruh terhadap Text To Speech, sehingga aplikasi tetep bisa ngomong tanpa ada message dialog yang ditampilkan. Cobalah dan hasilnya adalah ketika Button1 diklik maka aplikasi seolah bisu nggak mau ngomong, why?.
Secara teori atau ilmiah saya memang nggak bisa nerangin mengapa itu terjadi, tapi yang jelas untuk mengeluarkan suara fungsi oVoice.Speak memanfaatkan waktu jeda akibat munculnya message dialog, sebab suara tidak tidak akan dibunyikan lagi semua baris program pada procedure Ngomong telah selesai dikerjakan.
Oleh karena itu agar procedure Ngomong tidak cepat selesai maka diletakkan fungsi showmessage() untuk menampilkan kotak dialog pesan, dimana dengan munculnya kota dialog ini maka procedure tidak akan berakhir sebelum kotak dialog ditutup.
Namun kita bisa mengakalinya, masih inget dengan fungsi sleep(), udah lupa atau nggak pernah tau? dah taulah pasti ya.. kalau belum nggak papa jangan nangis hehehe.. Jadi ubah procedure "Ngomong", ganti kode showmessage(Text); menjadi sleep(1000);
Sekarang coba lagi jalankan aplikasi tersebut masukkan satu kata saja, maka aplikasi tetep bisa ngomong tanpa ada message dialog yang muncul, apakah semudah itu masalahnya, ternyata tidak saudara2,
Sekarang coba masukin kalimat yang panjang pada kotak Memo1, dan tekan button1 agar dia ngomong, oooo, yang terjadi adalah belum selesai teksnya dibaca semua tapi aplikasinya udah diam, mengapa? jawabannya adalah karena sleep(1000) hanya akan menghentikan procedure tersebut selama 1 detik saja jadi harusnya waktu sleep kita tambah, seberapa lama?
Pertanyaan bagous? ya selama aplikasi ngomongin teks pada memo1. Terus gimana cara mengetahuinya?, gimana jika seperti ini : sleep((length(Teks) div 4)* 1000); Silahkan Anda berkreasi tapi aku lebih suka menggunakan cara berikut ini :
Tambahkan variabel global stop dengan tipe boolean, caranya letakkan dibawah klausa var atau diatas klausa implementation, potongan kodenya seperti berikut :
var
Form1: TForm1;
Stop:Boolean;
implementation
uses ComObj;
Ubah procedure Ngomong menjadi seperti berikut :
procedure Ngomong(Teks : String);
const
SVSFDefault = $00000000;
SVSFlagsAsync = $00000001;
var
oVoice: OLEVariant;
begin
stop:=False;
oVoice := CreateOLEObject('SAPI.SpVoice');
oVoice.Speak(Teks , SVSFlagsAsync);
repeat
Application.ProcessMessages;
until stop=true;
end;
Cermatilah kode perulangan repeat until pada procedure diatas, tidak akan berhenti hingga variabel stop bernilai true; sedangkan kode Application.Messages; diletakkan agar aplikasi tentas bisa dikontrol karena perulangan yang terus menerus. Ok sekarang saatnya kita membuat procedure untuk menghentikan perulangan tersebut.
Pada form1 tambahkan sebuah button lagi dan berilah event onclick pada button2 tersebut yang berfungsi untuk merubah variabel global stop menjadi true, sehingga perulangan selesai.
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop:=true;
end;
Sekarang coba jalankan dan masukkan teks yang panjang pada memo1 maka aplikasi akan terus membaca hingga button2 ditekan.
Berikut ini kode lengkap untuk unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Stop:Boolean;
implementation
uses ComObj;
{$R *.dfm}
procedure Ngomong(Teks : String);
const
SVSFDefault = $00000000;
SVSFlagsAsync = $00000001;
var
oVoice: OLEVariant;
begin
stop:=False;
oVoice := CreateOLEObject('SAPI.SpVoice');
oVoice.Speak(Teks , SVSFlagsAsync);
repeat
Application.ProcessMessages;
until stop=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Ngomong(Memo1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop:=true;
end;
end.
Selamat mencoba!
Kode ini dicoba di Delphi 7 dengan lingkungan MS Windows XP SP2
- Sekarang, Anda bisa pasang iklan disini!
- Mau Tukeran Link Dengan Blog Ini? (Pengunjung Blog Ini Lebih dari 100/hari)
- Cek Jumlah Pengunjung
|