rk3568上webrtc处理稳态噪声实践

前言:

大家好,在上一篇文章里面,我给大家介绍了webrtc里面的ns降噪处理流程,本篇文章,我给大家带来webrtc处理稳态噪声的一个测试,非稳态噪声,暂时没有测试,我们一步一步来,我先从最为基本的内容开始,后面再步入到算法原理细节,也就是webrtc里面的ns模块源码研究学习。

rk3568上测试webrtc降噪效果:

首先我这里是在rk3568上采集的wav音频数据:

这个可以不限制板子,我这里采集的命令如下:

go 复制代码
arecord -f S16_LE -r 16000 -c 1 clean.wav

下面是采集的噪声音频文件:

然后根据之前编译的降噪测试程序,进行降噪处理:

go 复制代码
./webrtc_ns_demo clean.wav out_clean.wav --ns moderate

也可以调整噪声的level:

go 复制代码
# 低(保真)
./webrtc_ns_demo clean.wav out_clean.wav --ns low

# 中(推荐)
./webrtc_ns_demo clean.wav out_clean.wav --ns moderate

# 高(抑噪最狠,可能吃音)
./webrtc_ns_demo clean.wav out_clean.wav --ns high

这里的降噪level是可以调整的,在AudioProcessing类成员里面有对level做描述:

go 复制代码
// Enables background noise suppression.抑制录音中的背景噪声(风声、空调声、键盘声、电流噪、机械噪声)
    /*
    WebRTC 的 NS 使用:
      频域(FFT-based)噪声估计
      谱减法(spectral subtraction)
      噪声估计更新
      维纳滤波(Wiener filter)
      语音优先增强(Speech-first gain)
    */
    struct NoiseSuppression {
      /*
      是否启用降噪。
        如果为 true,每一帧信号都会通过:
        FFT 分解成频谱
        估计噪声谱(noise power spectral density)
        做频域增益调整(Wiener gain)
        iFFT 重建时域信号
      */
      bool enabled = false;
      /*
        降噪等级。
        | Level           | 噪声抑制力度   | 人声保真度           |
        | --------------- | --------    | --------------- |
        | `kLow`          | 轻度降噪     | 保真最高            |
        | `kModerate`(默认) | 中等降噪     | 保真 + 降噪均衡       |
        | `kHigh`         | 强降噪      | 人声略受影响,降低背景噪更明显 |
        | `kVeryHigh`     | **暴力降噪** | 人声可能干,但背景噪能大幅下降 |

        实际效果:
            kLow:轻微降噪
            kModerate:正常通话(会议场景最佳)
            kHigh:嘈杂环境(机器声、风声)
            kVeryHigh:强噪场景(工厂机器、风声、飞机噪音等)
      */
      enum Level { kLow, kModerate, kHigh, kVeryHigh };
      Level level = kModerate;
      /*
      如果 AEC 可用,那么 NS 的噪声分析会基于 linear AEC 输出
    (提高噪声估计精度)
      */
      bool analyze_linear_aec_output_when_available = false;
    } noise_suppression;

    // TODO(bugs.webrtc.org/357281131): Deprecated. Stop using and remove.
    // Enables transient suppression.
    /*
    什么是 Transient Suppression(瞬态噪声抑制)?
    Transient = "瞬态噪声"指:
        键盘敲击声
        鼠标点击声
        门开关咔哒声
        盘子碰撞叮当声
        桌子敲击声
        一些突发的高幅度、短时噪声
    Transient 噪声特点:
      持续时间极短(几毫秒)
      幅度通常比背景噪声大
      频率成分不稳定
      不像风噪那样连续,也不像语音那样稳定
      这种噪声对语音影响巨大:
      听感刺耳
      使降噪算法难以正确工作
      NLP/AEC 会误判
      波形破坏大
      Transient Suppression 模块的目标:
      识别突发瞬态噪声并对其做抑制,避免爆音或刺耳瞬间噪声。
    */
    struct TransientSuppression {
      bool enabled = false;
    } transient_suppression;

我这里是使用kModerate测试的效果,降噪后的音频文件如下:

大家可以在看文章的时候听一下两个音频前后的效果,处理效果还是不错的。

下面我们打开这两个文件的频谱图看一下:

第一个带噪声的音频频谱图


处理后的音频频谱图

webrtc的降噪源码入口:

这里我们暂时不会讲解源码,这里只是为后续讲解做铺垫,首先这里要学习降噪的算法原理细节,肯定是要看源码的,所以整个处理入口要找到类似下面的处理

go 复制代码
PCM
 ↓
STFT(短时傅里叶变换)
 ↓
噪声谱估计(基于非语音帧)
 ↓
Wiener-like 频域增益计算
 ↓
时间/频率平滑
 ↓
逆 STFT

Ok,我们从webrtc的demo开始:

  • 1、找到apm->ProcessStream接口
  • 2、找到ProcessCaptureStreamLocked接口:
  • 3、找到处理噪声接口submodules_.noise_suppressor->Process(capture_buffer);

上面的Process就是webrtc降噪算法最为核心的内容:

go 复制代码
void NoiseSuppressor::Process(AudioBuffer* audio)

总结:

从今天的文章开始,我们就正式打通了webrtc音频降噪功能了,有实操有理论,完美,当然后面的内容还有很多,我尽量把自己理解到的内容分享出来,我们下期见,准确来说,应该是明年见了,哈哈!

相关推荐
CoovallyAIHub2 小时前
从空地对抗到空战:首个无人机间追踪百万级基准与时空语义基线MambaSTS深度解析
深度学习·算法·计算机视觉
"YOUDIG"2 小时前
从算法到3D美学——一站式生成个性化手办风格照片
算法·3d
LYFlied2 小时前
【每日算法】LeetCode 104. 二叉树的最大深度
前端·算法·leetcode·面试·职场和发展
大厂技术总监下海2 小时前
PyTorch 核心技术深度解读:从动态图到自动微分的工程实现
算法
arron88992 小时前
以目标检测基础知识学习分割模型算法
学习·算法·目标检测
IT方大同2 小时前
循环结构的功能
c语言·数据结构·算法
代码不停2 小时前
BFS解决拓扑排序和FloodFill问题
java·算法·宽度优先
TL滕2 小时前
从0开始学算法——第二十一天(复杂链表问题)
笔记·学习·算法
sin_hielo2 小时前
leetcode 955
数据结构·算法·leetcode