Вопрос SpeechSynthesizer.SetOutputToAudioStream: проблема с аудиоформатом - PullRequest
5 голосов
/ 31 октября 2008

В настоящее время я работаю над приложением, которое требует передачи речи, закодированной в определенный аудиоформат.

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.

Ответы [ 3 ]

3 голосов
/ 09 октября 2009

Вполне возможно, что голоса LH Michael и LH Michelle просто не поддерживают частоты дискретизации 8000 Гц (поскольку они по сути генерируют выборки> 8000 Гц). SAPI позволяет двигателям отклонять неподдерживаемые тарифы.

1 голос
/ 24 декабря 2012

У меня была похожая проблема, и я хотел опубликовать ответ, если он кому-нибудь поможет. Эта тема заставила меня найти ответ. Моя проблема заключалась в том, что у меня был вывод 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 - это все, что нужно.

1 голос
/ 03 декабря 2008

Я создал несколько классов в моей библиотеке NAudio , чтобы позволить вам преобразовывать ваши аудиоданные в другую частоту дискретизации, если вы застряли на 11025 из синтезатора. Взгляните на WaveFormatConversionStream (который использует ACM) или ResamplerDMO (использует DirectX Media Object)

...