簡體   English   中英

使用SciPy中的wavfile.write在Python中編寫wav文件

[英]Writing wav file in Python with wavfile.write from SciPy

我有這個代碼:

import numpy as np
import scipy.io.wavfile
import math

rate, data = scipy.io.wavfile.read('xenencounter_23.wav')

data2 = []

for i in range(len(data)):
    data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])

data2 = np.asarray(data2)

print data2

scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data2)

這打印(截斷):

[[-2524  2728]
 [ -423 -2270]
 [ 2270   423]
 ..., 
 [-2524     0]
 [ 2524 -2728]
 [-2270   838]]

wav文件打開並在Windows Media Player中播放,因此至少是正確的格式。 但是,當使用Audacity打開它並查看單個樣本時,它們都是0,並且一致地文件根本不播放任何聲音。

我不明白的是上面列出的那個numpy數組如何變成全0。 它應該低於樣本的最大值(或者如果它是負的則高於)。

我發現scipy.io.wavfile.write()以16位整數寫入,這解釋了嘗試使用32位整數(默認值)時較大的文件大小。 雖然我找不到在wavfile.write中更改此方法的方法,但我確實發現通過更改:

data2 = np.asarray(data2)

data2 = np.asarray(data2, dtype=np.int16)

我可以寫一份工作文件。

正如您通過在不同點打印輸出並重新保存最初加載的內容所發現的那樣,行data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])是問題的根源。

我懷疑3000的振幅太大了。 試試1。

在通過scipy.io.wavfile.write()創建wav文件時,我發現振幅非常重要。 如果您創建幅度為150的正弦波,則在VLC中播放時聽起來像是靜音。 如果振幅為100,則聽起來像是一個失真的正弦波,如果你把它變成80,它就會聽起來像一個普通的文件。

在創建波形文件時一定要小心振幅,但是現在我不清楚它在開始削波或消失之前的最大水平。

暫無
暫無

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

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