Могу ли я использовать два или более механизма распознавания речи Microsoft?

Могу ли я использовать два или более механизма распознавания речи Microsoft на одном компьютере (с одним языком)?

У меня есть задача по распознаванию речи, и я пытаюсь распознать слишком объемную грамматику (2000+ слов).

Итак, я думаю разделить эту большую грамматику на две грамматики. Одна грамматическая нагрузка на первый движок, другая - на второй.

Но я не знаю - ссылаются ли эти экземпляры SpeechRecognitinEngine на 2 разностных речевых движка или они просто связаны с одним движком?

Вот мой код:

List<String> words1 = new List<string>();
words1.Add("one");

List<String> words2 = new List<string>();
words2.Add("two");

var gr1 = MakeGrammar("gr1", words1);
var gr2 = MakeGrammar("gr2", words2);

var gr3 = MakeGrammar("gr1", words1); // create new grammar with name gr1- to check on grammar unic name exception.

MicSpeechRecEngine1.LoadGrammar(gr1);  (where MicSpeechRecEngine is SpeechRecognitionEngine)

MicSpeechRecEngine2.LoadGrammar(gr2);
MicSpeechRecEngine2.LoadGrammar(gr3);

public static Grammar MakeGrammar(String name,List<String> words)
{
    Choices choises = new Choices();
    GrammarBuilder gb = new GrammarBuilder();
    gb.Culture = new CultureInfo("en-US");


    if (choises == null)
        throw new NullReferenceException("choises is null!");
    if (words == null)
        throw new NullReferenceException("Words is null!");
    choises.Add(words.ToArray());

    if (gb != null)
    {
        //gb.Append(choises); 
        gb.Append(choises, 0, 10);
    }

    Grammar g = new Grammar(gb);
    g.Name = name;
    g.Priority = 0;
    g.Weight = 1.0f;
    g.Enabled = true;

    return g;
}

Этот код работает хорошо - когда я говорю «один» - он набирает «один один» из обоих движков.

Моя цель - сделать 2 или более движка, загрузить два или более больших грамматика и, если они распознаются на разных движках, получить производительность (и подтвердить) распознавание.

Спасибо!

P.S. Спасибо за ответ!

Хорошо, я переписываю кусок кода:

var gr3 = MakeGrammar("gr3", words3);

Итак, в этой строке я создаю новую грамматику. И я могу загрузить его на второй двигатель.

Итак, gr1 загрузится в Engine1, gr2, g3- в Engine2.

Я знаю, это глупый вопрос, но: Может ли Engine1 и Engine2 - это просто ссылки на какой-то Engine, который распознает эти грамматики (грамматики большие)? Я надеюсь, что это не так, потому что я хочу создать на своей машине от 1 до N движков, загрузить грамматику от 1 до N (одна большая грамматика для одного движка) и попытаться распознать ее. Спасибо!


person Admiral Land    schedule 03.07.2015    source источник
comment
Мне кажется, что вам просто не разрешено повторно использовать объекты грамматики. Попробуйте создать отдельные объекты.   -  person Chris    schedule 03.07.2015
comment
хм .. я делаю так, как ты говоришь ... использовать один и тот же объект для двух двигателей ...   -  person Admiral Land    schedule 03.07.2015
comment
@Chris, а как я могу понять - я использую один и тот же движок или две разницы?   -  person Admiral Land    schedule 03.07.2015
comment
Вы по-прежнему передаете gr1 обоим двигателям. Попробуйте создать совершенно отдельные объекты грамматики.   -  person Chris    schedule 03.07.2015
comment
Что за исключение? Также попробуйте дать им уникальные имена, если что-то используется внутри api.   -  person Chris    schedule 03.07.2015


Ответы (1)


Ваша проблема заключается в следующем:

MicSpeechRecEngine1.LoadGrammar(gr1);  (where MicSpeechRecEngine is SpeechRecognitionEngine)

MicSpeechRecEngine2.LoadGrammar(gr2);
MicSpeechRecEngine2.LoadGrammar(gr3);

Как сказал Крис в разделе комментариев, вы загружаете одну и ту же грамматику дважды. В той части, где вы создаете грамматику, вы даете своим грамматикам то же имя, что и здесь:

var gr1 = MakeGrammar("gr1", words1);
var gr2 = MakeGrammar("gr2", words2);

var gr3 = MakeGrammar("gr1", words1);

И gr3, и gr1 одинаковы для SAPI. Поэтому, когда вы загружаете их, вы загружаете "один" в оба. Вот почему вы получаете «один».

Когда вы вызываете LoadGrammar (), я считаю, что вы очищаете предыдущую грамматику. Итак, код:

MicSpeechRecEngine2.LoadGrammar(gr2);
MicSpeechRecEngine2.LoadGrammar(gr3);

Фактически становится:

MicSpeechRecEngine2.LoadGrammar(gr3);

Во всяком случае, что касается SAPI.

Из того, что я вижу, похоже, что у вас действительно работает два распознавателя.

person Lesley Gushurst    schedule 03.07.2015