在Python

时间:2017-11-08 21:00:24

标签: python pyaudio wave

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

但是我真的只想在代码中用“signal”表示的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()

#stop录音    stream.stop_stream()    stream.close()    audio.terminate()

1 个答案:

答案 0 :(得分:0)

是的,您可以回复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.