用PyAudio测量树莓Pi的声级

2024-07-02 12:43:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Raspberry Pi创建一个简单的声音监视器,带有Python中的USB麦克风,可以检测声音的突然变化,无论是“拍手”、音乐中的节拍还是其他噪音。我希望它采取一个,比方说,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感兴趣的人分享MQTT方面的内容(效果很好)


Tags: 声音datastreamframesratetimemqttaudio
2条回答

再加上。如果您在Raspberry Pi上使用PyAudio时遇到缓冲区溢出和不可预测的行为,请尝试解决这些问题

将块大小增加到4096,并将异常\u on\u overflow设置为false。i、 e

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

完成此操作后,我的脚本开始可靠地工作

好的,我遇到的问题似乎与使用树莓圆周率有关。当我在我的Mac电脑上运行相同的程序时,它会按预期工作

相关问题 更多 >