Распознавание речи Microsoft: альтернативные результаты с доверительной оценкой?

Я новичок в работе с распознавателем Microsoft.Speech (с использованием Microsoft Speech Platform SDK версии 11) и пытаюсь вывести n-лучшие совпадения распознавания из простой грамматики вместе с показателем достоверности для каждого.

Согласно документации (и как уже упоминалось в ответе на этот вопрос), каждый должен иметь возможность использовать e.Result.Alternates чтобы получить доступ к распознанным словам, отличным от самого лучшего. Тем не менее, даже после сброса порога доверительного отклонения до 0 (что должно означать, что ничего не отклоняется), я все равно получаю только один результат, и никаких альтернатив (хотя SpeechHypothesized события указывают на то, что, по крайней мере, одно из других слов в какой-то момент кажется распознанным с ненулевой достоверностью).

Мой вопрос: может ли кто-нибудь объяснить мне, почему я получаю только одно распознанное слово, даже если порог отклонения доверия установлен на ноль? Как я могу получить другие возможные совпадения и их оценки доверия? Что мне здесь не хватает?

Ниже мой код. Заранее спасибо всем, кто может помочь:)


В приведенном ниже примере распознавателю отправляется wav-файл со словом "новости", и он должен выбрать одно из похожих слов ("петля", "тритон"). Я хочу извлечь список доверительной оценки распознавателя для КАЖДОГО слова (все они должны быть ненулевыми), даже если в результате будет возвращен только лучший результат ("новости").

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Speech.Recognition;

namespace SimpleRecognizer
{
    class Program
    {
        static readonly string[] settings = new string[] {
            "CFGConfidenceRejectionThreshold",
            "HighConfidenceThreshold", 
            "NormalConfidenceThreshold",
            "LowConfidenceThreshold"};

        static void Main(string[] args)
        {
            // Create a new SpeechRecognitionEngine instance.
            SpeechRecognitionEngine sre = new SpeechRecognitionEngine(); //en-US SRE

            // Configure the input to the recognizer.
            sre.SetInputToWaveFile(@"C:\Users\Anjana\Documents\news.wav");

            // Display Recognizer Settings (Confidence Thresholds)
            ListSettings(sre);

            // Set Confidence Threshold to Zero (nothing should be rejected)
            sre.UpdateRecognizerSetting("CFGConfidenceRejectionThreshold", 0);
            sre.UpdateRecognizerSetting("HighConfidenceThreshold", 0);
            sre.UpdateRecognizerSetting("NormalConfidenceThreshold", 0);
            sre.UpdateRecognizerSetting("LowConfidenceThreshold", 0);

            // Display New Recognizer Settings
            ListSettings(sre);

            // Build a simple Grammar with three choices
            Choices topics = new Choices();
            topics.Add(new string[] { "news", "newts", "noose" });
            GrammarBuilder gb = new GrammarBuilder();
            gb.Append(topics);
            Grammar g = new Grammar(gb);
            g.Name = "g";

            // Load the Grammar
            sre.LoadGrammar(g);

            // Register handlers for Grammar's SpeechRecognized Events
            g.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(gram_SpeechRecognized);

            // Register a handler for the recognizer's SpeechRecognized event.
            sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);

            // Register Handler for SpeechHypothesized
            sre.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(sre_SpeechHypothesized);

            // Start recognition.
            sre.Recognize();

            Console.ReadKey(); //wait to close

        }
        static void gram_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            Console.WriteLine("\nNumber of Alternates from Grammar {1}: {0}", e.Result.Alternates.Count.ToString(), e.Result.Grammar.Name);
            foreach (RecognizedPhrase phrase in e.Result.Alternates)
            {
                Console.WriteLine(phrase.Text + ", " + phrase.Confidence);
            }
        }
        static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            Console.WriteLine("\nSpeech recognized: " + e.Result.Text + ", " + e.Result.Confidence);
            Console.WriteLine("Number of Alternates from Recognizer: {0}", e.Result.Alternates.Count.ToString());
            foreach (RecognizedPhrase phrase in e.Result.Alternates)
            {
                Console.WriteLine(phrase.Text + ", " + phrase.Confidence);
            }
        }
        static void sre_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
        {
            Console.WriteLine("Speech from grammar {0} hypothesized: {1}, {2}", e.Result.Grammar.Name, e.Result.Text, e.Result.Confidence);
        }
        private static void ListSettings(SpeechRecognitionEngine recognizer)
        {
            foreach (string setting in settings)
            {
                try
                {
                    object value = recognizer.QueryRecognizerSetting(setting);
                    Console.WriteLine("  {0,-30} = {1}", setting, value);
                }
                catch
                {
                    Console.WriteLine("  {0,-30} is not supported by this recognizer.",
                      setting);
                }
            }
            Console.WriteLine();
        }
    }
}

Это дает следующий вывод:

Original recognizer settings:
  CFGConfidenceRejectionThreshold = 20
  HighConfidenceThreshold        = 80
  NormalConfidenceThreshold      = 50
  LowConfidenceThreshold         = 20

Updated recognizer settings:
  CFGConfidenceRejectionThreshold = 0
  HighConfidenceThreshold        = 0
  NormalConfidenceThreshold      = 0
  LowConfidenceThreshold         = 0

Speech from grammar g hypothesized: noose, 0.2214646
Speech from grammar g hypothesized: news, 0.640804

Number of Alternates from Grammar g: 1
news, 0.9208503

Speech recognized: news, 0.9208503
Number of Alternates from Recognizer: 1
news, 0.9208503

Я также пытался реализовать это с помощью отдельной фразы для каждого слова (вместо одной фразы с тремя вариантами) и даже с отдельной грамматикой для каждого слова / фразы. Результаты в основном одинаковы: только один "альтернативный".

1 ответ

Решение

Я считаю, что это еще одно место, где SAPI позволяет вам задавать вопросы, которые на самом деле не поддерживает движок SR.

И Microsoft.Speech.Recognition, и System.Speech.Recognition используют базовые интерфейсы SAPI для своей работы; единственная разница в том, какой двигатель SR используется. (Microsoft.Speech.Recognition использует механизм сервера; System.Speech.Recognition использует механизм рабочего стола.)

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

К сожалению, движок Microsoft.Speech.Recognition не поддерживает диктовку. (Однако он работает с гораздо более низким качеством звука и не требует обучения.)

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