如何在使用微软语音识别引擎时提高结果的准确性

本文关键字:高结果 结果 准确性 微软 引擎 语音识别 | 更新日期: 2023-09-27 18:05:48

我目前正在开发一个DialerService项目。其中一个功能是将录制的。wav媒体文件解释为纯文本。我使用了语音识别引擎试图解释内容,我得到了一些不准确的结果,或者有时是没有任何意义的断句。

.wav文件是两个或多个客户之间电话对话的记录文件,我测试的文件是我与同事进行的非常简单和简短的对话。

所以我的问题是如何提高解释的准确性,以及如何为此目的改进我的代码?我知道添加语法将有助于识别一些关键字,但我需要的是对我从用户那里记录的内容进行总体解释。

下面是我的工作代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Speech.Recognition;
using System.Speech.AudioFormat;
using System.Web;
namespace VoiceRecognition
{
    class Program
    {
        static bool completed;
        static void Main(string[] args)
        {
            using (
             SpeechRecognitionEngine recognizer =
                    new SpeechRecognitionEngine(
                        new System.Globalization.CultureInfo("en-US")))
            {
                // Create and load a grammar.
                Grammar dictation = new DictationGrammar();
                dictation.Name = "Dictation Grammar";
                recognizer.LoadGrammar(new DictationGrammar());
                recognizer.SetInputToWaveFile(@"C:'Projects2'VoiceRecognition2'conf_with_vincent_1.wav");
                // Attach event handlers for the results of recognition.
                //recognizer.AudioLevelUpdated += new EventHandler<AudioLevelUpdatedEventArgs>(recognizer_AudioLevelUpdated);
                //recognizer.AudioStateChanged += new EventHandler<AudioStateChangedEventArgs>(recognizer_AudioStateChanged);
                recognizer.SpeechRecognized  +=  new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
                recognizer.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(recognizer_RecognizeCompleted);
                // Perform recognition on the entire file.
                Console.WriteLine("Starting asynchronous recognition...");
                completed = false;
                //recognizer.RecognizeAsync();
                recognizer.RecognizeAsync(RecognizeMode.Multiple);
                // Keep the console window open.
                while (!completed)
                {
                    Console.ReadLine();
                }
                Console.WriteLine("Done.");
            }
            Console.WriteLine();
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();

        }
        // Handle the Audio state event.
        static void recognizer_AudioStateChanged(object sender, AudioStateChangedEventArgs e)
        {
            Console.WriteLine("The new audio state is: " + e.AudioState);
        }
        static void recognizer_AudioLevelUpdated(object sender, AudioLevelUpdatedEventArgs e)
        {
            Console.WriteLine("The audio level is now: {0}.", e.AudioLevel);
        }

        // Handle the SpeechRecognized event.
        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result != null && e.Result.Text != null)
            {
                Console.WriteLine("  Recognized text =  {0}", e.Result.Text);
            }
            else
            {
                Console.WriteLine("  Recognized text not available.");
            }
        }
        // Handle the RecognizeCompleted event.
        static void recognizer_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Console.WriteLine("  Error encountered, {0}: {1}",
                e.Error.GetType().Name, e.Error.Message);
            }
            if (e.Cancelled)
            {
                Console.WriteLine("  Operation cancelled.");
            }
            if (e.InputStreamEnded)
            {
                Console.WriteLine("  End of stream encountered.");
            }
            completed = true;
        }

    }
}
另一个类是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Speech.Recognition;
public class SpeechReconizer
{
    SpeechRecognitionEngine _speechRecognitionEngine;
    public SpeechReconitionResult ReadResult { get; set; }
    public SpeechReconizer()
    {
        Grammar dictation = new DictationGrammar();
        dictation.Name = "Dictation Grammar";

        _speechRecognitionEngine = new SpeechRecognitionEngine();
        _speechRecognitionEngine.SetInputToDefaultAudioDevice();
        _speechRecognitionEngine.LoadGrammar(dictation);
        _speechRecognitionEngine.InitialSilenceTimeout = TimeSpan.FromSeconds(3);
        _speechRecognitionEngine.BabbleTimeout = TimeSpan.FromSeconds(2);
        _speechRecognitionEngine.EndSilenceTimeout = TimeSpan.FromSeconds(1);
        _speechRecognitionEngine.EndSilenceTimeoutAmbiguous = TimeSpan.FromSeconds(1.5);
        _speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
        _speechRecognitionEngine.SpeechRecognized += RecognizerSpeechRecognized;
        _speechRecognitionEngine.RecognizeCompleted += RecognizerRecognizeCompleted;
    }

    public SpeechReconitionResult ReadSpeech(string sourceAudio)
    {
        ReadResult = new SpeechReconitionResult();
        _speechRecognitionEngine.SetInputToWaveFile(sourceAudio);

        _speechRecognitionEngine.Recognize();
        return ReadResult;
    }
    private void RecognizerSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        if (e.Result != null && e.Result.Text != null)
        {
            ReadResult.Success = true;
            ReadResult.Text = e.Result.Text;
        }
        else
        {
            ReadResult.Text = "Recognized text not available.";
        }
    }
    private void RecognizerRecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            ReadResult.Success = false;
            ReadResult.ErrorMessage = string.Format("{0}: {1}",
                          e.Error.GetType().Name, e.Error.Message);
        }
        if (e.Cancelled)
        {
            ReadResult.Success = false;
            ReadResult.ErrorMessage = "Operation cancelled.";
        }
    }
}
public class SpeechReconitionResult
{
    public string Text { get; set; }
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public bool Complete { get; set; }
}

测试结果是(在控制台中):

Starting asynchronous recognition...
  Recognized text = Helence and the globe or east
  Recognized text = alarmed
  Recognized text = and client thanks
  Recognized text = what aren't going to do and that they
  Recognized text = aren't goint to rule
  Recognized text = working to dear E
  Recognized text = N
  Recognized text = at dinner
  Recognized text = and
  Recognized text = that going there
  Recognized text = and you have a 98 no problem bars
  End of stream encountered.

实际内容是什么:-你好文森特。鲍里斯中国话。-你好吗?-我很好。你今天打算做什么?-我打算看电视,吃晚饭,然后回家。-谢谢,祝你愉快。-没有问题。

如何在使用微软语音识别引擎时提高结果的准确性

System.Speech。识别支持默认的windows语音识别。它是为单个用户设计的,可以由用户通过windows语音识别训练进行训练。

你可能想要的是Microsoft.Speech.Recognition库,它是为低质量音频设计的。它的工作原理几乎相同,然而,它不是为听写而设计的。它更适合于从电话质量音频中检测命令。如果你想尝试一下,我找到的最新版本在这里:http://www.microsoft.com/en-us/download/details.aspx?id=27226

实际上有几种方法可以做到这一点,我已经使用c#进行了测试。它本质上允许你从SrgsOneOf对象中创建"俚语规则"。假设您有一组命令,如"放弃,"但是说话的人是"放弃"的。你可以创建一个SrgsOneOf abandon = new SrgsOneOf(new string[] {"abandan", "abandin", "ah'bandon", abanon});

创建"俚语规则"从SrgsOneOf对象。SrgsRule = new SrgsRule("俚语", abandon);

同样,在c#中,枚举(或枚举类型)用于将常量名称赋给一组数值整数值。它使常量值更具可读性。我将此应用于我的switch case语句,从那时起,响应变得更加准确和清晰。

最后:重要的是练习良好的语法构建,投资一个昂贵的麦克风/好的质量。许多人忽略的另一个因素是字符串的使用及其可能消耗的内存。使用常量字符串的要点如下:是一个常量字符串被自动存储。如果您有1000个具有常规字符串字段的类型的实例,并且所有实例都存储永远不会更改的相同字符串,那么将存储1000个相同的字符串实例,不必要地破坏应用程序的内存配置文件。如果声明字符串常量,"它只会消耗一次内存"。这与直接使用字符串字面值的行为相同。与静态只读字符串相比,常量字符串的值直接存储在引用的类中。

假设我有选项:
选择命令= new Choices();命令。添加(新字符串[]{"scarlett find biochemistry"});

我如何采取更聪明的方法?答:private const string V = "scarlett find生化";现在:选择命令= new Choices();命令。Add(new string[] {V});

这大大改善了我在YouTube.com上看到的系统。斯佳丽极端