Text-to-speech-to-wav в Delphi

Я импортировал библиотеку типов SAPI в Delphi. Я могу вывести речь на динамики ПК с помощью этого кода:

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,05 кГц, но это звучит намного хуже.

Как вывести речь в моно-16-разрядный 44.1kHz .wav файл, который будет звучать точно так же, как речевой вывод непосредственно на динамики ПК? Я не мог понять, как изменить второй образец кода, чтобы установить бит на образец и битрейт.

Follup-up: Ответ Гленна решает проблему с битрейтом. Спасибо за это. Но качество вывода речи в файл .wav по-прежнему уступает тому, что выводится непосредственно на динамики. Я использовал программное обеспечение для записи экрана для записи вывода из первого блока кода как helloworldtospeakers.wav. Второй блок кода с добавленной строкой Гленна производит helloworldtowav.wav. Второй файл явно имеет некоторые искажения. Любые идеи?

Ответ 1

См. Атрибут формата в объекте файлового потока. Это тип SpAudioFormat, который имеет свойство Type, которое вы используете для установите аудиоформат. Это перечисляемый тип, который имеет множество опций, поэтому вам нужно изучить их, чтобы получить то, что вы хотите.

Эта строка должна получить его для вас (по крайней мере, с версией библиотеки типов, которую я использовал).

Stream.Format.Type_ := SAFT44kHz16BitMono;