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.

Geräteprototyp
Out of doors/City -Model des Sensorprototyps (Bild des Autors)

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.

Audiomoth USB -Mikrofonkonfiguration App. Denken Sie daran, das Gerät vor dem Konfigurieren mit der richtigen Firmware zu flashen.

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.

Armaturenbrett
Streamit Analytical Dashboard (Bild vom Autor)

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.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert