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

Jan*_*rts 11 delphi sapi wav

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

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

我可以.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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Gle*_*234 9

请参阅文件流对象上的Format属性.它是一个SpAudioFormat类型,它具有用于设置音频格式的Type属性.这是一个枚举类型,有很多选项,所以你需要研究它们才能得到你想要的东西.

这行应该为你得到它(至少我使用的类型库的版本).

Stream.Format.Type_ := SAFT44kHz16BitMono;
Run Code Online (Sandbox Code Playgroud)