簡體   English   中英

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

[英]Python: what are the nearest Linux and OSX equivalents of winsound.Beep?

如果希望在 Windows 上發出嗶嗶聲,Python 2 顯然提供了一個有用的函數: winsound.Beep() 這個函數的巧妙之處在於它接受指定嗶聲的確切頻率和持續時間的參數。 這正是我想要做的,只是我不使用 Windows。 所以...

什么是winsound.Beep() for LinuxOSX的最接近等價物,引入盡可能少的依賴項?

請注意,我希望能夠直接使揚聲器發出嗶嗶聲,而不是播放聲音文件。 另外,我需要能夠控制嗶聲的頻率和持續時間,所以curses.beep()print '\\a'不會做。 最后,我知道PyGame提供了廣泛的聲音功能,但鑒於我不需要 PyGame 的任何其他功能,這似乎是使用大錘敲碎堅果(無論如何,我正在嘗試消除依賴越遠越好)。

我在這里找到了一個潛在的解決方案: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()

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

這適用於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)

我能看到的最輕量級的跨平台層是“PortAudio”。 這被 R 例如在他們的包中用於將特定於平台的驅動程序調用包裝成簡單的數字化波形播放/記錄作為數組。 麻省理工學院的好人為此生成了一個 Python 綁定,但您需要包含已編譯的 .dll/.so 才能使其工作。 http://people.csail.mit.edu/hubert/pyaudio/

(libao 與 Ogg/Vorbis 的制造商 Xiph 相似,存在包裝 pyao 但這似乎不太廣泛使用)

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

使用 ctypes 從 Python 調用驅動程序是可行的,但非常混亂,即使是最簡單的遺留 WinMM。

我為 Linux 找到了 3 種方法:

  • 使用 Linux evdev API 的新方法,適用於input組中的任何用戶(示例源代碼
  • 使用fcntl/dev/console舊方法(需要 root 權限)(示例源代碼
  • 調用beep直接命令與subprocessos.system (較慢並且必須安裝在系統中)。

另請參閱 我的tone() 函數以及所有替代方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM