2010-01-25 10 views
5

Kann jemand Erkennungsprofile aus einer .NET-Anwendung heraus ändern?System.Speech.Recognition Auswählen des Erkennungsprofils

Ich schreibe eine .NET-Anwendung, die Spracherkennung mithilfe der Funktionen im System.Speech.Recognition-Namespace ausführt. Die Audiodaten, die ich in das System einspeise, stammen von mehreren verschiedenen Benutzern. Ich möchte in der Lage sein, das System zu trainieren, um Sprache von jedem der verschiedenen Benutzer genauer zu erkennen.

Ich habe die Systemsteuerung für die Spracherkennung in Windows gefunden (in diesem Fall Windows 7), wo ich Trainingsprofile konfigurieren kann. Das Erstellen eines Profils für mich selbst und das Durchführen des Trainingsprozesses hat die Genauigkeit der Erkennung erheblich verbessert. So konnte ich Profile für jeden Benutzer einrichten und sie den Trainingsprozess durchführen lassen, aber dann muss ich in der Lage sein, das richtige Profil in meiner Anwendung auszuwählen.

Meine Anwendung ist ein "Server", der Audio-Streams von einem oder mehreren Benutzern gleichzeitig empfängt und die Spracherkennung durchführt. Also muss ich in der Lage sein, anzugeben, welches Erkennungsprofil programmatisch für jede Instanz der Erkennungs-Engine verwendet werden soll, die meine Anwendung erstellt. Dies ist keine einzelne Benutzeranwendung, daher kann ich sie nicht einfach über das Windows-Kontrollfeld auswählen lassen.

Antwort

3

Ich sehe keine Möglichkeit, es über System.Speech.Recognition zu tun, aber Sie können es über Speechlib (die SAPI IDispatch-kompatible API) tun. Schau dir ISpeechRecognizer::Profile an.

das Profil einzustellen, müssen Sie

using SpeechLib; 

, um Ihren Code zu schreiben, zusammen mit System.Speech.Recognition.

Der schwierige Teil wäre, das Profil zu erhalten, das Sie über SpeechLib festgelegt haben, um während der Erstellung der System.Speech.Recognition.RecognitionEngine zu bleiben. Ich würde wahrscheinlich das Profil als Standard festlegen (über SpeechLib), die RecognitionEngine erstellen und das Standardprofil zurücksetzen.

(Ich gehe davon aus, dass Sie nicht den gemeinsamen Erkennungs nutzen möchten, die in einer Multi-User-Szenario wird nicht funktionieren.)

Sie werden wahrscheinlich einen kritischen Abschnitt müssen sicherstellen, dass nur ein Der Thread kann die Recognition Engine gleichzeitig erstellen.

0

Wie wäre es, wenn Sie sie bitten, ihren Namen zu sagen, um sie mit einem bestimmten Benutzer zu beginnen?

Es ist keine sehr sichere Methode, wenn Sie möchten, dass diese Lösung eine gewisse Authentifizierungsstufe hat ... Sie könnten ihnen sagen, dass sie eine bestimmte Phrase verwenden sollen, die das System als 'bestimmten Benutzer' erkennt wirklich gefälscht sein?

das ist ziemlich interessant, aber ich muss sagen.

+0

Danke Oren. Ich habe tatsächlich eine Möglichkeit zu identifizieren, welcher Benutzer eine Verbindung zum Server herstellt. Was ich versuche zu finden, ist, dass ich weiß, welcher Benutzer verbunden ist, wie kann ich der Erkennungs-Engine angeben, dass sie ein bestimmtes vorkonfiguriertes Trainingsprofil verwenden soll, damit sie die Worte, die der Benutzer gesprochen hat, genau erkennt. Es scheint, dass dies durch die C++ API geschehen kann, aber ich hoffe, dass jemand weiß, wie man es über die .NET/C# API macht. –

0

Sie können die Registrierung verwenden, um das Standardprofil zu ändern. Die Registrierung enthält eine Liste von Profilen. Sie können sie einfach über den Spracheigenschaften-Dialog hinzufügen. Trainiere das Profil und es ist einsatzbereit.

Ändern Sie das Standardprofil in der Registrierung und starten Sie die Sprach-Engine, die dieses Profil verwendet. Dies funktioniert für verschiedene Windows-Versionen, habe nicht an mehreren Instanzen versucht.

Der Registrierungsschlüssel befindet sich bei. HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles Ändern Sie den "DefaultTokenId" Schlüsselwert HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles \ Tokens {7A8C84A3-44DA-488F-A27D-BC5BC326A8BE}

Hier ist, wie sie aussehen durch Profile und legen Sie ein Profil als Standard fest.

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