使用python从PC麦克风获取音频输入

时间:2018-07-10 07:16:55

标签: python-3.5 pyalsaaudio

我正在使用ubuntu 16.04,必须从PC麦克风获取音频输入。我正在使用python3。我使用了pyalsaaudio。我从某个地方复制了代码。这是代码

import alsaaudio, time, audioop
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE,alsaaudio.PCM_NONBLOCK)
inp.setchannels(1)
inp.setrate(8000)
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
inp.setperiodsize(160)
while True:
    l,data = inp.read()
    if l:
       print(audioop.max(data, 2))
    time.sleep(.001)

通过使用此代码,我得到一个错误

  

ALSAAudioError:参数无效

行号3 inp.setchannels(1)

如果有另一个库可以执行此操作,那么我对此并不陌生,请也建议这样做。 谢谢。

1 个答案:

答案 0 :(得分:1)

据我从pyalsaaudio documentation获悉,您似乎已根据其example for recording audio.对其进行了正确设置

我可以在您的程序中看到的唯一问题可能是安装过程?您是通过pip还是手动安装的? (我猜是pip;也许您缺少正确的ALSA依赖项?)。如果您想继续使用此库,也许值得尝试手动安装。


PyAudio

根据我的经验,大多数人倾向于将PyAudio用于实时音频IO。它构建在portaudio的之上,该Real-time Blocking mode audio IO在Linux构建过程中使用ALSA。由于它被广泛使用,因此您会发现很多示例,例如:

仅此而已,这是一个录制麦克风音频的示例(阻塞,即程序等待音频被录制,然后再进行其他操作),然后使用PyAudio将数据写入Python的.wav文件。

import pyaudio # Soundcard audio I/O access library
import wave # Python 3 module for reading / writing simple .wav files

# Setup channel info
FORMAT = pyaudio.paInt16 # data type formate
CHANNELS = 2 # Adjust to your number of channels
RATE = 44100 # Sample Rate
CHUNK = 1024 # Block Size
RECORD_SECONDS = 5 # Record time
WAVE_OUTPUT_FILENAME = "file.wav"

# Startup pyaudio instance
audio = pyaudio.PyAudio()

# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
                rate=RATE, input=True,
                frames_per_buffer=CHUNK)
print "recording..."
frames = []

# Record for RECORD_SECONDS
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print "finished recording"


# Stop Recording
stream.stop_stream()
stream.close()
audio.terminate()

# Write your new .wav file with built in Python 3 Wave module
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()

如果您在安装它时遇到问题,那么这里是Ubuntu 16.04 LTS(最初为plenty examples)所需的基本依赖项安装。

sudo apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0
sudo apt-get install ffmpeg libav-tools
sudo pip install pyaudio

我希望这会有所帮助!

其他: 如果您喜欢的话,portaudio website上有{{3}},介绍如何开始使用C / C ++的实时音频IO