Bibliothèque Python pour jouer du son à fréquence fixe

j'ai un problème de moustique dans ma maison. Cela ne concernerait généralement pas une communauté de programmeurs; cependant, j'ai vu certains appareils qui prétendent dissuader ces créatures méchantes en jouant un ton de 17Khz. Je voudrais faire cela en utilisant mon ordinateur portable.

une méthode serait de créer un MP3 avec un seul, ton à fréquence fixe ( cela peut facilement être fait par audace ), l'ouvrir avec une bibliothèque python et le jouer à plusieurs reprises.

le second serait de jouer un son en utilisant le haut-parleur intégré à l'ordinateur. Je cherche quelque chose de similaire à QBasic son :

SOUND 17000, 100

y a-t-il une bibliothèque python pour ça?

24
demandé sur Community 2009-06-10 11:05:02

4 réponses

PyAudiere est une simple croix-plate-forme de solution pour le problème:

>>> import audiere
>>> d = audiere.open_device()
>>> t = d.create_tone(17000) # 17 KHz
>>> t.play() # non-blocking call
>>> import time
>>> time.sleep(5)
>>> t.stop()

pyaudiere.org est parti. le site et les installateurs binaires pour Python 2 (debian, windows) sont disponibles via la machine wayback par exemple, voici le code source pyaudiere-0.2.tar.gz .

pour supporter à la fois Python 2 et 3 sur Linux, Windows, OSX, pyaudio module pourrait à la place:

#!/usr/bin/env python
"""Play a fixed frequency sound."""
from __future__ import division
import math

from pyaudio import PyAudio # sudo apt-get install python{,3}-pyaudio

try:
    from itertools import izip
except ImportError: # Python 3
    izip = zip
    xrange = range

def sine_tone(frequency, duration, volume=1, sample_rate=22050):
    n_samples = int(sample_rate * duration)
    restframes = n_samples % sample_rate

    p = PyAudio()
    stream = p.open(format=p.get_format_from_width(1), # 8bit
                    channels=1, # mono
                    rate=sample_rate,
                    output=True)
    s = lambda t: volume * math.sin(2 * math.pi * frequency * t / sample_rate)
    samples = (int(s(t) * 0x7f + 0x80) for t in xrange(n_samples))
    for buf in izip(*[samples]*sample_rate): # write several samples at a time
        stream.write(bytes(bytearray(buf)))

    # fill remainder of frameset with silence
    stream.write(b'\x80' * restframes)

    stream.stop_stream()
    stream.close()
    p.terminate()

exemple:

sine_tone(
    # see http://www.phy.mtu.edu/~suits/notefreqs.html
    frequency=440.00, # Hz, waves per second A4
    duration=3.21, # seconds to play sound
    volume=.01, # 0..1 how loud it is
    # see http://en.wikipedia.org/wiki/Bit_rate#Audio
    sample_rate=22050 # number of samples per second
)

c'est une version modifiée (pour supporter Python 3) de cette réponse AskUbuntu .

15
répondu jfs 2017-04-13 12:22:42

le module winsound est inclus avec Python, donc il n'y a pas de bibliothèques externes à installer, et il devrait faire ce que vous voulez (et pas grand chose d'autre).

 import winsound
 winsound.Beep(17000, 100)

C'est très simple et facile, mais n'est disponible que pour Windows.

, Mais:

Une réponse complète à cette question devrait noter que bien que cette méthode produira un son, il ne découragera pas les moustiques . Il a déjà été testé: voir ici et ici

12
répondu tom10 2017-04-13 12:48:15

vous pouvez utiliser le Python binding du SDL ( Simple Direct Media Library ).

0
répondu Monkey 2009-06-10 08:45:34

il y a aussi une façon très simple de jouer un son à fréquence fixe, use:

Winsound.beep(frequency, duration)

par exemple:

winsound.beep(100, 0.5) 
0
répondu Newton Yuan 2018-09-18 12:13:58