Autor Beitrag
ayman
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 13.01.05 21:06 
Hi zusammen,

ich bin gerade dabei, die in XP vorinstallierte Sprachausgabefähigkeit unter Delphi zu nutzen. Das Packet heißt "Microsoft SAPI 5.1".

Quellen:
(1) Hier gibt es das kostenlose SDK inkl. Docs: www.microsoft.com/speech/download/SDK51
(2) Hier gibt es einen tollen Delphi-Kurs dazu mit Demos, Komponenten und Sourcecode für Delphi5/6/7: www.blong.com/Confer...02/Speech/Speech.htm

Aber wie das so ist, mit diesen COM-Servern (oder ActiveX ?) unter Delphi ... sie sind nicht eben trivial zu benutzen. Seit zwei Tagen versuche ich jetzt die der Quelle (2) beiliegende Demo so zu ändern, dass ich die Sprache nicht über Soundkarte höre, sondern in eine WAV-Datei abspeichern kann, komme aber nicht weiter.

Wie leite ich die Soundausgabe der SAPI 5.1 in eine WAV-Datei um?

Gibt es hier jemanden, dem das schon gelungen ist?


by the way ... ich verwende Delphi 5 (sollte aber kein Problem sein.)


Vorsicht: Details

Quelle (1) liefert eine umfassende (C++) API-Hilfedatei, die folgendes Programmbeispiel zu meinem Problem enthält:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
  HRESULT        hr = S_OK;
  CComPtr <ISpVoice>    cpVoice;
  CComPtr <ISpStream>    cpStream;
  CSpStreamFormat      cAudioFmt;

  //Create a SAPI Voice
  hr = cpVoice.CoCreateInstance( CLSID_SpVoice );

  //Set the audio format
        if(SUCCEEDED(hr))
  {
    hr = cAudioFmt.AssignFormat(SPSF_22kHz16BitMono);
  }
  
  //Call SPBindToFile, a SAPI helper method,  to bind the audio stream to the file
  if(SUCCEEDED(hr))
  {

    hr = SPBindToFile( L?c:\\ttstemp.wav?,  SPFM_CREATE_ALWAYS, 
      &cpStream, & cAudioFmt.FormatId(),cAudioFmt.WaveFormatExPtr() );
  }
  
  //set the output to cpStream so that the output audio data will be stored in cpStream
        if(SUCCEEDED(hr))
  {
    hr = cpVoice->SetOutput( cpStream, TRUE );
  }

   //Speak the text ?hello world? synchronously
        if(SUCCEEDED(hr))
  {
    hr = cpVoice->Speak( L"Hello World",  SPF_DEFAULT, NULL );
  }
  
  //close the stream
  if(SUCCEEDED(hr))
  {
    hr = cpStream->Close();
  }

  //Release the stream and voice object
  cpStream.Release ();
  cpVoice.Release();


In Zeile 12 fangen meine Probleme schon an, denn das dort erzeugte CSpStreamFormat-Objekt existiert in seiner Delphi Entsprechung scheinbar nur als Interface. Zu allem Überfluss fehlt eine Methode "AssignFormat" völlig (die gibt's im gesamten Source nicht).

Ich bitte um Rat.

Grüße
Ayman
ayman Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 17.01.05 03:40 
Hi zusammen,

wollte nur mitteilen, dass ich die Lösung doch noch gefunden habe:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
// Ausgabe in eine WAV-Datei umzuleiten
//
// Es handelt sich hierbei um eine Erweiterung der TextToSpeechU.pas - Demo
// Ich habe einen Button eingefügt (btnStartFileOutClick), der den Text aus der 
// TRichEdit-Komponente (reText) in eine WAV-Datei ausgibt.
//
// SpVoice ist das vom ganzen Programm genutzte globale TSpVoice-Objekt.
// edOutfile ist ein Eingabefeld mit dem Pfad der Zieldatei.
//
procedure TfrmTextToSpeech.btnStartFileOutClick(Sender: TObject);
var
   fs: TSpFileStream;
   fname: string;
begin
  fname := edOutfile.Text;

  fs := TSpFileStream.Create (nil);

  try
    btnStartFileOut.Enabled := False;
    fs.Format.type_ := SAFT22kHz16BitMono;
    fs.Open (fname, SSFMCreateForWrite, true);
    SpVoice.AudioOutputStream := fs.DefaultInterface;
    SpVoice.Speak(reText.Text, SVSFDefault);       // );
  finally
    SpVoice.AudioOutputStream := nil;
    fs.Close;
    fs.Free;
    btnStartFileOut.Enabled := True;
  end;

end;


Grüße
Ayman