टर्मिनल में प्रत्येक कमांड को एक अलग संदेश या ध्वनि के साथ स्वचालित रूप से समाप्त करें


21

मैंने SVOX pico2wave स्थापित किया और एक स्क्रिप्ट बनाई। अब जब मैं प्रवेश करता हूं:

speech "Hello world"

कंप्यूटर टेक्स्ट-टू-वॉयस इंजन ज़ोर से "हैलो वर्ल्ड" कहता है। इसके अलावा, मैं के रूप में परिभाषित .bashrcचर में उपयोग PROMPT_COMMAND:

PROMPT_COMMAND="speech 'Command executed.'"

तो अच्छा टेक्स्ट-टू-वॉयस इंजन मुझे जोर से घोषणा करता है कि टर्मिनल में प्रॉम्प्ट वापस करने से पहले कमांड निष्पादित किया गया है।

हालाँकि, यह थोड़ी देर के बाद उबाऊ हो जाता है और मैंने सोचा कि टर्मिनल के प्रत्येक कमांड को समाप्त करने के लिए पाठ की एक अलग लाइन बोलने वाले कंप्यूटर के साथ टर्मिनल पर प्रत्येक कमांड को समाप्त करना वास्तव में अच्छा होगा ।

इसलिए मैंने विभिन्न संदेशों के साथ एक सरणी चर में .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."

जो मैं चाहूंगा, वह यह है कि हर बार जब मैं टर्मिनल में कमांड चलाता हूं, तो वेरिएबल PROMPT_COMMANDको अपडेट किया जाना चाहिए और सरणी में एक अलग यादृच्छिक रेखा पढ़नी होगी ।

मुझे लगता है कि मुझे एक लूप की आवश्यकता है, लेकिन मुझे नहीं पता था कि इसे कैसे बनाया जाए।

मैं किसी भी मदद के लिए सबसे आभारी रहूंगा। धन्यवाद।


लिंक किए गए उत्तर में स्क्रिप्ट में, सुनिश्चित करें कि आप -l=de-DEअपनी स्थानीय भाषा में परिवर्तन करना चाहते हैं -l=en-US
टेरेंस

सच में शुक्रिया। इस पर ध्यान देने की जरूरत है, लेकिन मैंने ऐसा किया था।
रज़ात

हाँ, यह सामान्य रूप से एक टिप्पणी है। यहाँ बहुत अच्छा विचार है! +1
टेरेंस

बस जिज्ञासु - मैं speechनिष्पादन योग्य कैसे स्थापित कर सकता हूं ? क्या यह अन्य लोगों के लिए है espeak?
N0rbert

1
"भाषण" एक स्क्रिप्ट है। मैंने लिंक में दिए गए निर्देशों का पालन किया। मैंने एक स्क्रिप्ट बनायी थी, जिसे स्पीरश कहा जाता है, जिसमें टेरेंस द्वारा ऊपर बताए गए सुधार भी शामिल हैं। "मैंने speech.sh को मेरे / / स्क्रिप्ट फ़ोल्डर में सहेजा है। मैंने इसे निष्पादन योग्य बनाने के लिए फ़ाइल अनुमतियों को स्पीच में बदल दिया। मैंने निम्नानुसार एक फ़ोल्डर बनाया है: ~ / लिपियों / बिन और यहाँ से निर्देशों का पालन किया 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


उपरोक्त समाधान के लिए धन्यवाद। यह काम करने लगता है, सिवाय इसके कि यह केवल यादृच्छिक लाइन में पहले शब्द को प्रस्तुत करता है (जैसे। "शील्ड्स।" या "परिनियोजन ..") संपूर्ण लाइन नहीं (उदाहरण के लिए। 90% पर शील्ड्स) या "रिपेयरिंग ड्रॉइड्स को नियुक्त करना।" dek 17. "
RazTaz

@RazTaz आपका स्वागत है;)
रेवेक्सिना

${array[$RANDOM % ${#array[@]}]}दोहरे उद्धरण चिह्नों में नहीं होना चाहिए ?
मैड फिजिसिस्ट

@MadPhysicist यह एक अच्छा अभ्यास है, लेकिन यहाँ आवश्यक नहीं है, स्क्रिप्ट का उपयोग करके set -xदेखें कि मैं किस बारे में बात कर रहा हूँ :)
Ravexina

4

बाद में ट्यूटोरियल संपादित करें:

ऊपर रवेक्सिना के उत्तर के लिए धन्यवाद, अब समस्या हल हो गई है और समाधान काल्पनिक रूप से काम करता है। मैं नीचे दिए गए चरण-दर-चरण निर्देश दूंगा, अन्य लोगों के लिए जो इसे 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. ऊपर Ravexina द्वारा बताई गई shell_speech.sh स्क्रिप्ट बनाएं:

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. लिपियों को निष्पादन योग्य बनाएं और उनकी निर्देशिका को पाथ में जोड़ें ताकि उन्हें हर जगह से बुलाया जा सके:

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आपके घर में ... पीएस> इसे भाग्य का रूप दे ।
हस्त्तूर

@ हस्तूर एक मिनट के लिए सोचें कि आपकी परिस्थिति किन परिस्थितियों में सच हो सकती है (यानी "किसी ने आपके / बिन से पहले आपके रास्ते में कोई और बैश लगाया)"। यह केवल तभी संभव है जब किसी के पास आपके कंप्यूटर तक भौतिक पहुंच हो और / या पहले से ही विशेषाधिकार बढ़ गए हों। दोनों परिस्थितियों में, आपका समाधान समस्या को ठीक नहीं कर रहा है।
रज्जत

@RazTaz दुनिया रंगों से भरी है, सिर्फ काले और सफेद नहीं ! :-)। दुर्भाग्य से एक सिस्टम पर आंशिक विशेषाधिकार होने के बहुत सारे तरीके हैं, और केवल उपयोग करने का bashएक तरीका अधिक प्राप्त करना है। लिंक, स्क्रिप्ट, खुली निर्देशिका पर अनुमति लिखने, साझा करने वाले ... इसके अलावा - आप इसे याद कर सकते हैं - स्क्रिप्ट अपने पहले उद्देश्य या मालिक के लिए जीवित रह सकते हैं ... और आप (या किसी और) पर्याप्त समय के बाद उनका उपयोग कर सकते हैं आपको अलग-अलग परिस्थितियों में अंदर लिखी गई सभी कमांड्स (हम उसके लिए करते हैं) याद नहीं हैं। कहें \bin\bashस्पष्ट पथ के साथ है एक अच्छा अभ्यास। इसे करने से बचने के लिए ... एक जोखिम।
हस्त्पुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.