透過聲音來源,我們可以再去限制其範圍,最後將其範圍資料導入,去得知聲音內容
XAML:
<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="100" Width="250" Loaded="Window_Loaded_1"> <Grid> <Label x:Name="label" Content="Label" HorizontalAlignment="Left" Margin="10,21,0,0" VerticalAlignment="Top"/> </Grid> </Window>
程式碼:
using Microsoft.Kinect; using System.Windows; namespace WpfApplication2 { /// <summary> /// MainWindow.xaml 的互動邏輯 /// </summary> public partial class MainWindow : Window { private KinectSensor sensor; public MainWindow() { InitializeComponent(); KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged; label.Content = ""; } private void Window_Loaded_1(object sender, RoutedEventArgs e) { if (KinectSensor.KinectSensors.Count == 0) { MessageBox.Show("請將Kinect接上電腦"); } else { this.sensor = KinectSensor.KinectSensors[0]; this.sensor.Start(); InitiateAudioSource(); } } private void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e) { switch (e.Status) { case KinectStatus.Connected: if (sensor == null) { this.sensor = KinectSensor.KinectSensors[0]; this.sensor.Start(); } break; case KinectStatus.Disconnected: this.sensor.Stop(); this.sensor = null; break; } } private void InitiateAudioSource() { KinectAudioSource audioSource = sensor.AudioSource; audioSource.NoiseSuppression = true; audioSource.AutomaticGainControlEnabled = true; audioSource.BeamAngleMode = BeamAngleMode.Adaptive; audioSource.BeamAngleChanged += AudioSource_BeamAngleChanged; audioSource.Start(); } private void AudioSource_BeamAngleChanged(object sender, BeamAngleChangedEventArgs e) { if (e.Angle > 0) { label.Content = string.Format("聲音是從右邊發出來的," + "角度為{0:F}", e.Angle); } else if (e.Angle < 0) { label.Content = string.Format("聲音是從左邊發出來的," + "角度為{0:F}", e.Angle); } else { label.Content = string.Format("聲音是從中間發出來的," + "角度為{0:F}", e.Angle); } } } }
該程式主要是透過BeamAngleChanged去取得到該事件,BeamAngleChanged又是什麼呢?
BeamAngleChanged是經由聲音方位變換後觸發的事件,不過該事件觸發會造成CPU使用率提高,所以可能會有延遲的現象發生
該事件觸發時,我們可以透過BeamAngleChangedEventArgs的變數e去取得到角度,再去辨別聲音方位
參考資料:
Kinect體感程式探索-使用C#
http://www.dotblogs.com.tw/marcus116/archive/2012/03/11/70655.aspx
http://epaper.gotop.com.tw/PDFSample/ACL038800.pdf
http://msdn.microsoft.com/en-us/library/microsoft.kinect.beamanglemode
圖片來源:
http://files.channel9.msdn.com/wlwimages/f1dda9cc6de74512b7c19f0101402403/KinectAudioPoisitioning2%5B2%5D.png