Tự động kết thúc mỗi lệnh trong thiết bị đầu cuối với một thông điệp hoặc âm thanh khác nhau


21

Tôi đã cài đặt SVOX pico2wave và tạo một tập lệnh. Bây giờ khi tôi nhập:

speech "Hello world"

Công cụ chuyển văn bản thành giọng nói của máy tính nói to "Xin chào thế giới". Hơn nữa, tôi sử dụng trong .bashrcbiến PROMPT_COMMANDđược định nghĩa là:

PROMPT_COMMAND="speech 'Command executed.'"

Vì vậy, công cụ chuyển văn bản thành giọng nói tốt đẹp thông báo cho tôi rằng lệnh được thực thi, trước khi trả lại lời nhắc trong thiết bị đầu cuối.

Tuy nhiên, đây được nhàm chán sau một thời gian và tôi nghĩ rằng nó sẽ được thực sự mát để kết thúc mỗi lệnh trong terminal với máy tính nói một khác nhau dòng văn bản (suy nghĩ của lái tự động của Starship Enterprise).

Vì vậy, tôi đã tạo trong .bashrc một biến mảng, với các thông báo khác nhau:

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

Những gì tôi muốn, là mỗi lần tôi chạy một lệnh trong terminal, biến PROMPT_COMMANDđược cập nhật và đọc một dòng ngẫu nhiên khác nhau trong mảng.

Tôi đoán tôi cần một vòng lặp, nhưng tôi không biết làm thế nào để tạo ra nó.

Tôi sẽ rất biết ơn cho bất kỳ sự giúp đỡ. Cảm ơn bạn.


Trong tập lệnh trong câu trả lời được liên kết, hãy đảm bảo bạn thay đổi -l=de-DEngôn ngữ địa phương của mình như thế nào -l=en-US.
Terrance

Cảm ơn, thực sự. Điều này cần phải được quan tâm, nhưng tôi đã làm nó.
RazTaz

Vâng, đó chỉ là một nhận xét nói chung. Ý tưởng khá tuyệt vời ở đây! +1
Terrance

Chỉ tò mò - làm thế nào tôi có thể cài đặt speechthực thi? Có phải bí danh cho espeak?
N0rbert

1
"Bài phát biểu" là một kịch bản. Tôi làm theo hướng dẫn trong liên kết. Tôi đã tạo một tập lệnh có tên speech.sh, bao gồm các chỉnh sửa được chỉ ra ở trên bởi Terrance ". Tôi đã lưu speech.sh trong thư mục ~ / scripts của tôi. Tôi đã thay đổi quyền truy cập tệp thành speech.sh để thực thi. Tôi đã tạo một thư mục như sau: ~ / scripts / bin và làm theo hướng dẫn từ đây stackoverflow.com/a/20054809 , để thêm nó vào PATH, vì vậy tập lệnh có thể được công nhận là có thể thực thi được, bất kể tôi đang ở đâu
RazTaz

Câu trả lời:


22

Tạo một tập lệnh và lưu nó ở đâu đó chứa các dòng và logic của bạn để chọn một dòng ngẫu nhiên từ mảng và speechlệnh gọi trên dòng đó:

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"

Sau đó, trong .bashrchoặc .profilebộ của bạn PROMPT_COMMAND:

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

Chỉ cần thay thế speechbằng echođể có được một mớ hỗn độn thay vì giọng nói.


Cảm ơn các giải pháp trên. Nó dường như hoạt động, ngoại trừ việc nó chỉ hiển thị từ đầu tiên trong dòng ngẫu nhiên (ví dụ: "Shields." Hoặc "Triển khai ..") chứ không phải toàn bộ dòng (ví dụ: "Shields ở 90%" hoặc "Triển khai sửa chữa droids trên dek 17. "
RazTaz

@RazTaz Bạn được chào đón;)
Ravexina

Không nên ${array[$RANDOM % ${#array[@]}]}trong dấu ngoặc kép?
Nhà vật lý điên

@MadPhysicist Đó là một cách thực hành tốt nhưng không cần thiết ở đây, hãy chạy tập lệnh bằng cách sử dụng set -xđể xem những gì tôi đang nói về :)
Ravexina

4

Hướng dẫn chỉnh sửa sau:

Nhờ câu trả lời của Ravexina ở trên, bây giờ vấn đề đã được giải quyết và giải pháp này hoạt động rất tuyệt vời. Tôi sẽ đưa ra hướng dẫn từng bước dưới đây, cho những người khác quan tâm để làm cho nó hoạt động trong Ubuntu 18.04

1. Cài đặt gói pico2wave SVOX:

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

2. Tạo kịch bản lời nói

cd ~/scripts
gedit speech

và đặt nội dung này vào bên trong, chèn người dùng chính xác vào đường dẫn:

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

lưu và thoát.

3. Tạo tập lệnh shell_speech.sh như được chỉ định bởi Ravexina ở trên:

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"

lưu và thoát.

4. Làm cho các tập lệnh có thể thực thi được và thêm thư mục của chúng vào PATH để chúng có thể được gọi từ mọi nơi:

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

5. Sửa đổi .bashrc

gedit ~/.bashrc

thêm dòng sau:

PROMPT_COMMAND="bash shell_speech"

lưu và đóng

Lưu ý: bạn có thể thêm bao nhiêu dòng mới như bạn muốn trong mảng trong~/scripts/bin/shell_speech


Vì bạn đã tạo tập lệnh thực thi và trong phần PATH, bạn không cần đưa bashvào PROMPT_COMMANDvà tôi sẽ sử dụng dấu ngoặc đơn trong trường hợp bạn thêm những thứ khác sau đó sẽ cần phải thực hiện hoãn lại:PROMPT_COMMAND='shell_speech'
Tạm dừng cho đến khi có thông báo mới.

1
Vì lý do bảo mật, tốt hơn là viết /bin/bashthay vì đơn giản bash... (thực hành tốt chỉ trong trường hợp ai đó đặt một cú đánh khác vào đường dẫn của bạn trước khi /bin...). Tôi thậm chí nên đề nghị bạn một tệp ngẫu nhiên tạm thời trong /tmpthư mục thay vì test.wavtrong nhà của bạn ... ps> hãy xem nó để xem vận may .
Hastur

@Hastur suy nghĩ trong một phút trong trường hợp nào giả định của bạn có thể trở thành sự thật (nghĩa là "ai đó đặt một cú đánh khác vào đường dẫn của bạn trước / bin"). Điều này chỉ có thể nếu ai đó có quyền truy cập vật lý vào máy tính của bạn và / hoặc đã tăng đặc quyền. Trong cả hai trường hợp, giải pháp của bạn không khắc phục được vấn đề.
RazTaz

@RazTaz World có rất nhiều màu sắc, không chỉ có màu đentrắng ! :-). Thật không may, có rất nhiều cách để có một phần đặc quyền trên một hệ thống và chỉ sử dụng bashlà một cách để có được nhiều hơn. Liên kết, tập lệnh, quyền viết trên các thư mục mở, chia sẻ ... Ngoài ra - bạn có thể bỏ lỡ - tập lệnh có thể tồn tại cho mục tiêu hoặc chủ sở hữu đầu tiên của họ ... và bạn (hoặc ai đó) có thể sử dụng chúng sau đủ thời gian bạn không nhớ tất cả các lệnh được viết bên trong (chúng tôi làm điều đó), trong các điều kiện khác nhau. Để đặt \bin\bashvới con đường rõ ràng một thực hành tốt. Để tránh làm điều đó ... một rủi ro.
Hastur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.