2011-03-24 1 views
2

Я пытаюсь использовать SpeechRecognizer с пользовательской грамматикой для обработки следующего шаблона:Почему значение распознавания речи Microsoft SemanticValue.Confidence всегда 1?

«Можете ли вы открыть {item}?" где {item} использует DictationGrammar.

Я использую речевой движок, встроенный в Vista и .NET 4.0.

Я хотел был бы иметь возможность получить доверительные отношения для возвращаемого SemanticValues. См. Пример ниже.


Если я просто использовать «recognizer.AddGrammar (новый DictationGrammar())», я могу просматривать e.Results.Alternates и просматривать доверительные значения каждого заместителя. Это работает, если DictationGrammar находится на верхнем уровне .

Состоящая пример:

  • Можете ли вы открыть Firefox? .95
  • Можете ли вы открыть Fairfax? .93
  • Можете ли вы открыть факс факсом? .72
  • Можете ли вы создать Firefox? .85
  • Можете ли вы связаться с Fairfax? .63

Но если построить грамматику, который ищет "Может вы открыты {semanticValue Key = 'пункт' GrammarBuilder = новый DictationGrammar()}?", То я получаю это:

  • Может вы открываете Firefox? .91 - Семантика = {GrammarBuilder.Name = "вы можете открыть"}
  • Можете ли вы открыть Fairfax? .91 - Семантика = {GrammarBuilder.Name = "вы можете открыть"}
  • Можете ли вы открыть факс? .91 - Семантика = {GrammarBuilder.Name = "вы можете открыть"}
  • Можете ли вы создать Firefox? .85 - Семантика = null
  • Можете ли вы прикрепить Fairfax? .63 - Семантика = null

0,91 показывает мне, насколько уверенно, что он соответствует шаблону «Можете ли вы открыть {item}?». но не различает дальше.

Однако, если я потом посмотреть на e.Result.Alternates.Semantics.Where (s => s.Key == "элемент"), а также просматривать их доверие, я получаю это:

  • Firefox 1,0
  • Fairfax 1,0
  • файл по факсу 1,0

Который не помогает мне много.

То, что я действительно хочу что-то вроде этого, когда я осматриваю Уверенность согласующих SemanticValues:

  • Firefox +0,95
  • Фэйрфакс.93
  • файл факс .85

Похоже, что это должно работать таким образом ...

Я делаю что-то не так? Есть ли способ сделать это в рамках Speech?


Я надеюсь, что есть некоторые встроенные механизм, так что я могу сделать это «правильный» путь.

Что касается другого подхода, который, вероятно, работы ...

  1. Используйте SemanticValue подход, чтобы соответствовать по образцу
  2. Для чего-либо, что соответствует по этому образцу, извлекать необработанное аудио для {пункта } (используйте RecognitionResult.Words и RecognitionResult.GetAudioForWordRange)
  3. Run необработанный звук для {п} через SpeechRecognizer с DictationGrammar, чтобы получить доверие

... но это больше обработки, чем я действительно хочу.

+0

Сколько различных элементов вы хотите поддержать? Это известный конечный список? Использование грамматики диктовки означает, что вы не знаете, что кто-то может захотеть открыть, поэтому вы готовитесь к тому, чтобы они говорили что-нибудь «вы можете открыть Foobar», «Можете ли вы открыть мороженое». Функция распознавания не может дать вам семантический анализ на {item}, потому что грамматика диктовки не определяет никакого. Вам необходимо построить грамматику для идентификации {item} и добавить к ней информацию семантического сопоставления с помощью SemanticResultValue(). –

+0

См. Примеры на http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.semanticresultvalue.aspx –

+0

За исключением того, что реакция свободной формы - именно то, что я хочу. Я создаю интерактивную систему, которая распознает то, что она «знает», а что нет, а затем запрашивает разъяснения для неизвестных. Например, «Можете ли вы открыть Chrome?» «Извините, я не знаю, как открыть хром. Можете ли вы сказать, как его открыть?» «Нажмите на меню« Пуск », программы, Google, затем запустите Google Chrome». –

ответ

2

Я думаю, что грамматика диктовки только транскрипция. Он делает речь в тексте без выделения семантического значения, потому что по определению грамматика диктовки поддерживает все слова и не имеет никаких подсказок для вашего конкретного семантического сопоставления. Для извлечения семантического значения вам нужно использовать собственную грамматику. Если вы поставляете грамматику SRGS или создаете ее в коде или с помощью инструментов SpeechServer, вы можете указать семантические сопоставления для определенных слов и фраз. Затем распознаватель может извлечь семантический смысл и дать вам семантическую уверенность.

Вы должны иметь возможность получить значение доверия от распознавателя при распознавании, попробуйте System.Speech.Recognition.RecognitionResult.Confidence.

В файле справки, поставляемом с Microsoft Server Speech Platform 10.2 SDK, содержится более подробная информация. (это приложение Microsoft.Speech API для серверов, которое очень похоже на API System.Speech для клиентских приложений). См. (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=1b1604d3-4f66 . -4241-9a21-90a294a5c9a4) или документация Microsoft.Speech на http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.semanticvalue(v=office.13).aspx

для SemanticValue класса он говорит:

все речи на базе платформы распознавания двигателей вывода обеспечивают допустимые экземпляры в SemanticValue для всех признали вывод, даже фразы без явного семантическая структура.

SemanticValue экземпляр для фразы, полученный с использованием семантики свойства на RecognizedPhrase объекта (или объекты, которые наследуют от его, таких как RecognitionResult).

SemanticValue объекты, полученные для признанных фраз без семантической структуры характеризуются:

не имеющие детей (граф 0)

Свойство Значение является недействительным.

Искусственного уровень достоверности 1,0 (возвращаемый Confidence)

Как правило, приложения создают экземпляр SemanticValue косвенно добавлять их к объектам грамматики использования SemanticResultValue и SemanticResultKey экземпляров в вместе с, Выбор и Объекты GrammarBuilder.

Прямого строительство SemanticValue полезно во время создания сильно типизированных грамматик

При использовании SemanticValue функции в грамматике вы, как правило, пытаетесь сопоставить различные фразы одного значения. В вашем случае фраза «I.E» или «Internet Explorer» должна совпадать с тем же смысловым значением. Вы настраиваете выбор в своей грамматике, чтобы понимать каждую фразу, которая может отображаться в определенном смысле. Вот простой пример Winform:

private void btnTest_Click(object sender, EventArgs e) 
{ 
    SpeechRecognitionEngine myRecognizer = new SpeechRecognitionEngine(); 

    Grammar testGrammar = CreateTestGrammar(); 
    myRecognizer.LoadGrammar(testGrammar); 

    // use microphone 
    try 
    { 
     myRecognizer.SetInputToDefaultAudioDevice(); 
     WriteTextOuput(""); 
     RecognitionResult result = myRecognizer.Recognize();    

     string item = null; 
     float confidence = 0.0F; 
     if (result.Semantics.ContainsKey("item")) 
     { 
      item = result.Semantics["item"].Value.ToString(); 
      confidence = result.Semantics["item"].Confidence; 
      WriteTextOuput(String.Format("Item is '{0}' with confidence {1}.", item, confidence)); 
     } 

    } 
    catch (InvalidOperationException exception) 
    { 
     WriteTextOuput(String.Format("Could not recognize input from default aduio device. Is a microphone or sound card available?\r\n{0} - {1}.", exception.Source, exception.Message)); 
     myRecognizer.UnloadAllGrammars(); 
    } 

} 

private Grammar CreateTestGrammar() 
{       
    // item 
    Choices item = new Choices(); 
    SemanticResultValue itemSRV; 
    itemSRV = new SemanticResultValue("I E", "explorer"); 
    item.Add(itemSRV); 
    itemSRV = new SemanticResultValue("explorer", "explorer"); 
    item.Add(itemSRV); 
    itemSRV = new SemanticResultValue("firefox", "firefox"); 
    item.Add(itemSRV); 
    itemSRV = new SemanticResultValue("mozilla", "firefox"); 
    item.Add(itemSRV); 
    itemSRV = new SemanticResultValue("chrome", "chrome"); 
    item.Add(itemSRV); 
    itemSRV = new SemanticResultValue("google chrome", "chrome"); 
    item.Add(itemSRV); 
    SemanticResultKey itemSemKey = new SemanticResultKey("item", item); 

    //build the permutations of choices... 
    GrammarBuilder gb = new GrammarBuilder(); 
    gb.Append(itemSemKey); 

    //now build the complete pattern... 
    GrammarBuilder itemRequest = new GrammarBuilder(); 
    //pre-amble "[I'd like] a" 
    itemRequest.Append(new Choices("Can you open", "Open", "Please open")); 

    itemRequest.Append(gb, 0, 1); 

    Grammar TestGrammar = new Grammar(itemRequest); 
    return TestGrammar; 
} 
+0

Я разъяснил вопрос примерами. В комментариях было недостаточно места, поэтому я поставил его наверх. –

+0

См. Http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.semanticresultvalue.aspx –

+0

Я предполагаю, что я пытаюсь использовать неправильные инструменты для решения проблемы. Спасибо за объяснение того, как должен работать весь семантический дизайн в Речь. То, что я ищу, - это то, что поддерживает универсальное сопоставление с образцом, с возможностью: 1) распознавать шаблон и 2) распознавать компоненты в шаблоне; «Вы можете {глагол} {сущ.}" и использовать одну грамматику для {verb} и другую для {сущ.}, а затем вычислить общее доверительное значение и процесс на основе этого –

 Смежные вопросы

  • Нет связанных вопросов^_^