21

I installed SVOX pico2wave and created a script. Now when I enter:

speech "Hello world"

The computer text-to-voice engine says out loud "Hello world". Furthermore, I use in .bashrc the variable PROMPT_COMMAND defined as:

PROMPT_COMMAND="speech 'Command executed.'"

So the nice text-to-voice engine announces me loud that the command is executed, before returning the prompt in the terminal.

However, this gets boring after a while and I thought it would be really cool to end each command in terminal with the computer speaking a different line of text (think of the autopilot of Starship Enterprise).

So I created in .bashrc an array variable, with different messages:

array[0]="Shields at 90%"
array[1]="Engaging proton overdrive"
array[2]="Autopilot disengaged"
array[3]="Targetting solution available"
array[4]="Alert. Incoming missile."
array[5]="Deploying countermeasures."
array[6]="Firing torpedoes."
array[7]="Engaging auto-cannon."
array[8]="Severe damage on deck 17. Sealing off."
array[9]="Deploying repair droids to deck 17."

What I would like, is that each time I run a command in terminal, the variable PROMPT_COMMAND to be updated and read a different random line in the array.

I presume I need a loop, but I didn't know how to make it.

I would be most grateful for any help. Thank you.

RazTaz
  • 291
  • In the script in the linked answer, make sure you change the -l=de-DE to your local language like -l=en-US. – Terrance Sep 10 '18 at 14:07
  • Thanks, indeed. This needs to be taken care of, but I had done it. – RazTaz Sep 10 '18 at 14:29
  • Yeah, that is just a comment in general. Pretty cool idea here! +1 – Terrance Sep 10 '18 at 14:30
  • Just curious - how can I install speech executable? Is it alias for espeak? – N0rbert Sep 10 '18 at 14:44
  • 1
    "speech" is a script. I followed the instructions in the link. I made a script called speech.sh, including the corrections indicated above by Terrance". I saved speech.sh in my ~/scripts folder. I changed file permissions to speech.sh to make it executable. I created a folder as follows: ~/scripts/bin and followed the instructions from here https://stackoverflow.com/a/20054809, in order to add it to the PATH, so the script can be recognized as executable, no matter where I am. – RazTaz Sep 10 '18 at 14:55
  • Please do not write answers in the body of your question. If you want to share your "final solution" then add it as a new answer to your own question. – Bakuriu Sep 10 '18 at 18:36
  • @Bakuriu thank you for your suggestion. I approved the change and proceeded according to the guidlines. – RazTaz Sep 10 '18 at 19:10

2 Answers2

22

Create a script and save it somewhere which contains your lines and the logic to choose a random line from your array and calling speech command on that line:

array[0]="Shields at 90%"
array[1]="Engaging proton overdrive"
array[2]="Autopilot disengaged"
array[3]="Targetting solution available"
array[4]="Alert. Incoming missile."
array[5]="Deploying countermeasures."
array[6]="Firing torpedoes."
array[7]="Engaging auto-cannon."
array[8]="Severe damage on deck 17. Sealing off."
array[9]="Deploying repair droids to deck 17."

line=${array[$RANDOM % ${#array[@]}]}
speech "$line"

Then in your .bashrc or .profile set PROMPT_COMMAND:

PROMPT_COMMAND="bash $HOME/PATH/TO/myscript.sh"

Just replace the speech with echo to get a messge instead of the voice.

Ravexina
  • 55,668
  • 25
  • 164
  • 183
  • Thanks for the above solution. It seems to work, except that it only renders the first word in the random line (eg. "Shields." or "Deploying..") not the entire line (eg. "Shields at 90%" or "Deploying repair droids on dek 17." – RazTaz Sep 10 '18 at 14:15
  • @RazTaz You're welcome ;) – Ravexina Sep 10 '18 at 14:28
  • Shouldn't ${array[$RANDOM % ${#array[@]}]} be in double quotes? – Mad Physicist Sep 11 '18 at 14:02
  • @MadPhysicist It's a good practice but not necessary here, run the script using set -x to see what I'm talking about :) – Ravexina Sep 11 '18 at 14:14
4

Later Edit Tutorial:

Thanks to Ravexina's answer above, now the problem is solved and the solution works fantastically. I will give step-by-step instructions below, for the other people interested to make it work in Ubuntu 18.04

1. Install SVOX pico2wave package:

sudo apt-get install libttspico0 libttspico-utils libttspico-data libsox-fmt-mp3

2. Create the speech script

cd ~/scripts
gedit speech

and put this content inside, inserting the correct user in the path:

#!/bin/bash
pico2wave -l=en-US -w=/home/user/test.wav "$1"
aplay -q ~/test.wav
rm /home/user/test.wav

save and exit.

3. Create the shell_speech.sh script as indicated by Ravexina above:

gedit shell_speech
array[0]="Shields at 90%"
array[1]="Engaging proton overdrive"
array[2]="Autopilot disengaged"
array[3]="Targetting solution available"
array[4]="Alert. Incoming missile."
array[5]="Deploying countermeasures."
array[6]="Firing torpedoes."
array[7]="Engaging auto-cannon."
array[8]="Severe damage on deck 17. Sealing off."
array[9]="Deploying repair droids to deck 17."

line=${array[$RANDOM % ${#array[@]}]}
speech "$line"

save and exit.

4. Make the scripts executable and add their directory to PATH so that they could be called from everywhere:

chmod u+x ~/scripts/bin/speech
chmod u+x ~/scripts/bin/shell_speech
export PATH=$PATH:~/scripts

5. Modify .bashrc

gedit ~/.bashrc

add the following line:

PROMPT_COMMAND="bash shell_speech"

save and close

Note: you can add as many new lines as you want in the array in ~/scripts/bin/shell_speech

Ravexina
  • 55,668
  • 25
  • 164
  • 183
RazTaz
  • 291
  • Since you've made the script executable and in the PATH, you don't need to include bash in your PROMPT_COMMAND and I would use single quotes in case you add other things later that will need to have deferred execution: PROMPT_COMMAND='shell_speech' – Dennis Williamson Sep 11 '18 at 00:31
  • 1
    For security reasons it is better to write /bin/bash instead of a simple bash... (good practice just in case someone put another bash in your path before /bin...). I should even suggest you a temp random file in the /tmp directory instead that test.wav in your home... ps> give it a look to fortune. – Hastur Sep 11 '18 at 08:55
  • @Hastur think for a minute under what circumstances your assumption can become true (i.e "someone put another bash in your path before /bin"). This is possible only if someone either has physical access to your computer and/or has already escalated privileges. Under both circumstances, your solution is not fixing the problem. – RazTaz Sep 15 '18 at 09:23
  • @RazTaz World is full of colors, not just black and white! :-). Unfortunately there are a lot of ways to have partial privileges on a system, and to use only bash is a way to obtain more. Links, script, write permission on open directories, shared ones... Moreover -- you may miss it -- scripts can survive to their first aim or owner... and you (or someone else) can use them after enough time that you do not remember all the commands written inside (we do for that), under different conditions. To put \bin\bash with the explicit path is a good practice. To avoid to do it... a risk. – Hastur Sep 15 '18 at 16:35