Estoy usando la biblioteca de reconocimiento de voz WPF, tratando de usarla en una aplicación de escritorio como alternativa a los comandos de menú. (Quiero centrarme en la experiencia de la tableta, donde no tienes un teclado). Funciona, más o menos, excepto que la precisión del reconocimiento es tan mala que es inutilizable. Así que traté de dictar en Word. Word funcionó razonablemente bien. Estoy usando el micrófono de mi computadora portátil incorporado en ambos casos, y ambos programas son capaces de escuchar el mismo discurso simultáneamente (siempre que Word retenga el enfoque del teclado), pero Word lo hace bien y WPF hace un trabajo pésimo.
Probé tanto un DictationGrammar() genérico como una pequeña gramática especializada, y probé tanto "en-US" como "en-AU", y en todos los casos Word funciona bien y WPF funciona mal. Incluso comparando la gramática especializada en WPF con la gramática general en Word, WPF se equivoca el 50% de las veces, por ejemplo, al escuchar "tamaño pequeño" como "color pequeño".
private void InitSpeechRecognition() { recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")); // Create and load a grammar. if (false) { GrammarBuilder grammarBuilder = new GrammarBuilder(); Choices commandChoices = new Choices("weight", "color", "size"); grammarBuilder.Append(commandChoices); Choices valueChoices = new Choices(); valueChoices.Add("normal", "bold"); valueChoices.Add("red", "green", "blue"); valueChoices.Add("small", "medium", "large"); grammarBuilder.Append(valueChoices); recognizer.LoadGrammar(new Grammar(grammarBuilder)); } else { recognizer.LoadGrammar(new DictationGrammar()); } // Add a handler for the speech recognized event. recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); // Configure input to the speech recognizer. recognizer.SetInputToDefaultAudioDevice(); // Start asynchronous, continuous speech recognition. recognizer.RecognizeAsync(RecognizeMode.Multiple); }Resultados de muestra de Word:
Hello make it darker I want a brighter colour make it reader make it greener thank you make it bluer make it more blue make it darker turn on debugging turn off debugging zoom in zoom outEl mismo audio en WPF, gramática de dictado:
a lower make it back when Ted Brach making reader and he liked the ethanol and act out to be putting it off the parking zoom in and outObtuve el ensamblaje usando Nuget. Estoy usando Runtime version=v4.0.30319 y version=4.0.0.0. Si se supone que debo "entrenarlo", la documentación no explica cómo hacerlo, y no sé si el entrenamiento se comparte con otros programas como Word o dónde se guarda el entrenamiento. He estado jugando con él el tiempo suficiente para que reconozca el sonido de mi voz.
¿Alguien puede decirme qué estoy haciendo mal?
Esto se espera. El dictado de Word utiliza un servicio de voz asistido por IA/ML basado en la nube: Azure Cognitive Services - Speech To Text . Está siendo constantemente entrenado y actualizado para la mejor precisión. Puede probar esto fácilmente desconectándose y probando la función de dictado en Word; no funcionará.
System.Speech de .NET usa el SAPI5 fuera de línea que no se ha actualizado desde Windows 7, que yo sepa. La tecnología central en sí (era de Windows 95) es mucho más antigua que la que está disponible en los teléfonos o servicios basados en la nube actuales. Microsoft.Speech.Recognition también usa un núcleo similar y no será mucho mejor, aunque puede intentarlo.
Si desea explorar otras opciones sin conexión, le sugiero que pruebe Windows.Media.SpeechRecognition . Hasta donde yo sé, es la misma tecnología que usan Cortana y otras aplicaciones modernas de reconocimiento de voz en Windows 8 y versiones posteriores y no usa SAPI5.
Es bastante fácil encontrar ejemplos para Azure o Windows.Media.SpeechRecognition en línea, la mejor manera de usar este último sería actualizar su aplicación a .NET 5 y usar C#/WinRT para acceder a las API de UWP.
Su mejor apuesta diría que no use DictationGrammar sino gramáticas específicas con frases completas o con asignaciones de valores clave:
private static SpeechRecognitionEngine CreateRecognitionEngine() { var cultureInf = new System.Globalization.CultureInfo("en-US"); var recoEngine = new SpeechRecognitionEngine(cultureInf); recoEngine.SetInputToDefaultAudioDevice(); recoEngine.LoadGrammar(CreateKeyValuesGrammar(cultureInf, "weight", new string[] { "normal", "bold", "demibold" })); recoEngine.LoadGrammar(CreateKeyValuesGrammar(cultureInf, "color", new string[] { "red", "green", "blue" })); recoEngine.LoadGrammar(CreateKeyValuesGrammar(cultureInf, "size", new string[]{ "small", "medium", "large" })); recoEngine.LoadGrammar(CreateKeyValuesGrammar(cultureInf, "", new string[] { "Put whole phrase here", "Put whole phrase here again", "another long phrase" })); return recoEngine; } static Grammar CreateKeyValuesGrammar(CultureInfo cultureInf, string key, string[] values) { var grBldr = string.IsNullOrWhiteSpace(key) ? new GrammarBuilder() { Culture = cultureInf } : new GrammarBuilder(key) { Culture = cultureInf }; grBldr.Append(new Choices(values)); return new Grammar(grBldr); } También puede intentar usar Microsoft.Speech.Recognition . Consulte ¿Cuál es la diferencia entre System.Speech.Recognition y Microsoft.Speech.Recognition?
Si todos necesitan usar un motor de reconocimiento de voz que tenga el 90 % de la precisión de Cortana, deben seguir estos pasos.
Paso 1) Descargue el paquete Nugget Microsoft.Windows.SDK.Contracts
Paso 2) Migrar a la referencia del paquete SDK --> https://devblogs.microsoft.com/nuget/migrate-packages-config-to-package-reference/
El SDK mencionado anteriormente le proporcionará el sistema de reconocimiento de voz de Windows 10 dentro de las aplicaciones Win32. Esto debe hacerse porque la única forma de usar este motor de reconocimiento de voz es crear una aplicación de Plataformas universales de Windows. No recomiendo hacer una aplicación de IA en la Plataforma universal de Windows porque tiene sandboxing. La función de sandboxing está aislando la aplicación en un contenedor y no permitirá que se comunique con ningún hardware y también hará que el acceso a los archivos sea un dolor absoluto y la gestión de subprocesos no es posible, solo funciones asíncronas.
Paso 3) Agregue este espacio de nombres en la sección de espacios de nombres. Este espacio de nombres tiene todas las funciones relacionadas con el reconocimiento de voz en línea.
using Windows.Media.SpeechRecognition;Paso 4) Agregue la implementación de reconocimiento de voz.
Task.Run(async()=> { try { var speech = new SpeechRecognizer(); await speech.CompileConstraintsAsync(); SpeechRecognitionResult result = await speech.RecognizeAsync(); TextBox1.Text = result.Text; } catch{} });La mayoría de los métodos dentro de la clase SpeechRecognizer de Windows 10 deben llamarse de forma asíncrona y esto significa que debe ejecutarlos dentro de una función lambda Task.Run(async()=>{}) con un parámetro asíncrono, un método asíncrono o un método de tarea asíncrona.
Para que esto funcione, vaya a Configuración -> Privacidad -> Voz en el sistema operativo y verifique si el reconocimiento de voz en línea está permitido.