You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04通过PyAudio录制音频失败问题求助

解决Ubuntu 20.04下PyAudio录音ALSA错误及无音频问题

针对你遇到的ALSA报错、录制文件无音频的问题,可按以下步骤排查解决:

1. 确保PyAudio支持PulseAudio

你的系统默认使用PulseAudio作为声音服务器,但当前PyAudio可能仅基于ALSA编译,导致直接调用ALSA时找不到硬件声卡报错。

  • 卸载现有PyAudio:
    pip uninstall pyaudio
    
  • 安装系统提供的带PulseAudio支持的版本:
    sudo apt install python3-pyaudio
    
    若使用conda环境,先安装依赖再重新编译:
    sudo apt install libpulse-dev
    pip install pyaudio --no-binary :all:
    

2. 调整代码适配PulseAudio设备

你指定的设备索引1虽为默认设备,但可优化代码逻辑,确保和PulseAudio兼容:
修改后的代码示例:

import wave
import pyaudio

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
# 改用PulseAudio默认采样率44100(若麦克风支持16000可改回)
RATE = 44100
RECORD_SECONDS = 5

p = pyaudio.PyAudio()
# 不指定设备索引,自动匹配系统默认输入设备
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print('Recording...')
frames = []
for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print('Done')

stream.stop_stream()
stream.close()
p.terminate()

with wave.open('output.wav', 'wb') as wf:
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))

也可先遍历设备列表,明确指定PulseAudio设备:

import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
    dev_info = p.get_device_info_by_index(i)
    print(f"Index {i}: {dev_info['name']}")

找到名称含pulse或default的设备索引,替换到代码的input_device_index参数中。

3. 检查音频设备权限

确认当前用户拥有访问音频设备的权限:

groups $USER

若输出不含audio组,执行以下命令添加并重新登录:

sudo usermod -aG audio $USER

4. 测试系统录音功能

先排除系统层面问题,用arecord测试:

arecord -f S16_LE -r 44100 -c 1 test.wav

录制完成后播放test.wav,若有声音则系统录音正常,问题仅出在PyAudio配置;若无声音,检查麦克风连接状态及系统声音设置中是否选中正确输入设备。

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:53:14