Python:winsound.Beep中最接近的Linux和OSX等价物是什么?

时间:2012-09-10 15:14:02

标签: python linux macos audio

如果有人希望在Windows上发出嘟嘟声,那么Python 2显然提供了一个有用的功能:winsound.Beep()。关于这个函数的巧妙之处在于它需要参数来指定蜂鸣声的确切频率和持续时间。这正是我想要做的,除了我不使用Windows。所以......

对于Linux和OSX,winsound.Beep()的最接近的等价物是什么,引入尽可能少的依赖项?

请注意,我希望能够直接发出扬声器,而不是播放声音文件。此外,我需要能够控制蜂鸣声的频率和持续时间,因此curses.beep()print '\a'不会这样做。最后,我知道PyGame提供了广泛的声音功能,但考虑到我不需要任何PyGame的其他功能,这似乎就像使用大锤来破解坚果(无论如何,我试图消除依赖性尽可能)。

5 个答案:

答案 0 :(得分:11)

我在这里找到了一个潜在的解决方案: http://bytes.com/topic/python/answers/25217-beeping-under-linux

它涉及直接写入/ dev / audio。不确定它是多么便携,或者它是否可以工作 - 我不是在linux机器上。

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

答案 1 :(得分:10)

winsound仅适用于Windows,我找不到任何跨平台的方式来执行此操作,除了打印" / a"。但是,您无法使用此设置频率和持续时间。

但是,您可以尝试使用os.system命令对系统命令beep执行相同操作。这是一个片段,它以独立于平台的方式定义函数播放

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)

有关详细信息,请查看this blog

编辑:你需要在linux上安装beep包来运行beep命令。您可以通过提供命令来安装

sudo apt-get install beep

答案 2 :(得分:2)

我能看到的最轻量级的跨平台层是“PortAudio”。例如,它在它的包中用于将特定于平台的驱动程序调用包装成数组化波形的简单播放/记录作为数组。 M.I.T.的好人为此生成一个Python绑定,但是你需要包含已编译的.dll / .so才能生效。 http://people.csail.mit.edu/hubert/pyaudio/

(libao类似于Xiph,Ogg / Vorbis的制造商,包装pyao存在,但这似乎不太广泛使用)

SoX是一套优秀的跨平台工具,具有更多格式转换和读取文件等功能。

使用ctypes从Python调用驱动程序是可行的,但非常混乱,即使是最简单的传统WinMM。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我找到了3种Linux方法:

  • 使用Linux evdev API的新方法适用于input组中的任何用户(example source code
  • 使用fcntl/dev/console的旧方法(需要root权限)(example source code
  • 直接使用beepsubprocess调用os.system命令(速度较慢,必须安装在系统中)。

另见my tone() function here with all the alternatives