自动以不同的消息或声音结束终端中的每个命令


21

我安装了SVOX pico2wave并创建了一个脚本。现在,当我输入:

speech "Hello world"

计算机文本语音引擎大声说出“ 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
Terrance

的确如此。这需要照顾,但是我已经做到了。
RazTaz

是的,这只是一般性的评论。这里很酷的主意!+1
Terrance

只是好奇-我如何安装speech可执行文件?它是别名espeak吗?
N0rbert

1
“语音”是一个脚本。我按照链接中的说明进行操作。我创建了一个名为Speech.sh的脚本,其中包括Terrance上面指出的更正。“我将Speech.sh保存在〜/ scripts文件夹中。我将文件许可权更改为Speech.sh以使其可执行。我创建了一个文件夹,如下所示: 〜/脚本/ bin并遵循从这里说明stackoverflow.com/a/20054809,以将其添加到PATH,因此该脚本可以我在哪里被确认为可执行的,不管。
RazTaz

Answers:


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"

只需更换speechecho获得的messge,而不是声音。


感谢上述解决方案。看起来可行,除了它只呈现随机行中的第一个单词(例如“ Shields。”或“ Deploying ..”)而不渲染整行(例如“ Shields at 90%”或“ Deploying droids on 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.按照上面的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.使脚本可执行,并将其目录添加到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... 之前在您的路径中放置其他bash,请采用良好的做法)。我什至建议您在目录中创建一个临时文件/tmp而不是test.wav在您的家中... ps>让它看起来很幸运
Hastur

@Hastur想一想在什么情况下您的假设可以成立(即“有人在/ bin之前的路径上放了另外一拳”)。仅当某人对您的计算机具有物理访问权限和/或已经具有特权提升时,才可能这样做。在两种情况下,您的解决方案都无法解决问题。
RazTaz

@RazTaz世界充满色彩,不只是黑色白色!:-)。不幸的是,有很多方法可以在系统上拥有部分特权,而仅使用特权bash是获得更多特权的一种方法。链接,脚本,对打开目录的写权限,共享目录...此外-您可能会错过它-脚本可以生存到其首要目标或所有者...并且您(或其他人)可以在足够的时间后使用它们您不会记住在不同条件下编写的所有命令(为此我们要做的)。为了把\bin\bash用显式路径一个很好的做法。为避免这样做……有风险。
Hastur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.