Facebook RSS Feed
 
Kinect & Leap Motion: Ses Yönünü Belirlemek
Tarih: 10.10.2012, Platform: .NET 4.5, IDE: Visual Studio 2012, Level: 200

Önceki paylaşımlarımızda, Kinect'in çok hassas bir mikrofon dizisi taşıdığından bahsetmiştik. Kinect, kasasının altına doğru yerleştirilmiş 4 adet mikrofon ile hem hassas bir ses kaydı yapabilmekte, hem de sesin geldiği açıyı algılayabilmekte. Böylelikle, interaktif uygulamalarımızda sesin kimden geldiğini hesaplayabiliyoruz. Robotik uygulamalarda ise ses kaynağına yönelen bir robot sisteminin geliştirilmesi oldukça kolaylaşıyor. Üzerinde duracağımız uygulamada, ses kaynağının açısını, bu açının doğruluk seviyesini ve Kinect'in ses dinleme açısını elde etmeyi göreceğiz.

Çalışma Mantığı

Kinect, görüntü işlemlerinde olduğu gibi, ses işlemlerinde de işin zor kısmını gerçekleştirerek, elde ettiği veriyi uygulamamıza gönderiyor. AudioSource altından erişebildiğimiz bir çok metod ile sesle ilgili işlemleri gerçekleştirebiliyoruz.

Ses açısı konusunda "Sound Source Angle" ve "Beam Angle" özellikleri bulunuyor. Sound Source Angle, en yüksek sesin geldiği açıyı hesaplıyor. Confidence Level, bu açının ne doğrulukta hesaplandığını gösteriyor. Beam Angle ise, Kinect'in hangi açıdan gelen sesleri dinlediğini (ve dolayısıyla bunun dışındaki açılardan gelen ses seviyesini düşürdüğünü) bildiriyor.

Ses açısına ait bu verilere, "SoundSourceAngleChanged" ve "BeamAngleChanged" event'leri aracılığıyla ulaşabiliyoruz.

Uygulama

Sözünü ettiğimiz verilere ulaşmamızı sağlayacak örnek bir uygulama geliştireceğiz. Bunun için, Visual Studio'dan "KinectSesYonu" isminde bir WPF uygulaması oluşturalım ve proje referanslarına "Microsoft.Kinect.dll" dosyasını ekleyelim.

Uygulamamız, Kinect sesi hesapladığında aşağıdaki gibi açısal değerleri ve doğruluk seviyesini gösterecek.

 -

Uygulama kodlarımız:

[XAML] MainWindow.xaml

<Window x:Class="KinectSesYonu.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect Ses Yönü" Height="180" Width="320"
        Loaded="Window_Loaded" Closing="Window_Closing"
        WindowStartupLocation="CenterScreen" ResizeMode="CanMinimize">
    <Grid>
        <TextBlock FontSize="20" HorizontalAlignment="Left" Margin="25,25,0,0" TextWrapping="Wrap"
                   Text="Ses Kaynağı Açısı:" VerticalAlignment="Top"/>
        <TextBlock x:Name="txtAudioSourceAngle" FontSize="20" HorizontalAlignment="Left"
                   Margin="198,25,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top"
                   TextAlignment="Right" Width="75"/>
        <TextBlock FontSize="20" HorizontalAlignment="Left" Margin="25,57,0,0" TextWrapping="Wrap"
                   Text="Doğruluk Seviyesi:" VerticalAlignment="Top"/>
        <TextBlock x:Name="txtConfidenceLevel" FontSize="20" HorizontalAlignment="Left"
                   Margin="198,57,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top"
                   TextAlignment="Right" Width="75"/>
        <TextBlock FontSize="20" HorizontalAlignment="Left" Margin="25,89,0,0" TextWrapping="Wrap"
                   Text="Ses Dinleme Açısı:" VerticalAlignment="Top"/>
        <TextBlock x:Name="txtBeamAngle" FontSize="20" HorizontalAlignment="Left"
                   Margin="198,89,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top"
                   TextAlignment="Right" Width="75"/>
    </Grid>
</Window>

[C#] MainWindow.xaml.cs

using System.Windows;
using Microsoft.Kinect;
 
namespace KinectSesYonu
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        /// <summary>
        /// Kinect sensörü
        /// </summary>
        KinectSensor kinect;
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Kinect bilgisayara bağlıysa
            if (KinectSensor.KinectSensors.Count > 0)
            {
                // Bulunan ilk sensörü kullan
                kinect = KinectSensor.KinectSensors[0];
 
                // Kinect sensörü başlat
                kinect.Start();
 
                // Ses kaynağını başlat
                kinect.AudioSource.Start();
 
                // Ses kaynağında değişiklik olunca tetiklenecek event handlerı belirle
                kinect.AudioSource.SoundSourceAngleChanged += SoundSourceAngleChanged;
 
                // Ses dinleme yönünde değişiklik olunca tetiklenecek event handlerı belirle
                kinect.AudioSource.BeamAngleChanged += BeamAngleChanged;
            }
        }
 
        private void SoundSourceAngleChanged(object sender, SoundSourceAngleChangedEventArgs e)
        {
            // Ses kaynağının açısını göster
            txtAudioSourceAngle.Text = e.Angle.ToString("00.00");
 
            // Algılanan açının doğruluk seviyesini göster
            txtConfidenceLevel.Text = e.ConfidenceLevel.ToString("%000");
        }
 
        private void BeamAngleChanged(object sender, BeamAngleChangedEventArgs e)
        {
            // Ses dinleme açısını göster
            txtBeamAngle.Text = e.Angle.ToString("00.00");
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Uygulama kapatılırken, Kinect çalışıyorsa durdur
            if (kinect != null && kinect.IsRunning)
                kinect.Stop();
        }
    }
}

Uygulamayı çalıştırıp konuşmaya yada ses çıkarmaya başladığınızda, Kinect'e göre bulunguğunuz açıyı göreceksiniz...


Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 1553

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi