【问题标题】:Input from microphone to produce spectrogram从麦克风输入以产生频谱图
【发布时间】:2021-09-10 12:29:53
【问题描述】:

我正在尝试从麦克风获取输入并从音频块中生成频谱图。 但是,这行代码 stream = self.pa.open(format = self.pa.get_format_from_width(2,False), channels = 1, rate = RATE, input = True, input_device_index = device_index) 给我一个错误,说“[Errno -9996] 输入设备无效(没有默认输出设备)”。我正在录制的麦克风是我的 HP ProBook 上的默认麦克风,我使用的是 Windows 10。此外,我正在使用 Google Collab 运行代码。对出了什么问题有什么建议吗?

import pyaudio
import struct
import math
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import time
from scipy.io.wavfile import write

THRESHOLD = 0 # dB
RATE = 44100
INPUT_BLOCK_TIME = 1 # 30 ms
INPUT_FRAMES_PER_BLOCK = int(RATE * INPUT_BLOCK_TIME)
INPUT_FRAMES_PER_BLOCK_BUFFER = int(RATE * INPUT_BLOCK_TIME)

def get_rms(block):
  return np.sqrt(np.mean(np.square(block)))

class AudioHandler(object):
  def __init__(self):
    self.pa = pyaudio.PyAudio()
    self.stream = self.open_mic_stream()
    self.threshold = THRESHOLD
    self.plot_counter = 0

  def stop(self):
    self.stream.close()

  def find_input_device(self):
    device_index = None
    for i in range( self.pa.get_device_count() ):
      devinfo = self.pa.get_device_info_by_index(i)
      print('Device %{}: %{}'.format(i, devinfo['name']))

      for keyword in ['mic','input']:
        if keyword in devinfo['name'].lower():
          print('Found an input: device {} - {}'.format(i, devinfo['name']))
          device_index = i
          return device_index

    if device_index == None:
      print('No preferred input found; using default input device.')

    return device_index

  def open_mic_stream(self):
    device_index = self.find_input_device()
    stream = self.pa.open(format = self.pa.get_format_from_width(2,False), channels = 1, rate = RATE, input = True, input_device_index = device_index)
    stream.start_stream()
    return stream

  def processBlock(self, snd_block):
    f, t, Sxx = signal.spectrogram(snd_block, RATE)
    zmin = Sxx.min()
    zmax = Sxx.max()
    plt.pcolormesh(t, f, Sxx, cmap='RdBu', norm=LogNorm(vmin=zmin, vmax=zmax))
    plt.ylabel('Frequency [Hz]')
    plt.xlabel('Time [sec]')
    plt.axis([t.min(), t.max(), f.min(), f.max()])
    plt.colorbar()
    plt.savefig('data/spec{}.png'.format(self.plot_counter), bbox_inches='tight')
    plt.close()
    write('data/audio{}.wav'.format(self.plot_counter),RATE,snd_block)
    self.plot_counter += 1

  def listen(self):
    try:
      print ("start"), self.stream.is_active(), self.stream.is_stopped() 
      total = 0
      t_snd_block = []
      while total < INPUT_FRAMES_PER_BLOCK:
        while self.stream.get_read_available() <= 0:
          print ('waiting')
          time.sleep(0.01)
        while self.stream.get_read_available() > 0 and total < INPUT_FRAMES_PER_BLOCK:
          raw_block = self.stream.read(self.stream.get_read_available(), exception_on_overflow = False)
          count = len(raw_block) / 2
          total = total + count
          print ("done"), total,count
          format = '%dh' % (count)
          t_snd_block.append(np.fromstring(raw_block,dtype=np.int16))
          snd_block = np.hstack(t_snd_block)
    except Exception as e:
      print('Error recording: {}'.format(e))
      return

    self.processBlock(snd_block)

if __name__ == '__main__':
  audio = AudioHandler()
  for i in range(0,5):
    audio.listen()

【问题讨论】:

    标签: python audio microphone


    【解决方案1】:

    google 协作代码不在 您的 计算机上运行:它在 google 服务器上运行,并且仅通过浏览器中呈现 的内容与您的计算机进行交互并向您发送短信用键盘输入,浏览器发送它(它不发送按键事件,只发送最终文本)。

    Google Collab 无法使用旨在与您计算机上的硬件集成的库,例如从您计算机上的设备获取音频、视频等...。

    尽管您的计算机上可能有使用设备的浏览器应用程序,但基于 Jupyter 笔记本的 Google Collab不会将替代输入转换为运行在其上的 Python 应用程序的事件.它必须创建一个虚拟化层,并且软件包必须将这些“虚拟设备”识别为外围设备——它或多或少会重新创建世界。

    所以,在你的计算机上本地运行你的代码,看看你得到的结果。

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多