提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、pulseaudio是什么?
- 二、module-echo-cancel
- 三、声卡
- 四、开启降噪
- 1.内置声卡
- 2.外置声卡
- 3.其它设置
- 五、配置持久化
- 六、给些建议
- 总结
前言
最近有个项目需要使用到麦克风,研究起来才发现其中的门道那是相当多。平常我们使用麦克风都是基于Windows系统居多,Ubuntu上以我目前的研究阶段基本上觉得有声音的程度吧。今天基于Ubuntu-18.04~Ubuntu-22.04
这个跨度的系统都能用,其它的请自测。
一、pulseaudio是什么?
PulseAudio is a sound server system for POSIX OSes, meaning that it is a proxy for your sound applications. It is an integral part of all relevant modern Linux distributions and is used in various mobile devices, by multiple vendors. It performs advanced operations on sound data as it passes between your application and hardware. Things like transferring audio to a different machine, changing the sample format or channel count, or mixing several sounds into one input/output, are easily achieved using PulseAudio.
简而言之:至少Ubuntu-18.04就有了,22.04还在用
二、module-echo-cancel
这个是pulseaudio的一个module
,从1.0版本
就添加了。理解为在你和音源之间的一个模块,负责将从音源拿来的声音进行处理(降噪)之后提供给你。
三、声卡
一般来讲台式机或笔记本都至少集成一个声卡(内置声卡
),刀片服务器可能没有声卡(几乎用不到)。如果你的PC上有麦克风和外放(扬声器)的话那么就是接到这个声卡上的。如果你的PC有一个3.5mm耳机孔的话,那它大概率也是接到这个声卡上的。除非你另外接了一个声卡(外置声卡
)。
四、开启降噪
我的系统用到了3个麦克风,情况更复杂些,所以我分情况来说。
1.内置声卡
没有额外接声卡的时候,你使用的是内置麦克风。这个时候设置不用额外指定声卡,绑定的是默认声卡。
不能使用root权限,必须使用普通用户,你登陆桌面的那个用户
pactl load-module module-echo-cancel aec_method=webrtc source_name=mic source_properties=device.description=MicHD
成功返回index,失败返回错误信息
成功返回一个index,这里我们不用index,因为这个index重启之后可能会变。
注意:不需要重启电脑,执行之后模块加载进内存。
打开settings->sound->Input,下拉框出现一个MicHD,选中MicHD就完成了降噪设置。这个时候你再用麦克风录音就会发现对环境噪声进行了一定程度的抑制
,并不是没有了噪声
。
2.外置声卡
上面的方法没有指定声卡。如果我想对指定的声卡使用降噪怎么办呢?
不能使用root权限,必须使用普通用户,你登陆桌面的那个用户
pactl load-module module-echo-cancel source_master=<声源名字> aec_method=webrtc source_name=mic source_properties=device.description=MicHD
成功返回index,失败返回错误信息
那么,这个生源名字怎么获得呢?
用pactl显示plug的设备
pactl list sources
红框里的就是声源名字,不同的生源名字不一样,一般都是唯一的。
注意:怎么找到想要的那个声源名字呢?你可以先拔掉外置声卡看一下,再插上看一下,找到差异。
3.其它设置
上面介绍的是默认的降噪方法,还有很多附加的设置,这里提一下:
source_name
:给你的降噪配置起一个名字,需要唯一性
(上面的是mic,可以起其它名字)
source_properties
:这个我还在研究,上面的device.description是在UI里显示的名字
source_master
:指定需要降噪的声源
,上面图片红框里的那个Name字段
sink_name
:sink是外放(扬声器)
的意思,字面上可以对外放降噪,我没试过不知道啥效果
sink_properties
:外放附加属性,没研究
sink_master
:指定需要降噪的外放(扬声器)
use_volume_sharing
:没用过,难道是外放和麦克风音量同步?
format
:声音格式诸如s16le、s16be等等,根据个人需要设置
rate
:采样率
,越高声音还原度越好,理论上不能超过设备的最高采样率,设置过高可能失败
channels
:声道数
,1:单声道;2:双声道(立体声)
channel_map
:声道集合,看上面的图片里的字段(双声道:front-left,front-right,单声道:mono)
use_master_format
:套用设备的格式比如上图的Name字段
aec_method
:AES实现方法,Ubuntu-22.04支持几种(“speex”, “webrtc”,“adrian”,“null”)
aec_args
:和aec_method
配合使用的字段,自行研究官方文档
mic_geometry
:利用麦克风阵列
实现波束成形
,这个比较复杂,自行研究官方文档
target_direction
:和mic_geometry
配合使用的字段,自行研究官方文档
save_aec
:在/tmp下面生成aec_*文件,里面存放aec的data
五、配置持久化
上面的通过pactl命令行实现的重启电脑就没了,如果想要持久化有两种方法:第一种写一个shell开机启动,第二种就是写在pulse的配置文件里。
sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak
在/etc/pulse/default.pa最下面加上以下几句话:
#Active Noise Removal
.ifexists module-echo-cancel.so
load-module module-echo-cancel aec_method=webrtc source_name=mic source_properties=device.description=MicHD
set-default-source "mic"
.endif
注意:除了不用pactl其它配置差不多,根据需要自行添加
六、给些建议
前前后后研究了不下于2个星期,虽说没有研究透,也不是没有一点收获。下面就是我给真的有麦克风使用场景的小伙伴的建议:
1、如果你对噪声很敏感优先选动圈麦,动圈麦对背景噪声不敏感(相对电容麦),比较适合外部环境相对嘈杂,对人声要求比较高的场景;而电容麦比动圈麦更敏感,很多背景噪声会更轻易地录制进去。
2、嘈杂环境下,动圈麦比电容麦能更好地捕捉人声。电容麦更适合录音棚那种安静的场合。
3、人离麦克风地距离不应该太远,太远地话能量会衰减
4、好多配套地调音软件没有Linux版,要求高地话选Windows吧!
总结
1、真实的麦克风比上面说的要复杂,感兴趣的可以深入研究下
2、仅仅借助现有的软件和配置总是比Windows差点意思,好多软件Linux上也不支持
3、如果要实现更好的效果可能要自己动手开发降噪算法,要不然就只能在Windows上鼓捣了,也能节省很多时间成本。