如何在Python中连接音频文件(实现代码示例)

Python如何连接音频文件?本文带你探索使用 Python 中的 MoviePy、wave 和 PyDub 库来连接两个或多个音频文件的不同方法。
【如何在Python中连接音频文件(实现代码示例)】如何在Python中连接音频文件?如果你想使用 Python 将两个或多个音频文件合并为一个,那么在本教程中,你将学习 3 种使用MoviePy、wave或PyDub库在 Python 中连接音频文件的不同方法,并且你可以自由使用任何其中之一。
Python连接音频文件示例开始:首先,让我们安装必要的库:

$ pip install moviepy pydub tqdm

方法 1:使用 MoviePy首先,我们需要导入 MoviePy 来构建我们的脚本:
from moviepy.editor import concatenate_audioclips, AudioFileClip

Python如何连接音频文件?MoviePy 是一个非常简单的库,不涉及太多代码,以下函数将音频文件列表与 MoviePy 库合并:
def concatenate_audio_moviepy(audio_clip_paths, output_path): """Concatenates several audio files into one audio file using MoviePy and save it to `output_path`. Note that extension (mp3, etc.) must be added to `output_path`""" clips = [ AudioFileClip(c) for c in audio_clip_paths] final_clip = concatenate_audioclips(clips) final_clip.write_audiofile(output_path)

audio_clip_paths是路径的音频文件的列表,我们实例化一个AudioFileClip为每个音频剪辑对象,然后我们使用concatenate_audioclips()由MoviePy提供功能的音频文件结合起来。最后,我们用write_audiofile()方法编写最终的剪辑。
下面是解析命令行参数的代码:
if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Simple Audio file combiner using MoviePy library in Python") parser.add_argument("-c", "--clips", nargs="+", help="List of audio clip paths") parser.add_argument("-o", "--output", help="The output audio file, extension must be included (such as mp3, etc.)") args = parser.parse_args() concatenate_audio_moviepy(args.clips, args.output)

下面是脚本的使用方法:
$ python concatenate_audio_moviepy.py -c zoo.mp3 directed-by-robert.mp3 -o output_moviepy.mp3 MoviePy - Writing audio in output_moviepy.mp3 MoviePy - Done.

就我个人而言,在阅读一些音频文件时,我在使用 MoviePy 时遇到了一些奇怪的错误。因此,我努力使用其他方法。
方法 2:使用 WavePython连接音频文件示例:wave的优点之一是它在Python 标准库中,这意味着我们不必使用pip安装任何东西。以下函数将两个或多个wav音频文件合并为一个:
import wavedef concatenate_audio_wave(audio_clip_paths, output_path): """Concatenates several audio files into one audio file using Python's built-in wav module and save it to `output_path`. Note that extension (wav) must be added to `output_path`""" data = https://www.lsbin.com/[ ] for clip in audio_clip_paths: w = wave.open(clip,"rb") data.append([ w.getparams(), w.readframes(w.getnframes())]) w.close() output = wave.open(output_path, "wb") output.setparams(data[ 0][ 0]) for i in range(len(data)): output.writeframes(data[ i][ 1]) output.close()

这种方法是可靠的,而且速度要快得多。但是,wave库的缺点是仅wav支持扩展名,因此如果你的音频文件不是 wave 格式,请跳到第 3 种方法。
以下是使用此脚本解析命令行参数的典型argparse样板代码:
if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Simple Audio file combiner using wave module in Python") parser.add_argument("-c", "--clips", nargs="+", help="List of audio clip paths") parser.add_argument("-o", "--output", help="The output audio file, extension (wav) must be included") args = parser.parse_args() concatenate_audio_wave(args.clips, args.output)

你几乎可以使用与以前相同的脚本执行格式。
方法三:使用PyDubPython如何连接音频文件?我个人使用这种方法将多个音频文件合并为一个,因为它支持很多音频文件扩展名,并且在加载音频文件时不会产生任何奇怪的错误:
from pydub import AudioSegment from tqdm import tqdm import osdef concatenate_audio_pydub(audio_clip_paths, output_path, verbose=1): """ Concatenates two or more audio files into one audio file using PyDub library and save it to `output_path`. A lot of extensions are supported, more on PyDub's doc. """ def get_file_extension(filename): """A helper function to get a file's extension""" return os.path.splitext(filename)[ 1].lstrip(".")clips = [ ] # wrap the audio clip paths with tqdm if verbose audio_clip_paths = tqdm(audio_clip_paths, "Reading audio file") if verbose else audio_clip_paths for clip_path in audio_clip_paths: # get extension of the audio file extension = get_file_extension(clip_path) # load the audio clip and append it to our list clip = AudioSegment.from_file(clip_path, extension) clips.append(clip)final_clip = clips[ 0] range_loop = tqdm(list(range(1, len(clips))), "Concatenating audio") if verbose else range(1, len(clips)) for i in range_loop: # looping on all audio files and concatenating them together # ofc order is important final_clip = final_clip + clips[ i] # export the final clip final_clip_extension = get_file_extension(output_path) if verbose: print(f"Exporting resulting audio file to {output_path}") final_clip.export(output_path, format=final_clip_extension)

Python连接音频文件示例解析:你可能会注意到,它有点长:
  • 首先,我们编写一个辅助函数来使用 Python 获取任何文件的扩展名,我们将使用它来自动获取音频文件的扩展名,以便我们可以将其传递给 PyDub。
  • 其次,我们使用AudioSegment.from_file()需要音频路径和扩展名的方法加载音频文件。如果我们想用tqdm打印精美的进度条,我们也会用tqdm包装音频文件列表。
  • 接下来,我们使用简单的'+'运算符连接刚刚加载的那些音频文件。
  • 最后,我们使用export()方法导出生成的音频文件并将扩展名传递给format参数。
让我们解析命令行参数:
if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Simple Audio file combiner using PyDub library in Python") parser.add_argument("-c", "--clips", nargs="+", help="List of audio clip paths") parser.add_argument("-o", "--output", help="The output audio file, extension must be included (such as mp3, etc.)") args = parser.parse_args() concatenate_audio_pydub(args.clips, args.output)

让我们测试一下:
usage: concatenate_audio_pydub.py [ -h] [ -c CLIPS [ CLIPS ...]] [ -o OUTPUT]Simple Audio file combiner using PyDub library in Pythonoptional arguments: -h, --helpshow this help message and exit -c CLIPS [ CLIPS ...], --clips CLIPS [ CLIPS ...] List of audio clip paths -o OUTPUT, --output OUTPUT The output audio file, the extension must be included (such as mp3, etc.)

好吧,让我们结合2个音频文件:
$ python concatenate_audio_pydub.py -c zoo.mp3 directed-by-robert.mp3 -o output_pydub.mp3 Reading audio file: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [ 00:00< 00:00,8.40it/s] Concatenating audio: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [ 00:00< 00:00, 18.81it/s] Exporting resulting audio file to output_pydub.mp3

结论Python如何连接音频文件?就是以上这样了!希望可以帮助到你。
在以上的Python连接音频文件示例中,请注意,在第三种方法中,当你一次合并大量音频文件时,你可能会遇到export()方法上的延迟。这是正常的,但如果你希望它更快,请确保不要在一次运行中加入你的音频文件。
如何在Python中连接音频文件?顺便说一句,MoviePy 旨在处理视频而不是音频,我建议你使用第 3 种方法连接音频,使用MoviePy 连接视频,查看本教程以获取更多信息和代码。

    推荐阅读