Подтвердить что ты не робот

Библиотека Python для воспроизведения звука с фиксированной частотой

У меня проблема с комарами в моем доме. Это обычно не касается сообщества программистов; Тем не менее, я видел некоторые устройства, которые утверждают, что удерживают этих мерзких существ, играя тон 17ХГц. Я хотел бы сделать это, используя свой ноутбук.

Одним из методов было бы создание MP3 с одним тоном с фиксированной частотой (Это легко сделать с помощью смелости), открывая его с помощью библиотеки python и воспроизводя его несколько раз.

Второй будет воспроизводить звук с помощью встроенного динамика компьютера. Я ищу что-то похожее на QBasic Sound:

SOUND 17000, 100

Есть ли для этого библиотека python?

4b9b3361

Ответ 1

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) доступны через машину обратного пути, например здесь исходный код pyaudiere-0.2.tar.gz.

Чтобы поддерживать как Python 2, так и 3 в Linux, Windows, OSX, pyaudio module можно было бы использовать вместо:

#!/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.

Ответ 2

Модуль winsound включен в Python, поэтому для установки нет внешних библиотек, и он должен делать то, что вы хотите ( и не более того).

 import winsound
 winsound.Beep(17000, 100)

Это очень просто и просто, хотя доступно только для Windows.

Но:
Полный ответ на этот вопрос должен отметить, что, хотя этот метод даст звук, он не будет удерживать москитов. Он уже протестирован: см. здесь и здесь