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

2024-09-19 20:54:06 发布

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

我正在用USB-powered ultrasonic microphone做一个树莓皮蝙蝠探测器。我希望能够记录蝙蝠,同时排除昆虫和其他非蝙蝠噪音。录音需要声音触发,以避免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网站:

The difference in sound production of bats (vocal cords) and insects (stridulation) affects the period continuity. The period trigger takes advantage of this: enter image description here

The trigger fires when ProdVal and DivVal are lower than the set limits, so if the values ​​are within the yellow range. (Values mean default values): ProdVal = 8, higher values ​​trigger easier DivVal = 20, higher values ​​trigger easier

图像中的翻译文本:

Bat: Tonal signal

Period constant => zero crossings / time = stable

Insects: scratching

Period constant => zero crossings / time = differs

MN => mean value of the number of periods per measurement interval

SD => standard deviation of the number of periods

Higher values trigger better even at low frequencies (also insects!) And vice versa

有没有一种方法可以在Raspberry Pi操作系统中实现这一点(或者达到相同的效果)?我最熟悉的语言是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()

Tags: oftheimportdatastreamratetimethis
1条回答
网友
1楼 · 发布于 2024-09-19 20:54:06

TL;博士

R应该能够在后处理中做到这一点。如果你想在现场录音/流上完成这项工作,我建议你找一个不同的工具

更长的答案

R能够通过几个软件包处理音频文件(最值得注意的似乎是tuneR),但我相当确定这将限于收集后处理,即分析您已经收集的文件,而不是对流式音频输入进行“实时”过滤

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

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

万岁

相关问题 更多 >