Pyaudio Datenrate ungültig bei Start als .service

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
alexio
User
Beiträge: 5
Registriert: Dienstag 24. Januar 2023, 08:54

Programm vosk_text.py soll bei startup automatisch starten.

Folgende Fehlermeldung wird im Service status angezeigt:
vosk.service - Vosk start
Loaded: loaded (/lib/systemd/system/vosk.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2023-01-24 08:20:01 CET; 6min ago
Process: 1234 ExecStart=/usr/bin/python3 /home/pi/vosk_text.py (code=exited, status=1/FAILURE)
Main PID: 1234 (code=exited, status=1/FAILURE)

Jan 24 08:20:01 raspberrypi python3[1234]: Traceback (most recent call last):
Jan 24 08:20:01 raspberrypi python3[1234]: File "/home/pi/vosk_text.py", line 17, in <module>
Jan 24 08:20:01 raspberrypi python3[1234]: stream = p.open(format=pyaudio.paInt16, channels=1, rate
Jan 24 08:20:01 raspberrypi python3[1234]: File "/home/pi/.local/lib/python3.7/site-packages/pyaudio.
Jan 24 08:20:01 raspberrypi python3[1234]: stream = Stream(self, *args, **kwargs)
Jan 24 08:20:01 raspberrypi python3[1234]: File "/home/pi/.local/lib/python3.7/site-packages/pyaudio.
Jan 24 08:20:01 raspberrypi python3[1234]: self._stream = pa.open(**arguments)
Jan 24 08:20:01 raspberrypi python3[1234]: OSError: [Errno -9997] Invalid sample rate
Jan 24 08:20:01 raspberrypi systemd[1]: vosk.service: Main process exited, code=exited, status=1/FAILUR
Jan 24 08:20:01 raspberrypi systemd[1]: vosk.service: Failed with result 'exit-code'.
~
~
Dieser Fehler tritt nur auf wenn das Modul vosk_text.py über den vosk.service aufgerufen wird.
vosk.service in /lib/systemd/system:
[Unit]
Description=Vosk start
After=multi-user.target

[Service]
Type=simple
User=pi
ExecStart= /usr/bin/python3 /home/pi/vosk_text.py

[Install]
WantedBy=multi-user.target
__________


Start über IDLE/Modul/run =problemlos!
Start über Terminal :/usr/bin/ python3 /home/pi/vosk_text.py = problemlos!

Raspberry :
Raspberry Pi 3 Model B Plus Rev 1.3

PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster

Hat jemand eine Lösung für dieses Problem?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@alexio: Ist zu dem Zeitpunkt wo der Service gestartet wird das Audiosystem denn schon garantiert gestartet? Vielleicht ist multi-user.target nicht der richtige Ansatzpunkt dafür.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
alexio
User
Beiträge: 5
Registriert: Dienstag 24. Januar 2023, 08:54

Hallo _Blackjack_ , ich werde mal systemctl dahingehend durchforsten, erstmal Danke für den Hinweis.
Anmerkung: Type =idle habe ich schon erfolglos ausprobiert.
Benutzeravatar
grubenfox
User
Beiträge: 426
Registriert: Freitag 2. Dezember 2022, 15:49

Bei mir habe ich im Block [Unit] neben dem "After=multi-user.target" auch noch eine Zeile mit
Wants=multi-user.target
und unter [Service] auch noch für 'WorkingDirectory' einen Pfad vorgegeben. Aber dass das Arbeitsverzeichnis und die Datenrate irgendwie zusammen hängen, glaube ich jetzt nicht. Ich starte damit aber auch nur eine lokale Webanwendung und der ist das Audiosystem so etwas von egal... bei mir war das Problem dass die Webanwendung zuerst immer schon gestartet wurde, bevor der Pi überhaupt stabil im lokalen Wlan hing.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@grubenfox: Dann würde ich mal schauen, ob es bereits ein Target gibt (oder man eines definieren kann), das prüft, ob die WLAN-Verbindung da ist.
alexio
User
Beiträge: 5
Registriert: Dienstag 24. Januar 2023, 08:54

Hallo Zusammen,
folgende Ergänzung zu meinem Problem:
die geforderte pyaudio-rate ist bedingt durch:
------- Auszug -----
model = Model("/home/pi/vosk-api/python/example/model")
rec = KaldiRecognizer(model, 16000)

auf 16000 festgelegt, deshalb:

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4096)
-------

Ändere ich beide Werte auf 44100 (vermutlich default von Pyaudio) läuft der vosk.service fehlerfrei, aber meine Anwendung
(Vosk) versteht kein vernünftiges Wort mehr, da der KaldiRecognizer vermutlich auf 16000 festgelegt ist.

Wie vorher schon angemerkt läuft das Programm bei start über eine Terminalanwendung fehlerfrei, deshalb hab ich als Test einen
autostart mit Xterm geschrieben:
----------
/home/pi/.config/autostart/vosk.desktop

[Desktop Entry]
Type=Application
Name=Vosk
Exec=xterm -hold -e '/usr/bin/python3 /home/pi/vosk_text.py'

So funktioniert es fehlerfrei, es läuft aber ein xterm-Fenster im Hintergrund.
Eigentlich wäre das Problem damit gelöst, bleibt aber die Frage wie die empfohlene Methode mit systemctl
eingestellt werden muß, um ebenfalls fehlerfrei zu laufen.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das klingt als ob das eher mit PulseAudio zu tun hat, mit dem sich das xterm bzw. dessen Anwendungen dank einer xsession verbinden lassen. Du kannst die 44.1khz im Zweifel auch einfach downsamplen auf 16KHz.
alexio
User
Beiträge: 5
Registriert: Dienstag 24. Januar 2023, 08:54

Hallo Zusammen,
ich habe den Service umgeschrieben wie folgt:
--------
[Unit]
Description= start Vosk Service

[Service]
Type=idle
User=pi
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/vosk_text.py

[Install]
WantedBy=graphical.target
--------
So läuft es jetzt mit systemctl, aber kann mal jemand darüber schauen ob das auch korrekt ist.
Würde mich freuen wenn mir jemand fachlich kompetentes ein Statement zu kommen lässt, auch wenn meine Idee
totaler Unfug ist.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fuer einen solchen Service X vorrauszusetzen, ist ungewoehnlich. Wie gesagt, ich halte das fuer einen Seiteneffekt, dass da irgendwie pulseaudio mit ins Spiel kommt, und dadurch ueberhaut ermoeglicht, die 16KHz zu bekommen - weil das fuer dich downsampled. Du muesstest also den 44100 oder was auch immer echten Stream selbst downsamplen, um damit den VOSK-Classifier zu fuettern. Dann sollte es auch ohne X gehen.
alexio
User
Beiträge: 5
Registriert: Dienstag 24. Januar 2023, 08:54

Hallo, hab den Type auf simple eingestellt und Xauthority entfernt, funktioniert auch ohne:
[Unit]
Description= start Vosk Service

[Service]
Type=simple
User=pi
Environment=DISPLAY=:0
ExecStart=/usr/bin/python3 /home/pi/vosk_text.py

[Install]
WantedBy=graphical.target

So lasse ich es jetzt erstmal laufen.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja, das ist immer noch der gestartete X-Server. Und daran haengend pulse-audio (so meine Vermutung). Eine echte Verbesserung im Sinne von echtem headless-Betrieb ist das nicht. Aber ob das wirklich ein Problem ist, oder nur Aesthetik, das musst am Ende natuerlich du wissen.
Antworten