Python: faire un bip sonore

98

J'essaie de faire en sorte que le programme me donne un bip. Je suis sur une machine Windows. J'ai regardé http://docs.python.org/library/winsound.html

Mais je ne sais pas comment je peux programmer cela avec un lecteur de codes-barres.

Voici mon code pour le lecteur de codes à barres série.

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

#for windows
ser.port = 2 #for COM3

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

MISE À JOUR: Depuis que j'ennuie mes collègues avec le bip. Puis-je le faire passer par la prise audio pour casque?

Marc Brigham
la source
4
Vous voulez que le lecteur de codes barres fasse du bruit ou que la machine Windows soit connectée aussi?
Setheron
la machine à fenêtres. Je pense que le scanner de codes-barres le fera tout seul
Marc Brigham
10
Re "Update": Oui, c'est un fait bien connu que les bips sont ennuyeux :)
jforberg
2
@CharlieParker parce que le son gagnant est pour Windows. Imprimez plutôt "\ a".
noɥʇʎԀʎzɐɹƆ

Réponses:

149

Sous Windows, si vous voulez simplement que l'ordinateur émette un bip:

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

Le winsound.Beep()peut être utilisé partout où vous souhaitez que le bip se produise.

CyanRook
la source
12
Celui-ci est soigné:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel
9
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). Je devrais probablement retourner au travail maintenant: D
Skurmedel
1
Sur Windows Winsound.Beep est transporté à travers Windows Sounds.
Jakob Bowyer
Je suis sur Mac, je ne le trouve pas sur pip repo?
Volatil3
intéressant, il n'existe pas dans mon environnement anaconda ... est-ce bizarre?
Charlie Parker
130

La manière multiplateforme de le faire est de print('\a'). Cela enverra le caractère ASCII Bell à stdout, et, espérons-le, générera un bip (un pour «alerte»). Notez que de nombreux émulateurs de terminaux modernes offrent la possibilité d'ignorer les caractères de cloche.

Puisque vous êtes sous Windows, vous serez heureux d'apprendre que Windows a sa propre API Beep (accrochez-vous) , qui vous permet d'envoyer des bips de longueur et de hauteur arbitraires. Notez qu'il s'agit d'une solution Windows uniquement, vous devriez donc probablement préférer à print('\a')moins que vous ne vous souciez vraiment de Hertz et des millisecondes.

L'API Beep est accessible via le module winsound : http://docs.python.org/library/winsound.html

Jforberg
la source
1
Bien qu'il ait demandé spécifiquement Windows, je pense que c'est la meilleure solution, à moins que l'API WinSound ne revienne à \ a pour un système d'exploitation indépendant. Il existe également de nombreuses API audio
Setheron
2
Franchement, j'éviterais de jouer les bips du haut-parleur du PC dans un effort de programmation sérieux. S'il est effectivement sous Windows, il devrait probablement essayer de jouer le signal "d'alerte" par défaut du thème système à la place. Avec un peu de chance, ce signal est accessible via n'importe quel package GUI qu'il utilise.
jforberg
1
Si vous utilisez print dans une application console, pensez à ajouter end = "" pour éviter une nouvelle ligne à chaque bip.
Tony
2
@jforberg L'API pour cela est winsound.MessageBeep qui peut prendre MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION et MB_OK.
Peter Wood
2
Si vous utilisez Python 3, n'oubliez pas d'utiliser des parenthèses ou vous obtiendrez une erreur de syntaxe. Utilisez 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

la source
12
Évalué pour deux raisons: premièrement, GNU / Linux! = Debian et apt-get ne sont pas universels; deuxièmement, vous ne devriez pas utiliser os.system, utilisez plutôt le module de sous-processus.
Ben le
1
En tant qu'utilisateur Linux essayant d'obtenir un bip simple et bon marché lorsqu'un code long se termine, c'était de loin la solution la plus simple. J'ai particulièrement aimé le petit jingle! Notez que vous devrez peut-être appeler "sudo modprobe pcspkr" et installer beep avant que cette option ne fonctionne, selon askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh
4
os.systemc'est bien, surtout avec une valeur codée en dur, tout le monde n'écrit pas un serveur Web.
cz
faute de frappe -f 1047-l, devrait être -f 1047 -l, espace manquant
bartekbrak
@Ben Ancienne question, mais pour l'instant, il semble assez difficile de voter contre cela. La question concerne un domaine sans solution multiplateforme telle que je la comprends. La réponse acceptée avec 140 likes est spécifique à Windows. Et vous n'expliquez pas pourquoi un module légitime est une «mauvaise» pratique.
geotheory le
17

Je cherchais le même mais pour le shell Linux.

Le sujet m'a amené à une réponse, -merci-

Peut-être de manière plus pythonique:

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

Remarques :

  • la valeur de sommeil (ici 0,2), dépend de la durée (secondes) de votre bip par défaut
  • J'ai choisi de l'utiliser os.systemplutôt que subprocess.Popenpar simplicité (ça pourrait être mauvais)
  • le '-n' pour echoest de ne plus avoir d'affichage
  • le dernier ';' after sleepest nécessaire pour la séquence de texte résultante (* x)
  • également testé via ssh sur un terme X
s4mdf0o1
la source
3
Python a un équivalent à la fois echo( print) et sleep, donc il n'est en fait pas pythonique de passer par des appels externes, en particulier lorsqu'il s'agit d'appels Unix (non portables).
Eric O Lebigot
que signifie (3)?
bumbumpaw
9

Il y a une réponse Windows et une réponse Debian, alors voici une réponse Mac :

Cela suppose que vous cherchiez ici un moyen rapide de créer un son d'alerte personnalisable, et pas spécifiquement le bip piézoélectrique que vous obtenez sous Windows:

os.system( "say beep" )

Avertissement: Vous pouvez remplacer os.systempar un appel au subprocessmodule si vous craignez que quelqu'un pirate votre code sonore.

Voir: Comment faire retentir le bip matériel sous Mac OS X 10.6

cz
la source
6

La manière multiplateforme:

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
la source
5
La seule partie importante de ceci estsys.stdout.write('\a')
jstrieb
2
@jstrieb - c'est un petit programme autonome. Son importance dans l'exhaustivité elle-même.
FooBar167
Cela ne fonctionne pas dans le notebook
jupyter
4

J'ai fait un paquet à cet effet.

Vous pouvez l'utiliser comme ceci:

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

Cela dépend de sox et ne prend en charge que python3.

qed
la source
1
Essayez pip3 install pybeep.
qed
1
Sachez simplement que vous devez installer sox. run: brew install sox
Jam M. Hernandez Q.28
3

Utilisation pygamesur n'importe quelle plateforme

L'avantage de l'utilisation pygameest qu'il peut être fait pour fonctionner sur n'importe quelle plate-forme OS. L'exemple de code ci-dessous est cependant pour GNU / Linux .

Installez d'abord le pygamemodule python3comme expliqué en détail ici .

$ sudo pip3 install pygame

Le pygamemodule peut lire .wavet .oggfichiers à partir de n'importe quel emplacement de fichier. Voici un exemple:

#!/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
la source
0

Sous Linux: print('\007') fera sonner la cloche du système.

Rodrigo
la source