Termine automáticamente cada comando en la terminal con un mensaje o sonido diferente


21

Instalé SVOX pico2wave y creé un script. Ahora cuando entro:

speech "Hello world"

El motor de texto a voz de la computadora dice en voz alta "Hola mundo". Además, uso en .bashrcla variable PROMPT_COMMANDdefinida como:

PROMPT_COMMAND="speech 'Command executed.'"

Entonces, el agradable motor de texto a voz me anuncia en voz alta que el comando se ejecuta, antes de devolver el mensaje en la terminal.

Sin embargo, esto se vuelve aburrido después de un tiempo y pensé que sería genial terminar cada comando en la terminal con la computadora hablando una línea de texto diferente (piense en el piloto automático de Starship Enterprise).

Así que creé en .bashrc una variable de matriz, con diferentes mensajes:

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."

Lo que me gustaría es que cada vez que ejecute un comando en la terminal, la variable PROMPT_COMMANDse actualice y lea una línea aleatoria diferente en la matriz.

Supongo que necesito un bucle, pero no sabía cómo hacerlo.

Estaría muy agradecido por cualquier ayuda. Gracias.


En el guión de la respuesta vinculada, asegúrese de cambiar el -l=de-DEidioma local como -l=en-US.
Terrance

Gracias de hecho. Esto debe ser atendido, pero lo había hecho.
RazTaz

Sí, eso es solo un comentario en general. Muy buena idea aquí! +1
Terrance

Simplemente curioso: ¿cómo puedo instalar el speechejecutable? ¿Es alias para espeak?
N0rbert

1
"discurso" es un guión. Seguí las instrucciones en el enlace. Hice un script llamado speech.sh, incluidas las correcciones indicadas anteriormente por Terrance ". Guarde speech.sh en mi carpeta ~ / scripts. Cambié los permisos de archivo a speech.sh para hacerlo ejecutable. Creé una carpeta de la siguiente manera: ~ / scripts / bin y seguí las instrucciones de aquí stackoverflow.com/a/20054809 , para agregarlo a la RUTA, para que el script pueda ser reconocido como ejecutable, sin importar dónde esté.
RazTaz

Respuestas:


22

Cree un script y guárdelo en algún lugar que contenga sus líneas y la lógica para elegir una línea aleatoria de su matriz y speechcomando de llamada en esa línea:

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"

Luego en su .bashrco .profileconjunto PROMPT_COMMAND:

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

Simplemente reemplace speechcon echopara obtener un mensaje en lugar de la voz.


Gracias por la solución anterior. Parece funcionar, excepto que solo muestra la primera palabra en la línea aleatoria (por ejemplo, "Escudos" o "Implementación ...") no toda la línea (por ejemplo, "Escudos al 90%" o "Implementación de droides de reparación en dek 17. "
RazTaz

@RazTaz De nada;)
Ravexina

¿No debería ${array[$RANDOM % ${#array[@]}]}estar entre comillas dobles?
Físico loco

@MadPhysicist Es una buena práctica, pero no es necesario aquí, ejecuta el script usando set -xpara ver de qué estoy hablando :)
Ravexina

4

Más tarde Editar tutorial:

Gracias a la respuesta de Ravexina anterior, ahora el problema está resuelto y la solución funciona fantásticamente. Daré instrucciones paso a paso a continuación, para las otras personas interesadas en hacer que funcione en Ubuntu 18.04

1. Instale el paquete SVOX pico2wave:

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

2. Crear el guión de voz

cd ~/scripts
gedit speech

y poner este contenido dentro, insertando el usuario correcto en la ruta:

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

guardar y Salir.

3. Cree el script shell_speech.sh como lo indica Ravexina arriba:

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"

guardar y Salir.

4. Haga que los scripts sean ejecutables y agregue su directorio a PATH para poder llamarlos desde cualquier lugar:

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

5. Modificar .bashrc

gedit ~/.bashrc

agregue la siguiente línea:

PROMPT_COMMAND="bash shell_speech"

guardar y cerrar

Nota: puede agregar tantas líneas nuevas como desee en la matriz en~/scripts/bin/shell_speech


Dado que ha realizado el script ejecutable y en el PATH, no necesita incluirlo bashen su PROMPT_COMMANDy yo usaría comillas simples en caso de que agregue otras cosas más adelante que necesitarán una ejecución diferida:PROMPT_COMMAND='shell_speech'
Pausado hasta nuevo aviso.

1
Por razones de seguridad, es mejor escribir en /bin/bashlugar de un simple bash... (buena práctica en caso de que alguien ponga otro golpe en su camino antes /bin...). Incluso debería sugerirle un archivo aleatorio temporal en el /tmpdirectorio en lugar de que test.waven su hogar ... ps> eche un vistazo a la fortuna .
Hastur

@Hastur piensa por un minuto en qué circunstancias su suposición puede hacerse realidad (es decir, "alguien puso otro golpe en su camino antes / bin"). Esto es posible solo si alguien tiene acceso físico a su computadora y / o ya ha aumentado los privilegios. En ambas circunstancias, su solución no es solucionar el problema.
RazTaz

@RazTaz World está lleno de colores, ¡no solo en blanco y negro ! :-). Desafortunadamente, hay muchas maneras de tener privilegios parciales en un sistema, y ​​usar solo bashes una forma de obtener más. Enlaces, guiones, permisos de escritura en directorios abiertos, compartidos ... Además, puede que se lo pierda, los guiones pueden sobrevivir a su primer objetivo o propietario ... y usted (u otra persona) puede usarlos después de un tiempo suficiente no recuerda todos los comandos escritos en su interior (lo hacemos para eso), bajo diferentes condiciones. Para poner \bin\bashcon el camino explícito es una buena práctica. Para evitar hacerlo ... un riesgo.
Hastur
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.