基於.NET的語音合成或語音識別應用相對都比較簡單,基礎類庫已經幫我們做了大量的工作。我們只需要關注我們的需求即可。所以這里也是用一個最簡單的案例來演示基於.NET的語音識別。Windows系統內置已經集成了語音識別引擎。該引擎沒有獨立的安裝包,其包含在了系統語言包中。通常情況下簡體中文的系統僅包括了中文識別,如果安裝了額外的語言包,那么相對應也會有額外的語音識別引擎,所以我們在開發中盡可能指明當前使用的語音識別引擎。
首先創建一個窗體程序,添加System.Speech.Recognition引用,程序界面布局如下:
程序代碼如下:
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);
這里先卸載了所有語法,為了避免加載重復的語法。
打開並測試麥克風可用,運行上述代碼,並嘗試對着麥克風說話,結果如下:
TIPS:可以結合之前的語音合成來做一個簡單的問答機器人程序。
上述案例源碼:源碼下載


