Python:最接近的Linux和OS X是什么[编辑:macOS]相当于winsound,哔哔声?

ee7vknir  于 2023-02-11  发布在  Linux
关注(0)|答案(5)|浏览(156)

如果你想在Windows上按喇叭,Python 2显然提供了一个有用的函数:winsound.Beep()。这个函数的巧妙之处在于它接受指定哔哔声的确切频率和持续时间的参数。这正是我想要做的,只是我不使用Windows。所以...
对于LinuxOS Xwinsound.Beep()的最接近等价物是什么[编辑:macOS ],引入尽可能少的依赖项?
请注意,我希望能够直接蜂鸣扬声器,而不是播放声音文件。此外,我需要能够控制频率和持续时间的蜂鸣声,所以curses.beep()print '\a'不会做。最后,我知道PyGame提供了广泛的声音功能,但鉴于我不需要任何PyGame的其他功能,这看起来就像是用大锤敲坚果(无论如何,我正试图尽可能地消除依赖性)。
[编辑于2023年2月9日,以反映OS X在这个问题被问到几年后更名为macOS的事实]

czq61nw1

czq61nw11#

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
i86rm4rw

i86rm4rw2#

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

kcugc4gi3#

此操作在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)
lokaqttq

lokaqttq4#

我能看到的最轻量级的跨平台层是“PortAudio”。例如,R在他们的包中使用它来将特定于平台的驱动程序调用 Package 成简单的数字化波形的播放/记录数组。MIT的优秀人员为此制作了Python绑定,但您需要包括编译后的.dll/.so,以便工作。http://people.csail.mit.edu/hubert/pyaudio/
(libao是由Ogg/Vorbis的制造商Xiph类似的,有一个 Package pyao存在,但这似乎不太广泛使用)
SoX是一组优秀的跨平台工具,具有更多的格式转换和阅读文件等功能。
使用ctypes从Python调用驱动程序是可行的,但非常麻烦,即使是最简单的遗留WinMM也是如此。

kpbwa7wx

kpbwa7wx5#

我发现了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

相关问题