Распознавание речи на C # с SAPI 5.4 или MS Speech SDK v11 с использованием MemoryStream из звонка Skype

Я пытаюсь заставить SAPI 5.4 (также MS Speech Platform SDK v11) выполнять непрерывное распознавание речи для звука, поступающего из звонка в Skype.

Я могу использовать SKYPE4COMLib, чтобы захватить звук, поступающий из Skype, и передать его через порт TCP, выполнив инструкцию ALTER CALL. Вы можете направить звук Skype в файл или TCP-сокет. Файл работал нормально, но я хочу, чтобы он запускал распознавание в реальном времени, поэтому используйте сокет TCP.

Затем я создал прослушиватель TCP для сбора входящих данных (необработанный аудиоформат) и передачи массива байтов в SAPI как MemoryStream. Я настроил SAPI на ожидание необработанного звука в формате 16 бит, 16 кГц, моно, PCM. Однако событие признания никогда не происходит ?!

Вместо этого я попытался сохранить этот необработанный звук на диск, а затем прочитать его в SAPI, и он отлично работает ... так что сами данные в порядке, и Skype правильно отправляет звук. Однако это не позволяет мне постоянно узнавать, что мне нужно.

Код распознавания SAPI отлично работает с файлом WAV, необработанным файлом, загруженным с диска, или микрофоном. Я просто не могу заставить его работать из MemoryStream.

Я нашел эту похожую статью, ни одно из предложений, кажется, не работает для меня, и обсуждение, похоже, затихло.

Потоковый ввод в System.Speech.Recognition.SpeechRecognitionEngine

Есть ли у кого-нибудь рекомендации о том, как успешно заставить SAPI постоянно распознавать речь из необработанного звука, отправленного как MemoryStream на С #?


person timemirror    schedule 10.09.2012    source источник
comment
Если вы хотите осуществлять непрерывное распознавание, почему вы используете MemoryStream для его буферизации? Вы должны передать NetworkStream непосредственно SAPI, опционально с BufferedStream перед ним. Вам может потребоваться наследовать от NetworkStream, чтобы переопределить Seek.   -  person Dark Falcon    schedule 10.09.2012
comment
Я попробовал это, что было предложено по этой ссылке в вопросе, но не смог заставить его работать. Вы тоже это предлагаете? NetworkStream netStream = новый NetworkStream (сокет, истина); BufferedStream buffStream = новый BufferedStream (netStream, 8000 * 16 * 1); appRecognizer.SetInputToAudioStream (BuffStream, formatInfo);   -  person timemirror    schedule 10.09.2012
comment
Вы должны получить из потока и переопределить Seek, как указано.   -  person Dark Falcon    schedule 10.09.2012
comment
Причина, по которой я пытался использовать MemoryStream, заключается в том, что он поддерживает Seek, а NetworkStream - нет. Итак, я получил данные о NetworkStream и CopyTo (MemStream). Все еще не могу заставить его работать ...   -  person timemirror    schedule 11.09.2012
comment
Ответ Шона здесь работает хорошо .... stackoverflow.com/questions/1682902/   -  person timemirror    schedule 25.10.2012


Ответы (1)


Поскольку вы используете потоковое аудио, я думаю, вам следует использовать recognizer.RecognizeAsync

person Patel.NET    schedule 31.12.2013
comment
Привет, Patel.NET - спасибо, я использую распознаватель.RecognizeAsync (RecognizeMode.Multiple). Проблема заключалась в том, что при потоковой передаче данных никогда не возникает событие распознавания, поэтому вам необходимо переопределить класс потока. - person timemirror; 02.01.2014