如何用Python编写立体声wav文件?

时间:2010-09-03 15:41:51

标签: python wav wave

以下代码将频率为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()

3 个答案:

答案 0 :(得分:9)

使用其他频率/频道构建并行sine_list_y列表,设置nchannels=2,并在输出循环中使用for s, t in zip(sine_list_x, sine_list_y):作为标题子句,并使用两个{{1 }}调用 - 一个用于writeframes,一个用于s。 IOW,两个通道的相应帧在文件中“交替”。

参见例如this页面,详细描述了所有可能的WAV文件格式,并引用:

  

多声道数字音频样本   存储为隔行波数据   这只是意味着音频   多通道的样本(例如   立体声和环绕声)波形文件   通过音频循环存储   以前每个频道的样本   前进到下一个样本时间。   这样做是为了使音频文件   可以播放或流式播放   整个文件都可以读取。这很方便   从磁盘播放大文件时   (可能不完全符合   内存)或通过文件传输文件   互联网。图中的值   下面将存储在Wave文件中   按照它们列出的顺序排列   值列(从上到下)。

并且下表清楚地显示了通道的样本左,右,左,右......

答案 1 :(得分:3)

有关制作立体声.wav文件的示例,请参阅test_wave.py module。 该测试产生一个全零文件。 您可以通过插入交替的样本值进行修改。

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()

答案 2 :(得分:1)

另一个选择是使用SciPy和NumPy库。在下面的示例中,我们生成一个立体声波文件,其中左声道具有低频音调,而右声道具有高频音调。

要安装SciPy,请参阅: https://pypi.org/project/scipy/

@@@@@@@@@@@@@
Total files deleted: 55

@@@@@@@@@@@@@
Total Files fixed :77
Path :/tmp

环境说明

使用的版本 Python 3.7.1

  • Python 3.7.1
  • SciPy 1.1.0