Почему значение распознавания речи Microsoft SemanticValue.Confidence всегда равно 1? - PullRequest
2 голосов
/ 24 марта 2011

Я пытаюсь использовать SpeechRecognizer с пользовательской грамматикой для обработки следующего шаблона:

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

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

Я бы хотел иметь возможность вернуть конфиденциальность для SemanticValues. Смотрите пример ниже.


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

Придуманный пример:

  • Можете ли вы открыть Firefox? +0,95
  • Можете ли вы открыть Fairfax? 0,93
  • Можете ли вы открыть файл факса? 0,72
  • Можете ли вы написать Firefox? +0,85
  • Можете ли вы прикрепить Fairfax? 0,63

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

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

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

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

  • Firefox 1.0
  • Fairfax 1.0
  • файл факса 1.0

Что мне мало помогает.

Что мне действительно нужно, так это то, когда я просматриваю достоверность соответствующих значений Semantic:

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

Кажется, что так должно работать ...

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


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

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

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

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

1 Ответ

2 голосов
/ 24 марта 2011

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

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

Файл справки, поставляемый с Microsoft Server Speech Platform 10.2 SDK, содержит более подробную информацию. (это API-интерфейс Microsoft.Speech для серверных приложений, который очень похож на 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)

Свойство Value равно нулю.

Искусственный уровень достоверности 1,0 (возвращается по доверию)

Как правило, приложения создают экземпляр 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;
}
...