Python如何连接音频文件?本文带你探索使用 Python 中的 MoviePy、wave 和 PyDub 库来连接两个或多个音频文件的不同方法。
如何在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:使用 Wave
Python连接音频文件示例:wave的优点之一是它在Python 标准库中,这意味着我们不必使用pip安装任何东西。以下函数将两个或多个wav
音频文件合并为一个:
import wave
def 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 = []
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)
你几乎可以使用与以前相同的脚本执行格式。
方法三:使用PyDub
Python如何连接音频文件?我个人使用这种方法将多个音频文件合并为一个,因为它支持很多音频文件扩展名,并且在加载音频文件时不会产生任何奇怪的错误:
from pydub import AudioSegment
from tqdm import tqdm
import os
def 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 Python
optional arguments:
-h, --help show 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 连接视频,查看本教程以获取更多信息和代码。