☰
【个人记录】linux音频踩坑
2026/10/26 2:01:46 网站建设 项目流程

本文章记录了使用板机麦克风识别音频踩坑,以下是直接的结论,过程略去

音频采集链路是:麦克风硬件 → ALSA内核驱动 → (PulseAudio音频服务器) → PortAudio/SoundDevice → Python应用

我遇到的问题大致是:

PulseAudio 系统模式强占硬件:系统级PulseAudio(--system)以高优先级锁死了声卡hw:3,0。用arecord -D hw:3,0是在跟系统服务抢同一把锁,Linux内核直接把请求挂起或丢弃,导致arecord没机会采集就直接返回空数据。

sounddevice 不认识 ALSA 的 plughw 别名:plughw:3,0 是ALSA层的逻辑设备名,但sounddevice底层依赖PortAudio,它只认数字索引(如3)或PulseAudio的default。传字符串别名,PortAudio查表失败,直接报No input device matching。

讯飞VAD静音超时机制:发过去的是0000静音包,讯飞服务端等了5秒(vad_eos=5000)没等到有效语音,认为设备异常,主动断开并返回10165。Python代码还在傻等,试图发送结束帧,自然报Connection is already closed。

根本原因是:

PulseAudio占着茅坑不拉屎:它作为系统音频服务,接管了硬件,却没有正确转发音频流给应用。

应用层直接跳过了中间层:用plughw绕过PulseAudio直连ALSA,但PortAudio这层不支持这种跳级写法。

没有回退机制:应用层没做“如果设备A不行,自动切设备B”的容错,一旦设备名非法,直接崩溃

修理过程是:

[INFO] 音频最大值: 0

[INFO] 音频最大值: 0

[INFO] 音频最大值: 0

看到这个,说明麦克风聋子了,查一下软件还是硬件:

arecord -d 3 -f S16_LE -r 16000 -t raw | xxd -c 16 | head -20

输出全0000 → 确认系统级就采不到声音,排除Python代码问题

arecord -D hw:3,0 -d 3 ... # 一敲回车就出结果,不等3秒录音

输入ps aux | grep pulse,发现:pulse 560 0.1 0.3 ... /usr/bin/pulseaudio --daemonize=no –system

这个说明PulseAudio以--system模式运行(系统级服务),它独占了hw:3,0硬件设备,其他程序(包括arecord)用-D hw:3,0访问时被内核拒绝,直接返回空数据。PulseAudio虽然占了设备,但它的默认输入源没正确指向USB麦。

解决方法:

# 1. 停止系统级PulseAudio

sudo systemctl stop pulseaudio

sudo systemctl disable pulseaudio

# 2. 杀掉残留进程

sudo killall pulseaudio

# 3. 删除损坏的用户配置

rm -rf ~/.config/pulse/*

rm -rf ~/.pulse*

然后,寻找能用的设备名,关键教训: 每个音频库对设备名的理解不同。arecord用ALSA语法(hw:3,0),sounddevice用PortAudio语法(数字索引)。不能混用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询