语音数据(Audio Data)

Kinect for windows有四个麦克风,组成一个麦克风阵列,可以采集外部传来的声单,不但可以收集,还可以除噪,识别。Kinect for windows可以识别正前主100度范围的声单。Kinect for windows通过两组数组来定位声单的方向,一个是波束角度(BeamAngle),一个声源角度(SoundSourceAngle)。波束角度是把100度分成10分,分别为50,40,30,20,10,0,-10,-20,-30,-40,-50这11个值,只要在相应的范围内,采样就不会重新进行,比如现在在Kinect for windows的0度方向,大体上在-5或5的范围内,波束角度都不会更新。声源角度就不一样了,只要声音达到一定的分贝,它就采信,同时它还跟随着一个可信度的值,为0~1之间,1是最可信的,就是声音的来源确定性是最可信的。我们可以通过这两个参数结合骨骼定位能就Kinect for windows周围的人进行较为准确的定位。

同时,Kinect对象有一个AudioSource的属性,它有一个Start方法,可以返回录音的数据流。我们对这些数据进行处理就可以。

创建一个WinForm

现在看后台代码:

  
  
  
  
  1. public partial class Form1 : Form  
  2. {  
  3.     public Form1()  
  4.     {  
  5.         InitializeComponent();  
  6.         Control.CheckForIllegalCrossThreadCalls = false;  
  7.     }  
  8.  
  9.     KinectSensor kinectsensor = null;  
  10.     private void Form1_Shown(object sender, EventArgs e)  
  11.     {  
  12.         //从Kinect集合中找到连接上的Kinect  
  13.         foreach (KinectSensor ks in KinectSensor.KinectSensors)  
  14.         {  
  15.             //找到连接的Kinect  
  16.             if (ks.Status == KinectStatus.Connected)  
  17.             {  
  18.                 kinectsensor = ks;  
  19.                 kinectsensor.Start();//开始工作,即可以采集摄像头和红外摄像头信息                
  20.                 this.Text = "Kinect开始工作……";  
  21.  
  22.                 return;  
  23.             }  
  24.         }  
  25.     }  
  26.  
  27.     private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  28.     {  
  29.         if (kinectsensor.Status == KinectStatus.Connected)  
  30.         {  
  31.             this.kinectsensor.AudioSource.Stop();//结束语音流的采集  
  32.             kinectsensor.Stop();//结束Kinect采集工作  
  33.             MessageBox.Show("Kinect结束工作!");  
  34.  
  35.         }  
  36.     }  
  37.     private void AudioReadingThread()  
  38.     {  
  39.         int second = int.Parse(Second_TB.Text);//Second_TB 中存放着录音的时长,单位为秒  
  40.         long len = second * 16000 * 2;//得到一定时间内的文件总长度,采样率是16000,2为采样一次的字节数  
  41.         //创建wav文件流,先写文件头,再写声音数据信息  
  42.         using (FileStream stream = new FileStream("F:/a/a.wav", FileMode.Create))  
  43.         {  
  44.             //WAV 文件头  
  45.             string wavBegin = "RIFF";  
  46.             byte[] tmpbyte = Encoding.Default.GetBytes(wavBegin);  
  47.             stream.Write(tmpbyte, 0, tmpbyte.Length);  
  48.             // 文件总长度  
  49.             long wavLength = len;  
  50.             byte[] tmpArr = new byte[4];  
  51.             longToIntBinary(wavLength + 16, tmpArr, 0);  
  52.             stream.Write(tmpArr, 0, tmpArr.Length);  
  53.             // WAV 文件标识  
  54.             string wavTag = "WAVEfmt ";  
  55.             byte[] tmpbyte1 = Encoding.Default.GetBytes(wavTag);  
  56.             stream.Write(tmpbyte1, 0, tmpbyte1.Length);  
  57.             // size of .WAV file header  
  58.             int headLength = 16;  
  59.             tmpArr = new byte[4];  
  60.             longToIntBinary(headLength, tmpArr, 0);  
  61.             stream.Write(tmpArr, 0, tmpArr.Length);  
  62.             // 格式标记 (01 = Windows PCM)  
  63.             int wFormatTag = 1;  
  64.             tmpArr = new byte[2];  
  65.             toShortBinary(wFormatTag, tmpArr, 0);  
  66.             stream.Write(tmpArr, 0, tmpArr.Length);  
  67.             // 通道数 (1=mono, 2=stereo)  
  68.             int nChannels = 1;  
  69.             tmpArr = new byte[2];  
  70.             toShortBinary(nChannels, tmpArr, 0);  
  71.             stream.Write(tmpArr, 0, tmpArr.Length);  
  72.             // 采样率  
  73.             int nSamplesPerSec = 16000;  
  74.             tmpArr = new byte[4];  
  75.             longToIntBinary(nSamplesPerSec, tmpArr, 0);  
  76.             stream.Write(tmpArr, 0, tmpArr.Length);  
  77.             //每秒播放字节数  
  78.             int nAvgBytesPerSec = 32000;  
  79.             tmpArr = new byte[4];  
  80.             longToIntBinary(nAvgBytesPerSec, tmpArr, 0);  
  81.             stream.Write(tmpArr, 0, tmpArr.Length);  
  82.             // 采样一次占字节数  
  83.             int nBlockAlign = 2;  
  84.             tmpArr = new byte[2];  
  85.             toShortBinary(nBlockAlign, tmpArr, 0);  
  86.             stream.Write(tmpArr, 0, tmpArr.Length);// bytes per sample  
  87.             // 采样一次占的位数  
  88.             int wBitsPerSample = 8 * nBlockAlign;//8乘字节数  
  89.             tmpArr = new byte[2];  
  90.             toShortBinary(wBitsPerSample, tmpArr, 0);  
  91.             stream.Write(tmpArr, 0, tmpArr.Length);// bits per sample  
  92.  
  93.             /** ******以下是数据头********* */ 
  94.             string dataTag = "data";  
  95.             byte[] tmpbyte2 = Encoding.Default.GetBytes(dataTag);  
  96.             stream.Write(tmpbyte2, 0, tmpbyte2.Length);// data tag  
  97.             //采样数据字节数  
  98.             tmpArr = new byte[4];  
  99.             longToIntBinary(wavLength, tmpArr, 0);  
  100.             stream.Write(tmpArr, 0, tmpArr.Length);// 数据总长度  
  101.             //开始采信声音流  
  102.             using (Stream audiostream = kinectsensor.AudioSource.Start())  
  103.             {  
  104.                 byte[] buf = new byte[1024];  
  105.                 int count, totalcount = 0;  
  106.                 //按1024个字节为一组采集流,并保存,当采信数据没有超过总长度时  
  107.                 while ((count = audiostream.Read(buf, 0, buf.Length)) > 0 && totalcount < len)  
  108.                 {  
  109.                     stream.Write(buf, 0, count);  
  110.                     totalcount += count;  
  111.                 }  
  112.                 audiostream.Close();  
  113.             }  
  114.             stream.Close();  
  115.         }  
  116.         //让录音按钮生效  
  117.         StartRecord_But.Enabled = true;  
  118.     }  
  119.     //波束角度采集方法  
  120.     private void AudioSourceBeamChanged(object sender, BeamAngleChangedEventArgs e)  
  121.     {  
  122.         double o = e.Angle;  
  123.         Beam_Lab.Text = "波束角度:" + o;  
  124.     }  
  125.     //声源角度和可信度采集方法  
  126.     private void AudioSourceSoundSourceAngleChanged(object sender, SoundSourceAngleChangedEventArgs e)  
  127.     {  
  128.         double o = e.ConfidenceLevel;  
  129.         double d = e.Angle;  
  130.         Confidence_Lab.Text = "可信度:" + o;  
  131.         Sound_Lab.Text = "来源角度:" + d;  
  132.     }  
  133.  
  134.  
  135.     private Thread readingThread;  
  136.     /// <summary>  
  137.     /// 整型转数组  
  138.     /// </summary>  
  139.     private static void longToIntBinary(long val, byte[] array, int offset)  
  140.     {  
  141.         array[offset] = (byte)(val & 0xff);  
  142.         array[offset + 1] = (byte)(val >> 8 & 0xff);  
  143.         array[offset + 2] = (byte)(val >> 16 & 0xff);  
  144.         array[offset + 3] = (byte)(val >> 24 & 0xff);  
  145.     }  
  146.     /// <summary>  
  147.     /// 字节转短整型  
  148.     /// </summary>  
  149.     private static void byteToShortBinary(byte val, byte[] array, int offset)  
  150.     {  
  151.         array[offset] = (byte)(val & 0xff);  
  152.         array[offset + 1] = 0x0;  
  153.     }  
  154.  
  155.     /// <summary>  
  156.     /// 将超过0x7FFF的short类型保存为int类型。本方法提供了将有符号short类型转换保存在字节数组中,占据两个字节  
  157.     /// </summary>  
  158.     private static void toShortBinary(int val, byte[] array, int offset)  
  159.     {  
  160.         array[offset] = (byte)(val & 0xff);  
  161.         array[offset + 1] = (byte)(val >> 8 & 0xff);  
  162.     }  
  163.  
  164.  
  165.  
  166.     private void StartRecord_But_Click(object sender, EventArgs e)  
  167.     {  
  168.         //绑定波束角度的委托实例  
  169.         kinectsensor.AudioSource.BeamAngleChanged += this.AudioSourceBeamChanged;  
  170.         //绑定声音来源角度的委托实例  
  171.         kinectsensor.AudioSource.SoundSourceAngleChanged += this.AudioSourceSoundSourceAngleChanged;  
  172.         //起一个线程,来完成录音数据的保存  
  173.         this.readingThread = new Thread(AudioReadingThread);  
  174.         this.readingThread.Start();  
  175.  
  176.         //让录音按钮失效  
  177.         StartRecord_But.Enabled = false;  
  178.     }  
  179.  

 

你可能感兴趣的:(windows,for,Data,audio,kinect,语音数据)