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

2021年11月17日14:25:32 发表评论 1,282 次浏览

Python如何连接音频文件?本文带你探索使用 Python 中的 MoviePy、wave 和 PyDub 库来连接两个或多个音频文件的不同方法。

如何在Python中连接音频文件?如果你想使用 Python 将两个或多个音频文件合并为一个,那么在本教程中,你将学习 3 种使用MoviePywavePyDub库在 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 连接视频,查看本教程以获取更多信息和代码。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: