40

家の中で蚊に悩まされています。これは通常、プログラマーのコミュニティには関係ありません。ただし、17Khz トーンを再生することで、これらの厄介な生き物を抑止すると主張するデバイスをいくつか見てきました。ラップトップを使用してこれを行いたいと思います。

1 つの方法は、単一の固定周波数トーンで MP3 を作成し (これは audacity で簡単に実行できます)、python ライブラリで開き、繰り返し再生します。

2 つ目は、コンピューターの内蔵スピーカーを使用してサウンドを再生することです。QBasic Soundに似たものを探しています:

SOUND 17000, 100

そのためのpythonライブラリはありますか?

4

5 に答える 5

26

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) 。

Linux、Windows、OSXでPython 2と3の両方をサポートするには、代わりに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
)

これは、このAskUbuntu回答の(Python 3をサポートするための)変更バージョンです。

于 2009-06-10T08:20:33.743 に答える
19

モジュールwinsoundは Python に含まれているため、インストールする外部ライブラリはなく、必要なことを実行する必要があります (それ以外のことはほとんどありません)。

 import winsound
 winsound.Beep(17000, 100)

Windowsでのみ利用可能ですが、非常にシンプルで簡単です。

ただし
、この質問に対する完全な回答では、この方法は音を出しますが、蚊を阻止することはできないことに注意してください。すでにテスト済みです: hereおよびhereを参照してください

于 2009-06-10T16:50:20.220 に答える
1

Python3.6+ に対する jfs の回答を簡素化し、いくつかの小さな改善を行いました。

import math
from pyaudio import PyAudio, paUInt8

def generate_sine_wave(frequency, duration, volume=0.2, sample_rate=22050):
    ''' Generate a tone at the given frequency.

        Limited to unsigned 8-bit samples at a given sample_rate.
        The sample rate should be at least double the frequency.
    '''
    if sample_rate < (frequency * 2):
        print('Warning: sample_rate must be at least double the frequency '
              f'to accurately represent it:\n    sample_rate {sample_rate}'
              f' ≯ {frequency*2} (frequency {frequency}*2)')

    num_samples = int(sample_rate * duration)
    rest_frames = num_samples % sample_rate

    pa = PyAudio()
    stream = pa.open(
        format=paUInt8,
        channels=1,  # mono
        rate=sample_rate,
        output=True,
    )

    # make samples
    s = lambda i: volume * math.sin(2 * math.pi * frequency * i / sample_rate)
    samples = (int(s(i) * 0x7F + 0x80) for i in range(num_samples))

    # write several samples at a time
    for buf in zip( *([samples] * sample_rate) ):
        stream.write(bytes(buf))

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

    stream.stop_stream()
    stream.close()
    pa.terminate()

generate_sine_wave(
    # see http://www.phy.mtu.edu/~suits/notefreqs.html
    frequency=523.25,   # Hz, waves per second C6
    duration=1.2,       # seconds to play sound
    volume=0.25,        # 0..1 how loud it is
    sample_rate=22050,  # number of samples per second: 11025, 22050, 44100
)
于 2020-02-12T20:52:00.547 に答える
0

SDL ( Simple Direct Media Library ) のPython バインディングを使用できます。

于 2009-06-10T08:45:34.863 に答える