简体   繁体   English

如何使用python连接两个wav文件?

[英]How to join two wav files using python?

I am using python programming language,I want to join to wav file one at the end of other wav file?我正在使用python编程语言,我想在其他wav文件的末尾加入一个wav文件? I have a Question in the forum which suggest how to merge two wav file ie add the contents of one wav file at certain offset,but i want to join two wav file at the end of each other...我在论坛上有一个问题,建议如何合并两个 wav 文件,即在某个偏移量处添加一个 wav 文件的内容,但我想在彼此的末尾加入两个 wav 文件...

And also i had a prob playing the my own wav file,using winsound module..I was able to play the sound but using the time.sleep for certain time before playin any windows sound,disadvantage wit this is if i wanted to play a sound longer thn time.sleep(N),N sec also,the windows sound wil jst overlap after N sec play the winsound nd stop..而且我有一个问题,使用 winsound 模块播放我自己的 wav 文件。声音比时间长。睡眠(N),N 秒,窗户声音将在 N 秒播放 winsound 和停止后重叠。

Can anyone help??please kindly suggest to how to solve these prob...任何人都可以帮忙吗?请建议如何解决这些问题...

Thanks in advance提前致谢

Python ships with the wave module that will do what you need. Python 附带的wave模块可以满足您的需求。 The example below works when the details of the files (mono or stereo, frame rates, etc) are the same:当文件的详细信息(单声道或立体声、帧速率等)相同时,以下示例有效:

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

I'm the maintainer of pydub , which is designed to make this sort of thing easy.我是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")

note: pydub is a light wrapper around audioop.注意:pydub 是一个围绕 audioop 的轻量级包装。 So behind the scenes, it's doing essentially what Tom10 mentioned所以在幕后,它基本上是在做 Tom10 提到的事情

Just to build on @tom10's answer:只是为了建立在@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()))

Instead of storing all the data then writing it at the end in one go, it writes it bit by bit.它不是存储所有数据然后一次写入最后,而是一点一点地写入。 It also uses contextlib.close so you don't have to close files.它还使用 contextlib.close,因此您不必关闭文件。

Python 3 solution: Python 3 解决方案:
We can do this with the standard library as shown by tom10 and eggbert's answers.我们可以使用标准库来做到这一点,如 tom10 和 eggbert 的答案所示。
Below is a shorter version:下面是一个较短的版本:

  1. Only write the parameters for the first wave file.只写第一个波形文件的参数。 We can test the wav_out file length to see if we haven't yet written to it.我们可以测试 wav_out 文件长度,看看我们是否还没有写入它。 If we haven't write the wave parameters once only.如果我们没有只写一次波形参数。
  2. Then write frames to the wav_out as they are read from the wav_in.然后在从 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()))

You could use audiolab :您可以使用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)

I would use librosa.load and librosa.write_wav .我会使用librosa.loadlibrosa.write_wav Check out the doc here这里查看文档

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

Output:输出:

shape of x ==> (110250,) x 的形状 ==> (110250,)

shape of y ==> (110250,) y 的形状 ==> (110250,)

shape of x+y = z ==> (220500,) x+y = z ==> (220500,) 的形状

shape of z loaded ==> (220500,) z 加载的形状 ==> (220500,)

I used pysox我用过pysox

The wave module and many others don't seem to support mu-law wavs. wave 模块和许多其他模块似乎不支持 mu-law wavs。

pysox reqs that you install SoX and update your PATH to include the directory it's installed to. 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')

i use the SOX [1] library and then call it like我使用 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])

[1] http://sox.sourceforge.net/ [1] http://sox.sourceforge.net/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM