如何使用 python 合并两个 wav 文件?
- 2025-03-21 09:06:00
- admin 原创
- 64
问题描述:
我正在使用 python 编程语言,我想将一个 wav 文件合并到另一个 wav 文件的末尾?我在论坛中有一个问题,建议如何合并两个 wav 文件,即在某个偏移量处添加一个 wav 文件的内容,但我想将两个 wav 文件合并到彼此的末尾...
另外,我在使用 winsound 模块播放我自己的 wav 文件时也遇到了问题。我可以播放声音,但在播放任何 windows 声音之前要使用 time.sleep 一段时间,这样做的缺点是,如果我想播放比 time.sleep(N) 更长的声音,N 秒后,windows 声音将会重叠,播放 winsound 并停止。
有人可以帮忙吗?请建议如何解决这些问题......
提前致谢
解决方案 1:
Python 附带的wave模块可以满足您的需求。当文件的详细信息(单声道或立体声、帧速率等)相同时,下面的示例有效:
import wave
infiles = ["sound_1.wav", "sound_2.wav"]
outfile = "sounds.wav"
data= []
for infile in infiles:
w = wave.open(infile, 'rb')
data.append( [w.getparams(), w.readframes(w.getnframes())] )
w.close()
output = wave.open(outfile, 'wb')
output.setparams(data[0][0])
for i in range(len(data)):
output.writeframes(data[i][1])
output.close()
解决方案 2:
我是pydub的维护者,它的设计目的是使这类事情变得简单。
from pydub import AudioSegment
sound1 = AudioSegment.from_wav("/path/to/file1.wav")
sound2 = AudioSegment.from_wav("/path/to/file2.wav")
combined_sounds = sound1 + sound2
combined_sounds.export("/output/path.wav", format="wav")
注意:pydub 是 audioop 的轻量包装器。因此,在幕后,它基本上执行 Tom10 提到的操作
解决方案 3:
Python 3 解决方案:
我们可以使用标准库来实现这一点,如 tom10 和 eggbert 的答案所示。
以下是较短的版本:
只写入第一个波形文件的参数。我们可以测试 wav_out 文件长度,看看是否还没有写入。如果没有,则只写入一次波形参数。
然后将从 wav_in 读取的帧写入 wav_out。
with wave.open(outfile, 'wb') as wav_out:
for wav_path in infiles:
with wave.open(wav_path, 'rb') as wav_in:
if not wav_out.getnframes():
wav_out.setparams(wav_in.getparams())
wav_out.writeframes(wav_in.readframes(wav_in.getnframes()))
解决方案 4:
仅基于@tom10 的回答:
from contextlib import closing
with closing(wave.open(outfile, 'wb')) as output:
# find sample rate from first file
with closing(wave.open(wav_files[0])) as w:
output.setparams(w.getparams())
# write each file to output
for infile in wav_files:
with closing(wave.open(infile)) as w:
output.writeframes(w.readframes(w.getnframes()))
它不是存储所有数据然后一次性写入最后,而是一点一点地写入。它还使用 contextlib.close,因此您不必关闭文件。
解决方案 5:
我用的是pysox
波形模块和许多其他模块似乎不支持 mu-law wavs。
pysox 要求您安装SoX
并更新您的 PATH 以包含其安装到的目录。
import sox
cbn=sox.Combiner()
sounds=[]
#PROCESS SOUND PATHS TO AN ARRAY
if len(sounds)>=2:
print(sounds)
cbn.build(sounds,'outputfilepath.ext','concatenate')
解决方案 6:
您可以使用audiolab
:
import audiolab, scipy
a, fs, enc = audiolab.wavread('file1.wav')
b, fs, enc = audiolab.wavread('file2.wav')
c = scipy.vstack((a,b))
audiolab.wavwrite(c, 'file3.wav', fs, enc)
解决方案 7:
我会使用librosa.load
和。点击此处librosa.write_wav
查看文档
import librosa
import numpy as np
import librosa.display
example_audio = librosa.util.example_audio_file()
x, sr = librosa.load(example_audio, duration=5)
print('shape of x ==> ' + str(x.shape))
y, sr = librosa.load(example_audio, duration=5)
print('shape of y ==> ' + str(y.shape))
z = np.append(x,y)
print('shape of x+y = z ==> ' + str(z.shape))
librosa.output.write_wav('joined_file.wav', z, sr)
z_loaded, sr = librosa.load('joined_file.wav')
print('shape of z loaded ==> ' + str(z_loaded.shape))
输出:
x 的形状 ==> (110250,)
y 的形状 ==> (110250,)
x+y = z 的形状 ==> (220500,)
z 形状已加载 ==> (220500,)
解决方案 8:
我使用 SOX [1] 库,然后像这样调用它
>>> import subprocess
>>> sound_output_path = /tmp
>>> sox_filenames = ['file.wav', 'file1.wav']
>>> subprocess.call(['sox'] + sox_filenames + ['%s/out.wav' % sound_output_path])
扫码咨询,免费领取项目管理大礼包!