首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 實現語音控制第三方應用:Cortana / Windows Speech Recognition / 自定義語法完整方案

     編輯:程式設計綜合問答

需求拆解

  • 語音輸入文字(語音轉文字,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` 發送鍵盤/滑鼠訊息。
  • 權限:控制硬體設備通常需管理員權限或裝置驅動程式配合。

學習資源

避坑指南

  1. 不要在 UI 執行緒直接 `RecognizeAsync()`,會卡死介面,需 `Task.Run` 或獨立執行緒。
  2. 指令詞盡量互斥、語音特徵明顯,減少誤觸發(如避免「開啟」與「關閉」韻母相近)。
  3. 測試環境噪音、麥克風增益、采樣率 (16kHz/44.1kHz) 影響極大,實機調試不可省略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved