前言:

大家好,我在之前的文章里面已经给大家分享过rk3568平台移植webrtc audio procssing的移植,这个平台不限制,都可以参考我之前的步骤流程去操作。

那么今天我来给大家分享的是,开始实现webrtc的音频降噪功能,实现简单的测试项目工程,有了交叉编译出来的include和lib,就可以开始来集成到工程里面去,实现降噪功能:

  • include:

  • lib:

每个模块的静态库:

如果上面用libwebrtc-audio-processing-2.so库去集成工程调用vad相关的接口的话,会找不到对应的vad定义,所以我们在集成工程里面如果调用了vad相关的内容,就要把common_audio下面的静态库libcommon_audio.a集成链接进去:

为啥这样搞,那是因为vad模块默认不在audio_processing里面,在webrtc audio processing工程里面,他把vad相关实现放在了common_audio里面,所以要支持vad功能,就要单独链接到工程里面去:

搭建werbtc音频降噪功能工程:

首先我们来建立一个webrtc_ns_demo文件夹,文件夹下创建如下内容:

  • build:这个文件夹下是用进行cmake编译的

  • libs下面是用存放动态库和静态库和对应的头文件include

  • src: 实现的源码

  • CMakeLists.txt:代码编译管理规则

这里首先我在src里面创建main.cpp,下面是降噪初始化相关代码,大家现在可以不用管他是啥意思:

#include <cstdio>
#include <cstdint>
#include <vector>
#include <string>
#include <cstring>
#include <optional>
#include <stdexcept>
#include <iostream>

#include "api/scoped_refptr.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "common_audio/vad/include/webrtc_vad.h"
int main(int argc, char** argv)
{
   // Build AudioProcessing
    rtc::scoped_refptr<webrtc::AudioProcessing> apm = webrtc::AudioProcessingBuilder().Create();
    webrtc::AudioProcessing::Config cfg = apm->GetConfig();
    cfg.high_pass_filter.enabled = opt.hpf;
    cfg.noise_suppression.enabled = true;
    // Map NS level
    if (opt.ns == "low") cfg.noise_suppression.level = webrtc::AudioProcessing::Config::NoiseSuppression::kLow;
    elseif (opt.ns == "moderate") cfg.noise_suppression.level = webrtc::AudioProcessing::Config::NoiseSuppression::kModerate;
    else cfg.noise_suppression.level = webrtc::AudioProcessing::Config::NoiseSuppression::kHigh;
    // AGC2 (recommended over AGC1 for most apps)
    cfg.gain_controller2.enabled = opt.agc2;
    cfg.gain_controller2.adaptive_digital.enabled = opt.agc2;
    // VAD
    //cfg.voice_detection.enabled = opt.vad;
    // AEC (disabled in this file-only demo; left here for reference)
    cfg.echo_canceller.enabled = false;

    // 瞬态抑制
    cfg.transient_suppression.enabled = true;

    // 语音检测
    //cfg.voice_detection.enabled = true;

    apm->ApplyConfig(cfg);

    return 0;
}

CMakeLists.txt里面的内容:

cmake_minimum_required(VERSION 3.15)
project(webrtc_ns_demo)

set(cmake_build_type RELEASE)  #编译类型 DEBUG/RELEASE
set(cmake_c_flags_debug "-g -Wall")
add_compile_options(-std=c++17)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER /home/txp/rk3568/rk3568_sdk/buildroot/output/rockchip_atk_dlrk3568/host/bin/aarch64-buildroot-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /home/txp/rk3568/rk3568_sdk/buildroot/output/rockchip_atk_dlrk3568/host/bin/aarch64-buildroot-linux-gnu-g++)
add_definitions(-D_GNU_SOURCE)
add_definitions(-DMAR_DEC_BUF_REF)

set(LIBWEBRTC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/)
set(LIBWEBRTC_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/)

aux_source_directory(${LIBWEBRTC_SRC} SRC_FILES)

link_directories(${LIBWEBRTC_DIR})

add_executable(${PROJECT_NAME}${SRC_FILES})

target_include_directories(${PROJECT_NAME} PRIVATE
"${LIBWEBRTC_DIR}/include"          
)

target_link_libraries(${PROJECT_NAME}
    ${CMAKE_SOURCE_DIR}/libs/libwebrtc-audio-processing-2.so.1
    ${CMAKE_SOURCE_DIR}/libs/libcommon_audio.a
)

这个时候去编译一下整个工程,会发报下面的很多错误:

我们可以根据错误提示看一下这个头文件:

这个错误是因为 ABSL_NULLABILITY_COMPATIBLE 没有被正确定义,在预处理后变成了 class ABSL_NULLABILITY_COMPATIBLE scoped_refptr {(一个未知标识符插在 class 与类名之间),编译器就把它当成非法语法,于是后面出现一串 “expected primary-expression before ‘public’ / ‘T does not name a type’” 的级联报错。

那么怎么解决这个问题呢?

你需要与 WebRTC 对应的 Abseil LTS 20240116+ 的头文件,它在 absl/base/nullability.h 中加一个宏定义ABSL_NULLABILITY_COMPATIBLE就行:

现在我们再开始来编译一下:

最后总结:

现在我们打通了第一步工程构建,后面就是原理和webrtc降噪的原理以及降噪效果的实践学习,我个人感觉按照这种方式去学习音频算法会更简单,循环渐进,因为音频算法本身比较难,不要上来就看源码和看原理,会比较枯燥的;而是先看效果,然后再带着疑惑一步一步找自己想要的东西。

Logo

邀请您加入社区

更多推荐