如何使用 python 合并两个 wav 文件?

2025-03-21 09:06:00
admin
原创
64
摘要:问题描述:我正在使用 python 编程语言,我想将一个 wav 文件合并到另一个 wav 文件的末尾?我在论坛中有一个问题,建议如何合并两个 wav 文件,即在某个偏移量处添加一个 wav 文件的内容,但我想将两个 wav 文件合并到彼此的末尾...另外,我在使用 winsound 模块播放我自己的 wav...

问题描述:

我正在使用 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 的答案所示。

以下是较短的版本:

  1. 只写入第一个波形文件的参数。我们可以测试 wav_out 文件长度,看看是否还没有写入。如果没有,则只写入一次波形参数。

  2. 然后将从 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])

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用