В настоящее время я работаю над приложением, которое требует передачи речи, закодированной в определенный аудиоформат.
System.Speech.AudioFormat.SpeechAudioFormatInfo synthFormat =
new System.Speech.AudioFormat.SpeechAudioFormatInfo(System.Speech.AudioFormat.EncodingFormat.Pcm,
8000, 16, 1, 16000, 2, null);
Это означает, что звук находится в формате PCM, 8000 выборок в секунду, 16 бит на выборку, моно, 16000 средних байтов в секунду, выравнивание блоков - 2.
Когда я пытаюсь выполнить следующий код, в мой экземпляр MemoryStream ничего не записывается; однако, когда я перехожу с 8000 выборок в секунду до 11025, аудиоданные записываются успешно.
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
waveStream = new MemoryStream();
PromptBuilder pbuilder = new PromptBuilder();
PromptStyle pStyle = new PromptStyle();
pStyle.Emphasis = PromptEmphasis.None;
pStyle.Rate = PromptRate.Fast;
pStyle.Volume = PromptVolume.ExtraLoud;
pbuilder.StartStyle(pStyle);
pbuilder.StartParagraph();
pbuilder.StartVoice(VoiceGender.Male, VoiceAge.Teen, 2);
pbuilder.StartSentence();
pbuilder.AppendText("This is some text.");
pbuilder.EndSentence();
pbuilder.EndVoice();
pbuilder.EndParagraph();
pbuilder.EndStyle();
synthesizer.SetOutputToAudioStream(waveStream, synthFormat);
synthesizer.Speak(pbuilder);
synthesizer.SetOutputToNull();
При использовании частоты дискретизации 8000 не было зарегистрировано никаких исключений или ошибок, и я не смог найти ничего полезного в документации, касающейся SetOutputToAudioStream и почему он работает со скоростью 11025 выборок в секунду, а не 8000. У меня есть обходной путь, связанный с файлом wav, который я сгенерированы и преобразованы в правильную частоту дискретизации с помощью некоторых инструментов редактирования звука, но я хотел бы сгенерировать звук из приложения, если смогу.
Особый интерес вызывает то, что SpeechRecognitionEngine принимает этот аудиоформат и успешно распознает речь в моем синтезированном волновом файле ...
Обновление: недавно обнаружено, что этот аудиоформат подходит для некоторых установленных голосов, но не работает для других. Он не работает специально для LH Michael и LH Michelle, и сбой зависит от определенных параметров голоса, определенных в PromptBuilder.





Я создал несколько классов в моей библиотеке NAudio, чтобы вы могли конвертировать ваши аудиоданные с другой частотой дискретизации, если вы застряли на 11025 от синтезатора. Взгляните на WaveFormatConversionStream (который использует ACM) или ResamplerDMO (использует объект DirectX Media)
Вполне возможно, что голоса LH Michael и LH Michelle просто не поддерживают частоту дискретизации 8000 Гц (потому что они по своей сути генерируют образцы> 8000 Гц). SAPI позволяет двигателям отклонять неподдерживаемые ставки.
У меня была аналогичная проблема, и я хотел опубликовать ответ, если это кому-то поможет. Эта ветка подтолкнула меня к поиску ответа. Моя проблема заключалась в том, что у меня был вывод SpeechSynthesizer в файл WAV, а затем я воспроизводил этот файл WAV с помощью NAudio. При выводе в файл он работал без изменений. Однако при попытке использовать MemoryStream он воспроизводился, но так быстро, что вы слышали только писк.
Этот код для вывода SpeechSynthesizer устранил проблему, и никаких изменений на стороне NAudio не требуется:
SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null);
synth.SetOutputToAudioStream(streamAudio, synthFormat);
88200 - ключ к успеху. По умолчанию это 11025. Все, что нужно, - это создать SpeechAudioFormatInfo и установить для него значение 88200.
Извините, если я вас перебью, похоже, вы эксперт в аудиофайлах, у меня есть этот вопрос, который меня смутил, не могли бы вы мне помочь?