从零构建webrtc音频降噪工程代码!
前言:
大家好,我在之前的文章里面已经给大家分享过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降噪的原理以及降噪效果的实践学习,我个人感觉按照这种方式去学习音频算法会更简单,循环渐进,因为音频算法本身比较难,不要上来就看源码和看原理,会比较枯燥的;而是先看效果,然后再带着疑惑一步一步找自己想要的东西。
更多推荐
所有评论(0)