Как я могу получить альтернативы результата распознавания речи SAPI

На платформе Windows7 я могу использовать System.Speech.Recognition.SpeechRecognitionEngine для преобразования голоса в текст. По SpeechRecognitionEngine, когда сработало событие SpeechRecognized, я могу получить несколько альтернативных слов, и я могу показать это слово пользователям на выбор.

void engine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (this.SpeechRecognized != null)
    {
       this.SpeechRecognized(this, new RecognizedResultEventArgs
            {
                Text = e.Result.Text,
                Alternates = new ReadOnlyCollection<string>(e.Result.Alternates.Select(p => p.Text).ToList())
            });
    }
}

Кстати, когда я инициализирую экземпляр SpeechRecognitionEngine, я хочу загрузить определенное слово вместо использования "DictationGrammar".

Моя программа иногда должна работать на платформе xp. Поэтому я хочу использовать конкретную версию для запуска в операционной системе xp, используя sapi5.1.

Я перечитал часть документа sapi5.1, а затем понял: в sapi5.1 я могу использовать способ "управления и контроля". но метод "Result.Alternates()" нельзя использовать, когда я использую "команда и управление". Итак, как я могу добиться того же эффекта SpeechRecognitionEngine?

Я попробовал следующий код, и есть Eception:

public void RecoContext_Recognition(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
    {
        ISpeechPhraseProperty oItem;

        oItem = Result.PhraseInfo.Properties.Item(0);

        if ((System.Decimal)Result.PhraseInfo.GrammarId == grammarId)
        {
            if (this.SpeechRecognized != null)
            {
                RecognizedResultEventArgs e = new RecognizedResultEventArgs();
                e.Text = oItem.Name;

                // The following code throws an exception
                ISpeechPhraseAlternates alternates = Result.Alternates(10);
                List<string> s = new List<string>();
                foreach (ISpeechPhraseAlternate item in alternates)
                {
                    s.Add(item.RecoResult.PhraseInfo.Properties.Item(0).Name);
                }
                e.Alternates = new ReadOnlyCollection<string>(s);

                this.SpeechRecognized(this, e);
            }
        }
    }

Есть ли способ получить альтернативы с помощью sapi через COM? Спасибо.

1 ответ

В SAPI (любая версия) командные и контрольные грамматики не имеют альтернатив. Только грамматики диктовки имеют альтернативы.

Другие вопросы по тегам