代码之家  ›  专栏  ›  技术社区  ›  Aakash aggarwal

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

  •  0
  • Aakash aggarwal  · 技术社区  · 6 年前

    我使用的是Ubuntu 16.04,我必须从我的电脑麦克风中获取音频输入。我正在使用python 3。我用过皮阿尔萨乌迪奥。我从某个地方复制了代码。这是密码

    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行输入设置通道(1)

    我是新来的,如果有其他图书馆做这件事,那么请也建议。 谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   WoodyDev    6 年前

    据我所知 pyalsaaudio documentation 你似乎是根据他们的 example for recording audio.

    我能从你的程序中看到的唯一问题可能是安装过程?你是用PIP还是手动安装的?(我猜是pip;也许你缺少了正确的alsa依赖项?)。如果您想继续使用此库,可能需要尝试手动安装。


    PyAudio

    根据我的经验,大多数人倾向于使用 皮亚迪 用于实时音频IO。它建在 portaudio 它在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(最初 posted here )

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

    希望这有帮助!

    额外的: 如果你觉得有 plenty examples portaudio website 浅谈如何在C/C++中启动实时音频IO