准备做个非特定的声音识别程序,卡在录音和切割一小段时间,C#下基于DirectX的声音处理真的超级麻烦,后来找到了NAudio,非常好用,安利给大家,顺带把几个小坑稍微描述下,希望帮到类似需求的人。

项目下载:

NAudio官方地址:http://naudio.codeplex.com/

GitHub地址:https://github.com/naudio/NAudio

下载后是完整的工程文件,直接运行应该没问题,官方的demo都写成自定义控件的形式,界面写的不错,我也就懒得慢慢摘出来了,照猫画虎的去掉了demo里面选择控件的部分,直接显示在tabControl里,效果如下图。

private void MainForm_Load(object sender, EventArgs e){var demos = ReflectionHelper.CreateAllInstancesOf<INAudioDemoPlugin>().OrderBy(d => d.Name);var plugin1 = (INAudioDemoPlugin)demos.Last();var control1 = plugin1.CreatePanel();control1.Dock = DockStyle.Fill;panel1.Controls.Add(control1);var plugin2 = (INAudioDemoPlugin)demos.First();var control2 = plugin2.CreatePanel();control2.Dock = DockStyle.Fill;panel2.Controls.Add(control2);}

demos是项目下所有自定控件的集合,我这里删的大部分,只留下了一个录音和一个播放,所以只有last和first。

至此,录音和播放功能完全实现了,而后我的工作是希望将声音切割,判断依据是dB(分贝),

就是上图中垂直的绿色条条和黄色图中的波形,达到某个值就切割出来,静音部分不要(做监听咯,懂的,没声音就pass掉)

void OnPostVolumeMeter(object sender, StreamVolumeEventArgs e){// we know it is stereovolumeMeter1.Amplitude = e.MaxSampleValues[0];volumeMeter2.Amplitude = e.MaxSampleValues[1];if (e.MaxSampleValues[0] > 0.01 && StartOREnd == false){StartOREnd = true;DateTime starttime = DateTime.ParseExact(this.labelCurrentTime.Text,"mm:ss:fff",null);int StartPoint = starttime.Minute * 60 * 1000 + starttime.Second * 1000 + starttime.Millisecond;this.richTextBox1.Text += "\r\n开始:" + StartPoint.ToString();CutInfo.Add(StartPoint);}if (e.MaxSampleValues[0] < 0.01 && StartOREnd == true){StartOREnd = false;DateTime endtime = DateTime.ParseExact(this.labelCurrentTime.Text, "mm:ss:fff", null);int EndPoint = endtime.Minute * 60 * 1000 + endtime.Second * 1000 + endtime.Millisecond;this.richTextBox1.Text += "\r\n结束:" + EndPoint.ToString();CutInfo.Add(EndPoint);}}

我定义了一个CutInfo的list,坦白说这里的e.MaxSampleValuesde的值代表什么意思我没搞明白,但是有声音数值就大,没声音数值就小,所以我这就当时dB来用了,按照阈值定义起点和终点,用于后期的切割。

切割分两部分,mp3和wav,其中mp3直接就能按照时间进行切割,wav得换算为字节长度稍微麻烦一点点。

public static void TrimMp3File(string inputPath, string outputPath, TimeSpan? begin, TimeSpan? end){if (begin.HasValue && end.HasValue && begin > end)throw new ArgumentOutOfRangeException("end", "end should be greater than begin");using (var reader = new Mp3FileReader(inputPath))using (var writer = File.Create(outputPath)){Mp3Frame frame;while ((frame = reader.ReadNextFrame()) != null)if (reader.CurrentTime >= begin || !begin.HasValue){if (reader.CurrentTime <= end || !end.HasValue)writer.Write(frame.RawData, 0, frame.RawData.Length);else break;}}}public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd){using (WaveFileReader reader = new WaveFileReader(inPath)){using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat)){int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond/1000;int startPos = (int)cutFromStart.TotalMilliseconds * bytesPerMillisecond;startPos = startPos - startPos % reader.WaveFormat.BlockAlign;int endPos = (int)cutFromEnd.TotalMilliseconds * bytesPerMillisecond;endPos = endPos - endPos % reader.WaveFormat.BlockAlign;TrimWavFile(reader, writer, startPos, endPos);}}}private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos){reader.Position = startPos;byte[] buffer = new byte[1024];while (reader.Position < endPos){int bytesRequired = (int)(endPos - reader.Position);if (bytesRequired > 0){int bytesToRead = Math.Min(bytesRequired, buffer.Length);int bytesRead = reader.Read(buffer, 0, bytesToRead);if (bytesRead > 0){writer.WriteData(buffer, 0, bytesRead);}}}}

我每段测试音频都念了五个音,测试MP3和WAV都成功,效果如下图:

黄色波形图前5个波是一段,后面的是切割后单独放的5个。切割的目的是识别,下一篇写识别。

新开博客,目的为学习交流,本人QQ:273651820。

C#基于NAudio的声音识别(一)——录制与切割相关推荐

  1. C#基于NAudio的声音识别(二)——MFCC+SVM/BP

    书接上文,切割后的文件转换特征为MFCC(细节不表了,网搜的代码).声音的特征和识别最好的组合绝对不是MFCC+SVM(后面我会讲为什么),我只是怎么怎么方便怎么来,看到这的准备做声音识别的同学请果断 ...

  2. Matlab语音采集与读写程序,基于MATLAB的语音信号录制采集和分析的程序设计

    理 论广 角 ● I 基于 MATLAB的语音信号录制采集和分析的程序设计 刘 晓炯 (西北民族大学电气工程学院 甘肃 兰州I 730030) [摘 要]语音信号处理技术是语音处理领域中新近发展起来的 ...

  3. 基于AudioQueue实现音频的录制和播放(标贝科技)

    标贝科技 https://ai.data-baker.com/#/?source=qwer12 填写邀请码fwwqgs,每日免费调用量还可以翻倍 基于AudioQueue实现音频的录制和播放 文章目录 ...

  4. C# 使用NAudio实现声音的录制(麦克风 , 扬声器)

    NAudio 简介: NAudio是个相对成熟.开源的C#音频开发工具,它包含录音.播放录音.格式转换.混音调整等功能.本次介绍主要功能有音频.录音文件播放.实时音频流波形图显示等. 第一步:添加引用 ...

  5. 基于VCamera,仿微信录制短视频

    基于VCamera,Android仿微信录制短视频,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. recoder4.gif 使用 1) 在b ...

  6. 基于OpenCV的摄像头视频录制保存工具【附GIT源码地址】

    最近一个项目需要使用USB摄像头去采集视频并保存成文件,需要一个摄像头录制工具,要求其实很简单,就是能够将摄像头采集的图像加上一个时间戳的水印,实时保存到指定的文件中.同时为了防止文件过大,最好能够按 ...

  7. php h5视频录制上传,基于koa的h5视频录制异步上传

    # 需求 1. h5 录制视频, 2. 异步上传到 node 服务器端 3. 文件保存在服务器端. # 技术选型 ## 前端 - jquery ## 后端 - koa # 技术坑点 ## h5 录制视 ...

  8. 基于Libvlc库的视频录制功能简述(C#)

    最近在学习libvlc库,如下讲述如何播放网络或本地视频并进行视频录制的功能: 一.先看效果: 1-1.主界面:首先Init环境初始化,然后可选择播放网络流或是本地视频文件: 1-2.若播放网络流,则 ...

  9. 基于matlab的声音识别

    本程序实现了声音的识别,并设计了GUI 界面,实现了声音读取.缩小放大.嵌入嵌出.声音合成.增强回音和加强声.去噪声的功能.声音读取包括单声道录音,存储,播放和双声道录音,存储,播放.嵌入嵌出实现 了 ...

最新文章

  1. python语音识别终极指南
  2. DNN 4.6.2的中文语言包
  3. maven web项目中的web.xml的版本如何更改
  4. LeetCode 1974. 使用特殊打字机键入单词的最少时间
  5. 【小技巧】桌面图标出现蓝色问号的怎么办?
  6. matlab指派问题求法,matlab指派问题
  7. vue给html加背景图,Vue背景图如何全屏显示
  8. 中国电子学会-青少年电子信息等级考试标准 (1-6 级)
  9. 高德打车通用可编排订单状态机引擎设计
  10. 创建一个微信小程序——如何注册账号,安装微信开发者工具,创建一个小程序(详细步骤版)
  11. HTML,CSS,JS实现网页聊天窗口
  12. 第十四章 SQL命令 CREATE TABLE(一)
  13. 《EffcativeSTL》
  14. RPC通信协议远程服务调用(25)Java全栈
  15. 华为新系统鸿蒙开机图标,华为鸿蒙2.0正在揭开神秘面纱,开机界面大变
  16. 成功解决pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 4, saw 2
  17. 【】jQuery 等技术 目录
  18. 车载开发之CarLife CarPlay HiCar
  19. java查询几万条数据_java一次性查询几十万,几百万数据解决办法(转载)
  20. Unity中的旋转和矩阵操作

热门文章

  1. 电脑一直刷频,求解答
  2. CleanMyMac x2021中文版mac清理软件激活码下载
  3. 12.计蒜客信息学题库:T1702 魔法宝石
  4. Android蓝牙调试助手
  5. 情不知所起,一“网”而深
  6. Gin框架组合(Zap、lumberjack、ini)使用手册
  7. 鳄鱼法则(特转此贴,给不会止损的朋友们)
  8. python核心数据类型——数值、字符串和列表的基本操作
  9. 怎样对比计算机配置,怎么看电脑配置好坏,教您怎么看电脑配置好坏
  10. 3DMAX机械建模贴图教程