[英]How to write stereo wav files in Python?
以下代碼將頻率為 400Hz 的簡單正弦寫入單聲道 WAV 文件。 應如何更改此代碼以生成立體聲WAV 文件。 第二個頻道應該在不同的頻率。
import math
import wave
import struct
freq = 440.0
data_size = 40000
fname = "WaveTest.wav"
frate = 11025.0 # framerate as a float
amp = 64000.0 # multiplier for amplitude
sine_list_x = []
for x in range(data_size):
sine_list_x.append(math.sin(2*math.pi*freq*(x/frate)))
wav_file = wave.open(fname, "w")
nchannels = 1
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
wav_file.setparams((nchannels, sampwidth, framerate, nframes,
comptype, compname))
for s in sine_list_x:
# write the audio frames to file
wav_file.writeframes(struct.pack('h', int(s*amp/2)))
wav_file.close()
使用另一個頻率/通道構建一個並行的sine_list_y
列表,設置nchannels=2
,並在輸出循環中使用for s, t in zip(sine_list_x, sine_list_y):
作為標題子句,以及一個具有兩個writeframes
調用的主體 - 一個對於s
,一個對於t
。 IOW,文件中兩個通道的相應幀“交替”。
例如參見本頁面的所有可能的WAV文件格式的全面描述,我引用:
多通道數字音頻樣本存儲為隔行波數據,這意味着多通道(例如立體聲和環繞聲)波形文件的音頻樣本是通過在前進到下一個樣本之前循環每個通道的音頻樣本來存儲的時間。 這樣做是為了在讀取整個文件之前可以播放或流式傳輸音頻文件。 這在從磁盤播放大文件(可能不完全適合內存)或通過 Internet 流式傳輸文件時非常方便。 下圖中的值將按照它們在“值”列(從上到下)中列出的順序存儲在 Wave 文件中。
下表清楚地顯示了向左、向右、向左、向右、...
有關生成立體聲.wav
文件的示例,請參閱test_wave.py
模塊。 該測試生成一個全零文件。 您可以通過插入交替樣本值進行修改。
nchannels = 2
sampwidth = 2
framerate = 8000
nframes = 100
# ...
def test_it(self):
self.f = wave.open(TESTFN, 'wb')
self.f.setnchannels(nchannels)
self.f.setsampwidth(sampwidth)
self.f.setframerate(framerate)
self.f.setnframes(nframes)
output = '\0' * nframes * nchannels * sampwidth
self.f.writeframes(output)
self.f.close()
另一種選擇是使用 SciPy 和 NumPy 庫。 在下面的示例中,我們生成了一個立體聲波形文件,其中左聲道具有低頻音調,而右聲道具有高頻音調。
要安裝 SciPy,請參閱: https : //pypi.org/project/scipy/
import numpy as np
from scipy.io import wavfile
# User input
duration=5.0
toneFrequency_left=500 #Hz (20,000 Hz max value)
toneFrequency_right=1200 #Hz (20,000 Hz max value)
# Constants
samplingFrequency=48000
# Generate Tones
time_x=np.arange(0, duration, 1.0/float(samplingFrequency))
toneLeft_y=np.cos(2.0 * np.pi * toneFrequency_left * time_x)
toneRight_y=np.cos(2.0 * np.pi * toneFrequency_right * time_x)
# A 2D array where the left and right tones are contained in their respective rows
tone_y_stereo=np.vstack((toneLeft_y, toneRight_y))
# Reshape 2D array so that the left and right tones are contained in their respective columns
tone_y_stereo=tone_y_stereo.transpose()
# Produce an audio file that contains stereo sound
wavfile.write('stereoAudio.wav', samplingFrequency, tone_y_stereo)
使用的版本 Python 3.7.1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.