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?
Pyaudio Datenrate ungültig bei Start als .service
- __blackjack__
- User
- Beiträge: 13112
- 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
Bei mir habe ich im Block [Unit] neben dem "After=multi-user.target" auch noch eine Zeile mit
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.Wants=multi-user.target
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.
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.
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.
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.
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.
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.
[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.
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.