WaveCollect.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System.Collections.Concurrent;
  2. using NAudio.Wave;
  3. using NAudio.CoreAudioApi;
  4. namespace AliFsmnVadSharp
  5. {
  6. class WaveCollect
  7. {
  8. private string fileName = string.Empty;
  9. private WaveInEvent? waveSource = null;
  10. private WaveFileWriter? waveFile = null;
  11. public static int wave_buffer_milliseconds = 600;
  12. public static int wave_buffer_collectbits = 16;
  13. public static int wave_buffer_collectchannels = 1;
  14. public static int wave_buffer_collectfrequency = 16000;
  15. public static readonly ConcurrentQueue<byte[]> voicebuff = new ConcurrentQueue<byte[]>();
  16. public void StartRec()
  17. {
  18. // 获取麦克风设备
  19. var captureDevices = new MMDeviceEnumerator().EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);
  20. foreach (var device in captureDevices)
  21. {
  22. Console.WriteLine("Device Name: " + device.FriendlyName);
  23. using (var capture = new WasapiLoopbackCapture(device))
  24. {
  25. // 获取支持的采样率列表
  26. Console.WriteLine("Device Channels:" + capture.WaveFormat.Channels);
  27. Console.WriteLine("Device SampleRate:" + capture.WaveFormat.SampleRate);
  28. Console.WriteLine("Device BitsPerSample:" + capture.WaveFormat.BitsPerSample);
  29. }
  30. }
  31. //清空缓存数据
  32. int buffnum = voicebuff.Count;
  33. for (int i = 0; i < buffnum; i++)
  34. voicebuff.TryDequeue(out byte[] buff);
  35. waveSource = new WaveInEvent();
  36. waveSource.BufferMilliseconds = wave_buffer_milliseconds;
  37. waveSource.WaveFormat = new WaveFormat(wave_buffer_collectfrequency, wave_buffer_collectbits, wave_buffer_collectchannels); // 16bit,16KHz,Mono的录音格式
  38. waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
  39. SetFileName(AppDomain.CurrentDomain.BaseDirectory + "tmp.wav");
  40. waveFile = new WaveFileWriter(fileName, waveSource.WaveFormat);
  41. waveSource.StartRecording();
  42. }
  43. public void StopRec()
  44. {
  45. if (waveSource != null)
  46. {
  47. waveSource.StopRecording();
  48. if (waveSource != null)
  49. {
  50. waveSource.Dispose();
  51. waveSource = null;
  52. }
  53. if (waveFile != null)
  54. {
  55. waveFile.Dispose();
  56. waveFile = null;
  57. }
  58. }
  59. }
  60. public void SetFileName(string fileName)
  61. {
  62. this.fileName = fileName;
  63. }
  64. private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
  65. {
  66. if (waveFile != null)
  67. {
  68. if (e.Buffer != null && e.BytesRecorded > 0)
  69. {
  70. voicebuff.Enqueue(e.Buffer);
  71. //waveFile.Write(e.Buffer, 0, e.BytesRecorded);
  72. waveFile.Flush();
  73. }
  74. }
  75. }
  76. public static byte[] Wavedata_Dequeue()
  77. {
  78. byte[] datas;
  79. voicebuff.TryDequeue(out datas);
  80. return datas;
  81. }
  82. private void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
  83. {
  84. if (waveSource != null)
  85. {
  86. waveSource.Dispose();
  87. waveSource = null;
  88. }
  89. if (waveFile != null)
  90. {
  91. waveFile.Dispose();
  92. waveFile = null;
  93. }
  94. }
  95. }
  96. }