Я создаю программу, которая использует новый API microsoft.speech. При первом запуске программы я загружаю SpeechRecognizer с грамматикой, и все в порядке. Тем не менее, я также использую Microsoft Async CTP, чтобы выполнить некоторую работу по извлечению слова, которое будет добавлено в грамматику, и когда оно вернется, я хочу загрузить новую грамматику. Сильфон является асинхронной CTP-частью ...
class UR
{
private CancellationTokenSource _cancelationToken;
public UR()
{
_cancelationToken = new CancellationTokenSource();
}
public async void StartRecognition()
{
String someword = await Recognize(_cancelationToken.Token);
//Load the new grammar
SpeechRecognizer sr = SpeechRecognizer.Instance;
sr.LoadNewGrammar(someword);
}
}
Вот метод LoadNewGrammar, чтобы загрузить новую грамматику, вы увидите, что я пытаюсь использовать «RecognizeAsyncCancel», чтобы остановить распознаватель, затем загрузить грамматику и пользователя «RecognizeAsync», чтобы перезапустить распознаватель.
public void LoadNewGrammar(String someword)
{
Commands = new Dictionary<string, WhatSaid>()
{
{"DoThis", new WhatSaid() {verb=Verbs.DoThis}},
{"DoThat", new WhatSaid() {verb=Verbs.DoThat}},
{someword, new WhatSaid() {verb=Verbs.Someword}}
};
if (sre == null)
{
RecognizerInfo ri = GetKinectRecognizer();
sre = new SpeechRecognitionEngine(ri);
}
//Stop the speech recognizer temporarily in order to load the new grammar
sre.RecognizeAsyncCancel();
// Build a grammar of commands
var basicCmds = new Choices();
foreach (var phrase in Commands)
{
basicCmds.Add(phrase.Key);
}
// Combine all choices
var allChoices = new Choices();
allChoices.Add(basicCmds);
//Create a grammar builder to be used in the grammar object
var gb = new GrammarBuilder();
gb.Culture = sre.RecognizerInfo.Culture;
gb.Append(allChoices);
var g = new Grammar(gb);
sre.LoadGrammar(g);
sre.RecognizeAsync(RecognizeMode.Multiple);
}
Проблема, похоже, в том, что когда я вызываю sre.RecognizeAsyncCancel, моя программа полностью зависает. Я также попытался RecognizeAsyncStop с тем же результатом. У меня такое ощущение, что у меня возникла проблема с многопоточностью, но я не знаю, с чего начать.