PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sprache (SAPI) mit Borland C++ Builder



ba4_philipp
14.04.2006, 15:42
Hallo,

ich würde gerne eine Sprachausgabe mit einbauen. Ich programmiere auf dem PC mit dem Borland C++ Builder 6.0 und würde für die Sprachausgabe gerne das SAPI SDK von Micrsoft benutzen. Für Visual C++ habe ich schon etliche Beispiele gefunden, aber ich bekomme es mit Borland nicht zum laufen :( hat jmd von euch Erfahrung damit?

Vielen Dank schonmal
Gruß und frohe Ostern Philipp

NumberFive
17.04.2006, 07:45
Leider nicht mit Borland C++ aber mit delphi habe ich das schon gemacht ist in meinen Roboter programmen drin. ist ein normales Com objekt also sollte es da eingendlich keine Probs geben wo ist das Problem bei dir ?



unit Speech;

interface

uses Windows,Sysutils,forms,olectnrs,ComObj,olectrls,Ax Ctrls, ActiveX,Messages,SpeechLib_TLB,classes;

Type
TMNSpeech = Class
private
MySpeak : SpVoice;
m_speakFlags : SpeechVoiceSpeakFlags;
MySpeaklist : TStringlist;
Running : Boolean;
Public
Function IsRunning:Boolean;
Procedure DoNext;
Procedure Speak(Text:String);
Constructor Init(Var Result :Integer);
end;

Var MNSpeech : TMNSpeech;

implementation

Uses Main;

Var MyNotify : ISpNotifySource;

Procedure NOTIFYCALLBACK(Param1:wParam;Param2:lParam);stdcal l; Export;
Var EventSource :ISpEventSource;
Elemente,Bekommen,I : Cardinal;
ElemnentListe : Array[0..9] of SPEVENT;
begin
MyNotify.QueryInterface(ISpEventSource,EventSource );
if EventSource <> nil then
begin
Elemente := 10;
EventSource.GetEvents(Elemente,ElemnentListe[0],Bekommen);
//MainForm.Debug('Events Bekommen '+IntToStr(Bekommen));
if Bekommen > 0 then
begin
For I:=0 to Bekommen do
begin
case ElemnentListe[I].eEventId of
SPEI_START_INPUT_STREAM: Begin
MainForm.Debug('Stream gestartet');
MNSpeech.Running := True;
end;
SPEI_END_INPUT_STREAM: Begin
MainForm.Debug('Stream Beendet');
MNSpeech.Running := False;
MNSpeech.DoNext;
end;
SPEI_VOICE_CHANGE: Begin
MainForm.Debug('Stimme wurde geändert');
end;
SPEI_SOUND_START: Begin
MainForm.Debug('Ausgabe an');
end;

SPEI_SOUND_END: Begin
MainForm.Debug('Ausgabe aus');
end;


end;
end;
{
SPEI_TTS_BOOKMARK = $00000004;
SPEI_WORD_BOUNDARY = $00000005;
SPEI_PHONEME = $00000006;
SPEI_SENTENCE_BOUNDARY = $00000007;
SPEI_VISEME = $00000008;
SPEI_TTS_AUDIO_LEVEL = $00000009;
SPEI_TTS_PRIVATE = $0000000F;
SPEI_MIN_TTS = $00000001;
SPEI_MAX_TTS = $0000000F;
SPEI_END_SR_STREAM = $00000022;
SPEI_SOUND_START = $00000023;
SPEI_SOUND_END = $00000024;
SPEI_PHRASE_START = $00000025;
SPEI_RECOGNITION = $00000026;
SPEI_HYPOTHESIS = $00000027;
SPEI_SR_BOOKMARK = $00000028;
SPEI_PROPERTY_NUM_CHANGE = $00000029;
SPEI_PROPERTY_STRING_CHANGE = $0000002A;
SPEI_FALSE_RECOGNITION = $0000002B;
SPEI_INTERFERENCE = $0000002C;
SPEI_REQUEST_UI = $0000002D;
SPEI_RECO_STATE_CHANGE = $0000002E;
SPEI_ADAPTATION = $0000002F;
SPEI_START_SR_STREAM = $00000030;
SPEI_RECO_OTHER_CONTEXT = $00000031;
SPEI_SR_AUDIO_LEVEL = $00000032;
SPEI_SR_PRIVATE = $00000034;
SPEI_MIN_SR = $00000022;
SPEI_MAX_SR = $00000034;
SPEI_RESERVED1 = $0000001E;
SPEI_RESERVED2 = $00000021;
SPEI_RESERVED3 = $0000003F;}

end;
end;
//Message Resived
end;

Constructor TMNSpeech.Init(Var Result :Integer);
begin
MySpeak := CoSpVoice.Create();
m_speakFlags := SVSFlagsAsync Or SVSFPurgeBeforeSpeak Or SVSFIsXML;
MySpeak.QueryInterface(ISpNotifySource,MyNotify);
MySpeak.EventInterests := SVEAllEvents;
MyNotify.SetNotifyCallbackFunction(@NOTIFYCALLBACK ,0,0);
MySpeaklist := TStringlist.Create();
Running := false;
end;

Procedure TMNSpeech.Speak(Text:String);
begin
MySpeaklist.Add(Text);
if not Running then
begin
Running := True;
MySpeak.Speak(MySpeaklist.Strings[0],m_speakFlags);
end;
end;

Procedure TMNSpeech.DoNext;
begin
if MySpeaklist.Count >0 then
begin
MySpeaklist.Delete(0);
if MySpeaklist.Count >0 then
begin
MySpeak.Speak(MySpeaklist.Strings[0],m_speakFlags);
end;
end;
end;

Function TMNSpeech.IsRunning:Boolean;
begin
if MySpeaklist.Count = 0 then
begin
Result := Running;
end
else
begin
Result := True;
end;
end;

end.


Kapsel Klasse



unit SpeechLib_TLB;

// ************************************************** ********************** //
// WARNUNG //
// ------- //
// Die Typen, die in dieser Datei deklariert sind, sind Daten einer Typbibliothek.
// Wenn diese Typbibliothek explizit oder indirekt (via Verweis) //
// re-importiert wird oder die Anweisung 'Aktualisieren' im Editor //
// für Typbibliotheken beim Bearbeiten der Typbibliothek aktiviert ist //
// wird der Inhalt dieser Datei neu generiert und alle //
// manuellen Änderungen gehen verloren. //
// ************************************************** ********************** //

// PASTLWTR : $Revision: 1.11.1.75 $
// Datei generiert aus 16.11.2003 23:02:44 aus der unten beschriebenen Typbibliothek.

// ************************************************** ********************** //
// Typbibl.: C:\Programme\Gemeinsame Dateien\Microsoft Shared\Speech\sapi.dll
// IID\LCID: {C866CA3A-32F7-11D2-9602-00C04F8EE628}\0
// Hilfedatei:
// HilfsString: Microsoft Speech Object Library
// Version: 5.1
// ************************************************** ********************** //

interface

uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL;

....


Das Comobjekt

Vielliecht hilf es ja.

Gruß