2010-01-25 5 views
5

Qualcuno sa come modificare i profili di riconoscimento da un'applicazione .NET?System.Speech.Recognition Scelta del profilo di riconoscimento

Sto scrivendo un'applicazione .NET che esegue il riconoscimento vocale utilizzando le funzionalità disponibili nello spazio dei nomi System.Speech.Recognition. L'audio che sto alimentando nel sistema proviene da più utenti diversi. Mi piacerebbe essere in grado di addestrare il sistema a riconoscere in modo più accurato il parlato da ciascuno dei diversi utenti.

Ho trovato il pannello di controllo Riconoscimento vocale in Windows (Windows 7 in questo caso) in cui posso configurare i profili di allenamento. La creazione di un profilo per me stesso e il processo di addestramento hanno migliorato in modo significativo l'accuratezza del riconoscimento. Così ho potuto impostare i profili per ogni utente e fargli fare il processo di formazione, ma poi devo essere in grado di selezionare il profilo giusto nella mia applicazione.

La mia applicazione è un "server" che riceve flussi audio da uno o più utenti alla volta ed esegue il riconoscimento vocale. Quindi devo essere in grado di specificare quale profilo di riconoscimento usare a livello di programmazione per ogni istanza del motore di riconoscimento creata dalla mia applicazione. Questa non è una singola applicazione utente, quindi non posso semplicemente selezionarne il profilo dal pannello di controllo di Windows.

risposta

3

Non vedo un modo per farlo tramite System.Speech.Recognition, ma è possibile farlo tramite speechlib (l'API compatibile con IDispatch SAPI). Guarda ISpeechRecognizer::Profile.

Per impostare il profilo, è necessario aggiungere

using SpeechLib; 

al codice, insieme con System.Speech.Recognition.

La parte difficile sarebbe ottenere il profilo impostato tramite SpeechLib su "stick" mentre si sta creando System.Speech.Recognition.RecognitionEngine. Probabilmente impostare il profilo come predefinito (tramite SpeechLib), creare RecognitionEngine e ripristinare il profilo predefinito.

(sto supponendo che non avete intenzione di utilizzare il sistema di riconoscimento condiviso, che non funziona in uno scenario multiutente.)

Probabilmente avrete bisogno di una sezione critica per assicurarsi che solo un thread può creare il RecognitionEngine alla volta.

0

come chiedere a ciascuno di dire il proprio nome per innescarlo con un determinato utente?

non è un metodo molto sicuro se desideri che questa soluzione abbia una certa quantità di autenticazione ... potresti dire loro di usare una determinata frase che il sistema riconoscerà come un "determinato utente" che non può davvero essere falsificato?

questo è piuttosto interessante però, devo dire.

+0

Grazie Oren. In realtà ho un modo per identificare quale utente si connette al server. Quello che sto cercando di trovare è, dato che so quale utente è connesso, come posso specificare al motore di riconoscimento che dovrebbe usare un profilo di allenamento preconfigurato specifico, in modo che riconosca accuratamente le parole che l'utente ha pronunciato. Sembra che questo possa essere fatto attraverso l'API C++, ma spero che qualcuno sappia come farlo attraverso l'API .NET/C#. –

0

È possibile utilizzare il Registro di sistema per modificare il profilo predefinito. Il registro contiene un elenco di profili. Puoi aggiungerli facilmente tramite la finestra di dialogo delle proprietà del discorso. Allena il profilo e è pronto per l'uso.

Modificare il profilo predefinito nel Registro di sistema e avviare il modulo di sintesi vocale e il suo utilizzo è tale profilo. Questo ha funzionato per diverse versioni di Windows, non ho provato su più istanze.

La chiave di registro si trova in. HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles cambiare il "DefaultTokenId" valore della chiave HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles \ Gettoni {7A8C84A3-44DA-488F-A27D-BC5BC326A8BE}

Ecco come cercare attraverso i profili e impostare un profilo come predefinito.

 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);