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?
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 .
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
vous pouvez utiliser le Python binding du SDL ( Simple Direct Media Library ).
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)