Möchten Sie wissen, was mich zur Soundscape -Analyse zieht?
Es ist ein Feld, das Wissenschaft, Kreativität und Erforschung auf eine Weise kombiniert, die nur wenige andere tun. Erstens, Ihr Labor ist wohin Ihre Füße Sie führen – Ein Waldweg, ein Stadtpark oder ein abgelegener Bergweg können alle zu Räumen für wissenschaftliche Entdeckungen und akustische Untersuchungen werden. Zweitens, Bei der Überwachung eines ausgewählten geografischen Bereichs dreht sich alles um Kreativität. Innovation ist das Herzstück der Umwelt-Audioforschung, egal ob es sich um ein benutzerdefiniertes Gerät handelt, Sensoren in Baumzudeln zu verbergen oder Solarenergie für Setups außerhalb des Netzes zu verwenden. Endlich, Das Datenvolumen ist wirklich unglaublich. Und wie wir wissen, sind in der räumlichen Analyse alle Methoden ein faires Spiel. Von den Stunden tierischer Aufrufe bis zum subtilen Summen von städtischen Maschinen können die gesammelten akustischen Daten riesig und komplex sein, und das öffnet die Tür, um alles vom tiefen Lernen bis hin zu geografischen Informationssystemen (GIS) zu verwenden, um alles zu verstehen.
Nach meinen früheren Abenteuern mit Klanglandschaftsanalyse eines der Flüsse PolensIch beschloss, die Messlatte zu erhöhen und zu entwerfen und eine Lösung zu implementieren, die Soundscapes in in der Lage ist, in Echtzeit. In diesem Weblog -Beitrag finden Sie eine Beschreibung der vorgeschlagenen Methode zusammen mit einem Code, der den gesamten Prozess anführt, hauptsächlich mit einem Audiospektrogrammtransformator (AST) für die Klassifizierung.

Methoden
Aufstellen
Es gibt viele Gründe, warum ich in diesem speziellen Fall eine Kombination von verwendet habe Raspberry Pi 4 und Audiomoth. Glauben Sie mir, ich habe eine breite Palette von Geräten getestet-von weniger leistungsstarken Modellen der Raspberry Pi Familie durch verschiedene Arduino -Versionen, einschließlich der PORTENTAbis zum Jetson Nano. Und das conflict nur der Anfang. Die Auswahl des richtigen Mikrofons erwies sich als noch komplizierter.
Letztendlich ging ich mit dem PI 4 B (4 GB RAM) wegen seiner soliden Leistung und des relativ geringen Stromverbrauchs (~700mah beim Ausführen meines Codes). Das Paarung mit dem Audiomoth im USB -Mikrofonmodus gab mir außerdem viel Flexibilität während des Prototyps. Audiomoth ist ein leistungsstarkes Gerät mit einer Fülle von Konfigurationsoptionen, z. B. Abtastrate von 8 kHz bis atemberaubend 384 kHz. Ich habe das starke Gefühl, dass sich dies – auf lange Sicht – als perfekte Wahl für meine Soundscape -Studien erweisen wird.

Klang erfassen
Das Erfassen von Audio aus einem USB -Mikrofon mit Python erwies sich als überraschend problematisch. Nachdem ich eine Weile mit verschiedenen Bibliotheken gekämpft hatte, beschloss ich, auf den guten alten Linux zurückzukehren arecord
. Der gesamte Schallförderungsmechanismus wird mit dem folgenden Befehl eingekapselt:
arecord -d 1 -D plughw:0,7 -f S16_LE -r 16000 -c 1 -q /tmp/audio.wav
Ich verwende absichtlich ein Plug-in-Gerät, um die automatische Konvertierung für den Fall zu ermöglichen, dass ich Änderungen an der USB -Mikrofon Konfiguration. AST wird weitergeleitet 16 kHz Proben, so dass die Aufzeichnung und Audiomoth -Stichprobe auf diesen Wert festgelegt werden.
Achten Sie auf den Generator im Code. Es ist wichtig, dass das Gerät in den von mir angegebenen Zeitintervallen von Audio kontinuierlich erfasst. Ich wollte nur die neueste Audio -Probe auf dem Gerät speichern und nach der Klassifizierung verwerfen. Dieser Ansatz wird später in größeren Studien in städtischen Gebieten besonders nützlich sein, da er dazu beiträgt DSGVO Compliance.
import asyncio
import re
import subprocess
from tempfile import TemporaryDirectory
from typing import Any, AsyncGenerator
import librosa
import numpy as np
class AudioDevice:
def __init__(
self,
title: str,
channels: int,
sampling_rate: int,
format: str,
):
self.title = self._match_device(title)
self.channels = channels
self.sampling_rate = sampling_rate
self.format = format
@staticmethod
def _match_device(title: str):
traces = subprocess.check_output(('arecord', '-l'), textual content=True).splitlines()
units = (
f'plughw:{m.group(1)},{m.group(2)}'
for line in traces
if title.decrease() in line.decrease()
if (m := re.search(r'card (d+):.*gadget (d+):', line))
)
if len(units) == 0:
increase ValueError(f'No units discovered matching `{title}`')
if len(units) > 1:
increase ValueError(f'A number of units discovered matching `{title}` -> {units}')
return units(0)
async def continuous_capture(
self,
sample_duration: int = 1,
capture_delay: int = 0,
) -> AsyncGenerator(np.ndarray, Any):
with TemporaryDirectory() as temp_dir:
temp_file = f'{temp_dir}/audio.wav'
command = (
f'arecord '
f'-d {sample_duration} '
f'-D {self.title} '
f'-f {self.format} '
f'-r {self.sampling_rate} '
f'-c {self.channels} '
f'-q '
f'{temp_file}'
)
whereas True:
subprocess.check_call(command, shell=True)
knowledge, sr = librosa.load(
temp_file,
sr=self.sampling_rate,
)
await asyncio.sleep(capture_delay)
yield knowledge
Einstufung
Nun zum aufregendsten Teil.
Verwenden des Audio -Spektrogramm -Transformators (AST) und des ausgezeichneten Umarmung Ökosystem können wir Audio effizient analysieren und erkannte Segmente in über 500 Kategorien eintreffen.
Beachten Sie, dass ich das System zur Unterstützung verschiedener vorgebildeter Modelle vorbereitet habe. Standardmäßig benutze ich MIT/AST-Finetuned-ADIOSET-10–10–0.4593wie es die besten Ergebnisse liefert und intestine auf dem Raspberry Pi 4 läuft. Onnx-Group/Ast-Finetuned-ADIOSET-10–10–0.4593-ONNX ist auch es wert, erkundet zu werden – besonders seine quantisierte Modelwas weniger Speicher benötigt und die Inferenzergebnisse schneller dient.
Sie können feststellen, dass ich das Modell nicht auf ein einzelnes Klassifizierungsetikett einschränke, und das ist beabsichtigt. Anstatt davon auszugehen, dass zu einem bestimmten Zeitpunkt nur eine Klangquelle vorhanden ist, wende ich a an Sigmoidfunktion zu den Protokollen des Modells zu erhalten Unabhängige Wahrscheinlichkeiten für jede Klasse. Dadurch kann das Modell ausdrücken Vertrauen in mehrere Labels gleichzeitigwas entscheidend für Actual-World Soundscapes Wo überlappende Quellen – wie Vögel, Wind und entfernter Verkehr – häufig zusammen vorkommen. Das nehmen Prime 5 Ergebnisse stellt sicher, dass das System die wahrscheinlichsten Sound-Ereignisse in der Probe erfasst, ohne eine Entscheidung für Gewinner zu erzwingen.
from pathlib import Path
from typing import Non-obligatory
import numpy as np
import pandas as pd
import torch
from optimum.onnxruntime import ORTModelForAudioClassification
from transformers import AutoFeatureExtractor, ASTForAudioClassification
class AudioClassifier:
def __init__(self, pretrained_ast: str, pretrained_ast_file_name: Non-obligatory(str) = None):
if pretrained_ast_file_name and Path(pretrained_ast_file_name).suffix == '.onnx':
self.mannequin = ORTModelForAudioClassification.from_pretrained(
pretrained_ast,
subfolder='onnx',
file_name=pretrained_ast_file_name,
)
self.feature_extractor = AutoFeatureExtractor.from_pretrained(
pretrained_ast,
file_name=pretrained_ast_file_name,
)
else:
self.mannequin = ASTForAudioClassification.from_pretrained(pretrained_ast)
self.feature_extractor = AutoFeatureExtractor.from_pretrained(pretrained_ast)
self.sampling_rate = self.feature_extractor.sampling_rate
async def predict(
self,
audio: np.array,
top_k: int = 5,
) -> pd.DataFrame:
with torch.no_grad():
inputs = self.feature_extractor(
audio,
sampling_rate=self.sampling_rate,
return_tensors='pt',
)
logits = self.mannequin(**inputs).logits(0)
proba = torch.sigmoid(logits)
top_k_indices = torch.argsort(proba)(-top_k:).flip(dims=(0,)).tolist()
return pd.DataFrame(
{
'label': (self.mannequin.config.id2label(i) for i in top_k_indices),
'rating': proba(top_k_indices),
}
)
Um die ONNX -Model des Modells auszuführen, müssen Sie hinzufügen Optimum zu Ihren Abhängigkeiten.
Schalldruckpegel
Zusammen mit der Audio -Klassifizierung erfasse ich Informationen zum Klangdruckstufe. Dieser Ansatz identifiziert nicht nur Was machte den Klang, erhält aber auch Einblick in Wie stark Jeder Klang conflict vorhanden. Auf diese Weise erfasst das Modell eine reichhaltigere, realistischere Darstellung der akustischen Szene und kann schließlich verwendet werden, um Informationen zu feinkörnigeren Geräuschverschmutzung zu erfassen.
import numpy as np
from maad.spl import wav2dBSPL
from maad.util import mean_dB
async def calculate_sound_pressure_level(audio: np.ndarray, acquire=10 + 15, sensitivity=-18) -> np.ndarray:
x = wav2dBSPL(audio, acquire=acquire, sensitivity=sensitivity, Vadc=1.25)
return mean_dB(x, axis=0)
Die Verstärkung (Vorverstärker + AMP), Empfindlichkeit (DB/V) und VADC (V) werden hauptsächlich für Audiomoth eingestellt und experimentell bestätigt. Wenn Sie ein anderes Gerät verwenden, müssen Sie diese Werte identifizieren, indem Sie sich auf die technische Spezifikation beziehen.
Lagerung
Daten von jedem Sensor werden alle 30 Sekunden mit einer PostgreSQL -Datenbank synchronisiert. Der aktuelle städtische Soundscape Monitor -Prototyp verwendet eine Ethernet -Verbindung. Daher bin ich in Bezug auf die Netzwerkbelastung nicht eingeschränkt. Das Gerät für mehr entfernte Bereiche synchronisieren die Daten jede Stunde mit einer GSM -Verbindung.
label rating gadget sync_id sync_time
Hum 0.43894055 yor 9531b89a-4b38-4a43-946b-43ae2f704961 2025-05-26 14:57:49.104271
Mains hum 0.3894045 yor 9531b89a-4b38-4a43-946b-43ae2f704961 2025-05-26 14:57:49.104271
Static 0.06389702 yor 9531b89a-4b38-4a43-946b-43ae2f704961 2025-05-26 14:57:49.104271
Buzz 0.047603738 yor 9531b89a-4b38-4a43-946b-43ae2f704961 2025-05-26 14:57:49.104271
White noise 0.03204195 yor 9531b89a-4b38-4a43-946b-43ae2f704961 2025-05-26 14:57:49.104271
Bee, wasp, and so on. 0.40881288 yor 8477e05c-0b52-41b2-b5e9-727a01b9ec87 2025-05-26 14:58:40.641071
Fly, housefly 0.38868183 yor 8477e05c-0b52-41b2-b5e9-727a01b9ec87 2025-05-26 14:58:40.641071
Insect 0.35616025 yor 8477e05c-0b52-41b2-b5e9-727a01b9ec87 2025-05-26 14:58:40.641071
Speech 0.23579548 yor 8477e05c-0b52-41b2-b5e9-727a01b9ec87 2025-05-26 14:58:40.641071
Buzz 0.105577625 yor 8477e05c-0b52-41b2-b5e9-727a01b9ec87 2025-05-26 14:58:40.641071
Ergebnisse
Eine separate Anwendung, die mit Verwendung erstellt wurde Straffung Und Handlunggreift auf diese Daten zu. Derzeit werden Informationen über den Standort des Geräts, die zeitliche SPL (Schalldruckstufe), identifizierte Klassenklassen und eine Reihe von Akustische Indizes.

Und jetzt können wir loslegen. Der Plan besteht darin, das Sensornetzwerk zu erweitern und rund 20 Geräte zu erreichen, die an mehreren Stellen in meinem verstreut sind Stadt. Weitere Informationen zu einer größeren Bereitstellung eines größeren Bereichs werden in Kürze verfügbar sein.
Darüber hinaus sammle ich Daten von einem bereitgestellten Sensor und aircraft, das Datenpaket, das Dashboard und die Analyse in einem bevorstehenden Weblog -Beitrag zu teilen. Ich werde einen interessanten Ansatz verwenden, der einen tieferen Eintauchen in die Audioklassifizierung rechtfertigt. Die Hauptidee besteht darin, unterschiedliche Schalldruckpegel mit den erkannten Audioklassen anzupassen. Ich hoffe, einen besseren Weg zu finden, um die Lärmbelastung zu beschreiben. Seien Sie additionally gespannt auf einen detaillierteren Zusammenbruch.
In der Zwischenzeit können Sie die lesen Vorpapier Auf meinen Klanglandstudien (Kopfhörer sind obligatorisch).
Dieser Beitrag wurde Korrekturlesen und bearbeitet mithilfe Grammatik Grammatik und Klarheit zu verbessern.