C# NAudio检测声音

using NAudio.Wave;
using System;
using System.Collections.Generic;namespace WinFromBaidu
{class NAudioRecorder{#region var/// /// 录音机对象/// public WaveIn waveSource = null;/// /// 录音写入磁盘记录者  用于截取声音测试/// public WaveFileWriter waveFile = null;/// /// 录音保存格式/// private string fileName = string.Empty;/// /// 委托声音触发时间/// public Action<byte[]> ReciveMaxData;/// /// 缓存截取声音片段/// private List<byte> CacheBuffer = new List<byte>();/// /// 记录有人说话时间/// private DateTime BeginTime = DateTime.Now;/// /// 是否有人说话标志/// private bool IsSpeeak = false;/// /// 声音响度标准/// public float LoudnessStant = 0.08F;#endregion/// /// 开始录音方法/// public void StartRec(){waveSource = new WaveIn();waveSource.WaveFormat = new WaveFormat(16000, 16, 1); // 16bit,16KHz,Mono的录音格式waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);waveFile = new WaveFileWriter(fileName, waveSource.WaveFormat);waveSource.StartRecording();}/// /// 停止录音/// public void StopRec(){waveSource.StopRecording();// Close Wave(Not needed under synchronous situation)if (waveSource != null){waveSource.Dispose();waveSource = null;}if (waveFile != null){waveFile.Dispose();waveFile = null;}}/// /// 录音结束后保存的文件路径/// /// 保存wav文件的路径名public void SetFileName(string fileName){this.fileName = fileName;}/// /// 开始录音回调函数/// /// /// private void waveSource_DataAvailable(object sender, WaveInEventArgs e){if (waveFile != null){//waveFile.Write(e.Buffer, 0, e.BytesRecorded);//waveFile.Flush();}AnalyzeVoice(e.Buffer);}/// /// 录音结束回调函数/// /// /// private void waveSource_RecordingStopped(object sender, StoppedEventArgs e){if (waveSource != null){waveSource.Dispose();waveSource = null;}if (waveFile != null){waveFile.Dispose();waveFile = null;}}/// /// 语音分析/// /// private void AnalyzeVoice(byte[] buf){float max = LoudnessStant;int maxNumber = 0;// interpret as 16 bit audiofor (int index = 0; index < buf.Length; index += 2){short sample = (short)((buf[index + 1] << 8) |buf[index + 0]);// to floating pointvar sample32 = sample / 32768f;// absolute value if (sample32 < 0) sample32 = -sample32;// is this the max value?if (sample32 > max){max = sample32;maxNumber++;}}if (max != LoudnessStant){CacheBuffer.AddRange(buf);IsSpeeak = true;BeginTime = DateTime.Now;}else{if (IsSpeeak){if ((DateTime.Now - BeginTime).TotalSeconds < 2){CacheBuffer.AddRange(buf);}else{CacheBuffer.AddRange(buf);//waveFile.Write(CacheBuffer.ToArray(), 0, CacheBuffer.Count);//waveFile.Flush();//回调声音触发方法ReciveMaxData(CacheBuffer.ToArray());CacheBuffer.Clear();IsSpeeak = false;}}else{if (CacheBuffer.Count > 3200 * 6){CacheBuffer.RemoveRange(0, 3200);}CacheBuffer.AddRange(buf);}}}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部