Gadający notatnik

[Bodzio]

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

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?

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?

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

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

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

Window Eyes

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.

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

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

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

Lepiej z GG :P

:) 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 ?

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