преобразование текста в речь в 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,1 кГц .wav, который будет звучать точно так же, как речевой вывод, непосредственно на динамики ПК? Я не мог понять, как изменить второй образец кода, чтобы установить количество бит на образец и битрейт.

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


person Jan Goyvaerts    schedule 14.10.2012    source источник
comment
Я также импортировал его в XE8, но не могу заставить его говорить вообще, и он запрашивает 3 параметра. pwcs: PWideChar; dwFlags: Cardinal; outpulStreamNumber: Кардинал   -  person Jerry Mallett    schedule 17.03.2021


Ответы (1)


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

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

Stream.Format.Type_ := SAFT44kHz16BitMono;
person Glenn1234    schedule 14.10.2012