【问题标题】:Measuring Sound Levels on Raspberry Pi with PyAudio使用 PyAudio 在 Raspberry Pi 上测量声级
【发布时间】:2021-02-24 18:21:53
【问题描述】:

我正在用 Python 中的 USB 麦克风为 Raspberry Pi 创建一个简单的声音监视器,它可以检测声音的突然变化,无论是“拍手”、音乐节拍还是其他噪音。我希望它进行 0.1 秒的采样,将其与前一个采样周期进行比较,然后在新采样超过某个阈值时发送消息(通过 MQTT)。我一直在使用 PyAudio 和 audioop.max 并写了这个:

import time, audioop
import pyaudio

# Initialisation for PyAudio
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 1

threshold = 10;
reading = 0
previousreading = 0

# PyAudio Object
audio = pyaudio.PyAudio()

while True:
        stream = audio.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
        frames = []

        for i in range(0, int(RATE/CHUNK*RECORD_SECONDS)):
                data = stream.read(70)
                frames.append(data)
                time.sleep(0.001)

        reading = audioop.max(data, 2)
        if reading - previousreading > threshold:
                print(reading)
        previousreading = reading

        stream.stop_stream()
        stream.close()

# Clearing the resources
stream.stop_stream()
stream.close()
audio.terminate()

它大部分都可以工作,但也有很多问题。

  1. 我必须在每个循环中创建和关闭音频流。这似乎不是一件好事,但脚本会失败。
  2. 我希望能够使用“data = stream.read(CHUNK)”,但我可以读取的最大数据量是 70 左右而不出错。我在网上看到的所有其他示例都是能够使用 CHUNK。
  3. 我真的不知道这个脚本采样了多少声音。就像我说的,我想对 0.1 秒的样本进行采样和比较。
  4. “time.sleep(0.001)”在那里,因为它显然减少了处理器开销,但我无法找到最佳值。

非常欢迎任何关于改进脚本的帮助。我很高兴与任何对它感兴趣的人分享 MQTT 方面的东西(效果很好)。

【问题讨论】:

  • 不知道如果它是在硬件中完成的,但是如果你降低采样率,它可能会降低 CPU 使用率......如果你说你想要 0.1 秒的样本,则不需要在一整秒内声明每秒 44100 个样本.. . 同上 RECORD_SECONDS ...我还建议您删除该睡眠步骤...如果音频回调正确完成,则无需睡眠

标签: python audio pyaudio


【解决方案1】:

好的,我遇到的问题似乎与使用 Raspberry Pi 有关。当我在我的 Mac 上运行相同的程序时,它会按预期工作。

【讨论】:

    【解决方案2】:

    添加到这个。如果您在 Raspberry Pi 上使用 PyAudio 时遇到缓冲区溢出和不可预知的行为,那么请考虑采取措施。

    将 CHUNK 大小增加到 4096 并设置 exception_on_overflow=false。即

    CHUNK = 4096
    for i in range(0, int(RATE/CHUNK/settings.SOUNDRATE)):
    data = stream.read(CHUNK,exception_on_overflow=False)
        frames.append(data)
    

    执行此操作后,我的脚本开始可靠运行。

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2021-09-13
      • 1970-01-01
      • 2012-11-05
      • 2013-12-06
      相关资源
      最近更新 更多