Bagaimana cara membuat suara setelah proses selesai?

94

Saya sudah memulai proses panjang melalui terminal. Apakah mungkin membuat terminal Ubuntu mengeluarkan suara setelah prosesnya selesai? Dengan cara ini, saya tidak perlu terus memeriksa, tetapi sebaliknya akan diberitahu melalui suara.

Goaler444
sumber
Bisakah Anda menjelaskan lebih lanjut apa yang Anda maksud dengan proses selesai ?
Lucio
1
Kontrol @Lucio dikembalikan kembali ke terminal
Goaler444
1
Maksud Anda, buka aplikasi dari terminal dan ketika selesai, buat suara? Apakah Anda memiliki server Ubuntu atau maksud Anda perangkat lunak GUI?
Lucio
2
ya persis. Sebagai contoh saya memulai program baris perintah, dan setelah keluar dan kontrol dikembalikan kembali ke terminal, suara dibuat. Saya saat ini menggunakan Ubuntu 12.10
Goaler444

Jawaban:

78

Setidaknya ada tiga cara baris perintah untuk mencapai hal ini dengan menempatkan perintah suiting di akhir skrip Anda, Anda dapat meminta proses panjang Anda:

  1. Cara "klasik" untuk memainkan suara adalah dengan menggunakan bip Pasang bip melalui pengeras suara PC. Namun ini tidak akan berfungsi dalam semua kasus (mis. Di sistem saya speaker PC sepenuhnya dinonaktifkan) dan Anda perlu menghapus pscpkr dari /etc/modprobe/blacklist.confdan memuat pcspkrmodul kernel.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Kami juga dapat memutar file suara apa pun dalam format wav menggunakan aplay (diinstal secara default):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Cara lain adalah dengan menggunakan antarmuka baris perintah pulseaudio untuk memungkinkan pemutaran file suara apa pun yang libsndfiledikenali oleh sistem Anda pada output audio default:

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

    Kita dapat menggunakan file suara default dari /usr/share/sounds/, atau file suara lain yang mungkin kita miliki di lokasi yang berbeda.


Untuk menyebutkannya, ada cara lain yang bagus untuk mencapai ini dengan menyalahgunakan espeak , yang diinstal secara default di Ubuntu <= 12,04. Lihat, atau lebih tepatnya dengarkan contoh berikut:

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

Di Ubuntu> = 12.10 Orca menggunakan operator bicara. Kami kemudian dapat menginstal espeak Instal espeak , atau gunakan alternatif spd-say "Text".

Takkat
sumber
1
@ Takkat Saya menggunakan Ubuntu 12.10 dan espeak saat ini tidak diinstal.
Lucio
@ Lucio: ya, sekarang Anda mengatakannya ... Mereka beralih ke operator pengirim pesan. Jika ini berhasil (tidak pada sistem saya) lihat edit untuk digunakan spd-say.
Takkat
@Takkat spd-sayUtilitas diinstal secara default dan berfungsi pada sistem saya.
Lucio
Lihat juga Q / A
c0rp
1
Saya sukses denganpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza
73

saya menggunakan

make; spd-say done

Ganti "make" dengan perintah jangka panjang apa pun yang Anda gunakan.

Memetik
sumber
Kau mencerahkan hariku!! : D
n0noob
5
spd-say 'get back to work' Dan juga sudah diinstal sebelumnya: rilis.ubuntu.com/trusty/… , untuk orang buta saya kira? Dan -wuntuk loop tak terbatas: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Aku tertawa jauh lebih keras dari yang seharusnya.
NelsonGon
15

TL; DR

Untuk memainkan suara setelah perintah selesai:

long-running-command; sn3

(di mana sn3suara nomor 3) masukkan ini .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
}

Atau baca di bawah untuk opsi lebih lanjut:

Suara berbeda pada kesalahan dan kesuksesan

Inilah yang saya gunakan untuk persis apa yang Anda minta - dengan satu perbedaan: tidak hanya memainkan suara ketika perintah selesai tetapi memainkan suara yang berbeda pada keberhasilan dan kesalahan. (Tetapi Anda dapat mengubahnya jika Anda tidak menyukainya.)

Saya memiliki fungsi Bash yang disebut oksyang saya gunakan di akhir perintah yang berjalan lama:

make && make test && make install; oks

Ini memainkan suara dan menampilkan OK atau ERROR (dengan kode kesalahan) ketika perintah sebelumnya selesai.

Kode sumber

Inilah fungsi dengan dua pembantu:

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
}

Instalasi

Anda dapat meletakkannya di ~ / .bashrc Anda secara langsung atau memasukkannya ke file lain dan kemudian letakkan baris ini di ~ / .bashrc Anda:

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

Konfigurasi

Ubah sound_okdan sound_errorke beberapa suara lainnya.

Anda dapat bereksperimen dengan soundvs. soundbgdan mengubah sound_okdan sound_errormenggunakan urutan banyak suara yang Anda sukai untuk mendapatkan hasil yang Anda inginkan.

Suara yang bagus

Untuk menemukan beberapa suara yang bagus di sistem Anda, Anda dapat mencoba:

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

Berikut adalah beberapa suara yang sering saya gunakan yang tersedia di Ubuntu secara default yang bagus untuk notifikasi - sn1 keras dan bagus, sn2 sangat keras dan masih cukup bagus, sn3 sangat keras dan tidak begitu baik:

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
}

Sekali lagi, Anda dapat mengubah soundke soundbgjika Anda ingin memainkannya di latar belakang tanpa menunggu suara selesai (misalnya untuk tidak memperlambat skrip Anda ketika Anda memainkan banyak suara).

Versi diam

Dan untuk berjaga-jaga - di sini adalah fungsi yang sama okstetapi tanpa suara:

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

Pemakaian

Inilah cara Anda menggunakannya:

Contoh dengan sukses:

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

contoh dengan kesalahan:

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

Tentu saja dalam praktiknya perintahnya lebih seperti:

make && make test && make install; oks

tapi saya menggunakan lssehingga Anda bisa dengan cepat melihat cara kerjanya.

Anda dapat menggunakan okalih-alih oksuntuk versi diam.

Atau Anda dapat menggunakan mis:

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

untuk mencetak OK / KESALAHAN tetapi selalu memainkan suara yang sama, dll.

Memperbarui

Saya meletakkan fungsi-fungsi itu di GitHub, lihat:

Sumber dapat diunduh dari:

Perbarui 2

Saya menambahkan soundloopfungsi ke repo di atas. Memainkan suara dan dapat terganggu oleh Ctrl + C (tidak seperti yang sederhana while true; do paplay file.ogg; doneyang diharapkan akan berfungsi tetapi tidak) seperti yang diminta oleh shadi dalam komentar. Diimplementasikan sebagai:

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
}

Jika menurut Anda rumit, harap arahkan keluhan Anda ke pengembang PulseAudio.

rsp
sumber
Saya mencoba memasukkan ini ke dalam while true; do paplay ...; donesehingga suara berulang sampai saya tekan Ctrl+C, tetapi ketika saya melakukannya, itu tidak pecah. Saya tidak dapat menemukan opsi khusus man paplayuntuk mencari cara agar ini berfungsi. Ada ide?
shadi
@shadi Lihat jawaban saya yang diperbarui untuk solusi dengan suara yang berulang sampai Anda menekan Ctrl + C.
rsp
14

Menurut ini yang \akarakter lolos kode ASCII 7, yang merupakan bip komputer.

Jadi echo $'\a'berfungsi untuk membuat suara bip pada mesin lokal saya, bahkan ketika itu dieksekusi pada bash shell yang berjalan di komputer saya terhubung melalui antarmuka terminal seperti Putty.

Michael Currie
sumber
3
luar biasa! itulah solusi termudah dan terbaik (setidaknya bagi saya) karena tidak perlu menginstal aplikasi pihak ke-3 dan bahkan dapat diketik / disisipkan di tengah proses yang akan dijalankan setelah command prompt akan fokus.
hlopetz
2
suara karakter ini dinonaktifkan di sebagian besar terminal modern secara default
phil294
6

Memperluas jawaban Michael Curries, Anda dapat membuat Bash mencetak karakter BEL( \a) melalui PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Pengaturan PROMPT_COMMANDseperti itu akan membuat Bash mengeksekusi printf \\adi akhir setiap perintah, yang akan membuat terminal memainkan suara (meskipun seperti yang ditunjukkan muru, cukup memicu redrawal prompt akan membuat terminal memainkan suara, yaitu suara akan dimainkan setiap kali prompt baru ditarik, misalnya bahkan ketika hanya menekan ENTER).

Ini adalah fitur terminal, jadi mungkin tidak berfungsi di semua terminal; misalnya itu tidak berfungsi di konsol (tapi saya yakin itu berhasil gnome-terminaldan xterm).

kos
sumber
5
(dengan peringatan bahwa setiap kali Anda menekan Enter, Anda akan mendapatkan suara)
muru
5

Perintah

 speaker-test

membuat suara bising. Solusi paling sederhana namun menjengkelkan. :-)

Lihatlah manualspeaker-test(1) opsi untuk mengkonfigurasi sinyal noise.

xerostomus
sumber
2

Ini bukan yang Anda minta tetapi Anda bisa menggunakan notifikasi untuk itu.

Ganti perintah yang diberikan dalam jawaban lain dengan

notify-send "Process terminated" "Come back to the terminal, the task is over"
titik balik matahari
sumber
1
command && (say done ; echo done) || (echo error ; say error)

Contoh 1: echo alik && (say done ; echo done) || (echo error ; say error)akan menghasilkan kata yang dikerjakan.

Contoh 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)akan menghasilkan kata kesalahan.

* Kebutuhan gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Tepuk tangan.

AlikElzin-kilaka
sumber
0

Saya membuat skrip sederhana dan hampir asli yang memainkan Suara dan menampilkan Pemberitahuan dengan Pesan dan Waktu yang Diberikan untuk Ubuntu ( Inti ):

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

Cara Penggunaan?

Jalankan Pertama - Menyiapkan:

  1. Buat Direktori baru di rumah Anda dan sebut saja noti

    mkdir ~/noti
    
  2. Unduh noti.sh dan ekstrak ke notidir di atas .

  3. Buka Terminal dan Ubah Direktori untuk noti

    cd ~/noti
    
  4. Jadikan noti.sh dapat dieksekusi dengan mengeluarkan:

    sudo chmod +x noti.sh
    
  5. Jalankan Tes seperti ini:

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

Contohnya

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"

Untuk Memberitahu Selesai Proses (contoh)

sudo apt-get update; noti "Done" "now"
Yahya
sumber
0

gelombang sinus ffmpeg

Untuk para minimalis di luar sana, Anda dapat memainkan sinus 1000 Hz selama 5 detik:

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

atau selamanya sampai Anda melakukan Ctrl-C:

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

Informasi lebih lanjut di: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Diuji di Ubuntu 18.04, ffmpeg 3.4.6.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber