【发布时间】: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()
它大部分都可以工作,但也有很多问题。
- 我必须在每个循环中创建和关闭音频流。这似乎不是一件好事,但脚本会失败。
- 我希望能够使用“data = stream.read(CHUNK)”,但我可以读取的最大数据量是 70 左右而不出错。我在网上看到的所有其他示例都是能够使用 CHUNK。
- 我真的不知道这个脚本采样了多少声音。就像我说的,我想对 0.1 秒的样本进行采样和比较。
- “time.sleep(0.001)”在那里,因为它显然减少了处理器开销,但我无法找到最佳值。
非常欢迎任何关于改进脚本的帮助。我很高兴与任何对它感兴趣的人分享 MQTT 方面的东西(效果很好)。
【问题讨论】:
-
不知道如果它是在硬件中完成的,但是如果你降低采样率,它可能会降低 CPU 使用率......如果你说你想要 0.1 秒的样本,则不需要在一整秒内声明每秒 44100 个样本.. . 同上 RECORD_SECONDS ...我还建议您删除该睡眠步骤...如果音频回调正确完成,则无需睡眠