上一篇介紹了 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 實作略...
}
執行後,矩形會隨著說話者移動左右擺動,直觀顯示聲源方位。

參考 MIT Bolt 1980 年經典論文「Put That There」,結合 SpeechRecognitionEngine 與骨骼追蹤,實現:
Create a red circle, there. → 在右手十字準星位置生成紅色圓形。
Move that there. → 移動最近建立的物件到手勢位置。
Canvas.Left/Top 綁定 HandLeft/HandTop 隨右手移動。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);
}
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")));
}
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.,藍色菱形即出現在右手十字準星處。
BeamAngleMode.Adaptive 結合骨骼追蹤可有效鎖定說話者,但嘈雜環境下建議調整 NoiseSuppression、EchoCancellationMode。AppendWildcard() 忽略無關詞彙 (如 "a", "the"),提升辨識容錯率;Choices 限定關鍵字集合,大幅提高準確度。本文實作了波束追蹤視覺化與語音指令控制圖形的完整範例,展示 Kinect 「聽得見方向、懂得指令、配合手勢定位」的多模態互動潛力。下一篇將介紹進階開發常用的第三方類庫與工具 (Emgu CV、Unity 3D、Blender 等),敬請期待!