2008-10-22 13 views
53

Tengo que escribir una aplicación que utiliza un motor de reconocimiento de voz, ya sea el built-in-one o el tercero, que puede mostrar una palabra o frase, y reconocer cuando el usuario lo lee (o una aproximación de eso). También necesito poder cambiar rápidamente entre idiomas, sin cambiar el idioma del sistema operativo.C# Reconocimiento de voz: ¿es esto lo que dijo el usuario?

Los usuarios utilizarán el sistema por períodos muy cortos. La aplicación debe funcionar sin el requisito de primero entrenar el motor de reconocimiento a las voces de los usuarios.

También sería fantástico si esto pudiese funcionar en Windows XP o en versiones inferiores de Windows Vista.

Opcionalmente, el sistema debe poder leer la información en la pantalla de vuelta al usuario, en el idioma seleccionado por el usuario. Puedo trabajar alrededor de esta especificación usando grabaciones en off pregrabadas, pero el método preferido sería usar un motor de conversión de texto a voz.

¿Alguien puede recomendar algo para mí?

+0

Por favor, aclare ... ¿Qué quiere decir? ¿Te refieres a un motor de reconocimiento? Una estructura para la aplicación? Si incluso debería intentar hacerlo? –

+2

Principalmente estoy buscando un motor para usar. Necesito poder decirle a mis gerentes si la idea es factible o no. Ya tengo una idea aproximada de cómo estructurar la aplicación alrededor del motor, todo lo que necesito es conectar el motor. – RichieACC

Respuesta

7

Si el motor es lo que estás preguntando por entonces he encontrado (cuidado, sólo estoy lista, no he probado ninguno de ellos):

Lumenvox engine

también tiene el SAPI SDK de Microsoft mismo, solo lo he probado para texto a voz, pero según su definición:

El SDK también incluye motores de texto a voz (TTS) de distribución libre (en inglés estadounidense y chino simplificado) y motores de reconocimiento de voz (SR) (en inglés de EE. UU., Simp chino simplificado y japonés).

+1

¡Parece que el motor Lumenvox podría hacer el truco! Voy a tener que jugar un poco con eso para estar seguro. También es necesario discutir los precios con los gerentes. Gracias Jorge! – RichieACC

0

Dragon Naturally Speaking SDK valdría la pena mirar. This project parecía interesante.

No tengo que jugar con ninguno de ellos.

+0

Enlace muerto y el "Este proyecto" es sobre texto a voz, no reconocimiento de voz – Levitikon

+0

@Levitikon ¿Leyó la última parte de la pregunta antes de que me votara? Estaba buscando una pieza de reconocimiento de voz ** y ** texto a voz. No es de extrañar que un enlace de 3 años o más haya muerto. Lo actualicé – itsmatt

+0

¿es compatible con griego? –

3

Tenga en cuenta que no obtendrá buenos resultados si no necesita capacitación primero. El reconocimiento de voz es una aplicación estadística de la fonética, un campo que es bastante franco sobre el hecho de que hay tanta variación en la señal que es casi un milagro que alguien pueda entender lo que dice cualquier otra persona. Un motor de reconocimiento de voz listo para usar probablemente tenderá hacia un acento más general de inglés, pero fallará miserablemente por algo incluso ligeramente diferente.

Es por eso que la capacitación es tan importante. Podemos hacerlo bien al sobreajustar con facilidad, especialmente si reducimos el espacio problemático. ¿Pero crear una solución de aprendizaje de máquina extensible? Ahí siempre está el problema.

Dicho esto, considere Sphinx-4. Es una solución lista para usar escrita en Java disponible en http://cmusphinx.sourceforge.net/sphinx4/

+2

+1 para la advertencia sobre no aprender, solo estoy deseando que haya un puerto .NET para Sphinx-4. – nemesisfixx

57

Hace un tiempo se hizo una pregunta similar sobre Joel en software. Puede usar el espacio de nombre System.Speech.Recognition para hacer esto ... con algunas limitaciones. Agregue System.Speech (debe estar en el GAC) a su proyecto. Aquí hay un código de ejemplo para una aplicación de WinForms:

public partial class Form1 : Form 
{ 
    SpeechRecognizer rec = new SpeechRecognizer(); 

    public Form1() 
    { 
    InitializeComponent(); 
    rec.SpeechRecognized += rec_SpeechRecognized; 
    } 

    void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
    lblLetter.Text = e.Result.Text; 
    } 

    void Form1_Load(object sender, EventArgs e) 
    { 
    var c = new Choices(); 
    for (var i = 0; i <= 100; i++) 
     c.Add(i.ToString()); 
    var gb = new GrammarBuilder(c); 
    var g = new Grammar(gb); 
    rec.LoadGrammar(g); 
    rec.Enabled = true; 
    } 

Esto reconoce los números de 1 a 100, y muestra el número resultante en el formulario. Necesitará un formulario con una etiqueta llamada lblLetter.

System.Speech solo funciona con una lista predefinida de palabras o frases; no es exactamente NaturallySpeaking, ni en versatilidad ni en calidad de reconocimiento. Pero no tiene que entrenarlo para la voz del usuario, y si solo tiene algunas cosas diferentes que el usuario puede decir, funciona razonablemente bien. ¡Y es gratis! (si tiene Visual Studio)

No funcionará bien si utiliza frases muy cortas; Hice un programa para que mi hijo dijera letras del abecedario y las vea en la pantalla, pero no funciona bien, ya que muchas de las letras suenan igual (especialmente por la boca de un niño de cuatro años).

En cuanto a las opciones más flexibles ... bueno, está el ya mencionado NaturallySpeaking, que tiene un SDK. Pero tiene que ponerse en contacto con las ventas para obtener cualquier tipo de acceso a él, y no se enumera ningún precio, por lo que aparece como uno de esos "¿Cuánto cuesta? Bueno, ¿cuánto tiene?" tipo de cosas. No parece haber una opción de "descargar y jugar con eso". :(

En cuanto a texto a voz, System.Speech.Synthesis hace esto. Es incluso más fácil que el reconocimiento de voz. Escribí un pequeño programa que me permitía escribir, presionar Enter y leer el texto en voz alta. edad se hipnotizado por ella :) ("Papi, quiero TAWK que da wobot.")

+0

¿Cómo adaptaría este código para reconocer 1 - 100 en francés o alemán sin necesidad de cambiar el idioma de visualización del sistema operativo? – RichieACC

+1

El único idioma posible es el de su sistema operativo. Acabo de leerlo desde MSDN. –

+4

Creo que su comentario de que "solo funciona con una lista predefinida de palabras o frases" no es cierto. El reconocedor de escritorio en Vista y posterior incluye una gramática de dictado que puede cargar. Consulte http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar.aspx –

16

[Nota: yo era el líder de desarrollo para la API de reconocimiento de voz administrado en .NET 3.0].

sistema. Speech es parte de .NET 3.0, por lo que está disponible en Vista y XP. En Vista, tiene el beneficio adicional de tener un motor de reconocimiento de voz preinstalado por el sistema operativo. En XP sus opciones son: use el SAPI 5.1 SDK con un motor muy antiguo (pero podría funcionar lo suficientemente bien para su escenario de comando y control), instale Office 2003 que instala una versión más nueva del reconocedor. También hay algunos motores de reconocimiento de voz compatibles con SAPI 5 disponibles.

Si necesita cambiar de idioma, querrá usar la clase System.Speech.Recognition.SpeechRecognitionEngine que le permite elegir el motor SR para el idioma que necesita admitir. Tenga en cuenta que los motores están definidos por un conjunto de idiomas que admiten (pueden estar utilizando el mismo binario, solo intercambiando archivos de datos para admitir idiomas adicionales).

Comente si necesita saber más.

Philipp

+0

Phillip, si quiero usar el motor y entrenarlo para aprender y reconocer el croata hablado, como una forma de transcribir varios altavoces, ¿es posible, y si es, por dónde empezar? –

+0

Hay 2 partes para un reconocedor de voz: modelos acústicos y modelo de lenguaje. Puede usar el Kit de recursos de dictado de Vista (o algo así) para crear un modelo de lenguaje de dictado que haga referencia a las palabras en croata. Actualmente no hay herramientas para capacitar a los modelos acústicos que desearía hacer si hay sonidos en croata que no están presentes en inglés (o cualquier otro idioma de SR existente que esté utilizando). Puede especificar pronunciaciones personalizadas para sus palabras en croata para mejorar la precisión de su reconocimiento. –

+0

Phillip, he estado jugando con las bibliotecas que sugeriste, pero me ha costado mucho conseguir que reconozca lo que dije. Tengo un pequeño acento, pero no he tenido esta experiencia en otros dispositivos, como kinect, etc. ¿Debería considerar que mi micrófono no es lo suficientemente bueno o estoy haciendo algo mal? Entonces, ¿tienes alguna sugerencia? PD. Estoy usando el ejemplo en la documentación de MSDN. – Oakcool

10

Antes de este complemento referencia 'Speech'

System.Speech

encontrado que el ejemplo de código publicado por Kyralessa el oct 22a no funcionó para mí, pero una versión ligeramente modificada hizo. Al agregar cadenas en el objeto Elecciones, utilice palabras en inglés de texto completo, no números. Parece que el motor de reconocimiento de voz MS no puede reconocer los números por sí mismos.

He marcado estas modificaciones con algunos comentarios agregados al ejemplo anterior.

public partial class Form1 : Form 
{ 
    SpeechRecognizer rec = new SpeechRecognizer(); 

    public Form1() 
    { 
    InitializeComponent(); 
    rec.SpeechRecognized += rec_SpeechRecognized; 
    } 

    void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
    lblLetter.Text = e.Result.Text; 
    } 

    void Form1_Load(object sender, EventArgs e) 
    { 
    var c = new Choices(); 

    // Doens't work must use English words to add to Choices and 
    // populate grammar. 
    // 
    //for (var i = 0; i <= 100; i++) 
    // c.Add(i.ToString()); 

    c.Add("one"); 
    c.Add("two"); 
    c.Add("three"); 
    c.Add("four"); 
    // etc... 

    var gb = new GrammarBuilder(c); 
    var g = new Grammar(gb); 
    rec.LoadGrammar(g); 
    rec.Enabled = true; 
    } 
+0

No estoy seguro de por qué no funcionó para usted; el código que publiqué vino directamente de un programa que escribí y usé, y funcionó para mí. Tal vez está relacionado con la configuración de cultura en su sistema? –

+0

Podría ser. No me fijé en esto extremadamente en profundidad. –

0

Este es el artículo de la revista MSDN que discutió por primera vez el uso de las API System.Speech para Vista. Algunos de ellos están desactualizados porque la API cambió entre beta (cuando se escribió el artículo) y el lanzamiento de Vista, pero este sigue siendo uno de los mejores recursos que he encontrado y cubre una buena introducción al espacio de nombres System.Speech . Ver http://msdn.microsoft.com/en-us/magazine/cc163663.aspx

0

Bueno, esta pregunta ya tiene muchas buenas respuestas, pero creo que es valioso para actualizar con algo de información a partir de 2016 la documentación de las respuestas de Rob Segal y Philipp Schmid apuntando a este bonito ejemplo de código:

https://msdn.microsoft.com/en-us/library/office/system.speech.recognition.speechrecognitionengine.aspx

No usó el reconocedor compartido de Windows (El pequeño Windows Mic que se muestra en el medio de la pantalla), usa una aplicación agradable SpeechRecognitionEngine que no necesita ninguna señal visual. La interfaz de usuario está completamente bajo su control.

Cuestiones relacionadas