Heute brauchte jemand eine Lösung für folgendes Problem: Er verwendet die Sprachausgabe espeak, um Inhalte vorlesen zu lassen. Wenn er jedoch in per VoIP angesprochen wird, will er mit einer Tastenkombination den aktuellen espeak Prozess beenden.

Meine Idee war, den Prozess nicht zu beenden sondern mit einem Befehl zu pausieren und mit einem anderen wieder weiterlaufen zu lassen; so wie es auch mit Strg + z und fg gehen würde, nur ohne Zugriff auf die Shell, in der espeak läuft.

Hier der einfache Einzeiler dazu, der folgendes macht:

  • Per pgrep wird die Prozess-ID von espeak geholt
  • Wenn der espeak Prozess läuft, wird er angehalten
  • Wenn der espeak Prozess angehalten ist, wird er weiterlaufen gelassen

Funktioniert bei mir. Bei dem anderen Menschen auf BSD leider nicht. Dort gibt es Probleme mit stotterndem Sound, nachdem der Befehl abgesetzt wurde. Das Problem tritt dort auch auf, wenn Strg + z verwendet wird.

Ich lege das hier trotzdem mal ab, falls es mal irgendwann gebraucht wird.

MYPID=$(pgrep espeak); grep -q -i stopped /proc/${MYPID}/status && kill -s SIGCONT ${MYPID} || kill -s SIGSTOP ${MYPID}

Fehlertolerant sieht anders aus, ich weiß, aber es funktioniert und das reicht mir.

Optional kann man den Einzeiler einer Tastenkombination zuordnen und somit auf Unterbrechungen per VoIP mit einem Tastendruck reagieren.