Làm thế nào để tạo ra âm thanh sau khi một quá trình hoàn tất?


94

Tôi đã bắt đầu một quá trình dài thông qua một thiết bị đầu cuối. Có thể làm cho thiết bị đầu cuối Ubuntu phát ra âm thanh sau khi quá trình hoàn tất? Bằng cách này, tôi không cần tiếp tục kiểm tra mà thay vào đó sẽ được thông báo qua âm thanh.


Bạn có thể giải thích thêm những gì bạn có ý nghĩa với quá trình hoàn thành ?
Lucio

1
Kiểm soát @Lucio được đưa trở lại thiết bị đầu cuối
Goaler444

1
Ý bạn là, mở một ứng dụng từ thiết bị đầu cuối và khi nó kết thúc, tạo ra âm thanh? Bạn có máy chủ Ubuntu hay ý bạn là phần mềm GUI?
Lucio

2
đúng chính xác. Ví dụ, tôi bắt đầu một chương trình dòng lệnh, và một khi nó thoát và điều khiển được đưa trở lại thiết bị đầu cuối, một âm thanh được tạo ra. Tôi hiện đang sử dụng Ubuntu 12.10
Goaler444

Câu trả lời:


78

Có ít nhất ba cách dòng lệnh để thực hiện điều này bằng cách đặt lệnh phù hợp ở cuối tập lệnh của bạn, bạn có thể gọi cho quy trình dài của mình:

  1. Cách "cổ điển" để phát âm thanh là sử dụng tiếng bíp Cài đặt tiếng bíp qua loa PC. Tuy nhiên, điều này sẽ không hoạt động trong mọi trường hợp (ví dụ: trong hệ thống loa PC của tôi bị vô hiệu hóa hoàn toàn) và bạn sẽ cần xóa pscpkr khỏi /etc/modprobe/blacklist.confvà tải pcspkrmô-đun hạt nhân.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Chúng tôi cũng có thể phát bất kỳ tệp âm thanh nào ở định dạng wav bằng cách sử dụng aplay (được cài đặt theo mặc định):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Một cách khác là sử dụng giao diện dòng lệnh pulseaudio để cho phép phát lại bất kỳ tệp âm thanh nào mà hệ thống của bạn (trong libsndfile) nhận ra trên đầu ra âm thanh mặc định:

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

    Chúng tôi có thể sử dụng các tệp âm thanh mặc định từ /usr/share/sounds/hoặc bất kỳ tệp âm thanh nào khác mà chúng tôi có thể có ở một vị trí khác.


Chỉ cần đề cập đến nó, có một cách hay khác để đạt được điều này bằng cách sử dụng sai đặc biệt , được cài đặt mặc định trong Ubuntu <= 12.04. Xem, hoặc đúng hơn là nghe ví dụ sau:

#! /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"

Trong Ubuntu> = 12.10 Orca sử dụng bộ phát ngôn. Sau đó chúng ta có thể cài đặt đặc biệt Cài đặt đặc biệt , hoặc sử dụng thay thế spd-say "Text".


1
@Takkat Tôi đang sử dụng Ubuntu 12.10 và đặc biệt hiện chưa được cài đặt.
Lucio

@Lucio: yeah, bây giờ bạn nói điều đó ... Họ chuyển sang nói chuyện. Nếu điều này hoạt động (nó không có trên hệ thống của tôi), hãy xem chỉnh sửa để sử dụng spd-say.
Takkat

@Takkat spd-sayTiện ích được cài đặt theo mặc định và nó hoạt động trên hệ thống của tôi.
Lucio

Ngoài ra hãy xem này Q / A
c0rp

1
Tôi đã thành công tốt đẹp vớipaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiP Square

73

tôi sử dụng

make; spd-say done

Thay thế "make" bằng bất kỳ lệnh chạy dài nào bạn sử dụng.


Bạn đã làm ngày hôm nay của tôi trở nên thú vị!! : D
n0noob

5
spd-say 'get back to work'. Và cũng được cài đặt sẵn: phát hành.ubuntu.com/trusty/ , đối với người mù tôi cho rằng? Và -wcho các vòng lặp vô hạn : while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli 心 心 事件

Tôi cười cách khó hơn tôi nên có.
NelsonGon

15

TL; DR

Để phát âm thanh sau khi lệnh kết thúc:

long-running-command; sn3

( sn3âm thanh số 3) đặt cái này vào .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
}

Hoặc đọc phần bên dưới để có thêm lựa chọn:

Âm thanh khác nhau về lỗi và thành công

Đây là những gì tôi sử dụng cho chính xác những gì bạn yêu cầu - với một điểm khác biệt: nó không chỉ phát âm thanh khi lệnh kết thúc mà còn phát một âm thanh khác về thành công và lỗi. (Nhưng bạn có thể thay đổi nó nếu bạn không thích nó.)

Tôi có một hàm Bash được gọi là okstôi sử dụng ở cuối các lệnh chạy dài:

make && make test && make install; oks

Nó phát âm thanh và hiển thị OK hoặc ERROR (có mã lỗi) khi lệnh trước kết thúc.

Mã nguồn

Đây là chức năng với hai người trợ giúp:

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
}

Cài đặt

Bạn có thể đặt nó trực tiếp vào ~ / .bashrc hoặc đặt nó vào một số tệp khác và sau đó đặt dòng này vào ~ / .bashrc:

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

Cấu hình

Thay đổi sound_oksound_errormột số âm thanh khác.

Bạn có thể thử nghiệm soundso với soundbgvà thay đổi sound_oksound_errorsử dụng chuỗi nhiều âm thanh mà bạn muốn để có được kết quả mà bạn muốn.

Âm thanh tốt

Để tìm một số âm thanh hay trên hệ thống của bạn, bạn có thể thử:

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

Dưới đây là một số âm thanh mà tôi thường sử dụng có sẵn trên Ubuntu theo mặc định rất tốt cho các thông báo - sn1 rất to và hay, sn2 rất to và vẫn khá đẹp, sn3 cực kỳ to và không hay lắm:

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
}

Một lần nữa, bạn có thể thay đổi soundthành soundbgnếu bạn muốn phát nó ở chế độ nền mà không cần chờ âm thanh kết thúc (ví dụ: không làm chậm các tập lệnh của bạn khi bạn phát nhiều âm thanh).

Phiên bản im lặng

Và chỉ trong trường hợp - đây là chức năng tương tự oksnhưng không có âm thanh:

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

Sử dụng

Đây là cách bạn sử dụng nó:

Ví dụ với thành công:

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

ví dụ có lỗi:

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

Tất nhiên trong thực tế các lệnh giống như:

make && make test && make install; oks

nhưng tôi đã sử dụng lsđể bạn có thể nhanh chóng thấy nó hoạt động như thế nào.

Bạn có thể sử dụng okthay vì okscho một phiên bản im lặng.

Hoặc bạn có thể sử dụng, vd:

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

để in OK / ERROR nhưng luôn phát cùng một âm thanh, v.v.

Cập nhật

Tôi đặt các chức năng đó trên GitHub, xem:

Nguồn có thể được tải xuống từ:

Cập nhật 2

Tôi đã thêm một soundloopchức năng cho repo ở trên. Nó phát ra âm thanh và có thể bị gián đoạn bởi Ctrl + C (không giống như đơn giản while true; do paplay file.ogg; donemà người ta mong đợi sẽ hoạt động nhưng không được) như yêu cầu của shadi trong các bình luận. Nó được thực hiện như:

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
}

Nếu bạn nghĩ nó phức tạp, vui lòng gửi khiếu nại của bạn đến các nhà phát triển PulseAudio.


Tôi đã cố gắng đặt nó vào trong while true; do paplay ...; doneđể âm thanh lặp lại cho đến khi tôi nhấn Ctrl+C, nhưng khi tôi làm vậy, nó không bị hỏng. Tôi không thể tìm thấy bất kỳ tùy chọn đặc biệt nào man paplayđể tìm ra cách để làm việc này. Có ý kiến ​​gì không?
shadi

@shadi Xem câu trả lời cập nhật của tôi cho một giải pháp có âm thanh lặp lại cho đến khi bạn nhấn Ctrl + C.
rsp

14

Theo đó , \anhân vật thoát khỏi mã ASCII 7, đó là tiếng bíp của máy tính.

Vì vậy, echo $'\a'hoạt động để tạo ra tiếng bíp trên máy cục bộ của tôi, ngay cả khi nó được thực thi trên vỏ bash chạy trên máy tính mà tôi được kết nối qua giao diện đầu cuối như PuTTY.


3
kinh ngạc! đó là giải pháp dễ nhất và tốt nhất (ít nhất là đối với tôi) vì nó không yêu cầu cài đặt bất kỳ ứng dụng của bên thứ 3 nào và thậm chí có thể được gõ / dán ở giữa quy trình để chạy sau khi dấu nhắc lệnh sẽ tập trung.
hlopetz

2
Theo mặc định, âm thanh của nhân vật này bị tắt trong hầu hết các thiết bị đầu cuối hiện đại
phil294 24/03/18

6

Mở rộng câu trả lời của Michael Curries, bạn có thể khiến Bash in một ký tự BEL( \a) thông qua PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Cài đặt PROMPT_COMMANDtheo cách đó sẽ khiến Bash thực thi printf \\aở cuối mỗi lệnh, điều này sẽ khiến thiết bị đầu cuối phát âm thanh (mặc dù như muru chỉ ra, chỉ cần kích hoạt vẽ lại lời nhắc sẽ làm cho thiết bị đầu cuối phát âm thanh, tức là âm thanh sẽ được phát mỗi lần một dấu nhắc mới được rút ra, ví dụ ngay cả khi chỉ cần nhấn ENTER).

Đây là một tính năng của thiết bị đầu cuối, vì vậy nó có thể không hoạt động trên tất cả các thiết bị đầu cuối; ví dụ: nó không hoạt động trong bảng điều khiển (nhưng tôi chắc chắn rằng nó hoạt động trong gnome-terminalxterm).


5
(với lời cảnh báo rằng mỗi khi bạn nhấn Enter, bạn sẽ có âm thanh)
muru


2

Đây không phải là những gì bạn yêu cầu nhưng bạn có thể sử dụng thông báo cho điều đó.

Thay thế lệnh được đưa ra trong các câu trả lời khác bằng

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

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

Ví dụ 1: echo alik && (say done ; echo done) || (echo error ; say error)sẽ dẫn đến một từ được thực hiện.

Ví dụ 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)sẽ dẫn đến một từ lỗi.

* Nhu cầu gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Chúc mừng.


0

Tôi đã tạo một tập lệnh đơn giản và gần như nguyên bản để phát Âm thanh và hiển thị Thông báo với Thông báo và Thời gian cho 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

Sử dụng như thế nào?

Lần chạy đầu tiên - Thiết lập:

  1. Tạo một thư mục mới tại nhà của bạn và gọi nó noti

    mkdir ~/noti
    
  2. Tải về noti.sh và giải nén nó vào notithư mục trên .

  3. Mở Terminal và Change Directory thành noti

    cd ~/noti
    
  4. Làm cho noti.sh thực thi bằng cách phát hành:

    sudo chmod +x noti.sh
    
  5. Chạy thử nghiệm như thế này:

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

Ví dụ

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"

Để thông báo kết thúc quá trình (ví dụ)

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

0

sóng hình sin ffmpeg

Đối với những người theo chủ nghĩa tối giản ngoài kia, bạn có thể phát một hình sin 1000 Hz trong 5 giây:

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

hoặc mãi mãi cho đến khi bạn làm Ctrl-C:

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

Thêm thông tin tại: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Đã thử nghiệm trong Ubuntu 18.04, ffmpeg 3.4.6.

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.