30

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

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

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

4

5 回答 5

13

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 上安装 beep 包才能运行 beep 命令。你可以通过给出命令来安装

sudo apt-get install beep
于 2012-09-10T15:58:00.363 回答
11

我在这里找到了一个潜在的解决方案: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()
于 2012-09-10T15:25:57.327 回答
5

这适用于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)
于 2019-10-05T18:40:06.983 回答
2

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

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

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

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

于 2013-10-01T03:25:52.857 回答
0

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

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

另请参阅我的tone() 函数以及所有替代方法

于 2017-06-11T08:35:20.460 回答