Python: Fazendo um som de bipe

97

Estou tentando fazer o programa emitir um som de bipe. Estou em uma máquina Windows. Eu olhei em http://docs.python.org/library/winsound.html

Mas não tenho certeza de como posso programar isso com um leitor de código de barras.

Aqui está meu código para o leitor de código de barras serial.

ser = serial.Serial()
ser.baudrate = 9600

#for windows
ser.port = 2 #for COM3

ser.open()
ser.write('hello')
ser.close()

ATUALIZAÇÃO: Já que estou irritando meus colegas de trabalho com o bipe. Posso fazer com que passe pela entrada de áudio dos fones de ouvido?

Marc Brigham
fonte
4
Você quer que o leitor de código de barras faça barulho ou a máquina Windows está conectada também?
Setheron
a máquina do Windows. Acho que o leitor de código de barras fará isso sozinho
Marc Brigham
9
Re "Update": Sim, é um fato bem conhecido que bipes são irritantes :)
jforberg
Existe algo que funciona para o OS X? Não consigo encontrar o módulo Winsound.
Charlie Parker
2
@CharlieParker porque win sound é para windows. Imprima "\ a" ao invés.
noɥʇʎԀʎzɐɹƆ

Respostas:

145

No Windows, se você quiser apenas fazer o computador emitir um bipe:

import winsound
frequency = 2500  # Set Frequency To 2500 Hertz
duration = 1000  # Set Duration To 1000 ms == 1 second
winsound.Beep(frequency, duration)

O winsound.Beep()pode ser usado onde você quiser que o bipe ocorra.

CyanRook
fonte
12
Este é legal:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel
8
Ou def sos(): for i in range(0, 3): winsound.Beep(2000, 100) for i in range(0, 3): winsound.Beep(2000, 400) for i in range(0, 3): winsound.Beep(2000, 100). Eu provavelmente deveria voltar ao trabalho agora: D
Skurmedel
1
No Windows, o Winsound.Beep é transmitido pelos Sons do Windows.
Jakob Bowyer
Estou no Mac, não consigo encontrar isso no repositório pip?
Volatil3
interessante, ele não existe no meu ambiente anaconda ... isso é estranho?
Charlie Parker
127

A maneira multiplataforma de fazer isso é print '\a'. Isso enviará o caractere ASCII Bell para stdout e, com sorte, gerará um bipe (um para 'alerta'). Observe que muitos emuladores de terminal modernos oferecem a opção de ignorar caracteres de sino.

Como você está no Windows, ficará feliz em saber que o Windows tem sua própria API de bipe (prepare-se) , que permite enviar bipes de duração e tom arbitrários. Observe que esta é uma solução somente para Windows, portanto, você provavelmente deve preferir, a print '\a'menos que realmente se preocupe com Hertz e milissegundos.

A API Beep é acessada por meio do módulo Winsound : http://docs.python.org/library/winsound.html

Jforberg
fonte
1
Embora ele tenha solicitado especificamente o Windows, acho que esta é a melhor solução, a menos que a API WinSound reverta para \ a para o sistema operacional independente. Existem muitas APIs de áudio também
Setheron
2
Francamente, eu evitaria tocar bipes do alto-falante do PC em um esforço sério de programação. Se ele estiver realmente no Windows, ele provavelmente deve tentar reproduzir o sinal de "alerta" padrão do tema do sistema. Com alguma sorte, esse sinal pode ser acessado por meio de qualquer pacote GUI que ele esteja usando.
jforberg
1
Se você usar o print em um aplicativo de console, considere adicionar end = "" para evitar uma nova linha toda vez que você emitir um bipe.
Tony
1
@jforberg A api para isso é winsound.MessageBeep que pode levar MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION e MB_OK.
Peter Wood
1
Se você estiver usando Python 3, não se esqueça de usar parênteses ou você obterá um erro de sintaxe. Use print ('\ a')
ZorroDeLaArena
27

Linux.

$ apt-get install beep

$ python
>>> os.system("beep -f 555 -l 460")

OU

$ beep -f 659 -l 460 -n -f 784 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 880 -l 230 -n -f 659 -l 230 -n -f 587 -l 230 -n -f 659 -l 460 -n -f 988 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 1047-l 230 -n -f 988 -l 230 -n -f 784 -l 230 -n -f 659 -l 230 -n -f 988 -l 230 -n -f 1318 -l 230 -n -f 659 -l 110 -n -f 587 -l 230 -n -f 587 -l 110 -n -f 494 -l 230 -n -f 740 -l 230 -n -f 659 -l 460

fonte
12
Votos negados por dois motivos: primeiro, GNU / Linux! = Debian e apt-get não é universal; segundo, você não deve usar os.system, use o módulo de subprocesso.
Ben
1
Como um usuário de Linux tentando obter um bipe simples e barato para quando um código longo termina, esta foi de longe a solução mais fácil. Eu amei especialmente o pequeno jingle! Observe que você pode ter que chamar "sudo modprobe pcspkr" e instalar o beep antes que esta opção funcione, de acordo com askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh
4
os.systemestá bem, especialmente com um valor codificado permanentemente, nem todo mundo está escrevendo um servidor da web.
cz
erro de digitação -f 1047-l, deveria ser -f 1047 -l, falta espaço
bartekbrak
@Ben Velha pergunta, mas parece muito difícil votar contra isso. A questão está relacionada a uma área sem solução de plataforma cruzada, pelo que entendi. A resposta aceita com 140 curtidas é específica do Windows. E você não explica por que um módulo legítimo é uma prática "ruim".
geotheory
17

Eu estava procurando pelo mesmo, mas pelo shell do Linux.

O tópico me trouxe uma resposta, -obrigado-

De maneira talvez mais pitônica:

import os
beep = lambda x: os.system("echo -n '\a';sleep 0.2;" * x)
beep(3)

Notas :

  • o valor de suspensão (aqui 0,2), depende da duração (segundos) do seu som de bipe padrão
  • Optei por usar, em os.systemvez de subprocess.Popenpela simplicidade (pode ser ruim)
  • o '-n' para echoé não ter mais display
  • o último ';' depois sleepé necessário para a sequência de texto resultante (* x)
  • também testado por meio de ssh em um termo X
s4mdf0o1
fonte
3
Python tem um equivalente de both echo( print) e sleep, portanto, não é pythônico passar por chamadas externas, especialmente quando elas são chamadas Unix (não portáteis).
Eric O Lebigot
o que (3) significa?
bumbumpaw de
9

Há uma resposta do Windows e uma resposta do Debian, então aqui está uma do Mac :

Isso pressupõe que você está apenas procurando uma maneira rápida de fazer um som de alerta personalizável, e não especificamente o bipe piezeoelétrico que você recebe no Windows:

os.system( "say beep" )

Isenção de responsabilidade: você pode substituir os.systempor uma chamada para osubprocess módulo se estiver preocupado com alguém hackeando seu código de bipe.

Consulte: Como fazer o hardware emitir um bipe no Mac OS X 10.6

cz
fonte
6

A forma multiplataforma:

import time
import sys
for i in range(1,6):
    sys.stdout.write('\r\a{i}'.format(i=i))
    sys.stdout.flush()
    time.sleep(1)
sys.stdout.write('\n')
FooBar167
fonte
5
A única parte importante disso ésys.stdout.write('\a')
jstrieb
1
@jstrieb - este é um pequeno programa autônomo. Sua importância na própria completude.
FooBar167
4

Eu fiz um pacote para esse fim.

Você pode usá-lo assim:

from pybeep.pybeep import PyVibrate, PyBeep
PyVibrate().beep()
PyVibrate().beepn(3)
PyBeep().beep()
PyBeep().beepn(3)

Depende do sox e suporta apenas python3.

qed
fonte
1
Experimente pip3 install pybeep.
qed
1
Apenas saiba que você tem que instalar o sox. run: brew install sox
Jam M. Hernandez Q.
3

Usando pygameem qualquer plataforma

A vantagem de usar pygameé que pode funcionar em qualquer plataforma de sistema operacional. O código de exemplo abaixo é para GNU / Linux .

Primeiro instale o pygamemódulo python3conforme explicado em detalhes aqui .

$ sudo pip3 install pygame

O pygamemódulo pode reproduzir .wave .oggarquivos de qualquer local de arquivo. Aqui está um exemplo:

#!/usr/bin/env python3
import pygame
pygame.mixer.init()
sound = pygame.mixer.Sound('/usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga')
sound.play()
Serge Stroobandt
fonte