如何使用 python.wave 将列表中的帧正确写入 1 通道 wav 文件?

问题描述 投票:0回答:1
import wave

audio_file = wave.open('1.wav', 'rb')
frames = audio_file.readframes(audio_file.getnframes())
audio_file.close()

binary_data = list(frames)

output_file = wave.open('output.wav', 'wb')
output_file.setparams((1, 2, 48000, len(binary_data), 'NONE', 'not compressed'))

for value in binary_data:
    byt = value.to_bytes(2)
    output_file.writeframes(value.to_bytes(2))

output_file.close()

我的输出文件中有噪音

我只想了解如何使用 python.wave 将帧中的数据正确写入 wav 文件中的列表。

python audio wav wave
1个回答
0
投票

当您在

list
对象上使用
bytes
时,它会将每个单独的字节转换为整数,如果输入 WAV 文件宽于 8 位,则会导致输入帧数据出现乱码。一种更简单、更快速的方法是将帧直接写入输出文件,如下所示:

output_file.writeframes(frames)

但是,这使得生成的文件要么太慢要么太快,因为 Python 的 WAV

wave
模块无法自行正确地重新采样 WAV 文件。更好的选择是使用
scipy
代替。

import numpy as np
from scipy.io import wavfile
import scipy.signal as sg

sample_rate, data = wavfile.read('1.wav')

samples = round(len(data) * 48000.0 / sample_rate) #Sample count
new_data = np.array(sg.resample(data, samples), dtype=np.int16) #Get sound data as 16-bit PCM
mono_data = np.array((new_data.sum(axis=1) / 2), dtype=np.int16) #Mix down to mono

wavfile.write('output.wav', 48000, mono_data)
© www.soinside.com 2019 - 2024. All rights reserved.