2011-11-28 401 views
14

我需要在Python中生成正弦波聲音,並且我需要能夠控制頻率,持續時間和相對音量。 '生成'我的意思是我希望它立即通過揚聲器播放,而不是保存到文件。在Python中生成正弦波聲音

這樣做最簡單的方法是什麼?

+0

什麼平臺(S),你定位? –

+1

主要是MacOS X - 我應該指定這個,對不起! – astrofrog

+0

這個問題類似於http://stackoverflow.com/questions/307305/play-a-sound-with-python和http://stackoverflow.com/questions/260738/play-audio-with-python –

回答

1

在Python中安裝聲音處理方法的一個比較一致的方法是Pygame多媒體庫。

我推薦使用它 - 有pygame.sndarray子模塊,它允許你操縱數據向量中的數字,成爲可以在pygame.mixer模塊中播放的高級聲音對象。

pygame.org網站上的文檔應該足以使用sndarray模塊。

0

我的bregman lab toolbox你有一套完全按你想要的功能。這Python模塊是有點馬車,但你能適應這個代碼來獲取自己的函數

+0

404錯誤 - 頁面未找到 - https://github.com/bregmanstudio/BregmanToolkit – scls

21
import pyaudio 
import numpy as np 

p = pyaudio.PyAudio() 

volume = 0.5  # range [0.0, 1.0] 
fs = 44100  # sampling rate, Hz, must be integer 
duration = 1.0 # in seconds, may be float 
f = 440.0  # sine frequency, Hz, may be float 

# generate samples, note conversion to float32 array 
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32) 

# for paFloat32 sample values must be in range [-1.0, 1.0] 
stream = p.open(format=pyaudio.paFloat32, 
       channels=1, 
       rate=fs, 
       output=True) 

# play. May repeat with different volume values (if done interactively) 
stream.write(volume*samples) 

stream.stop_stream() 
stream.close() 

p.terminate() 
+0

我得到這:文件「C:\ Python27 \ lib \ site-packages \ numpy \ core \ __init__.py」,第6行,在, 之內。 import multiarray ImportError:DLL加載失敗:%1不是有效的Win32應用程序。 – chwi

+0

我發現@yahweh的貢獻是這樣。包含在代碼示例中會很有幫助。 – chris

1

伊萬 - onys之前做

sudo apt-get install python3-all-dev portaudio19-dev 

給了一個很好的答案,但有一點除了它: 這個腳本會產生比預期短4倍的聲音,因爲Pyaudio寫入方法需要float32的字符串數據,但是當您將numpy數組傳遞給此方法時,它會將整個數組作爲實體轉換爲字符串,因此您必須轉換在numpy的陣列到自己的字節序列像這樣的數據:

samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes() 

,你必須改變這一行,以及:

stream.write(samples)