web-dev-qa-db-ja.com

Python:winsound.Beepに最も近いLinuxおよびOSXの同等物は何ですか?

Windowsでスピーカーからビープ音を鳴らしたい場合、Python 2は明らかに便利な関数winsound.Beep()を提供します。この関数の優れた点は、正確な頻度を指定する引数を取ることです。ビープ音の長さ。これは、Windowsを使用しないことを除いて、まさに私がやりたいことです。

LinuxとOSXのwinsound.Beep()に最も近いものは何ですか?依存関係をできるだけ少なくしますか?

サウンドファイルを再生するのではなく、スピーカーから直接ビープ音を鳴らしたいので注意してください。また、ビープ音の頻度と持続時間を制御できる必要があるため、curses.beep()print '\a'はしません。最後に、PyGameが広範なサウンド機能を提供していることは承知していますが、PyGameの他の機能は必要ないため、ハンマーを使用してナットを割るようなものになります(とにかく、依存関係を排除しようとしています)可能な限り)。

25

私はここで潜在的な解決策を見つけました: 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()
11
Shawabawa

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
10
Max Jindal

私が見ることができる最も軽量なクロスプラットフォームレイヤーは「PortAudio」です。これは、たとえばRがパッケージで使用して、プラットフォーム固有のドライバー呼び出しを、デジタル化された波形の単純な再生/記録に配列としてラップします。 M.I.T.の善良な人々 Pythonバインディングを生成しますが、これを機能させるには、コンパイルされた.dll/.soを含める必要があります。 http://people.csail.mit.edu/ hubert/pyaudio /

(libaoはOgg/VorbisのメーカーであるXiphによって類似しており、ラッパーpyaoが存在しますが、これはあまり広く使用されていないようです)

SoXは、フォーマット変換やファイルの読み取りなどのためのはるかに多くの機能を備えた優れたクロスプラットフォームツールのセットです。

Ctypesを使用してPythonからドライバーを呼び出すことは可能ですが、最も単純なレガシーWinMMでさえ、非常に面倒です。

2
jayprich

これはMacで動作します:

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)
2
Alexey Turchin

Linux用の3つの方法を見つけました:

  • linux evdev APIを使用する新しいメソッドは、inputグループ内のすべてのユーザーで機能します( ソースコードの例
  • fcntl/dev/consoleを使用する古いメソッド(ルート権限が必要)( ソースコードの例
  • beepまたはos.systemを使用してsubprocessコマンドを直接呼び出します(低速であり、システムにインストールする必要があります)。

mytone()関数とすべての選択肢 も参照してください。

0
eadmaster