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