Programowanie w języku Delphi » Gotowce

Gadający notatnik

Aby komputer nawijał potrzebny jest jakiś syntezator mowy. Jest ich baaaardzo dużo. Widziałem
nawet syntezatory zewnętrzne [taka skrzynka z wejściem na słuchawki podłączana do portu COM ;) ].
Ale są też takie "programowe" np. System Syntezy Mowy WP, UniSpiker itd.

W naszym programie będziemy używać trochę już podstarzałego,dostępnego po necie syntezatora -
SYNTALK.

Na początek na formatkę wrzucamy dwa buttony, jedno memo i dwa komponenty z zakładki system: DDEClientItem i DDEClientConv. Caption pierwszego buttona zmieniamy
na "Czytaj!", drugiego na "Pauza", a trzeciego na "Stop".

  • Klikamy w puste miejsce formatki i wrzucamy taką prockę:

procedure TForm1.FormCreate(Sender: TObject);
begin 
 if DDEClientConv1.SetLink('Syntalk','System') then exit;
 ShowMessage('Błąd! Musisz pierw uruchomić Syntalka!');
 halt(1);
end;

  • w OnForm close:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 DDEClientConv1.CloseLink;
end;


  • Teraz klikamy dwa razy na przycisk Czytaj i wrzucamy tam taką procedurkę:

procedure TForm1.Button1Click(Sender: TObject);
var
ddedata:pchar;
s:string;
begin  
  FillChar(s,sizeof(s),0);
  s:=memo1.text;
  ddedata:=@s[1];
  DDEClientConv1.PokeData('text',ddedata);
  DDEClientConv1.ExecuteMacro('[read]',false);
end;


  • Teraz klikamy Pauzę i taką:

procedure TForm1.Button2Click(Sender: TObject);
begin
 DDEClientConv1.ExecuteMacro('[pause]',false);
end;


  • I jeszcze jedna do przycisku stop:

procedure TForm1.Button3Click(Sender: TObject);
begin
 DDEClientConv1.ExecuteMacro('[break]',false);
end;


Teraz odpalamy program, wpisujemy jakiś tekst i dajemy czytaj ;) co to ? komputer zaczął mówić ? ;)

Cały program:

{by [Bodzio]  03}
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DdeMan;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    DdeClientConv1: TDdeClientConv;
    DdeClientItem1: TDdeClientItem;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
ddedata:pchar;
s:string;
begin  
  FillChar(s,sizeof(s),0);
  s:=memo1.text;
  ddedata:=@s[1];
  DDEClientConv1.PokeData('text',ddedata);
  DDEClientConv1.ExecuteMacro('[read]',false);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
DDEClientConv1.ExecuteMacro('[pause]',false);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
 DDEClientConv1.ExecuteMacro('[break]',false);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 if DDEClientConv1.SetLink('Syntalk','System') then exit;
  MessageDlg('Blad! Najpierw uruchom SYNTALKA', mtInformation, [mbOK], 0);
  Halt(1);
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DDEClientConv1.CloseLink;
end;
 
end. 


----> Źródła powinny już być w dziale kody źródłowe.

by [Bodzio]
  '2003


14 komentarzy

pkkm 2008-08-18 09:57

a jak umieścić syntezator w jakimś pliku albo plikach żeby nie trzeba było go instalować tylko użyć np. dll'a albo unit'a?

pkkm 2008-08-18 09:56

a jak umieścić syntezator w jakimś pliku albo plikach żeby nie trzeba było go instalować tylko użyć np. dll'a albo unit'a?

lef 2004-12-15 21:13

A z kąd ja mam wziąć syntalk'a.

Piotr_Gil 2004-04-18 17:29

A powiedzcie mi po co ten drugi komponent, DDEClientItem chyba sie zwie.. Nigdzie w kodzie nie jest uzywany!

bAStek 2004-02-29 14:10

A może ktoś mi powie jak zmienić głos którym "gada" komputer
Zainstalowałem sobie SAPI 5.1
i używam takiego fragmentu kodu


uses Comobj;

procedure TForm1.Button1Click(Sender: TObject);
var
  voice: OLEVariant;
begin
          voice := CreateOLEObject('SAPI.SpVoice');
          voice.Speak('Hello World!', 0);
end;

a że w delphi jestem prawie zielony to może ktoś mi powie jak zmienić głos czy szybkość czytania, albo da linka do jakiegoś helpa odnośnie SAPI

FilD 2004-01-25 14:28

Window Eyes

rajdzen 2003-07-27 01:45

Fajnie ale o ile pamiętam to jest problem z wykryciem kiedy syntalk skończy mówić. Polecam oprogramować System syntezy mowy który daję taką możliwość. Niestety niewidzialełem w sieci żadnego źródła które było by w stanie wykryć taki przypadek. Sam się dużo naszukałem zanim to zrobiłem. Polecam dużo można się nauczyć.
Mój przykład zastosowania to lektor do filmów (u mnie na kompie już coś takiego od dawna gości :) ).
Ps. Jakie znacie syntezatory polskie oprócz syntalka wp i spikera? Jak ktoś ma link to niech napisze.

[Bodzio] 2003-04-08 21:09

wooow! ale dużo odsłon ;) thx wszystkim którzy tu wleźli ;D

gacek999 2003-04-06 20:01

Mozna tez uzyc kontrolki ActiveX "Microsoft Direct Text-To-Speech" itp.

[Bodzio] 2003-04-05 20:55

juz jest wtyczka do power gg ktora wykorzystuje syntezatory... a do irca jeszcze nie widzialem ;)

Sebek 2003-04-04 20:39

Lepiej z GG :P

Szymek 2003-03-18 20:13

:) Sam tez sie zajmowalem Syntalkiem i programem do sterowania nim. Ale nie wiedzialem ze sie to moze komus przydac. :) Osobiscie kozystam z SynTalka, bardzo sie przydaje. Co bys bodzio powiedzial na zintergowanie SynTalka z mircem ?

Drajwer 2003-03-18 15:47

wszystko mam .... nienajlepsze to ale ujdzie w skrajnych przypadkach-_-