2012-09-10 12 views
5

Estoy tratando de obtener SAPI 5.4 (también MS Speech Platform SDK v11) para realizar reconocimiento continuo de voz en el audio procedente de Skype llamada.Reconocimiento de voz en C# con SAPI 5.4 o MS Speech SDK v11 utilizando un MemoryStream de Skype call

Puedo usar SKYPE4COMLib para tomar el audio que viene de Skype y presionarlo sobre un puerto TCP emitiendo una instrucción ALTER CALL. Puede dirigir el audio de Skype a un archivo o socket TCP. El archivo funcionó bien, pero quiero que ejecute el reconocimiento en vivo, así que use el socket TCP.

Luego construí un oyente TCP para reunir los datos entrantes (formato raw de audio) y pasar el conjunto de bytes como un MemoryStream a SAPI. Configuré SAPI para esperar audio en bruto en el formato de 16 bits, 16khz, mono, PCM. Sin embargo, nunca ocurre un evento de reconocimiento?

He intentado guardar ese audio en bruto en el disco, y luego leerlo en SAPI y funciona bien ... así que los datos están bien y Skype está enviando correctamente el audio. Sin embargo, esto no me permite hacer el reconocimiento continuo que necesito.

El código de reconocimiento SAPI funciona bien utilizando un archivo WAV, o un archivo sin formato cargado desde un disco o un micrófono. Simplemente no puedo hacer que funcione desde un MemoryStream.

Encontré este artículo similar, ninguna de las sugerencias parece funcionar para mí, y la discusión parece haber quedado en silencio.

Streaming input to System.Speech.Recognition.SpeechRecognitionEngine

¿alguien tiene alguna orientación sobre cómo conseguir con éxito SAPI para reconocer el habla continua de audio en bruto enviado como MemoryStream en C#?

+0

Si usted quiere hacer un reconocimiento continuo, ¿por qué estás usando un 'MemoryStream' para amortiguar ella? Debe dar un 'NetworkStream' directamente a SAPI, opcionalmente con un BufferedStream delante de él. Es posible que deba derivar de 'NetworkStream' para anular' Seek'. –

+0

Intenté esto que se sugirió en ese enlace en la pregunta, pero no pude hacerlo funcionar. ¿Es esto lo que estás sugiriendo también? NetworkStream netStream = new NetworkStream (socket, true); BufferedStream buffStream = new BufferedStream (netStream, 8000 * 16 * 1); appRecognizer.SetInputToAudioStream (buffStream, formatInfo); – timemirror

+0

Debe derivar de la secuencia y anular Búsqueda, como se indica. –

Respuesta

0

Como está utilizando streaming de audio, creo que se debe utilizar recognizer.RecognizeAsync

+0

Hola Patel.NET - gracias, estoy usando recognizer.RecognizeAsync (RecognizeMode.Multiple). El problema era que cuando transmites datos, nunca aumenta el evento de reconocimiento, por lo que debes anular la clase de flujo. – timemirror

Cuestiones relacionadas