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 ?

Code:
unit Speech;

interface

uses Windows,Sysutils,forms,olectnrs,ComObj,olectrls,AxCtrls, 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);stdcall; 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

Code:
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ß