Syntezator mowy Sam

Artur Protasewicz

To jest program, który tylko pokazuje, jak umieścić syntezator mowy istniejący w komputerze we własnym programie, aby sprawdzać wymowę angielską w wydaniu tego syntezatora. Utwórz projekt, wklej kod Unit1 i uruchom. Nic więcej nie trzeba robić, no chyba, że masz wyłączony dźwięk.

Najważniejsze w kodzie jest:

uses Variants, ComObj;
Sam: OLEVariant;
Sam := CreateOLEObject('SApi.SpVoice');
Sam.Speak(Edit.Text);

Napisałem ten gotowiec z myślą o osobach mniej zaawansowanych w Delphi, a bardziej zainteresowanych analizą wymowy syntezatora, po otrzymaniu jednego z pytań do mojego artykułu "Jak zrobić syntezator mowy polskiej wykorzystując Microsoft Sam’a". Właściwie to chodzi o to, żeby nie wchodzić za każdym razem do Panelu strowania / Mowa.

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
  public
    Prompt: TLabel;
    Edit: TEdit;
    Button: TButton;
    Sam: OLEVariant;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  ComObj;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Sam := CreateOLEObject('SApi.SpVoice');
  Width := 800;
  Height := 600;
  Position := poScreenCenter;
  Font.Name := 'Tahoma';
  Font.Size := 8;
  Font.Style := [fsBold];
  Prompt := TLabel.Create(Self);
  Prompt.Left := 20;
  Prompt.Caption := 'Wpisz tekst, którego wymowę chcesz testować.';
  Prompt.Top := 10;
  InsertControl(Prompt);
  Edit := TEdit.Create(Self);
  Edit.Left := Prompt.Left;
  Edit.Width := Width - Edit.Left * 2;
  Edit.Top := Prompt.Top + Prompt.Height + 10;
  Edit.Text := 'This is your computer''s default voice.';
  InsertControl(Edit);
  Button := TButton.Create(Self);
  Button.Left := 20;
  Button.Width := 80;
  Button.Caption := 'Czytaj';
  Button.Top := Edit.Top + Edit.Height + 10;
  Button.OnClick := ButtonClick;
  InsertControl(Button);
end;
 
procedure TForm1.ButtonClick(Sender: TObject);
begin
  if Trim(Edit.Text) <> '' then
    Sam.Speak(Edit.Text);
end;
 
end.

4 komentarzy

Rzeczywiście, na Windows 7 pojawia się błąd "Div by 0". Program był pisany na XP w Delphi 2006 Explorer. Nie pojawia się na Win 7 i maszynie wirtualnej Microsoftu dla Win 7 XP Mode, co przed chwilą sprawdziłem, pisząc go w tym samym Delphi i w XP Mode na Win 7 właśnie. Na nowszych Windowsach pozostaje użyć MS Hyper-V, albo do zastosowań niekomercyjnych np. Oracle VirtualBox. Generalnie z samym Delphi 2006 Explorer na Win 7 jest problem polegający na pojawianiu się drugiego procesu Delphi przy uruchamianiu ze środowiska Delphi jakiegoś programu i też wyskoczy błąd, bodaj przy zamykaniu Dalphi 2006 Explorer. Ważne jest też posiadanie zaktualizowanego Win 7 i w nim XP Mode (do dziś aktualizacje się pobierają bez problemu). Na XP Mode wybrałem w ustawieniach dźwięk z SoundBlaster 10, bodaj. Tak, czy inaczej to było XP i Turbo Delphi 2006 Explorer (freeware do zastosowań komercyjnych). Przepraszam za tak późną odpowiedź.

Podczas działania programu pod obsługą delphi program nie ma problemów, ale kiedy uruchomię go osobno bez kontroli delphi, program wyrzuca mi taki błąd:
"Floating Point Division by 0"

szkoda ze sam nie nawija po polsku xd