【问题标题】:Using System.Speech with Kinect将 System.Speech 与 Kinect 一起使用
【发布时间】:2012-01-12 06:16:46
【问题描述】:

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

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();
}

【问题讨论】:

  • Windows 将 Kinect 识别为麦克风输入,因此所有语音库都应该可以正常工作。您是否能够运行 Kinect SDK 提供的音频/语音示例来验证设备是否正常工作?上面的代码对我来说看起来不错,但是你能发布你正在调用的 GetKinectRecognizer 方法吗?
  • 嗨。为迟到的回复道歉。请参考上面的编辑以查看我正在使用的 GetKinectRecognizer 方法,该方法基本上来自 Kinect 示例。
  • @LewisBenge,你看到 Dan Clark 的回复了吗?

标签: c# .net audio kinect system.speech.recognition


【解决方案1】:

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

试试这个代码而不是你当前的代码(确保你添加了对 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);
    }
}

祝你好运!!!

【讨论】:

  • 我没有看到 System.Speech,只有 Speech
  • 在使用 Visual Studio 2015 尝试 Kinect SDK 1.8 中的 SpeechBasics-WPF 示例时,在快速操作灯泡上它显示在 MainWindows.xaml.cs 中的 using 子句旁边,它建议简化“使用 Microsoft.语音.音频格式;"和“使用 Microsoft.Speech.Recognition;”到“使用 Speech.AudioFormat;”和“语音识别;”分别
  • 上面的代码显然来自Kinect Beta SDK(例如,您不能在Kinect SDK v1.8直接实例化音频源类,需要从KinectSensor对象中获取)。可以在SpeechTurtle.codeplex.com 找到有关如何使用 Microsoft.Speech 或 System.Speech 的代码(那里有一些条件编译代码可以在两者之间切换)。请注意,Kinect 团队建议 Microsoft.Speech 更适合 Kinect 的麦克风阵列。 System.Speech 的语言也较少,但除了 Microsoft.Speech 支持的语音命令外,它还支持免费听写
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多