需求拆解
- 語音輸入文字(語音轉文字,STT) → 填充第三方輸入框。
- 語音指令觸發動作:開啟瀏覽器、撥打電話、控制硬體設備。
- 已有 10+ 現成功能模組,需透過語音指令調度。
三大技術路線對比
| 方案 | 優點 | 缺點 | 適用場景 |
| Windows Speech Recognition (WSR) + System.Speech | 離線、免費、API 簡單(`SpeechRecognitionEngine`)、支援自定義 `Grammar` | 識別率不如雲端、需訓練、僅支援 Windows Vista+ | 企業內網、離線設備、隱私敏感場景 |
| Cortana / WinRT `Windows.Media.SpeechRecognition` | 雲端識別率高、自然語言理解 (NLU)、整合系統指令 | 需聯網、Cortana 區域限制、UWP/WinUI 專案較易整合 | 消費級 App、需複雜語義理解 |
| 第三方雲端 SDK (Azure Speech、百度、訊飛、Google) | 多語言、高準確度、支援熱詞、即時串流 | 收費、需網路、資料上雲合規風險 | 商業化產品、多平台(含移動端) |
推薦架構:WSR + 自定義 Grammar + 命令分發器
using System.Speech.Recognition;
using System.Diagnostics;
public class VoiceCommandDispatcher
{
private SpeechRecognitionEngine _engine;
private Dictionary _commands = new();
public VoiceCommandDispatcher()
{
_engine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("zh-CN"));
_engine.SetInputToDefaultAudioDevice();
// 1. 註冊現有功能
RegisterCommand("開啟瀏覽器", () => Process.Start("chrome.exe"));
RegisterCommand("撥打電話", () => DialPhone("13800138000"));
RegisterCommand("開啟設備", () => HardwareController.Open());
// ... 其餘 10+ 指令
// 2. 建立 Grammar
var choices = new Choices(_commands.Keys.ToArray());
var gb = new GrammarBuilder(choices);
var grammar = new Grammar(gb);
_engine.LoadGrammar(grammar);
_engine.SpeechRecognized += (s, e) => {
if (_commands.TryGetValue(e.Result.Text, out var action))
action.Invoke();
};
}
public void Start() => _engine.RecognizeAsync(RecognizeMode.Multiple);
public void Stop() => _engine.RecognizeAsyncStop();
private void RegisterCommand(string phrase, Action action) => _commands[phrase] = action;
private void DialPhone(string number) { /* 撥號邏輯 */ }
}
關鍵細節
- 語法擴充:使用 `SemanticResultKey`/`SemanticResultValue` 支援參數化指令,如「撥打 <聯繫人> 電話」。
- 降噪與適配:`_engine.UpdateRecognizerSetting("AdaptationOn", 1)` 啟用聲學模型適應。
- 第三方應用互動:若目標視窗非自家程式,需用 `SendKeys`、UI Automation (`System.Windows.Automation`)、或 Win32 `PostMessage` 發送鍵盤/滑鼠訊息。
- 權限:控制硬體設備通常需管理員權限或裝置驅動程式配合。
學習資源
避坑指南
- 不要在 UI 執行緒直接 `RecognizeAsync()`,會卡死介面,需 `Task.Run` 或獨立執行緒。
- 指令詞盡量互斥、語音特徵明顯,減少誤觸發(如避免「開啟」與「關閉」韻母相近)。
- 測試環境噪音、麥克風增益、采樣率 (16kHz/44.1kHz) 影響極大,實機調試不可省略。