Scheitere gerade an pip install pyalsaaudio

  • Servus beinand,

    ich glaube ich bin RPi-mäßig etwas eingerostet, da ich im vergangenen Jahr (leider) wichtigere Sachen organisieren musste. Das vermeintlich Einfachste bringe ich zumindest auf die Schnelle nicht hin, einen pip install pyalsaaudio, da erhalte ich das:

    Ich arbeite auf einem meiner vielen RPi3B unter Raspberry Pi OS Lite bookworm 32bit. 32bit deshalb, weil ich bei 64bit einen kodi-Absturz hatte. Beim RPi3 mit seinem 1GB RAM bringt 64bit zudem keinen wirklichen Vorteil...

    Vorgehen bei der Installation:

    1. Das OS mit dem RPi-Imager auf die SD-Karte geflasht. Inkl. SSH, deutscher Tastaturbelegung etc...

    2. sudo apt update && sudo apt upgrade

    3. In /boot/firmware/config.txt folgende Einträge ergänzt:

    Code
    dtoverlay=hifiberry-dacplus
    dtoverlay=vc4-fkms-v3d       # es kann schon sein, dass ich wieder zum "echten" vc4-kms-v3d zurückkehre. Stellt sich am Schluss heraus...

    4. eine /home/pi/.asoundrc für die ALSA-Konfiguration angelegt.
    Hier geht es darum, zwei oder mehr Hardware-Soundkarten zu einer virtuellen Karte zusammenzufassen, die simultan die gleiche Audioausgabe liefern. Das funzt auch schon so weit. Ich habe sogar schon die drei Soundkarten erfolgreich zusammengefasst: (native) HDMI, HifiBerry DAC+, Logitech USB-Headset DZL-A-5572A. Details dazu siehe Thread Zero 2 W mit HifiBerry für Spotify, zu dem ich auch meinen Senf dazugegeben habe.

    Wie gesagt, die gleichzeitige/simultane Wiedergabe einer Audioquelle über mehrere Hardware-Soundkarten funktioniert, auch deren Definiton als ALSA-Defaultgerät (Alsa-Einträge pcm) in der .asoundrc. Wenn man über eine Audiosoftware die Lautstärke regelt, beißt nur die Soundkarte an, die in ALSA als hw:0 eingebunden wird. Die Regler für amixer und alsamixer werden wohl über die Einträge ctl definiert, aber das funzt nicht so recht. Ich habe noch nicht gefunden, wie man ein ALSA-Mixerelement definiert, das gleichzeitig die Lautstärke mehrerer Soundkarten (bzw. einer virtuellen Karte) steuert. In allen im Internet gefundenen Beispielen wird letztlich eine Einzelkarte hw:<x> angegeben. Dies regelt aber dann eben nur diese eine HW-Soundkarte. Wegen der äußerst dürftigen und wohl relativ unaktuellen Dokumentation von ALSA (z.B. https://www.alsa-project.org/wiki/Asoundrc), bin ich hier ein echter Feuerwehrler: Ich stehe auf dem Schlauch!

    Dann stieß ich auf pyalsaaudio, eine Python-Library, mit der man ALSA über Python steuern kann. Mein erster quick+dirty-Ansatz zum Testen wäre jetzt, ein Lautstärkesteuerprogramm zu schreiben, das allen einzelnen HW-Soundkarten meiner virtuellen Soundkarte die Lautstärkeänderung übergibt und somit auch die Lautstärke aller Einzelkarten gleichzeitig anpasst. Aber da scheitere ich schon bei der Installation von pyalsaaudio:

    1. pip install pyalsaaudio
    unter Raspi OS Lite kommt die Meldung: -bash: pip: command not found

    2. sudo apt install pip
    läuft ohne Auffälligkeiten durch

    3. pip install pyalsaaudio
    Jetzt kommt die Fehlermeldung von oben!

    Liegt das jetzt an Raspi OS Lite? Bei mir ist zwar Python 3.11.2 installiert, aber das pip-Paket fehlt. Und danach funzt es immer noch nicht...
    Großes :?:

    EDIT:
    Interessant ist in diesem Zusammenhang, dass die Lautstärkeregelung von kodi wie gewünscht funktioniert, aber bei allen anderen Programmen nicht. Zuerst dachte ich, dies läge an einer fehlerhaften Umsetzung der anderen Software. Aber das ist bei den meisten Programmen so. Ich vermute mittlerweile, dass kodi seine Lautstärkeregelung nicht über ALSA steuert, sondern seine Audioausgabe selbst skaliert und in der eingestellten Lautstärke dann an ALSA liefert.

  • Mit der neuen Debian-Version können standardmäßig keine Python-Packages mehr über pip im Systeminterpreter installiert werden. Es gibt drei Möglichkeiten, das zu umgehen:

    1. Du erstellst eine venv, installierst das Package da und führst das Script in der venv aus
    2. Du guckst, ob es das Package auch über apt gibt (wäre dann python3-pyalsaaudio)
    3. Im Notfall kannst du die Beschränkung auch umgehen

    Die genauen Commands usw. stehen in der Fehlermeldung drin, die du bekommen hast

  • Danke euch beiden, again what learned!

    im aktiven venv funktioniert die pip-Installation wie gewollt:
    pip install pyalsaaudio

    Code
    Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
    Collecting pyalsaaudio
      Downloading https://www.piwheels.org/simple/pyalsaaudio/pyalsaaudio-0.11.0-cp311-cp311-linux_armv7l.whl (69 kB)
         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 69.6/69.6 kB 669.2 kB/s eta 0:00:00
    Installing collected packages: pyalsaaudio
    Successfully installed pyalsaaudio-0.11.0

    Wie habe ich es gemacht?
    Basierend auf dem von hyle genannten Beitrag ein venv (Virtual Environment) installiert:

    1. mkdir /home/pi/pythonenv # Installationsverzeichnis für venv anlegen
    2. python3 -m venv /home/pi/pythonvenv # Das venv-Modul in(?) bzw. für(?) Python installieren
    3. source /home/pi/pythonvenv/bin/activate # venv starten
      Bei der Datei <Pfad>/activate handelt es sich um ein Shellskript, welches das venv aktiviert. Der Kommandozeilenbefehl source bewirkt, dass <Pfad>activate nicht in einer untergeordneten Shell ausgeführt wird, sondern in der gleichen wie die Eingabeaufforderung und alle dort deklarierten Variablen und Einstellungen etc. verfügbar sin.
    4. Und beinahe wie von Zauberhand funzt plötzlich
      pip install pyalsaaudio
    5. deactivate # verlassen von venv

    Für mich, den Linux-Dauernoob ist das etwas mysteriös, da beinahe zu einfach :) Ich habe aber mittlerweile schon gelesen, dass dies unter Debian und seinen nahen(?) Abkömmlingen offenbar so gewollt ist, von daher werde ich es einfach fressen (akzeptieren).

    Damit ist dieses Thema für mich erstmal erledigt, jetzt werde ich meine Python-Lautstärkeregelung mal versuchen zu implementieren...

  • Noch ein Tipp dazu, weil die Frage nach dem Autostart ziemlich sicher kommen wird. ^^ Um ein Skript zu starten, muss das venv nicht aktiviert sein. Dazu setzt Du statt python3 den Interpreter aus dem venv vor das Skript. In Deinem Fall wäre das:

    Code
    /home/pi/pythonvenv/bin/python /Pfad/zum/Skript.py
  • Mei-o-mei -- Das geht ja viel einfacher:
    Der Aufgabe einfache Lösung ist das Kommando amixer, das genau das macht, was ich möchte: gezielt einzelne ALSA-Single-Mixer anzusteuern. Ein virtuelles Mischpult eben.
    Da werde ich jetzt ein simples bash-Skript zusammenstellen, das meine Zwecke erfüllt...

    Gott sei Dank habe ich noch nicht zu viel Aufwand in das Python-Programm hineingesteckt...

    Lerneffekt bei der ganzen Geschichte:

    • Ich weiß jetzt, wie man eine virtuelle ALSA-Soundkarte definiert, die aus mehreren HW-Soundkarten besteht und einen Audiostream synchron auf allen beteilgten HW-Soundkarten ausgibt. Siehe hier.
    • Ich weiß jetzt, dass man (spätestens) ab Debian 12 (Bookworm) Python-Libraries unter einer venv installieren und ausführen muss.
    • und für mein Problem gibt's eine fertige Lösung in Form eines Kommandozeilenprogramms: man amixer

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!