最近在做一个录音场景的项目,大概流程就是通过Python的sounddevice包去获取录音设备,然后拾取声音作为后续处理。
我的环境:
操作系统:Ubuntu-20.04
CPU:Intel 6700HQ
内存:8GB
声卡:100 Series/C230 Series Chipset Family HD Audio Controller
在shell里直接操作是可以的,不报任何错误。当使用supervisor作为守护保活的时候,诡异的事情发生了。居然出现了找不到输入设备的诡异错误。
下面是错误发生时我抓取的声音设备:
0 HDA Intel PCH: ALC662 rev3 Analog (hw:0,0), ALSA (0 in, 2 out)
1 HDA Intel PCH: ALC662 rev3 Digital (hw:0,1), ALSA (0 in, 2 out)
2 HDA Intel PCH: HDMI 0 (hw:0,3), ALSA (0 in, 8 out)
3 HDA Intel PCH: HDMI 1 (hw:0,7), ALSA (0 in, 8 out)
4 HDA Intel PCH: HDMI 2 (hw:0,8), ALSA (0 in, 8 out)
5 HDA Intel PCH: HDMI 3 (hw:0,9), ALSA (0 in, 8 out)
6 HDA Intel PCH: HDMI 4 (hw:0,10), ALSA (0 in, 8 out)
7 sysdefault, ALSA (0 in, 128 out)
8 front, ALSA (0 in, 2 out)
9 surround40, ALSA (0 in, 2 out)
10 surround51, ALSA (0 in, 2 out)
11 surround71, ALSA (0 in, 2 out)
12 iec958, ALSA (0 in, 2 out)
13 spdif, ALSA (0 in, 2 out)
14 hdmi, ALSA (0 in, 8 out)
15 samplerate, ALSA (0 in, 128 out)
16 speexrate, ALSA (0 in, 128 out)
17 upmix, ALSA (0 in, 8 out)
18 vdownmix, ALSA (0 in, 6 out)
< 19 default, ALSA (0 in, 128 out)
20 dmix, ALSA (0 in, 2 out)
<
是默认输出设备,>
是默认输入设备,*
是默认输入输出设备。
为了方便大家理解,我贴出来正常情况下获取的声音列表:
0 HDA Intel PCH: ALC662 rev3 Analog (hw:0,0), ALSA (0 in, 2 out)
1 HDA Intel PCH: ALC662 rev3 Digital (hw:0,1), ALSA (0 in, 2 out)
2 HDA Intel PCH: HDMI 0 (hw:0,3), ALSA (0 in, 8 out)
3 HDA Intel PCH: HDMI 1 (hw:0,7), ALSA (0 in, 8 out)
4 HDA Intel PCH: HDMI 2 (hw:0,8), ALSA (0 in, 8 out)
5 HDA Intel PCH: HDMI 3 (hw:0,9), ALSA (0 in, 8 out)
6 HDA Intel PCH: HDMI 4 (hw:0,10), ALSA (0 in, 8 out)
7 sysdefault, ALSA (0 in, 128 out)
8 front, ALSA (0 in, 2 out)
9 surround40, ALSA (0 in, 2 out)
10 surround51, ALSA (0 in, 2 out)
11 surround71, ALSA (0 in, 2 out)
12 iec958, ALSA (0 in, 2 out)
13 spdif, ALSA (0 in, 2 out)
14 hdmi, ALSA (0 in, 8 out)
15 samplerate, ALSA (0 in, 128 out)
16 speexrate, ALSA (0 in, 128 out)
17 pulse, ALSA (32 in, 32 out)
18 upmix, ALSA (0 in, 8 out)
19 vdownmix, ALSA (0 in, 6 out)
20 dmix, ALSA (0 in, 2 out)
* 21 default, ALSA (32 in, 32 out)
仔细看,两者的差别,正常的有输入设备,不正常的没有输入设备。
原因居然是root账户的问题,如果你使用root账户去调用sounddevice这个包就会出现这个问题,如果你使用非root账户去调用就没有这个问题。
虽然暂时没有完全找出来问题的根源(猜测和用户环境有一定的关系)
我找到了解决问题的办法,那就是使用普通用户去执行程序就没有这个问题了。
su - <普通用户> -c "<脚本>"
不管怎么说,有解决方案还是好的,特别是急于上线的项目!
至于具体原因,我留在了后续继续研究,等到有结果了再特别说明下,网上的相关问题也不多,我遇到了就随手记录下来了,给同样遇到这种问题的小伙伴一个参考。
就我所有接触的问题来看,Linux上最难解决的问题还是集中在硬件或驱动上,毕竟很多时候官方也不提供Linux上额驱动,因为实在是太冷门了。而硬件这块的问题又主要集中在外设上:像麦克风,立体声设备,摄像头等等。
如果是对硬件有特殊要求的人最好还是使用Windows+WSL2的搭配我觉得甚至强过纯Linux。