私は、大学のプロジェクト用にスピーチからテキストへのキャプション アプリケーションのプロトタイプを開発しています。プロジェクトの後半でジェスチャ認識を使用する予定なので、追加のマイクを使用するのではなく、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();
}