30

私は、大学のプロジェクト用にスピーチからテキストへのキャプション アプリケーションのプロトタイプを開発しています。プロジェクトの後半でジェスチャ認識を使用する予定なので、追加のマイクを使用するのではなく、Kinect をマイク ソースとして使用することをお勧めします。私のアプリケーションのアイデアは、長くて複雑な文などの自発的な発話を認識することです (ただし、発話の口述が完璧ではないことは理解しています)。Microsoft.Speech を参照しているが、System.Speech を参照していない Kinect 音声サンプルを多数見てきました。音声エンジンをトレーニングし、DictationGrammar を音声認識エンジンに読み込む必要があるため、Microsoft.Speech が唯一の選択肢です。

Kinect をダイレクト マイク オーディオ ソースとして使用している間、なんとか動作させることができましたが、ビデオ プレビューとジェスチャー認識のために Kinect をロードしているため、ダイレクト マイクとしてアクセスできません。

これは、ジェスチャーなどのために Kinect ハードウェアをロードせずにマイクに直接アクセスするコードであり、完全に機能します。

private void InitializeSpeech()
{
    var speechRecognitionEngine = new SpeechRecognitionEngine();
    speechRecognitionEngine.SetInputToDefaultAudioDevice();
    speechRecognitionEngine.LoadGrammar(new DictationGrammar());
    speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text);
}

これは、Kinect がロードされた後、Kinect を介してアクセス ソースにアクセスする必要がある場所です。Kinect は何も実行していません。これは私がやりたいことです:

using (var audioSource = new KinectAudioSource())
{
    audioSource.FeatureMode = true;
    audioSource.AutomaticGainControl = false;
    audioSource.SystemMode = SystemMode.OptibeamArrayOnly;

    var recognizerInfo = GetKinectRecognizer();
    var speechRecognitionEngine = new SpeechRecognitionEngine(recognizerInfo.Id);

    speechRecognitionEngine.LoadGrammar(new DictationGrammar());
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text);

    using (var s = audioSource.Start())
    {
        speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
        speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
    }
}

問題は、現在の Kinect SDK で Microsoft.Speech の代わりに System.Speech を使用することさえ可能ですか? 2 番目のコード サンプルで何が間違っているのでしょうか?

GetKinectRecognizer メソッド

private static RecognizerInfo GetKinectRecognizer()
{
    Func<RecognizerInfo, bool> matchingFunc = r =>
    {
        string value;
        r.AdditionalInfo.TryGetValue("Kinect", out value);
        return "True".Equals(value, StringComparison.InvariantCultureIgnoreCase) && "en-US".Equals(r.Culture.Name, StringComparison.InvariantCultureIgnoreCase);
    };

    return SpeechRecognitionEngine.InstalledRecognizers().Where(matchingFunc).FirstOrDefault();
}
4

2 に答える 2

3

私自身の実験から、実際には両方のライブラリを同時に使用できることがわかります。

現在のコードの代わりに次のコードを試してください (明らかに System.Speech への参照を追加してください)。

using (var audioSource = new KinectAudioSource())
{
    audioSource.FeatureMode = true;
    audioSource.AutomaticGainControl = false;
    audioSource.SystemMode = SystemMode.OptibeamArrayOnly;

    System.Speech.Recognition.RecognizerInfo ri = GetKinectRecognizer();
    var speechRecognitionEngine = new SpeechRecognitionEngine(ri.Id);

    speechRecognitionEngine.LoadGrammar(new DictationGrammar());
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text);

    using (var s = audioSource.Start())
    {
        speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
        speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
    }
}

幸運を!!!

于 2012-01-21T17:38:40.527 に答える
0

System.Speech を参照して、このコードを試してください。

using (var audioSource = new KinectAudioSource())
{
    audioSource.FeatureMode = true;
    audioSource.AutomaticGainControl = false;
    audioSource.SystemMode = SystemMode.OptibeamArrayOnly;

    System.Speech.Recognition.RecognizerInfo ri = GetKinectRecognizer();
    var speechRecognitionEngine = new SpeechRecognitionEngine(ri.Id);

    speechRecognitionEngine.LoadGrammar(new DictationGrammar());
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text);

    using (var s = audioSource.Start())
    {
        speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
        speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
    }
}
于 2019-05-27T01:09:59.160 に答える