Загрузка новой грамматики в Microsoft.Speech.Recognition - PullRequest
1 голос
/ 14 февраля 2012

Я создаю программу, которая использует новый 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 с тем же результатом. У меня такое ощущение, что у меня возникла проблема с многопоточностью, но я не знаю, с чего начать.

1 Ответ

1 голос
/ 11 декабря 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...