6

.NET アプリケーション内から認識プロファイルを変更する方法を知っている人はいますか?

System.Speech.Recognition 名前空間にある機能を使用して音声認識を行う .NET アプリケーションを作成しています。システムに供給しているオーディオは、複数の異なるユーザーからのものです。さまざまなユーザーの音声をより正確に認識できるようにシステムをトレーニングできるようにしたいと考えています。

Windows (この場合は Windows 7) でトレーニング プロファイルを構成できる音声認識コントロール パネルを見つけました。自分のプロファイルを設定し、トレーニング プロセスを実行することで、認識の精度が大幅に向上しました。そのため、すべてのユーザーのプロファイルをセットアップしてトレーニング プロセスを実行させることができますが、アプリケーションで適切なプロファイルを選択できるようにする必要があります。

私のアプリケーションは、一度に 1 人以上のユーザーからオーディオ ストリームを受信し、音声認識を実行する「サーバー」です。そのため、アプリケーションが作成する認識エンジンのインスタンスごとに、どの認識プロファイルをプログラムで使用するかを指定できる必要があります。これはシングル ユーザー アプリケーションではないため、Windows コントロール パネルからプロファイルを選択させることはできません。

4

3 に答える 3

4

System.Speech.Recognition 経由で行う方法はわかりませんが、speechlib (SAPI IDispatch 互換 API) 経由で行うことができます。ISpeechRecognizer::Profileを見てください。

プロファイルを設定するには、追加する必要があります

using SpeechLib;

System.Speech.Recognition とともにコードに追加します。

注意が必要なのは、System.Speech.Recognition.RecognitionEngine の作成中に、SpeechLib を介して設定したプロファイルを取得することです。おそらく、(SpeechLib を介して) プロファイルをデフォルトに設定し、RecognitionEngine を作成して、デフォルト プロファイルをリセットします。

(マルチユーザー シナリオでは機能しない共有認識エンジンを使用する予定はないと仮定しています。)

一度に 1 つのスレッドだけが RecognitionEngine を作成できるようにするには、おそらくクリティカル セクションが必要です。

于 2010-02-03T18:15:35.847 に答える
1

レジストリを使用して、既定のプロファイルを変更できます。レジストリには、プロファイルのリストが含まれています。音声プロパティ ダイアログから簡単に追加できます。プロファイルをトレーニングし、すぐに使用できるようにします。

レジストリのデフォルト プロファイルを変更し、音声エンジンを開始すると、そのプロファイルが使用されます。これはさまざまな Windows バージョンで機能しますが、複数のインスタンスでは試していません。

レジストリ キーは次の場所にあります。HKEY_CURRENT_USER\Software\Microsoft\Speech\RecoProfiles 「DefaultTokenId」キーの値を HKEY_CURRENT_USER\Software\Microsoft\Speech\RecoProfiles\Tokens{7A8C84A3-44DA-488F-A27D-BC5BC326A8BE} に変更します

プロファイルを調べて、プロファイルをデフォルトとして設定する方法は次のとおりです。

        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);
于 2013-06-28T21:55:23.100 に答える
0

与えられたユーザーでそれをプライミングするために彼らに彼らの名前を言うように頼むのはどうですか?

このソリューションにある程度の認証を持たせたい場合は、あまり安全な方法ではありません...システムが実際には偽造できない「特定のユーザー」として認識する特定のフレーズを使用するように指示できますか?

これはかなり面白いですが、私は言わなければなりません。

于 2010-01-26T01:42:38.503 に答える