Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将System.Speech与Kinect一起使用_C#_.net_Audio_Kinect_System.speech.recognition - Fatal编程技术网

C# 将System.Speech与Kinect一起使用

C# 将System.Speech与Kinect一起使用,c#,.net,audio,kinect,system.speech.recognition,C#,.net,Audio,Kinect,System.speech.recognition,我正在为一个大学项目开发一个语音到文本字幕的原型应用程序。稍后我将在我的项目中使用手势识别,因此我认为最好使用Kinect作为麦克风源,而不是使用额外的麦克风。我的应用程序的想法是识别自发的演讲,例如长而复杂的句子(我知道演讲听写不会是完美的)。我看过很多Kinect语音示例,其中引用了Microsoft.speech,但没有提到System.speech。由于我需要训练语音引擎并将听写语法加载到语音识别引擎中,Microsoft.speech是我唯一的选择 在使用Kinect作为直接麦克风音频

我正在为一个大学项目开发一个语音到文本字幕的原型应用程序。稍后我将在我的项目中使用手势识别,因此我认为最好使用Kinect作为麦克风源,而不是使用额外的麦克风。我的应用程序的想法是识别自发的演讲,例如长而复杂的句子(我知道演讲听写不会是完美的)。我看过很多Kinect语音示例,其中引用了Microsoft.speech,但没有提到System.speech。由于我需要训练语音引擎并将听写语法加载到语音识别引擎中,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加载后通过它访问访问源的地方,它根本不做任何事情。我想做的是:

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中,是否可以使用System.Speech而不是Microsoft.Speech?在第二个代码示例中,我做错了什么

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();
}
private static recognizerfo GetKinectRecognizer()
{
Func matchingFunc=r=>
{
字符串值;
r、 附加信息TryGetValue(“Kinect”,输出值);
返回“True”.Equals(value,StringComparison.InvariantCultureIgnoreCase)和&“en-US”.Equals(r.Culture.Name,StringComparison.InvariantCultureIgnoreCase);
};
return SpeechRecognitionEngine.InstalledRecognizers().Where(matchingFunc.FirstOrDefault();
}

通过我自己的实验,我可以告诉您,实际上您可以同时使用这两个库

请尝试此代码而不是当前代码(显然,请确保添加对System.Speech的引用):


祝你好运

请参考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);
    }
}

Windows将Kinect识别为麦克风输入,因此所有语音库都应该工作正常。您是否能够运行Kinect SDK提供的音频/语音样本来验证设备是否正常工作?上面的代码对我来说很好,但是你可以发布你正在调用的GetKinectRecognizer方法吗?嗨。对迟来的答复表示歉意。请参阅上面的编辑以查看我使用的GetKinect识别器方法,它基本上是来自Kinect示例的方法。@LewisBenge,你看到Dan Clark的答复了吗?我没有看到系统。Speech,只是Speech使用Visual Studio 2015从Kinect SDK 1.8尝试SpeechBasics WPF示例时,在MainWindows.xaml.cs的using子句旁边显示的Quick Actions灯泡上,它建议将“使用Microsoft.Speech.AudioFormat”和“使用Microsoft.Speech.Recognition”分别简化为“使用Speech.AudioFormat”和“Speech.Recogniton”;上面的代码显然来自Kinect Beta SDK(例如,您不能在Kinect SDK v1.8中直接实例化音频源类,需要从Kinect传感器对象获取该类)。可以找到有关如何使用Microsoft.Speech或System.Speech at的代码(其中有一些条件编译代码可在两者之间切换)。请注意,Kinect团队建议Microsoft.Speech更适合Kinect的麦克风阵列。此外,System.Speech的语言较少,但除了Microsoft.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);
    }
}