2012-10-14 10 views
11

Ich importierte die SAPI-Typ-Bibliothek in Delphi. Ich kann Ausgang Rede an die PC-Lautsprecher mit diesem Code:Text-zu-Sprache-zu-wav in Delphi

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Voice: TSpVoice; 
begin 
    Voice := TSpVoice.Create(nil); 
    Voice.Speak('Hello World!', 0); 
end; 

ich ausgeben kann Sprache an eine .wav Datei mit diesem Code:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Voice: TSpVoice; 
    Stream: TSpFileStream; 
begin 
    Voice := TSpVoice.Create(nil); 
    Stream := TSpFileStream.Create(nil); 
    Stream.Open('c:\temp\test.wav', SSFMCreateForWrite, False); 
    Voice.AudioOutputStream := Stream.DefaultInterface; 
    Voice.Speak('Hello World!', 0); 
    Stream.Close; 
end; 

Das Problem ist, dass, wenn ich die .wav Datei abspielen es klingt schrecklich, wie es eine wirklich niedrige Bitrate verwendet. Audacity sagt mir, dass die Datei Mono 16-Bit 22,05 kHz ist, aber es klingt viel schlechter als das.

Wie gebe ich Sprache in eine Mono-16-Bit 44.1kHz .wav Datei aus, die genauso klingt wie die Sprachausgabe direkt an die PC-Lautsprecher? Ich konnte nicht herausfinden, wie man das zweite Codebeispiel ändert, um die Bits pro Sample und die Bitrate einzustellen.

Follup-up: Glenn's Antwort löst das Problem mit der Bitrate. Dank dafür. Aber die Qualität der Sprachausgabe an die .wav Datei ist immer noch schlechter als die, die direkt an die Lautsprecher ausgegeben wird. Ich verwendete eine Bildschirmaufzeichnungssoftware, um die Ausgabe des ersten Codeblocks als helloworldtospeakers.wav aufzuzeichnen. Der zweite Codeblock mit der hinzugefügten Zeile von Glenn erzeugt helloworldtowav.wav. Die zweite Datei weist eindeutig eine Verzerrung auf. Irgendwelche Ideen?

Antwort

9

Siehe die Format attribute auf Ihrem Dateistream-Objekt. Es ist ein SpAudioFormat type, der eine Type property hat, die Sie verwenden, um das Audioformat festzulegen. Das ist eine enumerated type, die eine große Auswahl hat, so dass Sie sie studieren müssen, um zu bekommen, was Sie wollen.

Diese Zeile sollte es für Sie bekommen (zumindest mit der Version der Typbibliothek, die ich verwendet habe).

Stream.Format.Type_ := SAFT44kHz16BitMono;