微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Raspberry Pi 上的声音激活录音和高级过滤

如何解决Raspberry Pi 上的声音激活录音和高级过滤

我正在使用 USB-powered ultrasonic microphone 制作 RaspBerry Pi 蝙蝠探测器。我希望能够记录蝙蝠,同时排除昆虫和其他非蝙蝠的噪音。录音需要由声音触发,以避免过快地填充 SD 卡并帮助分析。 This website 解释了如何使用 SoX 做到这一点:

rec - c1 -r 192000 record.wav sinc 10k silence 1 0.1 1% trim 0 5

这会在触发声音至少 0.1 秒后记录 5 秒,并包含 10kHz 高通滤波器。这是一个好的开始,但我真正想要的是一种高级过滤器,可以排除蟋蟀和其他非蝙蝠噪音。昆虫和蝙蝠的叫声在频率上重叠,因此高通或带通滤波器不起作用。

Elekon Batlogger 使用分析零交叉的周期触发器执行此操作。来自 Batlogger 网站:

蝙蝠(声带)和昆虫发声的区别 (颤音)影响周期的连续性。周期触发器需要 这样做的好处:

enter image description here

当 ProdVal 和 DivVal 低于设定值时触发 限制,所以如果值在黄色范围内。 (数值表示认值):ProdVal = 8,数值越高触发 更容易 DivVal = 20,更高的值更容易触发

图片中的翻译文本:

蝙蝠:音调信号

周期常数 => 过零/时间 = 稳定

昆虫:抓挠

周期常数 => 过零/时间 = 不同

MN => 每个测量间隔周期数的平均值

SD => 周期数的标准差

更高的值即使在低频下也能更好地触发(也是昆虫!) 反之亦然

有没有办法在 RaspBerry Pi OS 中实现这一点(或达到相同效果)?我最熟悉的语言是 R。根据对 this question 的回答,R 似乎适合这个问题,但如果 R​​ 不是最佳选择,那么我愿意接受其他建议。

我真的很感激一些用于记录音频和过滤的工作代码,如上所述。我想要的输出是 5 秒的文件,其中包含蝙蝠的叫声,而不是昆虫或噪音。需要在 cpu/电源使用方面高效,并且需要即时工作。

蝙蝠和昆虫here的录音示例。


更新:

我有一个在 Python (based on this answer) 中运行的基本声音激活脚本,但我不确定如何在其中包含高级过滤器:

import pyaudio
import wave
from array import array
 import time
 
FORMAT=pyaudio.paInt16
CHANNELS=1
RATE=44100
CHUNK=1024
RECORD_SECONDS=5

audio=pyaudio.PyAudio() 

stream=audio.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)

nighttime=True # I will expand this later

while nighttime:
     data=stream.read(CHUNK)
     data_chunk=array('h',data)
     vol=max(data_chunk)
     if(vol>=3000):
         print("recording triggered")
         frames=[]
         for i in range(0,int(RATE / CHUNK * RECORD_SECONDS)):
             data = stream.read(CHUNK)
             frames.append(data)
         print("recording saved")
         # write to file
         words = ["RECORDING-",time.strftime("%Y%m%d-%H%M%s"),".wav"]
         FILE_NAME= "".join(words) 
         wavfile=wave.open(FILE_NAME,'wb')
         wavfile.setnchannels(CHANNELS)
         wavfile.setsampwidth(audio.get_sample_size(FORMAT))
         wavfile.setframerate(RATE)
         wavfile.writeframes(b''.join(frames))
         wavfile.close()
     # check if still nighttime
     nighttime=True # I will expand this later
 
 stream.stop_stream()
 stream.close()
 audio.terminate()

解决方法

TL;DR

R 应该能够在后期处理中做到这一点。如果您希望在现场录音/流媒体上完成此操作,我建议您寻找其他工具。

更长的答案

R 能够通过多个包处理音频文件(最显着的似乎是 tuneR),但我很确定这将仅限于收集后处理,即分析您已经收集的文件,而不是对流式音频输入进行“实时”过滤。

您可以采用多种方法来“实时”过滤昆虫/不需要的声音。一种方法是只记录上面列出的文件,然后编写 R 代码来处理它们(例如,您可以使用 cron 按计划自动执行此操作)并丢弃与您的标准不匹配的部分或文件。如果您担心 SD 卡空间,您还可以在处理后将这些文件卸载到另一个位置(即上传到某个地方的另一个驱动器)。您可以将其设置为相当短的时间范围(冒着 Pi 上 CPU 使用率的风险),以获得“几乎实时”的处理方法。

另一种方法是更多地查看 sox documentation 并查看其中是否有选项可以根据流式音频输入实现您想要的效果,或者查看是否有其他工具可以将输入流式传输到其中,这将允许进行那种过滤。

维尔格鲁克!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。