Sound activated switch in C#/WPF, Clap Switch C#


Introduction 

The article is a sound activated switch done in WPF (.Net 4.0) for controlling your applications or function based on sound variation. I have used NAudio library to capture the sound signals. The application has been designed to be a very simple and easy to use one.

NAudio is licensed under Microsoft Public License (Ms-PL) with which you will be able to use it where ever you want, even in your commercial applications, so feel free to use it in your Applications.

How did this happen…

There was a requirement to activate a switch when a tennis ball is hit (related to a tennis coaching application). The application had to record a video a couple of seconds before the ball was hit.

I did some research and found a very good article in channel9 (mentioned in the reference section) which contains the major functionality, but was meant for different purpose.  I tweaked it with some small functionality to create the Sound activated switch; you can even call it a Clap Switch in C# / WPF.

What is all this?

NAudio includes a class called WaveIn which is the main class we are going to use for this application. WaveIn also contains a static function called DeviceCount for getting the count of input devices.

WaveInCapabilities class is used to get the device information from waveInDevice (which is represented as an integer).

An event called DataAvailable is raised when there is an input sound signal (which can be even plotted). The event will be the total Bytes recorded and the buffer object, which means that the event will be triggered in frequent intervals (almost real-time) and will contain an array of the buffered values, which will be a byte array and for our application it should be converted to float.

We then compare the sound levels and make the necessary changes to sensitivity levels (0-100) which will be compared with the sound values. You can probably trigger your other functions from here.

         private float bigValue;
        WaveIn waveIn;
        private double MaxValue;
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (Convert.ToInt16(textBox1.Text) > 100)
            {
                MessageBox.Show("Invalid Value");
                return;
            }
            else
                MaxValue = Convert.ToDouble(textBox1.Text) / 100;
            bigValue = 0;
            waveIn= new WaveIn();
            int waveInDevices = WaveIn.DeviceCount;
            //get the devicecount

            for (int waveInDevice = 0; waveInDevice < waveInDevices; waveInDevice++)
            {
                WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
            }
            //load in the deviceinfo using the GetCapabilties function

            waveIn.DeviceNumber = 0;
            waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);
            int sampleRate = 8000; // 8 kHz
            int channels = 1; // mono
            waveIn.WaveFormat = new WaveFormat(sampleRate, channels);
            //Setting the format
            waveIn.StartRecording();
        }
  void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            for (int index = 0; index < e.BytesRecorded; index += 2)
            {
                short sample = (short)((e.Buffer[index + 1] << 8) |
                                        e.Buffer[index + 0]);
                float sample32 = sample / 32768f;
                label1.Content = sample32.ToString();
                if (bigValue < sample32)
                {
                    bigValue = sample32;
                    label2.Content = bigValue.ToString();
                    if (bigValue > MaxValue)
                    {
                        waveIn.StopRecording();

                        MessageBox.Show("Did you Clap?");
                    }
                }
            }

        }

You want to use this somewhere?

I am using this application for switching of Video Streams based on the voice, I also see various application in your day to day applications where you want to control any part of your application with sound activation like, show a status report when you manager / boss start making weird sounds :), you need to keep the sensitivity level accordingly though.

Clap switches are traditionally used in Electronic applications and you will see a wide variety of applications related to clap switches, an advance form of this application will be voice recognition(which is already available) in the Speech to Text facility in SAPI.

NAudio provides some samples where you can easily work on Sound Visualization in .NET, thought .NET is not the best solution for this, and it performs fairly above expectation when it comes to Audio functions.

Reference

The article named .Net Voice by Mark Heath is the real source behind this article, i just added some frills to his, and create a different function.

http://channel9.msdn.com/coding4fun/articles/NET-Voice-Recorder  

About

John Joseph

John Joseph

John Joseph

johnjoseph 8 gmail