【问题标题】:Python: what are the nearest Linux and OSX equivalents of winsound.Beep?Python:与 winsound.Beep 最接近的 Linux 和 OSX 等价物是什么?
【发布时间】:2012-09-03 11:46:36
【问题描述】:

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

LinuxOSXwinsound.Beep() 最接近的等效项是什么,尽可能少地引入依赖项?

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

【问题讨论】:

  • 没有可以发送到终端的字符吗? (0x07) ?
  • @JoranBeasley:最后一段解释了为什么这还不够。
  • 啊哈阅读理解的胜利;P

标签: python linux macos audio


【解决方案1】:

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

但是,您可以尝试使用 os.system 命令对系统命令 beep 执行相同的操作。这是一个sn-p,它以独立于平台的方式定义了函数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)

欲了解更多信息,请查看this blog

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

sudo apt-get install beep

【讨论】:

  • 谢谢,Himanshu。我对此投了赞成票,但是因为它引入了依赖关系,所以我没有接受它作为我的答案。但是,我意识到在没有依赖关系的情况下可能无法做我想做的事情。 'Beep' 至少比 PyGame 的依赖性小!
  • 在 MacOS 上,您可以通过端口安装 sox (sudo port install sox)。 Sox 包含播放命令。这是一个如何从 python 中使用它的示例: os.system('play --no-show-progress --null --channels 1 synth %f sine %s' % (duration/1000.0, frequency))
【解决方案2】:

我在这里找到了一个潜在的解决方案: 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()

【讨论】:

  • 谢谢,沙瓦巴瓦。我对此投了赞成票,但因为它不能在 OSX(没有/dev/audio)上工作,所以我没有接受它作为“答案”。也许没有完美的答案,但我还是坚持!
  • 我也收到了权限错误。不知道如何修复它。 “文件夹”/dev/audio 似乎不是文字文件夹,因此更改相关权限并不简单。
  • 对于python3用户,'file'应该在第6行替换为'open'。
【解决方案3】:

这适用于 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)

【讨论】:

  • 为什么在 cmets 中有这样的 440 Hz 参考?似乎频率是 x 参数,而不是某个固定值。
  • 其实这看起来很跨平台
【解决方案4】:

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

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

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

使用 ctypes 从 Python 调用驱动程序是可行的,但非常麻烦,即使是最简单的旧版 WinMM。

【讨论】:

    【解决方案5】:

    我找到了 3 种适用于 Linux 的方法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2011-11-20
      相关资源
      最近更新 更多