我正在为大学项目开发一个原型演讲文本字幕应用程序.我将在我的项目中使用手势识别,所以我认为使用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);
}
Run Code Online (Sandbox Code Playgroud)
这是我需要在加载后通过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);
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是,是否可以使用System.Speech而不是Microsoft.Speech与当前的Kinect SDK,以及我在第二个代码示例中做错了什么?
GetKinectRecognizer方法
private static …Run Code Online (Sandbox Code Playgroud) 我在inproc-mode中SpeechRecognitionEngine使用命名空间System.Speech来完成一些自动化工作.语音识别通过以下方式开始RecognizeAsync.
它工作正常,但是,当计算机锁定时,语音识别停止.一旦计算机解锁,识别就会再次激活.虽然对于大多数应用程序来说这可能是一个有意义的行为,但对我来说,这是个问题.我搜索过网络,但没有找到解决方案来禁用此行为.
如何参数化SpeechRecognition不要在计算机锁定时停止?
(请注意:该应用程序是传统的Windows WPF应用程序,而不是Windows应用商店应用程序)
system.speech.recognition microsoft-speech-api microsoft-speech-platform
我有一些简单的代码System.Speech.Recognition可以正常工作:
using (var recognizer = new SpeechRecognitionEngine(new CultureInfo("en-US")))
{
recognizer.LoadGrammar(new DictationGrammar());
recognizer.SpeechRecognized += recognizer_SpeechRecognized;
recognizer.SetInputToDefaultAudioDevice();
recognizer.RecognizeAsync(RecognizeMode.Multiple);
}
private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
textBox1.Text = "Recognized text: " + e.Result.Text;
}
Run Code Online (Sandbox Code Playgroud)
使用Windows 7时,我会进行语音培训"Control Panel" -> "Speech Recognition" -> "Train your computer to better understand you".
我的程序是否自动使用已完成的任何培训?培训的好处是基于用户还是机器?这些语音"简介"可以(轻松)移动吗?
我System.Speech用来识别一些短语或单词.其中之一是Set timer.我想将其扩展为Set timer for X seconds,并让代码设置X秒的计时器.这可能吗?到目前为止,我对此几乎没有任何经验,我所能找到的是我必须对语法课做一些事情.
现在我已经设置了这样的识别引擎:
SpeechRecognitionEngine = new SpeechRecognitionEngine();
SpeechRecognitionEngine.SetInputToDefaultAudioDevice();
var choices = new Choices();
choices.Add("Set timer");
var gb = new GrammarBuilder();
gb.Append(choices);
var g = new Grammar(gb);
SpeechRecognitionEngine.LoadGrammarAsync(g);
SpeechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
SpeechRecognitionEngine.SpeechRecognized += OnSpeechRecognized;
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我试图使用System.Speech该类在ASP.NET mvc应用程序中生成语音。
[HttpPost]
public ActionResult TTS(string text)
{
SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
speechSynthesizer.Speak(text);
return View();
}
Run Code Online (Sandbox Code Playgroud)
但是它给出了以下错误。
System.InvalidOperationException: 'An asynchronous operation cannot be
Started at this time. Asynchronous operations may only be started within an
asynchronous handler or module or during certain events in the Page lifecycle.
If this exception occurred while executing a Page, ensure that the Page is
marked <%@ Page Async="true" %>.
This exception may also indicate an attempt to call an "async void" …Run Code Online (Sandbox Code Playgroud)