To read a selected text in GUI out loud I use the command xsel | espeak-ng -v mb-us3 -p3 -s135
.
To stop it I use killall -s STOP espeak-ng
.
To start it again killall -s CONT espeak-ng
.
All 3 commands work, but the noob I am won't let me archive correct results. The problem is in the if- and case-statement I think. I assigned them to a keyboard shortcut.
I want to manage this shellscript to toggle between read aloud and stopping the process of reading aloud if espeak-ng is already running. If it's not already running the bash should start it.
0 #!/bin/bash
1 # Name: espeak-en.sh
2 # Author: Karsten Zarth
3 # Created: 2020-08-23
4 # Description: Textselection in GUI is read aloud with english
5 # male voice with espeak-ng and mbrula
6 # if already reading: stop
7 # if stopped: continue
8 # Modified: 2020-08-23
9
10 status=`ps -ef| grep espeak-ng| grep -v grep| awk '{print $5}"`
11
12 if [[ $(pgrep -x espeak-ng) ]]
13 then
14 case $status in
15 Tl) killall -s CONT espeak-ng;;
16 Sl) killall -s STOP espeak-ng;;
17 esac
18 else
19 xsel | espeak-ng -v mb-us3 -p3 -s135
20 fi
I don't even know how to test the output of: if [[ $(pgrep -x espeak-ng) ]]
Can somebody help me to figure out what's wrong and give me some hints? Many thanks in advance.
after struggling a bit by myself I found out that there is a difference between ps -ef
and ps ax
in the order of printing out some values...
Also I have to admit that the end of line 10 looks awful. It has to be ...print $5}'`
. Because of the difference between ps -ef
and ps ax
of course it has to be ...print $3}'`
.
By the way. The dependencies are xsel
and espeak-ng
and at least one mbrola-voice.
Now it works. Here is the full code:
0 #!/bin/bash
1 # Name: espeak-en.sh
2 # Author: Karsten Zarth
3 # Created: 2020-08-23
4 # Description: Textselection in GUI is read aloud with english
5 # male voice with espeak-ng and mbrula
6 # if already reading: stop
7 # if stopped: continue
8 # Modified: 2020-08-24
9
10 status=`ps ax| grep espeak-ng| grep -v grep| awk '{print $3}'`
11
12 if [[ $(pgrep -x espeak-ng) ]]
13 then
14 case $status in
15 Tl) killall -s CONT espeak-ng;;
16 Sl) killall -s STOP espeak-ng;;
17 esac
18 else
19 xsel | espeak-ng -v mb-us3 -p3 -s135
20 fi