Synteza mowy w Delphi jest jak najbardziej możliwa, ale w tym atykule zajmiemy się syntezą mowy za pomocą zewnętrznego syntezatora, jakim jest Syntalk.
Z Syntalkiem możemy się połączyć poprzez kanał DDE (Dynamic Data Exchange). Możemy to uczynić poprzez zastosowanie komponentu DDEClientConv z zakładki System. Oczywistym wyborem wydaje się tutaj syntezator Syntalk, gdyż oferuje kanał DDE.
Na początku musimy nawiązać połączenie z Syntalkiem. Oczywiście, aby ta operacja się udała, Syntalk musi być włączony.
Na początku dodajemy na formę komponent TDDEClientConv z zakładki System. Następnie w zdarzeniu OnCreate formy wpisujemy :
procedure TForm1.FormCreate(Sender: TObject);
begin
if not DDEClientConv1.SetLink('Syntalk','System') then begin
ShowMessage('Aby można było używać tej aplikacji musisz najpierw uruchomić SynTalka');
Application.Terminate;
end;
end;
Metoda SetLink próbuje nawiązać połączenie z Syntalkiem i zwraca rezultat tej próby (typ boolean). Jeżeli coś poszło nie tak, zwróci wartość false, i aplikacja pokaże stosowny komunikat, i wyłączy się.
Dodajemy teraz na formę komponent TButton, opowiedzialny za rozpoczęcie czytania tekstu. Dodajemy też komponent TMemo, w którym będzie znajdował się tekst do przeczytania. Teraz w OnClick Buttona wpisujemy :
procedure TForm1.Button1Click(Sender: TObject);
var
dane :pchar;
tekst : string;
begin
FillChar(tekst,sizeof(tekst),0);
tekst := Memo1.Text;
dane := @tekst[1];
DDEClientConv1.PokeData('text',dane);
DDEClientConv1.ExecuteMacro('[read]',false);
end;
Aby zatrzymać odtwarzanie, potrzebujemy drugiego komponentu TButton, który będzie używany własnie do zatrzymywania odtwarzania :
procedure TForm1.Button2Click(Sender: TObject);
var
dane : pchar;
tekst : string;
begin
FillChar(tekst,sizeof(tekst),0);
tekst := Memo1.Text;
dane := @tekst[1];
DDEClientConv1.PokeData('text',dane);
DDEClientConv1.ExecuteMacro('[pause]',false);
end;
Aby całkowicie wyłączyć odtwarzanie, msuimy dodać na formę trzeci komponent TButton, odpowiedzialny własnie za tą akcję :
procedure TForm1.Button3Click(Sender: TObject);
var
dane : pchar;
tekst :string;
begin
FillChar(tekst,sizeof(tekst),0);
tekst := Memo1.Text;
dane := @tekst[1];
DDEClientConv1.PokeData('text',dane);
DDEClientConv1.ExecuteMacro('[break]',false);
end;
Jeśli chodzi o Syntalka, to tyle. Teraz zajmiemy się obsługą wbudowanego w system Windows XP systemu syntezy mowy o nazwie Sam. Sam niestety jest zoptymalizowany na język angielski, więc wymowa polskich słów może brzmieć co najmniej dziwnie. Ale ten przykład zobrazuje wykorzystanie nowszego od DDE protokołu OLE (Object Linking and Embedding).
Na początku do listy Uses dodajemy moduł ComObj. Następnie tworzymy zmienną globalną typu OleVariant :
Voice : OleVariant;
Następnie musimy utworzyć obiekt Voice. W tym celu w zdarzeniu OnCreate formy wpisujemy :
procedure TForm1.FormCreate(Sender: TObject);
begin
Voice := CreateOLEObject('SAPI.SpVoice');
end;
Aby zaimplementować funkcję czytania tekstu, dodajemy na formę TButton oraz TMemo. Button będzie służył do rozpoczęcia czytania tekstu z Memo. W zdarzeniu OnClick Buttona wpisujemy :
procedure TForm1.Button1Click(Sender: TObject);
begin
Voice.Speak(Memo1.text, 0);
end;
Syntezę mowy można też zrealizować przy pomocy syntezatora Ivona, ale z powodu trudności w uzyskaniu Ivona SDK, oraz tego, że jest to produkt komercyjny, zrezygnowałem z jego opisywania. Może w przyszłości :)
Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.