วิธีทำเสียงเมื่อกระบวนการเสร็จสมบูรณ์


94

ฉันได้เริ่มกระบวนการที่ยาวนานผ่านเทอร์มินัล เป็นไปได้ไหมที่จะทำให้เทอร์มินัล Ubuntu ทำเสียงดังขึ้นเมื่อกระบวนการเสร็จสมบูรณ์ ด้วยวิธีนี้ฉันไม่จำเป็นต้องตรวจสอบต่อไป แต่จะได้รับแจ้งผ่านเสียงแทน


คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับกระบวนการที่ทำให้เสร็จสมบูรณ์ได้อย่างไร?
Lucio

1
@ การควบคุม Lucio ถูกส่งกลับไปที่เทอร์มินัล
Goaler444

1
คุณหมายถึงเปิดแอปพลิเคชั่นจากเทอร์มินัลและเมื่อเสร็จแล้วให้ส่งเสียงหรือไม่ คุณมีเซิร์ฟเวอร์ Ubuntu หรือคุณหมายถึงซอฟต์แวร์ GUI
Lucio

2
ใช่แน่นอน ตัวอย่างเช่นฉันเริ่มโปรแกรมบรรทัดคำสั่งและเมื่อออกจากและควบคุมจะถูกส่งกลับไปยังสถานีเสียงจะทำ ฉันกำลังใช้ Ubuntu 12.10
Goaler444

คำตอบ:


78

มีวิธีบรรทัดคำสั่งอย่างน้อยสามวิธีในการทำสิ่งนี้โดยใส่คำสั่งสิ่งทอสำหรับทำชุดท้ายสคริปต์ของคุณคุณอาจเรียกใช้สำหรับกระบวนการที่ยาวนานของคุณ:

  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. นอกจากนี้เรายังสามารถเล่นไฟล์เสียงใด ๆ ในรูปแบบ wav โดยใช้ aplay (ติดตั้งตามค่าเริ่มต้น):

    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 ใช้ speak-dispatcher จากนั้นเราสามารถติดตั้งespeak ติดตั้ง espeakหรือใช้spd-say "Text"แทน


1
@Takkat ฉันใช้ Ubuntu 12.10 และespeakยังไม่ได้ติดตั้ง
Lucio

@Lucio: ใช่ตอนนี้ที่คุณพูดมัน ... พวกเขาเปลี่ยนไปพูดกับดิสแพตเชอร์ หากได้ผล (มันไม่ได้ในระบบของฉัน) spd-sayเห็นการแก้ไขสำหรับการใช้
Takkat

@ Takkat spd-sayโปรแกรมอรรถประโยชน์ถูกติดตั้งตามค่าเริ่มต้นและทำงานบนระบบของฉัน
Lucio

นอกจากนี้ให้ดูที่Q / A นี้
c0rp

1
ฉันประสบความสำเร็จเป็นอย่างดีด้วยpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiP Piazza

73

ฉันใช้

make; spd-say done

แทนที่ "ทำ" ด้วยคำสั่งที่ใช้งานได้นาน


คุณทำให้วันนี้ดี!! : D
n0noob

5
spd-say 'get back to work' และติดตั้งมาแล้วเช่นกัน: release.ubuntu.com/trusty/ …สำหรับคนตาบอดที่ฉันคิดว่า และสำหรับลูปไม่มีที่สิ้นสุด:-w while true; do spd-say -w 'get back to work you lazy bum'; done
Ciro Santilli 新疆改造中心法轮功六四事件

ฉันหัวเราะอย่างหนักกว่าที่ควรจะเป็น
NelsonGon

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 หรือข้อผิดพลาด (พร้อมรหัสข้อผิดพลาด) เมื่อคำสั่งก่อนหน้านี้เสร็จสิ้น

รหัสแหล่งที่มา

นี่คือฟังก์ชันที่มีผู้ช่วยสองคน:

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_okและเปลี่ยนsound_errorเป็นเสียงอื่น

คุณสามารถทดสอบsoundกับsoundbgและและเปลี่ยนsound_okและsound_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
}

อีกครั้งคุณสามารถเปลี่ยนsoundเป็นsoundbgถ้าคุณต้องการเล่นในพื้นหลังโดยไม่ต้องรอให้เสียงเสร็จสิ้น (เช่นเพื่อไม่ทำให้สคริปต์ช้าลงเมื่อคุณเล่นเสียงจำนวนมาก)

รุ่นเงียบ

และในกรณี - นี่คือฟังก์ชั่นเดียวกับ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ฟังก์ชั่นไปที่ repo ด้านบน มันเล่นเสียงและสามารถถูกขัดจังหวะโดย 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


ฉันพยายามใส่สิ่งนี้ลงไปwhile true; do paplay ...; doneเพื่อให้เสียงซ้ำจนกว่าฉันจะตีCtrl+Cแต่เมื่อฉันทำมันจะไม่หยุด ฉันไม่พบตัวเลือกพิเศษใด ๆ ในman paplayการหาวิธีการใช้งาน ความคิดใด ๆ
shadi

@shadi ดูคำตอบที่อัปเดตของฉันเพื่อหาคำตอบพร้อมกับเสียงที่เล่นซ้ำจนกว่าคุณจะกด Ctrl + C
rsp

14

ตามนี้\aตัวละครหนีรหัส ASCII 7 ซึ่งเป็นเสียงเตือนของคอมพิวเตอร์

ดังนั้นecho $'\a'จะทำการส่งเสียงบี๊บบนเครื่องในพื้นที่ของฉันแม้ว่าจะถูกดำเนินการบน bash shell ที่รันบนคอมพิวเตอร์ที่ฉันเชื่อมต่อผ่านเทอร์มินัลอินเตอร์เฟสเช่น PuTTY


3
น่าทึ่ง! นั่นเป็นทางออกที่ง่ายที่สุดและดีที่สุด (อย่างน้อยสำหรับฉัน) เพราะมันไม่จำเป็นต้องติดตั้งแอพของบุคคลที่สามและสามารถพิมพ์ / วางในช่วงกลางของกระบวนการที่จะเรียกใช้หลังจากพรอมต์คำสั่งจะเน้น
hlopetz

2
เสียงของตัวละครตัวนี้ถูกปิดการใช้งานในอาคารที่ทันสมัยที่สุดโดยค่าเริ่มต้น
phil294

6

เมื่อเพิ่มคำตอบของ Michael Curries คุณสามารถสร้าง Bash print a BEL( \a) ตัวละครผ่านPROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

การตั้งค่าPROMPT_COMMANDด้วยวิธีนี้จะทำให้ Bash ดำเนินการprintf \\aในตอนท้ายของแต่ละคำสั่งซึ่งจะทำให้เทอร์มินัลเล่นเสียง (แม้ว่า muru จะชี้ให้เห็นเพียงแค่เรียกการวาดใหม่ของพรอมต์จะทำให้เทอร์มินัลเล่นเสียงเช่นเสียงที่จะเล่น ทุกครั้งที่มีพรอมต์ใหม่ถูกดึงออกมาตัวอย่างเช่นแม้เพียงแค่กดปุ่ม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 ( สรุปสาระสำคัญ ):

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

วิธีใช้?

First Run - การติดตั้ง:

  1. สร้างไดเรกทอรีใหม่ที่บ้านของคุณและเรียกมัน noti

    mkdir ~/noti
    
  2. ดาวน์โหลดnoti.shและแตกไปยังnotidir ด้านบน

  3. เปิด Terminal และเปลี่ยน Directory เป็น 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 คลื่นไซน์

สำหรับมินิมัลลิสต์นั้นคุณสามารถเล่น 1,000 Hz sine เป็นเวลา 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.