Py: Lautstärke-Messung mit alsaaudio

  • Hallo zusammen :)


    hab' schon viel im Netz von euch gelesen und bin nun selbst an einem Punkt, an dem google nicht helfen kann.


    Ich hoffe ihr könnt mir den Faden reichen, der mir verloren ging - folgende Geschichte:


    Anwendung:

      • Sofern ich das Haus verlasse, schaltet HomeKit ein Switch, der ein Script ausführt
      • Script überwacht die Lautstärke in einem Raum (Hundeüberwachung)
      • Sobald der Pegel eine Grenze überschreitet stoppt das script
      • Es wird ein Text per telegram verschickt: "Du dein Hund bellt"
      • Es werden 10s Ton und Video aufgenommen und per telegram versendet
      • Das Script läuft von Anfang und hört wieder zu

    Das hat alles 1-2 Wochen gut funktioniert. Jetzt ist es jedoch so, dass mein Script KEINEN Input mehr erkennt. Der Pegel wird einfach nicht mehr gemessen. Konfiguration ist jedoch die gleiche. Manuell habe ich da nichts verändert.


    Setup:


    soundcheck.py (Aus dem Netz kopiert)


    Ich habe die Cam 'Camera' als standard device konfiguriert!


    /etc/asound.conf:

    Code
    1. pcm.!default {
    2. type hw
    3. card Camera
    4. }
    5. ctl.!default {
    6. type hw
    7. card Camera
    8. }


    arecord -l:

    Code
    1. **** List of CAPTURE Hardware Devices ****
    2. card 1: Camera [AUKEY PC-LM1 USB Camera], device 0: USB Audio [USB Audio]
    3. Subdevices: 1/1
    4. Subdevice #0: subdevice #0


    /usr/share/alsa/alsa.conf:

    Code
    1. ...
    2. defaults.ctl.card 1
    3. defaults.pcm.card 1
    4. ...


    JETZT KOMMTS:

    arecord funktioniert tadellos (nur mit sudo) und nimmt den Sound korrekt auf und speichert mir eine Datei. Es mangelt also nur an der Messung der Lautstärke und die Erkennung, wenn es lauter ist, als es soll.


    Wo liegt das Problem? Ich hoffe jemand von euch weiß weiter...


    Es hat vor einigen Tagen noch reibungslos geklappt. Das Script rennt auch noch ohne Probleme, print liefert aber keine Werte. Der Wert bleibt bei 0.

    Ich sitze tatsächlich schon Tage hieran und ich kann es mir nicht erklären.


    Hints:

    Das einzige woran ich mich erinnere ist, dass ich sudo apt-get update / upgrade durchgeführt habe.

    Ich habe pitcher.set_silence(-25) bereits auf alle möglichen Werte gebracht.

    Wenn ich das Script logge, kommen auch keine Fehlermeldungen oder sonstiges.

  • Hast Du schonmal in die Logfiles geschaut, oder mit top die Speicherauslastung überprüft,

    mit "prozess status" (man ps) die Prozesse angeschaut, oder mit < dmesg -w > den Kernel Ring Puffer laufend anzeigen lassen ?


    Servus !

    Wer nichts weiß, muss alles glauben.

  • Ich verstehe diese Zeile nicht:

    Code
    1. a = "{:10.4f}".format(freq,energy) # gemessen

    Da wird doch der Wert von energy und damit die Lautstärke gar nicht verwertet, oder schaue ich schief? Was gibt das Script denn für Werte aus?

  • ... oder mit < dmesg -w > den Kernel Ring Puffer laufend anzeigen lassen ?


    Servus !

    Okay das ist ja schon mal ein Befehl, der mir gar nicht bekannt war !!!


    Bin ja nicht so der Pro, aber habe da etwas, was suspekt aussieht:


    [ 4.655592] uvcvideo 1-1.1.2.3:1.0: Entity type for entity Camera 1 was not initialized! # Weiße Zeile

    [17026.234742] uvcvideo: Failed to resubmit video URB (-1). # Rote Zeile


    Was möchte mein Pi von mir ? :D


    Dazu bemerkt, normaler "arecord" funktioniert, nur im script das "zuhören" nicht so wirklich.. <Edit> UND: Video Stream von HomeKit auf iPhone funktioniert auch tadellos -> aber von Anfang an ohne Sound. Das hat aber einen anderen Hintergrund wegen dem Plugin.</Edit>


    <htop> zeigt auch, dass die Memory-Auslastung bei knapp über die hälfte ist... Kann das ein Grund sein, das Audio vom Mic nicht durchkommt?


    -------------

    ZUSATZ:


    <v4l2-ctl --all> zeigt folgendes:

    Was bedeutet denn das??


    "Driver Info (not using libv4l2)"



    -------------



    Ich verstehe diese Zeile nicht:

    Code
    1. a = "{:10.4f}".format(freq,energy) # gemessen

    Da wird doch der Wert von energy und damit die Lautstärke gar nicht verwertet, oder schaue ich schief? Was gibt das Script denn für Werte aus?

    -> Das Script ist aus dem Netz. Wenn Lautstärke erkannt wird, dann schlägt der Wert aus. Ich kann es dir leider auch nicht erklären, aber es hat wunderbar funktioniert - bis es aufhörte zu funktionieren :/

    2 Mal editiert, zuletzt von Stew1987 ()

  • pitcher = aubio.pitch("default", win_s, hop_s, samplerate)

    Ach, das gehört so :lol:

    Schon mal probiert (auch mehrmals) mit rmmod uvcvideo und dann mit modprobe uvcvideo das Modul wieder zu laden ?


    P.S. Absolute Pfade benutzen.

  • Bin leider arbeiten aber kann die Befehle an den pi senden und in der Pause nachschauen und Posten was dabei rum kam...


    Ich bin zwar was html, js, css und nun auch bisschen Shell, Python und php angeht halbwegs gut aufgestellt, aber was ein absoluter Pfad ist weiß ich noch immer nicht. Das Google ich -> danke!

  • Als Beispiel eine Zeile:

    subprocess.call(['python ~/stews/conversations/soundcheckON.py'], shell=True)

    Mit absolutem Pfad:

    subprocess.call(['/usr/bin/python /home/stews/conversations/soundcheckON.py'], shell=True)

    Wo ein Programm ist, kannst du mit which <programmname> herausfinden.

    Z.B.:

    which python3

    ergibt:

    /usr/bin/python3

  • Vielen Dank!!! "which" ist mir auch noch nicht bekannt gewesen :) So viel eindrücke hier :):) TOP


    -------------


    pitcher = aubio.pitch("default", win_s, hop_s, samplerate)

    Ach, das gehört so :lol:

    Schon mal probiert (auch mehrmals) mit rmmod uvcvideo und dann mit modprobe uvcvideo das Modul wieder zu laden ?


    P.S. Absolute Pfade benutzen.


    Ich habe nun MEHRMALS das Modul neugeladen. Kein erfolg...... noch mal ein kurzer Auszug aus ...


    dmesg -w: (alles was rot ist)

    Code
    1. [ 4.077072] sd 0:0:0:0: [sda] No Caching mode page found
    2. [ 4.077085] sd 0:0:0:0: [sda] Assuming drive cache: write through
    3. [ 4.294467] brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
    4. [ 4.678608] brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
    5. [ 4.679179] brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 9.10.105 Compiler: 1.29.4 ClmImport: 1.36.3 Creation: 2018-03-09 18:56:28

    weiß:

    Code
    1. [ 4.610471] uvcvideo 1-1.1.2.3:1.0: Entity type for entity Extension 3 was not initialized!
    2. [ 4.610494] uvcvideo 1-1.1.2.3:1.0: Entity type for entity Processing 2 was not initialized!
    3. [ 4.610509] uvcvideo 1-1.1.2.3:1.0: Entity type for entity Camera 1 was not initialized!


    Das ist sehr komisch...

  • v4l = Video for Linux. (Release 2). Da steht nur, dass keine v4l2-Bibliothek verwendet wird, somdern ein "uvcvideo" (Modul/Treiber). Und von Audio steht da gar nichts.


    Wenn das Script aus dem Netz gefischt wurde, hat es auch einen Autor, und der wäre die erste Ansprechadresse, wenn nach einem Softwareupdate (welches eigentlich ?) seine "Software" nicht mehr funktioniert.


    Und auch beim Softwareupdate können Fehler passieren, die nicht nur angezeigt werden, sondern auch im Logfile nachträglich eingesehen werden können. Bei mir z.B. unter /var/cache/apt/term.log.



    Servus !

    Wer nichts weiß, muss alles glauben.

  • Ok nice!


    Hab' die log gefunden und der hat für den 09.02. (an dem Tag war der letzte erfolgreiche Test) folgendes notiert:


    Ich werde da jetzt nicht fündig.


    Frage: Kann man den stand reverten? So dass ich die Pakete wieder auf den letzten Stand bringe, um zu testen ob es der Auslöser war? (Ohne manuelles Backup)


    UPDATE:


    Letzte erfolgreiche Messung gg. 18 Uhr an dem Tag.

    Das Update ist es nicht -> Da es Morgens um 10 gemacht wurde...........


    Man..

  • Hallo,


    Zitat

    Frage: Kann man den stand reverten? So dass ich die Pakete wieder auf den letzten Stand bringe, um zu testen ob es der Auslöser war?

    Schlecht. APT ist "nur" für Upgrades gemacht, Downgrades sind da nicht wirklich vorgesehen. Klar kannst du das Paket deinstallieren, die eine ältere Version suchen und diese manuell installieren. Kann aber, gerade bei systemnahen Sachen, auch schnell zu Problem und Abhängigkeitschaos führen.


    Wenn man _vorher_ weiß, dass ein Paket nicht aktualisiert werden soll, kann man das mit apt-pinning machen.


    Gruß, noisefloor

  • Also beim upgrade vom 2019-02-09 09:56 hats was.


    Vom Ctrl-M abgesehen wurden nur 30 % der Datenbank eingelesen und deshalb war das upgrade nach 9 Sekunden schon fertig.


    Es fehlen noch 70 % der Datenbankfiles !



    Ich würde nochmal ein apt-get update und apt-get upgrade nachsetzen.


    Servus !

    Wer nichts weiß, muss alles glauben.

  • Hm, das update war eigentlich komplett. Da ist ein "$"


    Volle Zeile ist: (Reading database ... ^M(Reading database ... 5%^M(Reading database ... 10%^M(Reading database ... 15%^M(Reading database ... 20%^M(Reading database ... 25%^M(Reading database ... 30%^M(Reading database ... 35%^M(Reading database ... 40%^M(Reading database ... 45%^M(Reading database ... 50%^M(Reading database ... 55%^M(Reading database ... 60%^M(Reading database ... 65%^M(Reading database ... 70%^M(Reading database ... 75%^M(Reading database ... 80%^M(Reading database ... 85%^M(Reading database ... 90%^M(Reading database ... 95%^M(Reading database ... 100%^M(Reading database ... 125615 files and directories currently installed.)


    Upgrade:

    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


    -> Kein Erfolg

    Einmal editiert, zuletzt von Stew1987 ()

  • Hey noch mal.....


    Nach einer Woche fummeln und erstellen von mehreren Test scripts... hier die Lösung:



    Ich habe den Stecker für ein paar Sekunden gezogen, wieder reingesteckt und alles funktioniert wie vorher.


    Vielen Dank an Alle beteiligten! Habe viel gelernt :)