首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Kinect for Windows SDK 開發入門(十三):語音辨識實戰——波束追蹤與指令控制

     編輯:關於.NET

前言:語音與骨骼的雙重奏

上一篇介紹了 Kinect 語音辨識的核心架構與音訊錄製。本文將透過兩個完整範例,展示 波束追蹤 (Beam Tracking) 視覺化聲音方向,以及 語音指令結合骨骼追蹤 實現「說話下指令、揮手定位置」的自然互動體驗。

一、波束追蹤:看見聲音的方向

Kinect 底部的 4 支麥克風組成陣列,透過波束成形技術可計算聲源方向。KinectAudioSource.BeamAngleChanged 事件即可即時取得該角度 (弧度)。

範例:聲音方向指示器

UI 設計:一個垂直細長矩形,置中底部,綁定 RotateTransform.Angle 屬性。

<Rectangle Fill="#1BA78B" Width="10" RenderTransformOrigin="0.5,0">
    <Rectangle.RenderTransform>
        <RotateTransform Angle="{Binding BeamAngle}"/>
    </Rectangle.RenderTransform>
</Rectangle>

核心邏輯:

public partial class MainWindow : Window, INotifyPropertyChanged {
    private double _beamAngle;
    public double BeamAngle { get => _beamAngle; set { _beamAngle = value; OnPropertyChanged("BeamAngle"); } }

    private void ListenForBeamChanges() {
        KinectSensor.KinectSensors[0].Start();
        var source = KinectSensor.KinectSensors[0].AudioSource;
        source.BeamAngleMode = BeamAngleMode.Automatic; // 自適應追蹤
        source.BeamAngleChanged += (s, e) => BeamAngle = -e.Angle * 180 / Math.PI; // 弧度轉角度並反向
        source.Start();
    }
    // INotifyPropertyChanged 實作略...
}

執行後,矩形會隨著說話者移動左右擺動,直觀顯示聲源方位。

波束追蹤示意圖

二、語音指令識別:打造「說出指令、手勢定位」的 Put-That-There 經典範例

參考 MIT Bolt 1980 年經典論文「Put That There」,結合 SpeechRecognitionEngine 與骨骼追蹤,實現:
Create a red circle, there. → 在右手十字準星位置生成紅色圓形。
Move that there. → 移動最近建立的物件到手勢位置。

專案架構

  • CrossHairs 控制項:50x50 十字準星,透過 Canvas.Left/Top 綁定 HandLeft/HandTop 隨右手移動。
  • MainWindow (Canvas + Viewbox):支援多解析度自動縮放,底部兩 Label 顯示辨譽文字與信心度。
  • 語法定義 (Grammar):支援顏色、形狀、動作關鍵字組合。

核心程式碼片段

1. 音訊來源與辨識引擎初始化

private void StartSpeechRecognition() {
    _source = CreateAudioSource(); // 關閉 AGC、EchoCancellation
    var ri = SpeechRecognitionEngine.InstalledRecognizers()
        .FirstOrDefault(r => "True".Equals(r.AdditionalInfo["Kinect"]) && "en-US".Equals(r.Culture.Name));
    _sre = new SpeechRecognitionEngine(ri.Id);
    CreateGrammars(ri);
    _sre.SpeechRecognized += sre_SpeechRecognized;
    _sre.SpeechHypothesized += (s, e) => HypothesizedText = e.Result.Text;
    _sre.SpeechRecognitionRejected += (s, e) => { HypothesizedText += " Rejected"; Confidence = e.Result.Confidence.ToString("0.00"); };
    _sre.SetInputToAudioStream(_source.Start(), new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
    _sre.RecognizeAsync(RecognizeMode.Multiple);
}

2. 語法建構:靈活的關鍵字組合

private void CreateGrammars(RecognizerInfo ri) {
    var colors = new Choices("cyan", "yellow", "magenta", "blue", "green", "red");
    var actions = new Choices("create", "put");
    var shapes = new Choices("circle", "triangle", "square", "diamond");
    var gb = new GrammarBuilder { Culture = ri.Culture };
    gb.Append(actions).AppendWildcard().Append(colors).Append(shapes).Append("there");
    _sre.LoadGrammar(new Grammar(gb));
    // 退出指令
    _sre.LoadGrammar(new Grammar(new GrammarBuilder { Culture = ri.Culture }.Append("quit application")));
}

3. 指令解譯與 UI 操作 (需在 UI 執行緒)

private void InterpretCommand(SpeechRecognizedEventArgs e) {
    var result = e.Result;
    Confidence = result.Confidence.ToString("0.00");
    if (result.Confidence < 0.95 && result.Words[0].Text == "quit" && result.Words[1].Text == "application") { this.Close(); return; }
    if (!(result.Words[0].Text == "put" || result.Words[0].Text == "create")) return;
    // 解析顏色 (Words[2])
    Color color = ParseColor(result.Words[2].Text); // 略
    // 解析形狀 (Words[3])
    Shape shape = ParseShape(result.Words[3].Text); // 略
    // 定位到右手位置
    shape.SetValue(Canvas.LeftProperty, HandLeft);
    shape.SetValue(Canvas.TopProperty, HandTop);
    shape.Fill = new SolidColorBrush(color);
    MainStage.Children.Add(shape);
}

執行畫面

語音指令建立圖形示意

說出 Create a blue diamond, there.,藍色菱形即出現在右手十字準星處。

三、重要限制與心得

  • 語言支援:截至 SDK 1.5,官方語言包不支援中文,僅能以英文測試 (en-US)。
  • 環境噪音:BeamAngleMode.Adaptive 結合骨骼追蹤可有效鎖定說話者,但嘈雜環境下建議調整 NoiseSuppression、EchoCancellationMode。
  • 語法設計哲學:使用 AppendWildcard() 忽略無關詞彙 (如 "a", "the"),提升辨識容錯率;Choices 限定關鍵字集合,大幅提高準確度。

四、結語

本文實作了波束追蹤視覺化與語音指令控制圖形的完整範例,展示 Kinect 「聽得見方向、懂得指令、配合手勢定位」的多模態互動潛力。下一篇將介紹進階開發常用的第三方類庫與工具 (Emgu CV、Unity 3D、Blender 等),敬請期待!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved