Como faço para emitir um sinal sonoro no alto-falante do meu PC

Respostas:

124

Eu costumo usar o pequeno utilitário beepinstalado em muitos sistemas. Este comando tentará abordagens diferentes para criar um som do sistema.

Existem três maneiras de criar um som a partir da página de beepmanual:

  1. O método tradicional de produzir um sinal sonoro em um script shell é escrever um caractere ASCII BEL( \007) na saída padrão, por meio de um comando shell, como

    echo -ne '\007'
    

    Isso funciona apenas se a saída padrão do shell de chamada estiver direcionada para um dispositivo terminal de algum tipo; caso contrário, o sinal sonoro não produzirá som e poderá causar corrupção indesejada em qualquer arquivo para o qual a saída seja direcionada.

  2. Existem outras maneiras de causar um sinal sonoro. Um método um pouco mais confiável é abrir /dev/ttye enviar seu personagem BEL para lá. Isso é robusto contra o redirecionamento de E / S, mas ainda falha no caso em que o script do shell que deseja gerar um sinal sonoro não possui um terminal de controle, por exemplo, porque é executado a partir de um gerenciador de janelas X.

  3. Uma terceira abordagem é conectar-se ao seu monitor X e enviar um comando de campainha. Isso não depende de um dispositivo de terminal Unix, mas (é claro) requer um display X.

beep simplesmente tentará esses 3 métodos.

eco
fonte
9
A página inicial do beepcomando é: johnath.com/beep No Ubuntu / Debian, você pode instalá-lo apt-get install beep.
Riccardo Murri
14
No linux, existe um quarto método durão para emitir um sinal sonoro: descarregue o pcspkrmódulo, carregue o snd-pcsp, e agora você tem uma placa de som alsa que usa truques da velha escola para realmente alimentar o som digital ao seu alto-falante interno. Dá resultados ruins com alto-falantes internos piezoelétricos, mas em alto-falantes internos clássicos, a qualidade é boa para o que é. Dessa forma, você pode ser muito mais criativo com os seus bipes;);
BatchyX
8
@ isomorphismes: pcspkre snd-pcspsão módulos, não pacotes. use modprobe/ modprobe -r/ lsmodpara manipulá-los. Para sua informação, eles estão no linux-image-somethingpacote, que já está instalado (espero que você não tenha o kernel do linux).
BatchyX
3
beep normalmente trabalha fora da caixa para debian mas eu precisava carregar o módulo para que isso funcione no ubuntu
mchid
4
Como o mchid disse, depois de adicionar o módulo:, o modprobe snd-pcspbeep está funcionando!
lepe
73

Simplesmente ecoando \aou \07funciona para mim.

$ echo -e "\a"

Isso provavelmente exigirá que o pcspkrmódulo do kernel seja carregado. Eu só testei isso no RHEL, então YMMV.

ATUALIZAR

Como Warren apontou nos comentários, isso pode não funcionar quando conectado remotamente via SSH. Uma solução rápida seria redirecionar a saída para qualquer um dos dispositivos TTY (de preferência um que não seja usado). Por exemplo:

$ echo -en "\a" > /dev/tty5
Shawn Chin
fonte
5
Se você estiver usando um terminal X ou ssh'd na máquina, isso poderá fazer com que o terminal pisque, pois muitos programas do tipo xterm / vt100 estão configurados para fazer isso com caracteres BEL.
Warren novo
2
Isso faz sentido, mas não funcionou para mim no Ubuntu 12.04.
Isomorphismes
2
@ isomorphismes: isso é para consoles, não para terminais X11. Para bipes no X, você pode tentar o seguinte: askubuntu.com/a/587311/11015
MestreLion
1
@ isomorphismes: Eu também estou usando o Ubuntu 12.04, e para mim sudo modprobe pcspkrfoi suficiente para ativar os bipes sob o VT, via printf "\a"ou beeputilitário.
MestreLion
3
Nenhum dos métodos funciona para mim. Ubuntu 16.04.1 LTS
ar2015
67

NOTA: Esta solução emite bipes dos alto - falantes , não da placa - mãe .

O ALSA vem com o teste de alto-falante , um gerador de tom de teste de alto-falante da linha de comando, que pode ser usado para gerar um sinal sonoro:

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

Veja este tópico do fórum do arch linux .

No entanto, a duração do sinal sonoro será arbitrária, mas pode ser controlada da seguinte maneira:

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

Podemos dar um passo adiante e emitir um sinal sonoro com esta função:

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

chamado com argumentos de frequência e duração:

$ _alarm 400 200

Com isso em mente, é possível criar músicas simples speaker-test. Veja este script de shell .

Ryne Everett
fonte
1
Sua função como one-liner (e compatível com Ctrl-C):timeout ${2} speaker-test --frequency ${1} --test sine
user569825
1
Não há necessidade real de salvar pid, apenas speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $! faz a mesma coisa. De qualquer forma, o método do @ user569825 é melhor.
Erm3nda
28
tput bel

porque terminfo define belcomo

           Variable                       Cap-               TCap                  Description
            String                        name               Code

   bell                                   bel                bl                audible signal
                                                                               (bell) (P)
Winston Smith
fonte
17

Para usar a placa de som, se soxestiver instalada, e o alto-falante do PC, se não:

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

sox está disponível para a maioria das distros.

Alexander
fonte
2
+1 Eu não sabia que o jogo tinha esse recurso. Acabei usando isso em um thenbloco dentro watchpara me notificar quando uma determinada condição fosse atendida. Até me permite manter meus fones de ouvido. Isso foi muito útil para mim.
andyortlieb
A partir de um jogo festa sh provavelmente terásudo -u USER play...
intika
No meu sistema, playusa o pulseaudio como usuário. Eu acho que depende da configuração do sistema.
Alexander
13

Algumas distribuições possuem utilitários de linha de comando para conseguir isso. Talvez você possa nos dizer em que distro está ou pesquisar (por exemplo, emerge -s beepno gentoo).

Indo além dos utilitários "disponíveis", você também pode criar um script Perl que emite um sinal sonoro; tudo o que você precisa fazer é incluir:

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

Se você acabar recebendo 'bip', tente o seguinte:

#! /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
fonte
Eu gosto que minhas perguntas permaneçam agnósticas, echo -e "\007"funcionaria no bash em vez de print "\007no perl?
Stefan
1
@ Stefan - Beep é praticamente 'universal'. Você pode, no entanto, permanecer agnóstico usando 'echo -e "\ a"' ou 'echo -e "\ 07"'. Felicidades!
wormintrude
2
Seria mais portátil usar em printf '\007'vez de echo.
Dennis Williamson
2

Experimentar

eco -n Ctrl+ V Ctrl+G

A desvantagem é que isso funcionará apenas quando o dispositivo de saída for um terminal, portanto, pode não funcionar dentro de um trabalho cron, por exemplo. (Mas se você é root, poderá redirecionar /dev/consolepara um sinal sonoro imediato.)

codehead
fonte
1

No Linux, ferramentas como beeppodem usar um ioctl no dispositivo do console para emitir um determinado som. Para ser mais específico, beepusará o KIOCSOUNDioctl, mas também há um KDMKTONEioctl que pode ser usado para gerar som.

Pelo que entendi, o primeiro inicia um som que dura até ser explicitamente cancelado, enquanto o último cria um sinal sonoro de duração pré-determinada. Consulte a console_ioctlpágina do manual (4) para obter detalhes.

Portanto, se você não estiver satisfeito com o que beepfaz, poderá escrever algumas linhas de código para acessar esses ioctls diretamente. Supondo que você tenha acesso completo /dev/console, o que pode exigir privilégios de root.

MvG
fonte
-1

Em um terminal, pressione Ctrl+ Ge, em seguida,Enter

Hitesh Chechani
fonte
1
No meu terminal (gnome-terminal), ele funciona sem o Enter. Assim como um teste do alto-falante do PC, isso me parece ótimo. É totalmente inútil em scripts, no entanto.
Palec 27/08/15
Votações surpreendentes. Isso funciona em alguns PCs, mas pode não funcionar em todos.
Zzzach ...
Ele não funciona em rxvt, urxvt, xterm, lxterm ou lxterminal. Meu terminal não deveria pelo menos piscar se tiver uma campainha visual?
Willem
Ele funciona no xterm
Chris