过程完成后如何发出声音?


94

我已经通过终端开始了漫长的过程。处理完成后,是否可以使Ubuntu终端发出声音?这样,我不需要继续检查,而是会通过声音得到通知。


您能进一步解释一下“完成流程”是什么意思吗?
Lucio

1
@Lucio控制权返回终端
Goaler444

1
您是说从终端打开应用程序,完成后发出声音吗?您有Ubuntu服务器还是GUI软件?
Lucio

2
对,就是这样。例如,我启动了一个命令行程序,一旦退出并把控制权返回给终端,就会发出声音。我目前正在使用Ubuntu 12.10
Goaler444

Answers:


78

通过将suite命令放在您可能为冗长的过程而调用的脚本的末尾,至少有三种命令行方法可以实现此目的:

  1. 播放声音的“经典”方法是 通过PC扬声器使用蜂鸣声 安装提示音。但是,这并非在所有情况下都有效(例如,在我的系统中PC扬声器完全被禁用),您需要从中删除pscpkr /etc/modprobe/blacklist.conf并加载pcspkr内核模块。

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. 我们还可以使用aplay播放wav格式的任何声音文件(默认安装):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. 另一种方法是使用pulseaudio命令行界面来启用系统(在中libsndfile)在默认音频输出上识别的任何声音文件的播放:

     paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    

    我们可以使用中的默认声音文件/usr/share/sounds/,也可以使用其他位置的声音文件。


刚才已经提到过,还有另一种不错的方法可以通过滥用espeak来实现,该默认安装在Ubuntu <= 12.04中。查看,或者更确切地说,听到以下示例:

#! /bin/bash

c=10; while [ $c -ge 0 ]; do espeak $c; let c--; done; sleep 1 ## here lengthy code
espeak "We are done with counting"

在Ubuntu> = 12.10中,Orca使用语音调度程序。然后,我们可以安装espeak 安装espeak或使用spd-say "Text"


1
@Takkat我正在使用Ubuntu 12.10,当前未安装espeak
Lucio

@Lucio:是的,现在您说出来了……他们转而使用语音调度程序。如果这行得通(在我的系统上不行),请参见使用进行编辑spd-say
塔卡特

@Takkat该spd-say实用程序默认情况下已安装,并且可以在我的系统上运行。
Lucio

还可以看看此问题/
解答-c0rp

1
我在paplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza


15

TL; DR

在命令完成后播放声音:

long-running-command; sn3

sn3第3号声音在哪里)将其放入.bashrc

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

或阅读下面的更多选项:

错误和成功的声音不同

这正是我用于您所要的内容的地方-唯一的区别是:它不仅在命令完成时播放声音,而且在成功和错误时播放不同的声音。(但是,如果您不喜欢它,可以更改它。)

我有一个称为Bash的函数oks,可以在长时间运行的命令末尾使用:

make && make test && make install; oks

当上一个命令完成时,它会播放声音并显示OK或ERROR(带有错误代码)。

源代码

这是带有两个助手的函数:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
soundbg() {
  # plays all sounds at the same time in the background
  for s in $@; do
    # you may need to change 0 to 1 or something else:
    pacmd play-file $s 0 >/dev/null
  done
}
oks() {
  # like ok but with sounds
  s=$?
  sound_ok=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg
  sound_error=/usr/share/sounds/ubuntu/stereo/dialog-warning.ogg
  if [[ $s = 0 ]]; then
    echo OK
    soundbg $sound_ok
  else
    echo ERROR: $s
    soundbg $sound_error
  fi
}

安装

您可以将其直接放在〜/ .bashrc中,也可以放在其他文件中,然后将此行放入〜/ .bashrc中:

. ~/path/to/file/with/function

组态

改变声音sound_oksound_error发出其他声音。

您可以试验soundvs. soundbg并进行更改,sound_oksound_error使用许多喜欢的声音序列来获得所需的结果。

声音不错

要在系统上找到一些好的声音,您可以尝试:

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done

以下是我经常使用的默认情况下在Ubuntu上可用的一些声音,这些声音对于通知非常有用-sn1很大且很好,sn2非常很大而且仍然很不错,sn3非常很大而且不太好:

sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

同样,您可以更改soundsoundbg是否要在后台播放而不等待声音结束(例如,在播放大量声音时不要放慢脚本速度)。

静音版

以防万一-这里的功能oks与之相同,但没有声音:

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}

用法

使用方法如下:

成功的例子:

ls / && ls /bin && ls /usr; oks

错误示例:

ls / && ls /bim && ls /usr; oks

当然,实际上,命令更像是:

make && make test && make install; oks

但我使用过,ls以便您可以快速了解其工作原理。

您可以使用ok代替而不使用oks静默版本。

或者您可以使用例如:

ls / && ls /bim && ls /usr; ok; sn1

打印OK / ERROR,但始终播放相同的声音等。

更新资料

我将这些功能放在GitHub上,请参阅:

可以从以下位置下载源:

更新2

soundloop在上面的仓库中添加了一个功能。它会播放声音,并且可以按Ctrl + C中断(不像while true; do paplay file.ogg; done人们期望的那样简单,但它不会奏效),如shadi在评论中所要求的。它实现为:

soundloop() {
  set +m
  a=`date +%s`
  { paplay $1 & } 2>/dev/null
  wait
  b=`date +%s`
  d=$(($b-$a))
  [ $d -eq 0 ] && d=1
  while :; do
    pacmd play-file $1 0 >/dev/null
    sleep $d
  done
}

如果您认为这很复杂,请直接向PulseAudio开发人员投诉。


我尝试将其放在a中while true; do paplay ...; done,以使声音一直重复直到我按下为止Ctrl+C,但是当我这样做时,它不会破裂。我找不到任何特殊的选择man paplay来弄清楚如何使其工作。有任何想法吗?
shadi

@shadi请参阅我最新的答案,以获取重复播放声音的解决方案,直到您按Ctrl + C。
rsp

14

根据\a字符转义ASCII码7,这是计算机的蜂鸣声。

因此echo $'\a',即使在通过诸如PuTTY之类的终端接口连接到的计算机上运行的bash shell上执行蜂鸣声时,它也可以在本地计算机上发出蜂鸣声。


3
惊人!这是最简单,最好的解决方案(至少对我而言),因为它不需要安装任何第三方应用程序,甚至可以在命令提示符成为焦点之后运行的过程中进行键入/粘贴。
hlopetz '16

2
默认情况下,大多数现代终端都禁用此字符的声音
phil294

6

扩展Michael Curries的答案,您可以通过以下方式使Bash打印BEL\a)字符PROMPT_COMMAND

PROMPT_COMMAND='printf \\a'

设置PROMPT_COMMAND该方式将使Bash printf \\a在每个命令的末尾执行,这将使终端播放声音(尽管正如大师指出的那样,仅触发提示的重绘将使终端播放声音,即将播放声音)每次绘制新提示时(例如,即使刚刚点击ENTER)也是如此。

这是一个终端功能,因此可能无法在所有终端上使用;例如,它在控制台中不起作用(但我确定它在gnome-terminal和中 可以工作xterm)。


5
(请注意,每次您按Enter键,您都会听到声音)
muru


2

这不是您要的,但是您可以使用通知。

将其他答案中给出的命令替换为

notify-send "Process terminated" "Come back to the terminal, the task is over"

1
command && (say done ; echo done) || (echo error ; say error)

示例1:echo alik && (say done ; echo done) || (echo error ; say error)将完成一个单词。

示例2:non_existing_command_error && (say done ; echo done) || (echo error ; say error)将导致错误字。

*需求gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

干杯。


0

我创建了一个简单的,几乎是本机的脚本,该脚本播放声音并为Ubuntu(Gist)显示带有给定消息和时间的通知:

#!/bin/sh

# https://gist.github.com/John-Almardeny/04fb95eeb969aa46f031457c7815b07d
# Create a Notification With Sound with a Given Message and Time
# The Downloaded Sound is from Notification Sounds https://notificationsounds.com/

MSSG="$1"
TIME="$2"

# install wget if not found
if ! [ -x "$(command -v wget)" ]; then 
    echo -e "INSTALLING WGET...\n\n"
    sudo apt-get install wget
    echo -e "\n\n"
fi

# install at package if not found
if ! [ -x "$(command -v at)" ]; then
    echo -e "INSTALLING AT...\n\n"
    sudo apt-get install at
    echo -e "\n\n"
fi

# install sox if not found
if ! [ -x "$(command -v sox)" ]; then
    echo -e "INSTALLING SOX...\n\n"
    sudo apt-get install sox
    sudo apt-get install sox libsox-fmt-all
    echo -e "\n\n"
fi

# download the noti sound if this is first time
# add alias to the bashrc file
if ! [ -f ~/noti/sound.mp3 ]; then
    echo -e "DOWNLOADING SOUND...\n\n"
    touch ~/noti/sound.mp3 | wget -O ~/noti/sound.mp3 "https://notificationsounds.com/wake-up-tones/rise-and-shine-342/download/mp3"
    sudo echo "alias noti=\"sh ~/noti/noti.sh\"" >> ~/.bashrc
    source ~/.bashrc        
    echo -e "\n\n"
fi

# notify with the sound playing and particular given message and time
echo "notify-send \""$MSSG\"" && play ~/noti/sound.mp3" | at $TIME

如何使用?

首次运行-设置:

  1. 在家里创建一个新目录并调用它 noti

    mkdir ~/noti
    
  2. 下载noti.sh并将其压缩到上述noti目录。

  3. 打开终端并将目录更改为 noti

    cd ~/noti
    
  4. 通过发出以下命令使noti.sh可执行:

    sudo chmod +x noti.sh
    
  5. 运行这样的测试:

    sh ~/noti/noti.sh "Test" "now"
    

例子

noti "Hello From Noti" "now +1 minute"
noti "Hello From Noti" "now +5 minutes"
noti "Hello From Noti" "now + 1 hour"
noti "Hello From Noti" "now + 2 days"
noti "Hello From Noti" "4 PM + 2 days"
noti "Hello From Noti" "now + 3 weeks"
noti "Hello From Noti" "now + 4 months"
noti "Hello From Noti" "4:00 PM"
noti "Hello From Noti" "2:30 AM tomorrow"
noti "Hello From Noti" "2:30 PM Fri"
noti "Hello From Noti" "2:30 PM 25.07.18"

用于通知过程完成(示例)

sudo apt-get update; noti "Done" "now"

0

ffmpeg正弦波

对于极简主义者,您可以播放1000 Hz正弦波5秒钟:

sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp

或直到您执行Ctrl-C为止:

ffplay -f lavfi -i "sine=frequency=1000" -nodisp

有关更多信息,访问:https//stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

已在Ubuntu 18.04,ffmpeg 3.4.6中测试。

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.