Automatycznie zakończ każde polecenie w terminalu inną wiadomością lub dźwiękiem

21

Zainstalowałem SVOX pico2wave i stworzyłem skrypt. Teraz kiedy wejdę:

speech "Hello world"

Komputerowy mechanizm zamiany tekstu na głos mówi głośno „Witaj świecie”. Ponadto używam w .bashrczmiennej PROMPT_COMMANDzdefiniowanej jako:

PROMPT_COMMAND="speech 'Command executed.'"

Tak więc ładny mechanizm zamiany tekstu na głos obwieszcza mi głośno, że polecenie zostało wykonane, zanim zwróci monit w terminalu.

Jednak po pewnym czasie staje się to nudne i pomyślałem, że fajnie byłoby zakończyć każde polecenie w terminalu, gdy komputer wypowiadał inną linię tekstu (pomyśl o autopilocie Starship Enterprise).

Więc stworzyłem w .bashrc zmienną tablicową z różnymi komunikatami:

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

Chciałbym, aby za każdym razem, gdy uruchamiam polecenie w terminalu, zmienna, PROMPT_COMMANDktóra ma być aktualizowana i odczytuje inną losową linię w tablicy.

Przypuszczam, że potrzebuję pętli, ale nie wiedziałem, jak to zrobić.

Byłbym bardzo wdzięczny za wszelką pomoc. Dziękuję Ci.

RazTaz
źródło
W skrypcie w połączonej odpowiedzi upewnij się, że zmieniłeś -l=de-DEjęzyk lokalny, np -l=en-US.
Terrance
Wielkie dzięki. Trzeba się tym zająć, ale zrobiłem to.
RazTaz,
Tak, to tylko komentarz. Całkiem fajny pomysł tutaj! +1
Terrance
Ciekawe - jak mogę zainstalować speechplik wykonywalny? Czy to jest alias espeak?
N0rbert,
1
„mowa” to skrypt. Postępowałem zgodnie z instrukcjami w linku. Stworzyłem skrypt o nazwie speech.sh, w tym poprawki wskazane powyżej przez Terrance'a. Zapisałem speech.sh w folderze ~ / scripts. Zmieniłem uprawnienia do pliku na speech.sh, aby był wykonywalny. Utworzyłem folder w następujący sposób: ~ / scripts / bin i postępował zgodnie z instrukcjami tutaj stackoverflow.com/a/20054809 , aby dodać go do ŚCIEŻKI, dzięki czemu skrypt może zostać rozpoznany jako wykonywalny, bez względu na to gdzie jestem.
RazTaz

Odpowiedzi:

22

Utwórz skrypt i zapisz go gdzieś, w którym znajdują się twoje linie i logika, aby wybrać losową linię z tablicy i wywołać speechpolecenie w tym wierszu:

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"

Następnie w swoim .bashrclub .profileustaw PROMPT_COMMAND:

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

Wystarczy wymienić speechsię echodostać messge zamiast głosu.

Ravexina
źródło
Dzięki za powyższe rozwiązanie. Wygląda na to, że działa, poza tym, że renderuje tylko pierwsze słowo w linii losowej (np. „Tarcze” lub „Wdrażanie ...”), a nie całą linię (np. „Tarcze w 90%” lub „Wdrażanie droidów naprawczych na dek 17. "
RazTaz,
@RazTaz Nie ma za co;)
Ravexina
Nie powinno ${array[$RANDOM % ${#array[@]}]}być w podwójnych cudzysłowach?
Mad Physicist,
@MadPhysicist To dobra praktyka, ale nie jest to konieczne tutaj, uruchom skrypt za pomocą, set -xaby zobaczyć, o czym mówię :)
Ravexina
4

Później samouczek edycji:

Dzięki powyższej odpowiedzi Ravexiny teraz problem został rozwiązany, a rozwiązanie działa fantastycznie. Podam poniżej instrukcje krok po kroku, aby inne osoby zainteresowane sprawiły, że będzie działać w Ubuntu 18.04

1. Zainstaluj pakiet pico2wave SVOX:

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

2. Utwórz skrypt mowy

cd ~/scripts
gedit speech

i umieść tę zawartość w środku, wstawiając właściwego użytkownika na ścieżkę:

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

Zapisz i wyjdź.

3. Utwórz skrypt shell_speech.sh, jak wskazano powyżej Ravexina:

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"

Zapisz i wyjdź.

4. Ustaw skrypty w postaci wykonywalnej i dodaj ich katalog do PATH, aby można je było wywoływać z dowolnego miejsca:

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

5. Zmodyfikuj .bashrc

gedit ~/.bashrc

dodaj następujący wiersz:

PROMPT_COMMAND="bash shell_speech"

Zapisz i zamknij

Uwaga: możesz dodać tyle nowych wierszy, ile chcesz w tablicy w~/scripts/bin/shell_speech

RazTaz
źródło
Ponieważ zrobiłem skrypt wykonywalny aw PATH, nie muszą zawierać bashw twojej PROMPT_COMMANDi chciałbym używać apostrofów w przypadku dodawania innych rzeczy, które później będą musiały mieć wykonanie odroczony:PROMPT_COMMAND='shell_speech'
wstrzymane do odwołania.
1
Ze względów bezpieczeństwa lepiej jest pisać /bin/bashzamiast prostego bash... (dobra praktyka na wypadek, gdyby ktoś wrzucił ci kolejną wstrząs przed /bin...). Powinienem nawet zasugerować ci tymczasowy plik tymczasowy w /tmpkatalogu zamiast test.wavw twoim domu ... ps> daj mu szczęście .
Hastur
@Hastur zastanów się przez chwilę, w jakich okolicznościach twoje przypuszczenie może się spełnić (np. „Ktoś wrzuci ci inną ścieżkę przed / bin”). Jest to możliwe tylko wtedy, gdy ktoś ma fizyczny dostęp do twojego komputera i / lub ma już zwiększone uprawnienia. W obu przypadkach rozwiązanie nie rozwiązuje problemu.
RazTaz
@RazTaz World jest pełen kolorów, nie tylko czerni i bieli ! :-). Niestety istnieje wiele sposobów posiadania częściowych przywilejów w systemie, a użycie tylko bashjest sposobem na uzyskanie więcej. Linki, skrypty, uprawnienia do zapisu w otwartych katalogach, udostępnionych ... Co więcej - możesz tego przegapić - skrypty mogą przetrwać do pierwszego celu lub właściciela ... a Ty (lub ktoś inny) możesz z nich skorzystać po upływie wystarczająco długiego czasu nie pamiętasz wszystkich poleceń zapisanych w środku (robimy to w tym celu), w różnych warunkach. Umieszczenie \bin\bashz wyraźną ścieżką jest dobrą praktyką. Aby tego uniknąć ... ryzyko.
Hastur