2012-10-14 22 views
11

Ho importato la libreria di tipi SAPI in Delphi. Mi può produrre discorso agli altoparlanti del PC con questo codice:text-to-speech-to-wav in Delphi

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

posso output vocale in un file .wav con questo codice:

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; 

Il problema è che quando ho riprodurre il file .wav esso sembra terribile, come se stesse usando un bitrate molto basso. Audacity mi dice che il file è mono 16 bit 22.05 kHz, ma suona molto peggio di così.

Come si trasmette il parlato a un file mono a 16 bit 44.1kHz .wav che suona esattamente come l'uscita vocale direttamente agli altoparlanti del PC? Non riuscivo a capire come modificare il secondo codice di esempio per impostare i bit per campione e il bitrate.

Follup-up: La risposta di Glenn risolve il problema del bitrate. Grazie per quello. Ma la qualità dell'output vocale per il file .wav è ancora inferiore a ciò che viene emesso direttamente agli altoparlanti. Ho usato un software di registrazione dello schermo per registrare l'output dal primo blocco di codice come helloworldtospeakers.wav. Il secondo blocco di codice, con aggiunta della linea di Glenn, produce helloworldtowav.wav. Il secondo file ha chiaramente qualche distorsione. Qualche idea?

risposta

9

Vedere Format attribute sull'oggetto del flusso di file. È un SpAudioFormat type che ha un Type property che usi per impostare il formato audio. Questo è un enumerated type, che ha molte opzioni, quindi dovrai studiarle per ottenere quello che vuoi.

Questa riga dovrebbe ottenerlo per voi (almeno con la versione della libreria dei tipi che ho usato).

Stream.Format.Type_ := SAFT44kHz16BitMono;