• (四)语音识别测试案例


         基于.NET的语音合成或语音识别应用相对都比较简单,基础类库已经帮我们做了大量的工作。我们只需要关注我们的需求即可。所以这里也是用一个最简单的案例来演示基于.NET的语音识别。Windows系统内置已经集成了语音识别引擎。该引擎没有独立的安装包,其包含在了系统语言包中。通常情况下简体中文的系统仅包括了中文识别,如果安装了额外的语言包,那么相对应也会有额外的语音识别引擎,所以我们在开发中尽可能指明当前使用的语音识别引擎。

    首先创建一个窗体程序,添加System.Speech.Recognition引用,程序界面布局如下:

    image

    程序代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Speech.Recognition;
    using System.Globalization;
    
    namespace Recognition
    {
        public partial class FrmMain : Form
        {
           private SpeechRecognitionEngine recognizer;  //语音识别引擎
            private string engineId = "MS-2052-80-DESK"; //Win7下语音识别引擎编号
            private string currentCulture = "zh-CN"; //语言
    
            public FrmMain()
            {
                InitializeComponent();
            }
    
            private void FrmMain_Load(object sender, EventArgs e)
            {
                /*
                 * 如果系统存在多个识别引擎,则初始化指定编号和语言的引擎
                 * 关于其它引擎的编号可以从SpeechRecognitionEngine.InstalledRecognizers()中获取
                 */
                CultureInfo cultureInfo = new CultureInfo(currentCulture); //当前地区文化
                foreach (RecognizerInfo recognizerInfo in SpeechRecognitionEngine.InstalledRecognizers())
                {
                    if (recognizerInfo.Culture.Equals(cultureInfo) && recognizerInfo.Id == engineId)
                    {
                        recognizer = new SpeechRecognitionEngine(recognizerInfo);
                        recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Recognizer_SpeechRecognized);
                        break;
                    }
                }
    
                //卸载所有语法
                recognizer.UnloadAllGrammars();
    
                //加载自然语法
                DictationGrammar dictationGrammar = new DictationGrammar();
                recognizer.LoadGrammar(dictationGrammar);
            }
    
            /// <summary>
            /// 开始聆听
            /// </summary>
            private void btnStart_Click(object sender, EventArgs e)
            {
                //设置语音输入设备(使用系统默认输入设备)
                recognizer.SetInputToDefaultAudioDevice();
    
                //启用连续语音识别模式
                recognizer.RecognizeAsync(RecognizeMode.Multiple);
    
                this.btnStart.Text = "聆听中...";
                this.btnStart.Enabled = false;
                this.btnStop.Enabled = true;
            }
    
            /// <summary>
            /// 停止聆听
            /// </summary>
            private void btnStop_Click(object sender, EventArgs e)
            {
                recognizer.RecognizeAsyncStop();
    
                this.btnStart.Text = "开始聆听";
                this.btnStart.Enabled = true;
                this.btnStop.Enabled = false;
            }
    
            /// <summary>
            /// 连续识别完成时引发
            /// </summary>
            private void Recognizer_SpeechRecognized(Object sender, SpeechRecognizedEventArgs e)
            {
                this.rtxtResult.Text = e.Result.Text;
            }
        }
    }

    在初始化引擎时,需要指明当前使用的识别引擎。如何查看系统安装的语音识别引擎的编号呢?可以使用SpeechRecognitionEngine.InstalledRecognizers()这个静态方法获取到系统安装的所有引擎。使用该方法预先了解下系统识别的引擎的的编号和语言。

    根据已经了解的信息可以预先定义要使用的识别引擎如下:

    private SpeechRecognitionEngine recognizer;  //语音识别引擎
    private string engineId = "MS-2052-80-DESK"; //Win7下语音识别引擎编号
    private string currentCulture = "zh-CN"; //语言

    再根据上述信息初始化识别引擎:

    CultureInfo cultureInfo = new CultureInfo(currentCulture); //当前地区文化
    foreach (RecognizerInfo recognizerInfo in SpeechRecognitionEngine.InstalledRecognizers())
    {
        if (recognizerInfo.Culture.Equals(cultureInfo) && recognizerInfo.Id == engineId)
        {
            recognizer = new SpeechRecognitionEngine(recognizerInfo);
            recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Recognizer_SpeechRecognized);
            break;
        }
    }

    语音识别引擎比较重要的就是识别语法。一般分两种:一种是自然语法,一种是自定义语法。自然语法是语音识别引擎工作的基础语法。如果不加载自然语法识别准确度将会很低。而自定义语法,则是我们针对特定的需求或项目来编排用于提高识别精度的。上述案例仅仅使用的自然语法来进行识别。

    //卸载所有语法
    recognizer.UnloadAllGrammars();
    
    //加载自然语法
    DictationGrammar dictationGrammar = new DictationGrammar();
    recognizer.LoadGrammar(dictationGrammar);

    这里先卸载了所有语法,为了避免加载重复的语法。

    打开并测试麦克风可用,运行上述代码,并尝试对着麦克风说话,结果如下:

    image

    TIPS:可以结合之前的语音合成来做一个简单的问答机器人程序。

    上述案例源码:源码下载

  • 相关阅读:
    Leetcode_02【两数相加】——【难度:中】
    Leetcode_39【组合总和】
    Leetcode_38【报数】
    Leetcode_36【有效的数独】
    Leetcode_35【搜索插入位置】
    51nod1347 旋转字符串
    WebH
    ExcelHelper
    文件二进制与String相互转换
    汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp
  • 原文地址:https://www.cnblogs.com/UltimateAvalon/p/4622010.html
Copyright © 2020-2023  润新知