(四)語音識別測試案例


     基於.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:可以結合之前的語音合成來做一個簡單的問答機器人程序。

上述案例源碼:源碼下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM