无论是在音视频录制系统,还是音视频通话系统、或视频会议系统中,对从麦克风采集到的说话的声音数据进行预处理,都是是非常必要的。

语音数据预处理主要包括:​​降噪(Noise Reduction)、静音检测(Silence Detection/VAD)、自动增益(Automatic Gain Control, AGC)​​ 。

一. 语音预处理的作用

   我们先解释一下,降噪、静音检测、自动增益,这些语音预处理分别起什么作用。

(1)降噪

降噪,用于消除背景噪声,比如马路车流声、环境杂音等,以保留清晰的说话人声。

更高级的,结合AI模型训练,还可以消除电脑的风扇声、键盘敲击声等等。

(2)静音检测

静音检测,又称为语音活动检测,用于识别音频流中的静音片段(没有讲话人声),这样可以简化后续的编码等环节,并可以节省传递所需要的带宽。

(3)自动增益

自动增益,用于动态调整说话声音的音量,使输出电平保持稳定,以避免讲话的声音忽大忽小。

二. 实现语音预处理

接下来,我们使用C#实现一个Demo,这个Demo将从麦克风采集声音数据,然后进行语音预处理,并且将处理后的声音数据实时播放出来。Demo的运行效果如下图所示:

Demo 功能很简单,那我们来具体看看代码是如何实现的。

1. 创建采集器、预处理器、播放器

麦克风声音数据采样率我们选择16K、单声道。

WaveSampleRate sr = WaveSampleRate.S16k;
int channelCount = 1; //创建语音预处理器,开启降噪、自动增益、静音检测
this.voicePreprocessor = CapturerFactory.CreateVoicePreprocessor(sr, channelCount, true ,true);
//创建麦克风采集器
this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(int.Parse(this.textBox_mic.Text), sr);
this.microphoneCapturer.AudioCaptured += new ESBasic.CbGeneric<byte[]>(microphoneCapturer_AudioCaptured);
//创建声音播放器
this.audioPlayer = PlayerFactory.CreateAudioPlayer(int.Parse(this.textBox_speaker.Text), (int)sr, channelCount, 16, 2); this.microphoneCapturer.Start();

  CreateVoicePreprocessor 方法的最后两个参数可以指定在降噪的同时,是否开启静音检测和自动增益功能。

2. 预处理语音数据

语音预处理器每次处理10ms的声音数据,而现在的麦克风采集器每次采集的是20ms的PCM数据,所以,我们将其拆成两个10ms数据,再提交给预处理器处理。

void microphoneCapturer_AudioCaptured(byte[] audioData)
{
if (this.checkBox_enabled.Checked)
{
//麦克风每次采集20ms数据,降噪器每次处理10ms数据。
byte[] frame10ms1 = new byte[audioData.Length / 2];
byte[] frame10ms2 = new byte[audioData.Length / 2];
Buffer.BlockCopy(audioData, 0, frame10ms1, 0, frame10ms1.Length);
Buffer.BlockCopy(audioData, frame10ms1.Length, frame10ms2, 0, frame10ms2.Length);
this.HandleData(frame10ms1);
this.HandleData(frame10ms2);
return;
} this.audioPlayer.Play(audioData);
}

(1)通过一个CheckBox勾选框来实时控制是否启用语音预处理,这样在测试时,就可以很方便的对比体验开启了语音预处理的效果。

(2)调用IVoicePreprocessor 的 Process 方法,就可以完成一帧语音数据(10ms)的预处理。如下所示:

private void HandleData(byte[] frame10ms)
{
byte[] res = this.voicePreprocessor.Process(frame10ms);
if (res == null) //静音帧
{
++this.silenceFrameCountTotal;
this.audioPlayer.Play(this.voicePreprocessor.SlienceFrame);
}
else
{
this.audioPlayer.Play(res);
}
}

  如果Process 方法返回的是null,表示检测到该帧是静音帧,于是,将内置的10ms静音帧 SlienceFrame 提交给播放器去播放。

3. 统计静音帧数量

  一个语音帧是10ms,那么1秒钟就有100个语音帧,程序中,我们统计了上一秒出现了多少个静音帧,并在UI左下方显示出来。

private volatile int silenceFrameCountTotal = 0;
private volatile int silenceFrameCountPre = 0;
private void timer1_Tick(object sender, EventArgs e)
{
int delt = this.silenceFrameCountTotal - this.silenceFrameCountPre;
this.silenceFrameCountPre = this.silenceFrameCountTotal;
//显示上一秒静音帧数量。
this.label_silenceFrameCount.Text = delt.ToString();
}

  实际测试时可以发现,当不说话时,UI实时显示1秒钟出现的静音帧是100个。

三. Demo源码下载

源码下载:VoicePreprocessDemo.rar

   如果不想打开VS,可以直接到Debug目录下,双击 Oraycn.VoicePreprocessDemo.exe 即可运行Demo,开始体验语音降噪、静音检测、自动增益的处理效果。

建议使用耳麦测试,对比效果会更明显。当开启预处理时,能立即感觉到背景噪音消失了,而且说话的声音变大了(AGC),不说话时,UI显示静音帧的数量变多。

  来下载试试语音预处理的效果吧。

C#实现语音预处理:降噪、静音检测、自动增益(附Demo源码)的更多相关文章

  1. 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)

    单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件) webrtc的音频处理模块分为降噪ns,回音消除aec,回声 ...

  2. Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...

  3. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  4. 音频自动增益 与 静音检测 算法 附完整C代码【转】

    转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...

  5. 网络语音视频技术浅议(附多个demo源码下载)

    我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...

  6. 客服小妹是如何泡到手的——C#定时提醒·语音录制·语音播放·文件转录Demo源码——倾情奉献!

    一.需求提出 客服小妹跟我说,每天要统计新加好友数,得先记下昨天的数目,然后查看今天的数目,还要相减,打字,记录——好麻烦! 又说,客户多的时候,忙起这头忘了那头,文字记录备忘又太费劲! 我说,赐你一 ...

  7. 34.QT-制作串口助手(并动态检测在线串口,附带源码)

    qextserialport-1.2rc库下载链接: http://www.pudn.com/Download/item/id/2298532.html 1.添加源码到工程 将qextserialpo ...

  8. [NLP-ASR] 语音识别项目整理(一) 语音预处理

      简介 之前参与过114对话系统的项目,中间搁置很久,现在把之前做过的内容整理一下,一是为自己回顾,二是也希望分享自己看的内容,中间也遇到一些问题,如果您可以提一些建议将不胜感激. 114查询主要分 ...

  9. Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)

    1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...

  10. 第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)

    在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haar分类器),其检测效果也是不错的,但是目前人脸检测的应用场景逐渐 ...

随机推荐

  1. Redis 持久化机制简介【Redis 系列之三】

    〇.前言 Redis 持久化主要有两种:RDB(数据快照模式).AOF(追加模式),另外就是这两种模式的混合模式用. 本文将对这三种情况进行详细介绍. 博主 Redis 相关文章都在这里了:https ...

  2. Oracle AI应用的LLM模型典型配置

    最近在做一些基于Oracle的一些AI应用测试工作,AI肯定离不开配置LLM相关,虽然是简单配置类,但实际还是遇到一些卡点,记录下来供今后参考. 1.配置Embedding模型 2.特殊语法传参JSO ...

  3. 基于RK3568 + FPGA国产平台的多通道AD实时采集显示方案分享

    在工业控制与数据采集领域,高精度的AD采集和实时显示至关重要.今天,我们就来基于瑞芯微RK3568J + FPGA国产平台深入探讨以下,它是如何实现该功能的.适用开发环境如下: Windows开发环境 ...

  4. expected at least 1 bean which qualifies as autowire candidate

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'log ...

  5. Sunshine+Moonlight让安卓Pad或IPad变6ms低延迟高质量无线显示器 #串流 #无线副屏

    1.背景 最近看到多个博主在分享局域网或者公网使用Sunshine+Moonlight串流技术,将电脑画面投屏到其他屏幕(电视.安卓和苹果平板等等),宣称是个位数的延迟,并且能用平板打steam游戏( ...

  6. 使用 StreamJsonRpc 在 ASP.NET Core 中启用 JSON-RPC

    StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC).它通过流(如管道.网络流等)实现高效的跨进程或跨网络通信 ...

  7. Mybatis 框架课程第二天

    目录 3 基于代理Dao实现CRUD操作 3.1 根据id查询 3.1.1 在持久层接口中添加findById方法 3.1.2 在用户的映射配置文件中配置 3.1.3 在测试类添加测试 3.2 保存操 ...

  8. 轮播图导航组件 | 纯血鸿蒙组件库AUI

    摘要: 轮播图导航(A_SwiperNav):实现沉浸式体验的App全屏轮播引导页效果.可设置图片数据(含文本.图片地址.路由.标题.子标题),可设置按钮颜色. 一.在页面当中调用轮播图导航组件 打开 ...

  9. JS中常用方法

    数组 splice: splice() 方法的第一个参数是起始索引,第二个参数是要删除的元素数量(可以为0),然后可以传递更多的参数作为要插入的新元素. 限制删除的数量: const arr = [1 ...

  10. frp增加IP限制

    核心设计理念 传统frp安全方案的不足 静态配置文件管理白名单IP,修改需要重启服务 分布式环境下多节点配置同步困难 缺乏实时阻断恶意IP的能力 Redis作为动态白名单存储的优势 实时生效:IP规则 ...