concatenate_audio_moviepy.py
from moviepy.editor import concatenate_audioclips, AudioFileClip
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)
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)
concatenate_audio_wave.py
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()
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)
concatenate_audio_pydub.py
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)
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)