【问题标题】:Sound activated recording and advanced filtering on Raspberry PiRaspberry Pi 上的声音激活录音和高级过滤
【发布时间】:2021-09-13 15:48:32
【问题描述】:

我正在使用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 网站:

蝙蝠(声带)和昆虫的发声差异 (颤音)影响经期的连续性。期间触发需要 这样做的好处:

当 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()

【问题讨论】:

    标签: python audio raspbian


    【解决方案1】:

    TL;DR

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

    更长的答案

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

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

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

    维尔格吕克!

    【讨论】:

    • 感谢@SamRogers 的回答。我认为这是一种选择(记录所有内容,然后用 R 过滤),但这似乎是一种非常低效的方法。我查看了 sox 文档并一直在寻找其他工具,但一直未能找到解决方案。这就是为什么我在这里问这个问题。你知道其他工具或有任何代码可以帮助我吗?
    • 不幸的是,我真的不知道任何其他工具,对不起:(
    • 也许您可以在“软件推荐堆栈交换”softwarerecs.stackexchange.com987654323@上提问?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2019-04-30
    • 2020-08-28
    相关资源
    最近更新 更多