web-dev-qa-db-fra.com

Python: quels sont les équivalents Linux et OSX les plus proches de winsound.Beep?

Si vous souhaitez émettre un bip sur le haut-parleur sous Windows, Python 2 fournit apparemment une fonction utile: winsound.Beep(). Le bon côté de cette fonction est qu’il faut 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. Alors...

Quels sont les équivalents les plus proches de winsound.Beep() pour Linux et OSX, en apportant le moins de dépendances possible?

Veuillez noter que je veux pouvoir émettre un bip sonore directement dans le haut-parleur, pas pour lire un fichier son. De plus, je dois pouvoir contrôler la fréquence et la durée du bip, pour que curses.beep() et print '\a' ne le fassent pas. Enfin, je suis conscient que PyGame fournit des fonctionnalités sonores étendues, mais étant donné que je n’exige aucune des autres fonctionnalités de PyGame, il semblerait que l’on utilise un massicot pour casser une noix (et de toute façon, j’essaie de supprimer les dépendances le plus loin possible).

24
Westcroft_to_Apse

J'ai trouvé une solution potentielle ici: http://bytes.com/topic/python/answers/25217-beeping-under-linux

Cela implique d’écrire directement dans/dev/audio. Pas sûr de savoir si c'est portable ou si ça marche même du tout - je ne suis pas sur une machine sous linux.

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()
10
Shawabawa

winsound est uniquement destiné aux fenêtres et je n’ai trouvé aucun moyen de le faire sur plusieurs plates-formes, autre que l’impression "/ a". Cependant, vous ne pouvez pas définir la fréquence et la durée avec cela.

Toutefois, vous pouvez essayer de faire de même avec la commande os.system avec la commande système beep . Voici un extrait, qui définit la fonction playsound de manière indépendante de la plate-forme.

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'informations, regardez ce blog

EDIT: Vous devrez installer le paquet beep sur linux pour exécuter la commande beep. Vous pouvez installer en donnant la commande

Sudo apt-get install beep
10
Max Jindal

La couche multiplate-forme la plus légère que je puisse voir est "PortAudio". Par exemple, cela est utilisé par R dans son package pour intégrer les appels de pilotes spécifiques à une plate-forme dans une simple lecture/enregistrement de formes d'onde numérisées sous forme de tableau. Les bons gens chez M.I.T. produire une liaison Python pour cela, mais vous devrez inclure le fichier .dll/.so compilé pour que cela fonctionne. http://people.csail.mit.edu/hubert/pyaudio/

(libao est similaire par Xiph les fabricants d'Ogg/Vorbis, un pyao wrapper existe mais il semble que cela soit moins largement utilisé)

SoX est un excellent ensemble d’outils multi-plateformes avec beaucoup plus de fonctionnalités pour la conversion de format et la lecture de fichiers, etc.

L'utilisation de ctypes pour passer des appels de Python à un pilote est faisable, mais très compliquée, même avec le WinMM hérité le plus simple.

2
jayprich

J'ai trouvé 3 méthodes pour Linux:

  • nouvelle méthode utilisant l’API evdev Linux, fonctionne avec n’importe quel utilisateur du groupe input ( exemple de code source )
  • ancienne méthode utilisant fcntl et /dev/console (requiert des privilèges root) ( exemple de code source )
  • invoquez la commande beep directement avec subprocess ou os.system (plus lent et doit être installé sur le système).

Voir aussi ma fonction tone () ici avec toutes les alternatives .

0
eadmaster