สิ้นสุดแต่ละคำสั่งในเทอร์มินัลโดยอัตโนมัติด้วยข้อความหรือเสียงที่แตกต่างกัน


21

ฉันติดตั้งSVOX pico2waveและสร้างสคริปต์ ตอนนี้เมื่อฉันเข้าร่วม:

speech "Hello world"

เอ็นจิ้นข้อความเป็นเสียงของคอมพิวเตอร์พูดเสียงดังออกมาว่า "Hello world" นอกจากนี้ฉันใช้ใน.bashrcตัวแปรที่PROMPT_COMMANDกำหนดเป็น:

PROMPT_COMMAND="speech 'Command executed.'"

เอ็นจิ้นข้อความเป็นเสียงที่ดีประกาศให้ฉันดังว่าคำสั่งถูกเรียกใช้งานก่อนที่จะส่งคืนพรอมต์ในเทอร์มินัล

อย่างไรก็ตามเรื่องนี้น่าเบื่อไปครู่หนึ่งและฉันคิดว่ามันจะเจ๋งจริง ๆ ที่จะจบแต่ละคำสั่งในเทอร์มินัลด้วยคอมพิวเตอร์ที่พูดข้อความที่แตกต่างกัน (คิดว่าเป็นนักบินขององค์กร Starship)

ดังนั้นฉันจึงสร้าง. bashrc เป็นอาเรย์ตัวแปรที่มีข้อความต่างกัน:

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

สิ่งที่ฉันต้องการก็คือว่าแต่ละครั้งที่ผมเรียกใช้คำสั่งใน terminal ตัวแปรPROMPT_COMMANDที่จะได้รับการปรับปรุงและอ่านที่แตกต่างกันบรรทัดสุ่มในอาร์เรย์

ฉันเข้าใจว่าฉันต้องการลูป แต่ฉันไม่รู้ว่าจะทำอย่างไร

ฉันจะขอบคุณมากที่สุดสำหรับความช่วยเหลือใด ๆ ขอขอบคุณ.


ในสคริปต์ในคำตอบที่ถูกเชื่อมโยงให้แน่ใจว่าคุณเปลี่ยนไปใช้ภาษาท้องถิ่นของคุณเช่น-l=de-DE -l=en-US
Terrance

ขอบคุณจริงๆ. สิ่งนี้ต้องได้รับการดูแล แต่ฉันได้ทำไปแล้ว
RazTaz

ใช่นั่นเป็นเพียงความเห็นโดยทั่วไป ไอเดียสวย ๆ ที่นี่! +1
Terrance

แค่อยากรู้ - ฉันจะติดตั้งspeechไฟล์ปฏิบัติการได้อย่างไร มันเป็นนามแฝงเพื่อespeak?
N0rbert

1
"คำพูด" เป็นสคริปต์ ฉันทำตามคำแนะนำในลิงค์ ฉันสร้างสคริปต์ชื่อ speech.sh รวมถึงการแก้ไขที่ระบุไว้ข้างต้นโดย Terrance "ฉันบันทึก speech.sh ในโฟลเดอร์ ~ / สคริปต์ของฉันฉันเปลี่ยนสิทธิ์การใช้งานไฟล์เป็น speech.sh เพื่อให้สามารถเรียกใช้งานได้ฉันสร้างโฟลเดอร์ดังนี้: ~ / สคริปต์ / bin และทำตามคำแนะนำจากที่นี่stackoverflow.com/a/20054809เพื่อเพิ่มลงใน PATH ดังนั้นสคริปต์สามารถรับรู้ได้ว่าสามารถใช้งานได้ไม่ว่าฉันอยู่ที่ไหน
RazTaz

คำตอบ:


22

สร้างสคริปต์และบันทึกไว้ที่ใดที่มีบรรทัดและตรรกะของคุณเพื่อเลือกบรรทัดแบบสุ่มจากอาร์เรย์และ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"

จากนั้นใน.bashrcหรือ.profileชุดของคุณPROMPT_COMMAND:

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

เพียงแค่แทนที่speechด้วยechoเพื่อให้ได้รับความยุ่งเหยิงแทนเสียง


ขอบคุณสำหรับการแก้ปัญหาข้างต้น ดูเหมือนว่าจะทำงานยกเว้นว่าจะแสดงเฉพาะคำแรกในบรรทัดสุ่ม (เช่น "Shields." หรือ "Deploying .. ") ไม่ใช่ทั้งบรรทัด (เช่น "Shields ที่ 90%" หรือ "Deploying droids ซ่อมแซมบน dek 17. "
RazTaz

@RazTaz ไม่เป็นไร;)
Ravexina

ไม่ควร${array[$RANDOM % ${#array[@]}]}อยู่ในเครื่องหมายคำพูดคู่?
นักฟิสิกส์บ้า

@ MadPhysicist เป็นวิธีปฏิบัติที่ดี แต่ไม่จำเป็นที่นี่ให้เรียกใช้สคริปต์โดยใช้set -xเพื่อดูว่าฉันกำลังพูดถึงอะไร :)
Ravexina

4

ภายหลังแก้ไขบทช่วยสอน:

ขอบคุณคำตอบของ Ravexina ด้านบนตอนนี้ปัญหาได้รับการแก้ไขแล้ว ฉันจะให้คำแนะนำทีละขั้นตอนด้านล่างสำหรับคนอื่น ๆ ที่สนใจที่จะทำให้มันทำงานใน Ubuntu 18.04

1. ติดตั้งแพ็คเกจ SVOX pico2wave:

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

2. สร้างสคริปต์คำพูด

cd ~/scripts
gedit speech

และใส่เนื้อหานี้เข้าไปด้านในแทรกผู้ใช้ที่ถูกต้องในเส้นทาง:

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

บันทึกและออก.

3. สร้างสคริปต์ shell_speech.sh ตามที่ระบุโดย 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"

บันทึกและออก.

4. ทำให้สคริปต์สามารถทำงานได้และเพิ่มไดเรกทอรีลงใน PATH เพื่อให้สามารถเรียกใช้ได้จากทุกที่:

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

5. แก้ไข. bashrc

gedit ~/.bashrc

เพิ่มบรรทัดต่อไปนี้:

PROMPT_COMMAND="bash shell_speech"

บันทึกและปิด

หมายเหตุ:คุณสามารถเพิ่มบรรทัดใหม่ได้มากเท่าที่คุณต้องการในอาเรย์~/scripts/bin/shell_speech


เนื่องจากคุณสร้างสคริปต์ที่เรียกใช้งานได้และในPATHคุณไม่จำเป็นต้องรวมbashไว้ในของคุณPROMPT_COMMANDและฉันจะใช้เครื่องหมายคำพูดเดี่ยวในกรณีที่คุณเพิ่มสิ่งอื่น ๆ ในภายหลังซึ่งจะต้องมีการดำเนินการที่เลื่อนออกไป:PROMPT_COMMAND='shell_speech'
หยุดชั่วคราวจนกว่าจะมีประกาศเพิ่มเติม

1
เพื่อเหตุผลด้านความปลอดภัยจะดีกว่าที่จะเขียน/bin/bashแทนที่จะง่ายbash... (การปฏิบัติที่ดีในกรณีที่มีคนใส่อีกทุบตีในเส้นทางของคุณก่อน/bin... ) ฉันก็ควรแนะนำให้คุณไฟล์สุ่มอุณหภูมิใน/tmpไดเรกทอรีแทนว่าtest.wavในบ้านของคุณ ... PS> ให้ดูกับโชคลาภ
Hastur

@Hastur ลองคิดดูสักครู่ภายใต้สถานการณ์ที่การสันนิษฐานของคุณอาจกลายเป็นจริง (เช่น "มีคนใส่ bash อีกอันไว้ในเส้นทางของคุณต่อหน้า / bin") สิ่งนี้เป็นไปได้ก็ต่อเมื่อมีใครบางคนสามารถเข้าถึงคอมพิวเตอร์ของคุณและ / หรือมีสิทธิ์พิเศษที่เพิ่มขึ้นแล้ว ภายใต้สถานการณ์ทั้งสองวิธีการแก้ปัญหาของคุณไม่ได้แก้ไขปัญหา
RazTaz

@RazTaz โลกที่เต็มไปด้วยสีไม่ได้เป็นเพียงสีดำและสีขาว ! :-) น่าเสียดายที่มีหลายวิธีในการรับสิทธิ์บางส่วนในระบบและการใช้เพียงอย่างเดียวbashก็เป็นวิธีที่จะได้รับเพิ่มเติม ลิงก์, สคริปต์, การอนุญาตให้ใช้งานในไดเรกทอรีที่เปิดอยู่, รายการที่แชร์ ... นอกจากนี้ - คุณอาจพลาด - สคริปต์สามารถอยู่รอดได้เพื่อเป้าหมายแรกหรือเจ้าของ ... และคุณ (หรือคนอื่น) สามารถใช้พวกเขาได้ในเวลาต่อมา คุณจำคำสั่งทั้งหมดที่เขียนไว้ข้างใน (เราทำเพื่อสิ่งนั้น) ภายใต้เงื่อนไขที่ต่างกัน การใส่\bin\bashเส้นทางที่ชัดเจนเป็นแนวปฏิบัติที่ดี เพื่อหลีกเลี่ยงการทำ ... ความเสี่ยง
Hastur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.