Delphi中的文本到语音转换为wav

时间:2012-10-14 04:54:03

标签: delphi wav sapi

我将SAPI类型库导入Delphi。我可以使用以下代码将语音输出到PC扬声器:

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

我可以使用以下代码将语音输出到.wav文件:

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;

问题在于,当我播放.wav文件时,听起来很糟糕,就像使用非常低的比特率一样。 Audacity告诉我文件是单声道16位22.05kHz,但听起来比这更糟糕。

如何将语音输出到单声道16位44.1kHz .wav文件,该文件与直接发送到PC扬声器的语音输出完全相同?我无法弄清楚如何修改第二个代码示例来设置每个样本的比特和比特率。

Follup-up: Glenn的回答解决了比特率问题。感谢那。但是,.wav文件的语音输出质量仍然低于直接输出到扬声器的质量。我使用屏幕录制软件将第一个代码块的输出记录为helloworldtospeakers.wav。添加了Glenn的第二个代码块产生helloworldtowav.wav。第二个文件显然有一些失真。有什么想法吗?

1 个答案:

答案 0 :(得分:9)

请参阅文件流对象上的Format attribute。它是SpAudioFormat type,其中有Type property用于设置音频格式。这是一个enumerated type,它有很多选项,所以你需要研究它们才能得到你想要的东西。

此行应该为您提供(至少使用我使用的类型库的版本)。

Stream.Format.Type_ := SAFT44kHz16BitMono;