Python: quels sont les équivalents Linux et OSX les plus proches de winsound.Bip?
si l'on souhaite biper le haut-parleur sur Windows, Python 2 fournit apparemment une fonction utile:winsound.Beep()
. La chose soigneuse au sujet de cette fonction est qu'elle prend des arguments spécifiant la fréquence exacte et la durée du bip. C'est exactement ce que je veux faire, sauf que je n'utilise pas Windows. Si...
Quel est l'équivalent le plus proche de winsound.Beep()
Pour Linux et OSX, introduire le moins de dépendances possible?
s'il vous Plaît noter que je veux être en mesure de bip haut-parleur directement, pas pour lire un fichier sonore. Aussi, je dois être capable de contrôler la fréquence et la durée du bip, donc curses.beep()
et print 'a'
ne fera pas. Enfin, je suis conscient que PyGame fournit des capacités sonores étendues, mais étant donné que je n'ai besoin d'aucune des autres fonctionnalités de PyGame, cela semblerait comme utiliser un marteau de forgeron pour casser une noix (et de toute façon, j'essaie de me débarrasser des dépendances autant que possible).
4 réponses
j'ai trouvé une solution ici: http://bytes.com/topic/python/answers/25217-beeping-under-linux
il s'agit d'écrire directement à /dev/audio. Vous ne savez pas comment portable ou si cela fonctionne, je ne suis pas sur une machine linux atm.
def beep(frequency, amplitude, duration):
sample = 8000
half_period = int(sample/frequency/2)
beep = chr(amplitude)*half_period+chr(0)*half_period
beep *= int(duration*frequency)
audio = file('/dev/audio', 'wb')
audio.write(beep)
audio.close()
winsound est seulement pour windows et je n'ai pas pu trouver d'autre moyen de faire ceci, autre que d'Imprimer "/a". Cependant, vous ne pouvez pas définir la fréquence et la durée avec cette.
cependant, vous pouvez essayer l'os.commande système pour faire la même chose avec la commande système bip. Voici un extrait, qui définit la fonction playsound d'une manière indépendante de la plateforme
try:
import winsound
except ImportError:
import os
def playsound(frequency,duration):
#apt-get install beep
os.system('beep -f %s -l %s' % (frequency,duration))
else:
def playsound(frequency,duration):
winsound.Beep(frequency,duration)
Pour plus d'info, regardez ce blog
EDIT: Vous besoin d'installer le paquet beep sur linux pour exécuter la commande beep. Vous pouvez installer en donnant la commande
sudo apt-get install beep
la couche de plateforme la plus légère que je puisse voir est "PortAudio". Ceci est utilisé par R par exemple dans leur package pour envelopper les driver calls spécifiques à une plate-forme dans un simple play/record de formes d'ondes numérisées comme un tableau. Le bon folk de M. I. T. produit une reliure Python pour cela, mais vous aurez besoin d'inclure le compilé .dll/.donc pour que ça marche. http://people.csail.mit.edu/hubert/pyaudio/
( libao est similaire par Xiph les fabricants de Ogg / Vorbis , un wrapper pyao existe mais cela semble moins utilisé)
SoX est un excellent ensemble d'outils multiplateformes avec beaucoup plus de fonctionnalités pour la conversion de format et la lecture de fichiers, etc..
utiliser des ctypes pour faire des appels de Python vers un pilote est faisable, mais très compliqué, même le plus simple winmm legacy.
j'ai trouvé 3 méthodes pour Linux:
- nouvelle méthode utilisant L'API Linux evdev, fonctionne avec n'importe quel utilisateur dans le
input
( exemple de code source) - ancienne méthode utilisant
fcntl
et/dev/console
(nécessite des privilèges root) ( exemple de code source) - appeler
beep
commande directement avecsubprocess
ouos.system
(plus lent et doit être installé dans le système).
Voir aussi ma fonction tone() ici, avec toutes les alternatives.