Secara otomatis akhiri setiap perintah di terminal dengan pesan atau suara yang berbeda

21

Saya menginstal pico2wave SVOX dan membuat skrip. Sekarang ketika saya masuk:

speech "Hello world"

Mesin teks-ke-suara komputer mengatakan dengan keras "Halo dunia". Selanjutnya, saya menggunakan .bashrcvariabel yang PROMPT_COMMANDdidefinisikan sebagai:

PROMPT_COMMAND="speech 'Command executed.'"

Jadi mesin text-to-voice yang bagus mengumumkan saya keras bahwa perintah dieksekusi, sebelum mengembalikan prompt di terminal.

Namun, ini menjadi membosankan setelah beberapa saat dan saya pikir akan sangat keren untuk mengakhiri setiap perintah di terminal dengan komputer berbicara baris teks yang berbeda (pikirkan autopilot dari Starship Enterprise).

Jadi saya membuat variabel array .bashrc, dengan pesan yang berbeda:

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

Yang saya inginkan, adalah bahwa setiap kali saya menjalankan perintah di terminal, variabel yang PROMPT_COMMANDakan diperbarui dan membaca baris acak yang berbeda dalam array.

Saya kira saya perlu loop, tetapi saya tidak tahu bagaimana membuatnya.

Saya akan sangat berterima kasih atas bantuannya. Terima kasih.

RazTaz
sumber
Dalam skrip di jawaban yang ditautkan, pastikan Anda mengubah -l=de-DEbahasa lokal Anda seperti -l=en-US.
Terrance
Terima kasih banyak. Ini perlu diurus, tetapi saya telah melakukannya.
RazTaz
Ya, itu hanya komentar secara umum. Ide yang sangat keren di sini! +1
Terrance
Hanya ingin tahu - bagaimana saya bisa menginstal yang speechdapat dieksekusi? Apakah itu alias untuk espeak?
N0rbert
1
"pidato" adalah naskah. Saya mengikuti instruksi di tautan. Saya membuat skrip bernama speech.sh, termasuk koreksi yang ditunjukkan di atas oleh Terrance ". Saya menyimpan speech.sh di folder ~ / skrip saya. Saya mengubah izin file ke speech.sh untuk membuatnya dieksekusi. Saya membuat folder sebagai berikut: ~ / scripts / bin dan ikuti instruksi dari sini stackoverflow.com/a/20054809 , untuk menambahkannya ke PATH, sehingga skrip dapat dikenali sebagai executable, di mana pun saya berada.
RazTaz

Jawaban:

22

Buat skrip dan simpan di suatu tempat yang berisi baris Anda dan logika untuk memilih garis acak dari array Anda dan memanggil speechperintah di baris itu:

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"

Kemudian di .bashrcatau .profileatur Anda PROMPT_COMMAND:

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

Cukup ganti speechdengan echountuk mendapatkan pesan, bukan suara.

Ravexina
sumber
Terima kasih atas solusi di atas. Tampaknya berfungsi, kecuali bahwa itu hanya membuat kata pertama dalam baris acak (mis. "Shields." Atau "Deploying ..") bukan keseluruhan baris (mis. "Shields at 90%" atau "Menyebarkan droid perbaikan pada dek 17. "
RazTaz
@RazTaz Sama-sama;)
Ravexina
Tidak ${array[$RANDOM % ${#array[@]}]}harus dengan tanda kutip ganda?
Fisikawan Gila
@MadPhysicist Ini adalah praktik yang baik tetapi tidak perlu di sini, jalankan skrip menggunakan set -xuntuk melihat apa yang saya bicarakan :)
Ravexina
4

Kemudian Edit Tutorial:

Berkat jawaban Ravexina di atas, sekarang masalahnya terpecahkan dan solusinya bekerja dengan fantastis. Saya akan memberikan petunjuk langkah demi langkah di bawah ini, untuk orang lain yang tertarik untuk membuatnya bekerja di Ubuntu 18.04

1. Instal paket SVOX pico2wave:

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

2. Buat skrip pidato

cd ~/scripts
gedit speech

dan letakkan konten ini di dalamnya, masukkan pengguna yang benar di jalur:

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

Simpan dan keluar.

3. Buat skrip shell_speech.sh seperti yang ditunjukkan oleh Ravexina di atas:

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"

Simpan dan keluar.

4. Jadikan skrip dapat dieksekusi dan tambahkan direktori mereka ke PATH sehingga dapat dipanggil dari mana saja:

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

5. Ubah .bashrc

gedit ~/.bashrc

tambahkan baris berikut:

PROMPT_COMMAND="bash shell_speech"

Simpan dan tutup

Catatan: Anda bisa menambahkan sebanyak mungkin baris baru di array~/scripts/bin/shell_speech

RazTaz
sumber
Karena Anda telah membuat skrip dapat dieksekusi dan dalam PATH, Anda tidak perlu memasukkan bashdalam Anda PROMPT_COMMANDdan saya akan menggunakan tanda kutip tunggal jika Anda menambahkan hal-hal lain nanti yang perlu menunda eksekusi:PROMPT_COMMAND='shell_speech'
Dijeda hingga pemberitahuan lebih lanjut.
1
Demi alasan keamanan, lebih baik menulis /bin/bashdaripada sederhana bash... (praktik yang baik kalau-kalau ada orang yang membuat bash lain di jalan Anda sebelum /bin...). Saya bahkan harus menyarankan Anda file temp temporer di /tmpdirektori sebagai gantinya test.wavdi rumah Anda ... ps> coba lihat keberuntungan .
Hastur
@Hurur berpikir sejenak dalam situasi apa asumsi Anda bisa menjadi kenyataan (yaitu "seseorang menaruh bash lain di jalur Anda sebelum / bin"). Ini hanya dimungkinkan jika seseorang memiliki akses fisik ke komputer Anda dan / atau telah meningkatkan hak istimewa. Dalam kedua kondisi tersebut, solusi Anda tidak memperbaiki masalah.
RazTaz
@RazTaz World penuh warna, bukan hanya hitam dan putih ! :-). Sayangnya ada banyak cara untuk memiliki hak parsial pada suatu sistem, dan menggunakan hanya bashmerupakan cara untuk mendapatkan lebih banyak. Tautan, skrip, tulis izin pada direktori terbuka, yang dibagikan ... Selain itu - Anda mungkin melewatkannya - skrip dapat bertahan hingga tujuan pertama atau pemiliknya ... dan Anda (atau orang lain) dapat menggunakannya setelah cukup waktu sehingga Anda tidak ingat semua perintah yang tertulis di dalamnya (kami lakukan untuk itu), dalam kondisi yang berbeda. Untuk menempatkan \bin\bashdengan jalur eksplisit adalah praktik yang baik. Untuk menghindari melakukannya ... sebuah risiko.
Hastur