Seite 1 von 1

Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Dienstag 24. Januar 2023, 09:22
von alexio
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?

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Dienstag 24. Januar 2023, 12:34
von __blackjack__
@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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Dienstag 24. Januar 2023, 13:24
von alexio
Hallo _Blackjack_ , ich werde mal systemctl dahingehend durchforsten, erstmal Danke für den Hinweis.
Anmerkung: Type =idle habe ich schon erfolglos ausprobiert.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Dienstag 24. Januar 2023, 15:03
von grubenfox
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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Dienstag 24. Januar 2023, 20:09
von sparrow
@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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Donnerstag 26. Januar 2023, 09:10
von alexio
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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Donnerstag 26. Januar 2023, 11:55
von __deets__
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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Donnerstag 26. Januar 2023, 14:10
von alexio
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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Donnerstag 26. Januar 2023, 14:31
von __deets__
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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Freitag 27. Januar 2023, 10:25
von alexio
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.

Re: Pyaudio Datenrate ungültig bei Start als .service

Verfasst: Freitag 27. Januar 2023, 10:28
von __deets__
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.