Распознавание речи 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 не поддерживает диктовку. (Однако он работает с гораздо более низким качеством звука и не требует обучения.)