2012-10-14 14 views
11

Zaimportowałem bibliotekę typu SAPI do Delphi. Mogę mowy wyjście do głośników komputerowych z tym kodem:text-to-speech-to-wav w Delphi

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

mogę mowy wyjście do pliku .wav z tym kodem:

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; 

Problem polega na tym, że kiedy odtworzyć pliku, który .wav brzmi okropnie, jakby używało naprawdę niskiej przepływności. Audacity mówi mi, że plik ma format 16 bitów 22.05 kHz, ale brzmi znacznie gorzej.

Jak wyprowadzić mowę na plik 16-bitowego 44,1 kHz o częstotliwości próbkowania 44.1 kHz, z dokładnością co do mowy, bezpośrednio na głośniki komputera? Nie mogłem wymyślić, jak zmodyfikować drugą próbkę kodu, aby ustawić bity na próbkę i bitrate.

Folkup-up: Odpowiedź Glenna rozwiązuje problem z przepływnością. Dziękuję za to. Ale jakość mowy wyjściowej do pliku .wav jest wciąż gorsza od tego, co jest wysyłane bezpośrednio do głośników. Użyłem oprogramowania do nagrywania ekranu, aby zarejestrować wyjście z pierwszego bloku kodu jako helloworldtospeakers.wav. Drugi blok kodu, z dodaną linią Glenna, generuje helloworldtowav.wav. Drugi plik wyraźnie ma pewne zniekształcenia. Jakieś pomysły?

Odpowiedz

9

Zobacz obiekt Format attribute w obiekcie strumienia plików. Jest to SpAudioFormat type, który ma Type property, którego używasz do ustawienia formatu audio. To jest enumerated type, który ma wiele opcji, więc musisz się ich nauczyć, aby uzyskać to, czego chcesz.

Ten wiersz powinien go pobrać (przynajmniej z wersją używanej biblioteki typów).

Stream.Format.Type_ := SAFT44kHz16BitMono;