Windowsでスピーカーからビープ音を鳴らしたい場合、Python 2は明らかに便利な関数winsound.Beep()
を提供します。この関数の優れた点は、正確な頻度を指定する引数を取ることです。ビープ音の長さ。これは、Windowsを使用しないことを除いて、まさに私がやりたいことです。
LinuxとOSXのwinsound.Beep()
に最も近いものは何ですか?依存関係をできるだけ少なくしますか?
サウンドファイルを再生するのではなく、スピーカーから直接ビープ音を鳴らしたいので注意してください。また、ビープ音の頻度と持続時間を制御できる必要があるため、curses.beep()
とprint '\a'
はしません。最後に、PyGameが広範なサウンド機能を提供していることは承知していますが、PyGameの他の機能は必要ないため、ハンマーを使用してナットを割るようなものになります(とにかく、依存関係を排除しようとしています)可能な限り)。
私はここで潜在的な解決策を見つけました: http://bytes.com/topic/python/answers/25217-beeping-under-linux
/ dev/audioに直接書き込む必要があります。それがどれほどポータブルであるか、あるいはそれがまったく機能するかどうかさえわかりません-私はLinuxマシンのATMを使用していません。
def beep(frequency, amplitude, duration):
sample = 8000
half_period = int(sample/frequency/2)
beep = chr(amplitude)*half_period+chr(0)*half_period
beep *= int(duration*frequency)
audio = file('/dev/audio', 'wb')
audio.write(beep)
audio.close()
winsoundはWindows専用であり、「/ a」を出力する以外に、これを行うためのクロスプラットフォームの方法を見つけることができませんでした。ただし、これで頻度と期間を設定することはできません。
ただし、os.systemコマンドを試して、システムコマンド beep で同じことを行うことができます。これは、プラットフォームに依存しない方法で関数playsoundを定義するスニペットです。
try:
import winsound
except ImportError:
import os
def playsound(frequency,duration):
#apt-get install beep
os.system('beep -f %s -l %s' % (frequency,duration))
else:
def playsound(frequency,duration):
winsound.Beep(frequency,duration)
詳細については、 このブログ をご覧ください。
編集:ビープコマンドを実行するには、Linuxにビープパッケージをインストールする必要があります。コマンドを与えることによってインストールすることができます
Sudo apt-get install beep
私が見ることができる最も軽量なクロスプラットフォームレイヤーは「PortAudio」です。これは、たとえばRがパッケージで使用して、プラットフォーム固有のドライバー呼び出しを、デジタル化された波形の単純な再生/記録に配列としてラップします。 M.I.T.の善良な人々 Pythonバインディングを生成しますが、これを機能させるには、コンパイルされた.dll/.soを含める必要があります。 http://people.csail.mit.edu/ hubert/pyaudio /
(libaoはOgg/VorbisのメーカーであるXiphによって類似しており、ラッパーpyaoが存在しますが、これはあまり広く使用されていないようです)
SoXは、フォーマット変換やファイルの読み取りなどのためのはるかに多くの機能を備えた優れたクロスプラットフォームツールのセットです。
Ctypesを使用してPythonからドライバーを呼び出すことは可能ですが、最も単純なレガシーWinMMでさえ、非常に面倒です。
import numpy as np
import simpleaudio as sa
def sound(x,z):
frequency = x # Our played note will be 440 Hz
fs = 44100 # 44100 samples per second
seconds = z # Note duration of 3 seconds
# Generate array with seconds*sample_rate steps, ranging between 0 and seconds
t = np.linspace(0, seconds, seconds * fs, False)
# Generate a 440 Hz sine wave
note = np.sin(frequency * t * 2 * np.pi)
# Ensure that highest value is in 16-bit range
audio = note * (2**15 - 1) / np.max(np.abs(note))
# Convert to 16-bit data
audio = audio.astype(np.int16)
# Start playback
play_obj = sa.play_buffer(audio, 1, 2, fs)
# Wait for playback to finish before exiting
play_obj.wait_done()
sound(300,2)
sound(200,1)
Linux用の3つの方法を見つけました:
input
グループ内のすべてのユーザーで機能します( ソースコードの例 )fcntl
と/dev/console
を使用する古いメソッド(ルート権限が必要)( ソースコードの例 )beep
またはos.system
を使用してsubprocess
コマンドを直接呼び出します(低速であり、システムにインストールする必要があります)。mytone()関数とすべての選択肢 も参照してください。