Библиотека Python для воспроизведения звука фиксированной частоты
У меня есть проблема с комарами в моем доме. Обычно это не касается сообщества программистов; однако я видел некоторые устройства, которые утверждают, что сдерживают этих неприятных существ, играя тон 17Khz. Я хотел бы сделать это с помощью моего ноутбука.
одним из методов будет создание MP3 с одним фиксированным частотным тоном (Это можно легко сделать с помощью audacity),открытие его с помощью библиотеки python и играть его неоднократно.
второй будет воспроизводить звук с помощью встроенного динамика компьютера. Я ищу что-то похожее на QBasic звук:
SOUND 17000, 100
для этого есть библиотека python?
4 ответов
PyAudiere является простым кросс-платформенным решением проблемы:
>>> 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 ушел. сайт и бинарные инсталляторы для Python 2 (debian, windows) доступны через wayback machine, например,здесь код pyaudiere-0.2.tar.gz
.
для поддержки Python 2 и 3 в Linux, Windows, OSX,pyaudio
модуль может использоваться вместо этого:
#!/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()
пример:
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
)
Это модифицированная (для поддержки Python 3) версия это AskUbuntu ответ.
модуль winsound входит в Python, поэтому нет внешних библиотек для установки, и он должен делать то, что вы хотите (и не многое другое).
import winsound
winsound.Beep(17000, 100)
это очень просто и легко, хотя доступно только для Windows.
но:
Полный ответ на этот вопрос следует отметить что, хотя этот метод будет производить звук, это не отпугнет комаров. Он уже был протестирован: см. здесь и здесь
можно использовать привязка Python SDL (Простая Прямая Медиа-Библиотека).
существует также очень простой способ воспроизведения звука с фиксированной частотой, использовать:
Winsound.beep(frequency, duration)
например:
winsound.beep(100, 0.5)