2010-01-25 8 views
5

¿Alguien sabe cómo cambiar los perfiles de reconocimiento desde una aplicación .NET?System.Speech.Recognition Elección del perfil de reconocimiento

Estoy escribiendo una aplicación .NET que hace reconocimiento de voz utilizando las capacidades que se encuentran en el espacio de nombres System.Speech.Recognition. El audio que estoy alimentando al sistema proviene de múltiples usuarios diferentes. Me gustaría ser capaz de entrenar el sistema para reconocer con más precisión el habla de cada uno de los diferentes usuarios.

Encontré el panel de control Reconocimiento de voz en Windows (Windows 7 en este caso) donde puedo configurar los perfiles de entrenamiento. Configurar un perfil para mí y hacer el proceso de capacitación mejoró significativamente la precisión del reconocimiento. Así que pude configurar perfiles para cada usuario y hacer que ellos realicen el proceso de capacitación, pero luego debo poder seleccionar el perfil correcto en mi aplicación.

Mi aplicación es un "servidor" que recibe transmisiones de audio de uno o más usuarios a la vez y realiza el reconocimiento de voz. Por lo tanto, debo ser capaz de especificar qué perfil de reconocimiento usará programáticamente para cada instancia del motor de reconocimiento que crea mi aplicación. Esta no es una aplicación de usuario única, por lo que no puedo simplemente hacer que seleccionen su perfil desde el panel de control de Windows.

Respuesta

3

No veo una forma de hacerlo a través de System.Speech.Recognition, pero puede hacerlo a través de speechlib (la API compatible con SAPI IDispatch). Mira ISpeechRecognizer::Profile.

Para que el modo, tendrá que añadir

using SpeechLib; 

a su código, junto con System.Speech.Recognition.

La parte difícil sería conseguir que el perfil que establezca a través de SpeechLib se 'adhiera' mientras está creando el System.Speech.Recognition.RecognitionEngine. Probablemente configuraría el perfil como predeterminado (a través de SpeechLib), crearé RecognitionEngine y restablecería el perfil predeterminado.

(estoy asumiendo que usted no está planeando utilizar el reconocedor compartida, que no va a funcionar en un escenario multiusuario.)

es probable que tengas una sección crítica para asegurarse de que sólo uno thread puede crear el RecognitionEngine a la vez.

0

¿qué le parece pedirles a cada uno que digan su nombre para prepararlo con un usuario determinado?

no es un método muy seguro si desea que esta solución tenga cierta cantidad de autenticación ... podría decirles que utilicen una frase dada que el sistema reconocerá como un "determinado usuario" que no puede realmente ser falso?

esto es bastante interesante, tengo que decirlo.

+0

Gracias Oren. De hecho, tengo una forma de identificar qué usuario se está conectando al servidor. Lo que estoy tratando de encontrar es que, dado que sé qué usuario está conectado, ¿cómo puedo especificar al motor de reconocimiento que debe estar utilizando un perfil de entrenamiento preconfigurado específico, para que reconozca con precisión las palabras que habló el usuario? Parece que esto se puede hacer a través de la API C++, pero espero que alguien sepa cómo hacerlo a través de la API .NET/C#. –

0

Puede usar el registro para cambiar el perfil predeterminado. El registro contiene una lista de perfiles. Puede agregarlos fácilmente a través del diálogo de propiedades de voz. Entrena el perfil y está listo para usar.

Cambie el perfil predeterminado en el registro e inicie el motor de voz y está utilizando ese perfil. Esto tiene trabajo para diferentes versiones de Windows, no se han probado en varias instancias.

La clave de registro se encuentra en. HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles cambiar el "DefaultTokenId" valor clave a HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles \ Fichas {7A8C84A3-44DA-488F-A27D-BC5BC326A8BE}

Aquí está la forma de mirar a través de perfiles y establecer un perfil como predeterminado.

 RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Speech\RecoProfiles\Tokens"); 
     _profiles = rk.GetSubKeyNames(); 
     string findname = "{7A8C84A3-44DA-488F-A27D-BC5BC326A8BE}"; 
     string name = ""; 
     foreach (String s in _profiles) 
     { 
      using (RegistryKey sk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Speech\RecoProfiles\Tokens\" + s)) 
      { 
       if (sk != null) 
        name = (string)sk.GetValue(""); 
       if (name == findname) break; 
      } 
     } 
     RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Speech\RecoProfiles", true); 
     rk.SetValue("DefaultTokenId", @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\RecoProfiles\Tokens\" + name);