2017-02-21 68 views
1

對於我在大學的最後一年項目,我正在使用Wav文件和Python,並與他們搞混了。我希望能夠從內存中播放聲音樣本,而不是在我聽到它們之前將聲音樣本寫入WAV文件。如何從內存播放Wav聲音樣本

我一直在網上尋找並發現PyMedia,PySound,PyGame等,他們都沒有爲我工作。每一個軟件包都會給我錯誤。

有沒有其他圖書館我失蹤,這將幫助我做到這一點?或者我只是很愚蠢,無法讓其他軟件包正常工作。

正是我想要做的就是沿此線:

#open file and get parameters 
    wavfile = Wave.open("file.wav", "r") 
    params = wfile.getparams() 
    nframes = params[3] 

    #get sound samples in a list 
    samples = [] 
    for i in range(nframes): 
     samples.append(wfile.readframes(1)) 

    playsound(samples) 

    changedSamples = makeChangeTo(samples) 

    playsound(changedSamples) 

而且我希望能夠有這樣的一個循環,這樣我可以編輯和聽到的編輯在程序運行時依舊無需將樣本寫入wav文件即可運行,因爲這需要很長時間。

有什麼建議嗎?乾杯!

+0

嘗試SSDD或虛擬磁盤RAM?文件,流接口可以隱藏潛在的延遲,這將導致播放/記錄的差距 - 這是預期的解釋性語言與垃圾收集,如Python – f5r5e5d

+0

你還沒有給出任何有關你得到任何這些庫工作的錯誤信息。 pygame當然可以[從OGG音頻文件或未壓縮的WAV'創建一個Sound對象](https://www.pygame.org/docs/ref/mixer.html#pygame.mixer.Sound)。 –

回答

0

你應該清楚地分離這兩個關注點:

  1. 讀/寫WAV文件(或其他音頻文件)

  2. 播放/錄製聲音

有幾個問題並在這裏回答這兩個主題。

這是我個人的(當然有偏)推薦:

您應該使用NumPy的操作聲音,這比處理普通的Python緩衝區容易得多。 如果由於某種原因你不能使用NumPy,你仍然可以做到這一切,但它會多一點工作。

對於讀/寫聲音文件,我推薦soundfile模塊(完全披露:我是合作作者)。

對於播放/錄製聲音,我推薦sounddevice模塊(完全公開:我是它的主要作者)。

當使用這些模塊,你的例子可能會成爲這樣的事:

import soundfile as sf 
import sounddevice as sd 

samples, samplerate = sf.read('file.wav') 
sd.play(samples, samplerate) 
sd.wait() 
changed_samples = make_change_to(samples) 
sd.play(changed_samples, samplerate) 
sd.wait() 

如果您在交互式Python提示符工作,你可能並不需要sd.wait()電話,你可以等到播放已結束。或者,如果你厭倦聽它的,你可以使用:

sd.stop() 

如果你知道你將使用相同的採樣率一段時間後,可以將其設置爲默認:

sd.default.samplerate = 48000 

之後,您使用play()時可以刪除samplerate說法:

sd.play(samples) 

如果你想改變的聲音存儲到一個文件,你可以使用這樣的事情:

sf.write('changed_file.wav', changed_samples, samplerate) 

延伸閱讀:

+0

真棒,看起來不錯我會給它一個去看看會發生什麼。 謝謝我感謝他! – ConorSpn

+0

@ConorSpn太好了!如果這有幫助,你應該考慮增加投票和/或接受我的答案。如果沒有,請讓我知道,所以我可以嘗試改進我的答案! – Matthias