Jak zrobić sygnał dźwiękowy mojego głośnika na komputerze

171

Używając bash, jak mogę wydać sygnał dźwiękowy z komputera?

Coś jak echo 'beepsound' > /dev/pcspkrbyłoby miło.

Stefan
źródło
1
superuser.com/questions/47564/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

124

Zwykle używam małego narzędzia beepzainstalowanego na wielu systemach. To polecenie spróbuje zastosować różne podejścia do stworzenia dźwięku systemowego.

Istnieją 3 sposoby tworzenia dźwięku ze strony beeppodręcznika:

  1. Tradycyjna metoda generowania sygnału dźwiękowego w skrypcie powłoki polega na zapisaniu znaku ASCII BEL( \007) na standardowym wyjściu za pomocą polecenia powłoki, takiego jak

    echo -ne '\007'
    

    Działa to tylko wtedy, gdy standardowe wyjście powłoki wywołującej jest obecnie kierowane do jakiegoś urządzenia końcowego; jeśli nie, sygnał dźwiękowy nie wyda dźwięku, a nawet może spowodować niepożądane uszkodzenie w jakimkolwiek pliku, do którego skierowane jest wyjście.

  2. Istnieją inne sposoby wywołania sygnału dźwiękowego. Nieco bardziej niezawodną metodą jest otwarcie /dev/ttyi wysłanie tam postaci BEL. Jest to odporne na przekierowanie We / Wy, ale nadal zawiedzie w przypadku, gdy skrypt powłoki, który chce wygenerować sygnał dźwiękowy, nie ma kontrolnego terminala, na przykład ponieważ jest uruchamiany z menedżera okien X.

  3. Trzecie podejście polega na połączeniu się z wyświetlaczem X i wysłaniu komendy dzwonka. Nie zależy to od terminalowego urządzenia Unix, ale (oczywiście) wymaga wyświetlacza X.

beep wypróbuje te 3 metody.

echox
źródło
9
Strona domowa beeppolecenia to: johnath.com/beep W systemie Ubuntu / Debian można go zainstalować za pomocą apt-get install beep.
Riccardo Murri,
14
Na Linuksie istnieje czwarta zła metoda wydawania sygnałów dźwiękowych: rozładuj pcspkrmoduł, załaduj snd-pcspi masz teraz kartę dźwiękową Alsa, która używa sztuczek oldschoolowych do faktycznego przesyłania cyfrowego dźwięku do wewnętrznego głośnika. Daje to kiepskie rezultaty z wewnętrznymi głośnikami piezoelektrycznymi, ale w klasycznych głośnikach wewnętrznych jakość jest całkiem dobra jak na to, co to jest. W ten sposób możesz uzyskać znacznie więcej kreatywności w zakresie dźwięków;)
BatchyX,
8
@ isomorphismes: pcspkri snd-pcspsą modułami, a nie pakietami. użyj modprobe/ modprobe -r/, lsmodaby nimi manipulować. Dla twojej informacji, są one w linux-image-somethingpakiecie, który, mam nadzieję, jest już zainstalowany (inaczej nie miałbyś jądra Linuksa).
BatchyX
3
Sygnał dźwiękowy zwykle działa
poprawnie
4
Jak powiedział mchid, po dodaniu modułu: modprobe snd-pcspsygnał dźwiękowy teraz działa!
lepe
72

Po prostu echo \alub \07działa dla mnie.

$ echo -e "\a"

Prawdopodobnie będzie to wymagało pcspkrzaładowania modułu jądra. Testowałem to tylko na RHEL, więc YMMV.

AKTUALIZACJA

Jak zauważył Warren w komentarzach, może to nie działać po zalogowaniu zdalnym przez SSH. Szybkim obejściem byłoby przekierowanie wyjścia na dowolne urządzenie TTY (najlepiej takie, które nie jest używane). Na przykład:

$ echo -en "\a" > /dev/tty5
Shawn Chin
źródło
5
Jeśli używasz terminala X lub ssh'd na maszynie, może to po prostu spowodować flashowanie terminala, ponieważ wiele programów typu xterm / vt100 jest skonfigurowanych do obsługi znaków BEL.
Warren Young,
2
To ma sens, ale nie działało dla mnie na Ubuntu 12.04.
izomorfizmy
2
@ isomorphismes: dotyczy konsoli, a nie terminali X11. W przypadku sygnałów dźwiękowych w X, możesz spróbować: askubuntu.com/a/587311/11015
MestreLion
1
@ isomorphismes: Używam również Ubuntu 12.04, a dla mnie sudo modprobe pcspkrwystarczyło, aby włączyć sygnały dźwiękowe w VT, za pośrednictwem printf "\a"lub beepnarzędzia.
MestreLion,
3
Żadna z metod nie działa dla mnie. Ubuntu 16.04.1 LTS
ar2015
67

UWAGA: To rozwiązanie emituje sygnały dźwiękowe z głośników , a nie z płyty głównej .

ALSA jest wyposażony w test głośników, generator dźwięków testowych z wiersza poleceń, którego można użyć do wygenerowania sygnału dźwiękowego:

$ speaker-test -t sine -f 1000 -l 1

Zobacz ten wątek na forum arch linux .

Jednak czas trwania sygnału dźwiękowego będzie dowolny, ale można go kontrolować w następujący sposób:

$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid

Za pomocą tej funkcji możemy pójść o krok dalej i wygenerować sygnał dźwiękowy:

_alarm() {
  ( \speaker-test --frequency $1 --test sine )&
  pid=$!
  \sleep 0.${2}s
  \kill -9 $pid
}

który jest wywoływany z argumentami częstotliwości i czasu trwania:

$ _alarm 400 200

Mając to na uwadze, można tworzyć proste utwory muzyczne speaker-test. Zobacz ten skrypt powłoki .

Ryne Everett
źródło
1
Twoja funkcja jako jednej linii (i kompatybilna z Ctrl-C):timeout ${2} speaker-test --frequency ${1} --test sine
user569825
1
Nie ma potrzeby oszczędzania pid, po prostu speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $! robi to samo. W każdym razie metoda @ user569825 jest lepsza.
erm3nda
27
tput bel

ponieważ terminfo definiuje beljako

           Variable                       Cap-               TCap                  Description
            String                        name               Code

   bell                                   bel                bl                audible signal
                                                                               (bell) (P)
Winston Smith
źródło
17

Aby użyć karty dźwiękowej, jeśli soxjest zainstalowana, i głośnika PC, jeśli nie:

$ play -q -n synth 0.1 sin 880 || echo -e "\a"

sox jest dostępny dla większości dystrybucji.

Alexander
źródło
2
+1 Nie wiedziałem, że gra ma tę funkcję. Skończyło się na użyciu tego w thenbloku wewnątrz, watchaby powiadomić mnie, gdy spełniony zostanie określony warunek. Nawet pozwala mi pozostawić włączone słuchawki. To było dla mnie bardzo przydatne.
andyortlieb
Od bash sh prawdopodobnie będzie trzeba graćsudo -u USER play...
intika
W moim systemie playużywa pulseaudio jako użytkownika. Myślę, że to zależy od konfiguracji systemu.
Alexander
13

Niektóre dystrybucje mają do tego celu narzędzia wiersza poleceń. Może mógłbyś nam powiedzieć, na jakiej dystrybucji jesteś, lub wyszukać (np. emerge -s beepW Gentoo).

Wychodząc poza „dostępne” narzędzia, możesz również utworzyć skrypt Perla, który emituje sygnał dźwiękowy, wszystko co musisz zrobić, to:

<SomeCodeBefore>
print "\007";
<SomeCodeAfter>  

Jeśli w końcu usłyszysz „dźwięk”, wypróbuj następujące czynności:

#! /bin/sh 

beep -f 500 -l 700 
beep -f 480 -l 400 
beep -f 470 -l 250 
beep -f 530 -l 300 -D 100 
beep -f 500 -l 300 -D 100 
beep -f 500 -l 300 
beep -f 400 -l 600 
beep -f 300 -l 500 
beep -f 350 -l 700 
beep -f 250 -l 600
wormintrude
źródło
Chciałbym, żeby moje pytania pozostały distro-agnostyczne, czy echo -e "\007"działałoby w bashu zamiast print "\007w perlu?
Stefan
1
@Stefan - Beep jest właściwie „uniwersalny”. Możesz jednak pozostać niezależny od dystrybucji, używając „echo -e” \ a ”lub„ echo -e ”\ 07”. Twoje zdrowie!
wormintrude
2
Byłoby bardziej przenośne w użyciu printf '\007'zamiast echo.
Dennis Williamson
2

Próbować

echo -n Ctrl+ V Ctrl+G

Minusem jest to, że zadziała to tylko wtedy, gdy urządzeniem wyjściowym jest terminal, więc może nie działać na przykład w zadaniu cron. (Ale jeśli jesteś rootem, możesz przekierować /dev/consolena natychmiastowy sygnał dźwiękowy).

kodhead
źródło
1

W systemie Linux narzędzia takie jak beepmogą używać ioctl na konsoli do emitowania danego dźwięku. Mówiąc dokładniej, beepużyje KIOCSOUNDioctl, ale jest też KDMKTONEioctl, którego można użyć do generowania dźwięku.

Jak rozumiem, ten pierwszy uruchamia dźwięk, który trwa, dopóki nie zostanie wyraźnie anulowany, a drugi wygeneruje sygnał dźwiękowy o określonym czasie trwania. Szczegółowe informacje można znaleźć na stronie podręcznika console_ioctl(4) .

Więc jeśli nie jesteś zadowolony z tego beep, co robi, możesz napisać kilka wierszy kodu, aby uzyskać bezpośredni dostęp do tych plików ioctls. Zakładając, że masz pełny dostęp do /dev/console, co może wymagać uprawnień roota.

MvG
źródło
-1

W terminalu naciśnij Ctrl+, Ga następnieEnter

Hitesh Chechani
źródło
1
W moim terminalu (gnome-terminal) działa bez Enter. Podobnie jak test głośnika PC, dla mnie to wygląda dobrze. Jest to jednak całkowicie bezużyteczne w skryptach.
Palec
Zaskakujące opinie negatywne. Działa to na niektórych komputerach, ale może nie działać na wszystkich.
Zzzach ...
Nie działa na rxvt, urxvt, xterm, lxterm lub lxterminal, czy mój terminal nie powinien przynajmniej flashować, jeśli ma dzwonek wizualny?
Willem,
Działa na Xterm
Chris