【问题标题】:Maintain a streaming microphone input in Python在 Python 中维护流式麦克风输入
【发布时间】:2018-04-21 17:24:50
【问题描述】:

我正在使用 Python 从我的笔记本电脑传输麦克风输入。我目前正在使用 PyAudio 和 .wav 创建一个 2 秒的批次(下面的代码),然后在循环中读出新创建的 .wav 文件的帧表示。

但是我真的只想要代码中由“信号”表示的np.ndarray,它是 .wav 文件的 Int16 表示。有没有办法完全绕过写入 .wav 并使我的应用程序看起来是“实时的”而不是微批处理?

import pyaudio
import wave

#AUDIO INPUT
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 2
WAVE_OUTPUT_FILENAME = "output.wav"

audio = pyaudio.PyAudio()

# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
                rate=RATE, input=True,
                frames_per_buffer=CHUNK)
while(1):
  print "recording"
  frames = []
  for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
      data = stream.read(CHUNK)
      frames.append(data)
  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()
  spf = wave.open(WAVE_OUTPUT_FILENAME,'r')

  #Extract Raw Audio from Wav File
  signal = spf.readframes(-1)
  signal = np.fromstring(signal, 'Int16')   
  copy= signal.copy()

# 停止录制 stream.stop_stream() 流.close() audio.terminate()

【问题讨论】:

    标签: python pyaudio wave


    【解决方案1】:

    是的,您可以对 stream 变量进行回调,然后随心所欲地处理该音频:

    def callback(input_data, frame_count, time_info, flags):
        ...
    
        return input_data, pyaudio.paContinue
    
    stream = audio.open(format=FORMAT,
                        channels=CHANNELS,
                        rate=RATE,
                        input=True,
                        stream_callback=callback,
                        frames_per_buffer=CHUNK)
    

    更多here.

    【讨论】:

    • 看起来只要数据可用,回调就会运行?关于 audio.open 的 input_data 到底是什么?是不是等价于stream.read()?
    • 它看起来像是一个 np.int16。可以使用np.fromstring(input_data, dtype=np.int16)阅读
    • 更一般地说,我相信它基于传递给audio.openFORMAT。它将是该数据类型的等效 numpy 格式。
    • 但是它在我的实现中取代了什么?如果我举了你的例子并让它运行 RECORD_SECONDS 的流相当于 spf.readframes()?
    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多