【Pythonでコピペ一撃】クロスフェードでBGMを作成するサンプルコード
この記事の目次
録音したBGMやポッドキャストの素材をシームレスに繋げることができたら、とても便利。
もちろんDAWソフトや、マスタリングソフトで切ったり貼ったりしてもokですが、できるだけPythonを使って一撃処理した方が日常の作業が楽になります。
この記事では、Pythonを使って簡単にオーディオファイルをクロスフェードで結合する方法を解説します。
特に長時間のBGM制作や、ポッドキャスト制作などをしている方、プログラミングの力を使って音楽編集を自動化したい方におすすめです。
なぜPythonでオーディオ編集なのか?
通常、オーディオ編集ソフト(DAW)は専門的で扱いにくい部分があり、細かな編集作業には多くの時間を費やします。
しかし、Pythonを使うとコードで編集を自動化することができるため、一度設定した内容を簡単に再利用することができます。
使用するライブラリ pydub
今回使うのは、Pythonのオーディオ編集ライブラリ「pydub
」。このライブラリは、オーディオファイルのカット、結合、エフェクト付与、変換など、様々な編集がシンプルなコードで実現できます。特に、クロスフェードで2つのオーディオをつなげる操作はとても簡単です。
まずは、pydub
ライブラリをインストールしましょう。
pip install pydub
クロスフェードのためのオーディオファイルを準備
まずは結合したい2つのオーディオファイルを用意しましょう。
今回は以下の2つのファイルを例として使います。
- ファイル1:
ファイル名.wav
- ファイル2:
ファイル名.wav
これらのファイルがあるフォルダを絶対パスで指定して編集します。
from pydub import AudioSegment
def crossfade_audio(file1, file2, crossfade_duration_ms, output_file):
"""
2つのオーディオファイルを指定したクロスフェード時間でつなげます。
Parameters:
file1 (str): 最初のオーディオファイルへの絶対パス
file2 (str): 2番目のオーディオファイルへの絶対パス
crossfade_duration_ms (int): クロスフェードする時間(ミリ秒)
output_file (str): 出力ファイルの絶対パス
"""
print("実行中・・・")
# オーディオファイルの読み込み
audio1 = AudioSegment.from_file(file1)
audio2 = AudioSegment.from_file(file2)
# クロスフェードでオーディオを結合
combined = audio1.append(audio2, crossfade=crossfade_duration_ms)
# 出力ファイルにエクスポート(MP3, 320kbps)
combined.export(output_file, format="mp3", bitrate="320k")
print("クロスフェードでオーディオファイルの統合が完了しました。")
# 使用例(フルパス指定)
crossfade_audio(
r"あなたの絶対パス.wav",
r"あなたの絶対パス.wav",
5000, # クロスフェードの時間(ミリ秒)
r"出力先フォルダの絶対パス"
)
どんなオーディオファイルを読み込んでもmp3の320kbpsで出力するように設定しています。
また、print文で、実行中に表示できるようにしました。
重たいファイルだとオーディオといえども結構時間がかかるので。
コードの解説
このコードのポイントは次の通りです:
from pydub import AudioSegment
:pydub
ライブラリのAudioSegment
を使ってオーディオファイルを読み込み・編集します。crossfade_audio
関数:2つのオーディオファイルを指定したクロスフェード時間で結合し、指定のフォルダに出力します。- オーディオの結合とクロスフェード:
audio1.append(audio2, crossfade=crossfade_duration_ms)
で2つのオーディオファイルをクロスフェードで結合しています。crossfade_duration_ms
にはクロスフェードの長さ(ミリ秒)を指定します。 combined.export
:結合したオーディオをMP3の320kbpsの高音質で出力します。
PowerShellで実行
次に、このPythonスクリプトをPowerShellで実行します。
まずはPowerShellを開き、以下のコマンドを実行してください。
python "C:\Users\User\あなたのパス.py"
最近プログラムコードはNotepad++というアプリを使っています。
非常に軽量で使いやすくて便利。
VSCODEなんかが主流だと思いますが、より軽量でシンプルな方が使いやすいのでおすすめです。
指定したフォルダ全体をクロスフェードでつなげる
ここからは、指定されたフォルダ内のすべてのオーディオファイルをクロスフェードで結合し、長時間BGMを作成するコードを紹介します。
このコードは、フォルダ内のファイルを順番に読み込み、指定されたクロスフェード時間でつなげていきます。
ソートはファイル名の昇順で行われるため、ファイルの順番を変えたい場合はファイル名を調整してください。
import os
from pydub import AudioSegment
def crossfade_folder(input_folder, crossfade_duration_ms, output_file):
"""
指定したフォルダ内のすべてのオーディオファイルをクロスフェードでつなげ、長時間BGMを作成します。
Parameters:
input_folder (str): オーディオファイルが含まれるフォルダへの絶対パス
crossfade_duration_ms (int): クロスフェードする時間(ミリ秒)
output_file (str): 出力ファイルの絶対パス
"""
print("実行中・・・")
# 指定したフォルダ内のすべてのファイルを取得
files = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith(('.wav', '.mp3', '.flac'))]
files.sort() # ファイルを名前順にソート
# 最初のオーディオファイルを読み込み
combined_audio = AudioSegment.from_file(files[0])
# 残りのファイルを順番に結合(クロスフェード)
for file in files[1:]:
print(f"ファイルを追加中: {file}")
next_audio = AudioSegment.from_file(file)
combined_audio = combined_audio.append(next_audio, crossfade=crossfade_duration_ms)
# 出力ファイルにエクスポート(MP3, 320kbps)
combined_audio.export(output_file, format="mp3", bitrate="320k")
print("クロスフェードでオーディオファイルの統合が完了しました。")
# 使用例(フルパス指定)
crossfade_folder(
r"統合したいオーディオファイル", # オーディオファイルが含まれるフォルダへの絶対パス
5000, # クロスフェードの時間(ミリ秒)
r"C:\Users\User\Documents\AUDIO FILE\output_long_bgm.mp3" # 出力ファイルの絶対パス
)
これで、完成です。
めっちゃ簡単ですし、楽にBGMをつなげられるようになりました。
pydub
は.wav
、.mp3
、.flac
に対応していますが、他のフォーマットを使用する場合は.endswith
に追加する必要があります。
フォルダ内のオーディオファイルをすべてMP3 320kbpsに変換する方法については、音楽家育成塾をご覧ください。
エラー・デバッグ
ファイルを開く際に「無効なデータが見つかった」と表示されることがあります。
これは、オーディオファイルが正しく読み込めない、もしくは処理に問題があるときに発生します。
例えば、Macで作成された音源などの場合は、ファイル名に「._
」が含まれていることがあり、これはMacで生成されるメタデータファイルである可能性があります。
通常、これらのファイルはオーディオデータを持たず、不要なものです。
.wav
ファイルに加えて「._
」で始まるファイルがある場合、無視しても問題ありません。
これらのファイルを削除するか、リストから除外します。
コードを修正して、不要なファイルを無視するようにしましょう。
import os
from pydub import AudioSegment
def crossfade_folder(input_folder, crossfade_duration_ms, output_file):
print("実行中・・・")
# 指定したフォルダ内のすべてのファイルを取得し、「._」で始まるファイルを除外
files = [os.path.join(input_folder, f) for f in os.listdir(input_folder)
if f.endswith(('.wav', '.mp3', '.flac')) and not f.startswith("._")]
files.sort()
if not files:
print("有効なオーディオファイルが見つかりませんでした。")
return
# 最初のオーディオファイルを読み込み
combined_audio = AudioSegment.from_file(files[0])
# 残りのファイルを順番に結合(クロスフェード)
for file in files[1:]:
print(f"ファイルを追加中: {file}")
next_audio = AudioSegment.from_file(file)
combined_audio = combined_audio.append(next_audio, crossfade=crossfade_duration_ms)
# 出力ファイルにエクスポート(MP3, 320kbps)
combined_audio.export(output_file, format="mp3", bitrate="320k")
print("クロスフェードでオーディオファイルの統合が完了しました。")
# 使用例(フルパス指定)
crossfade_folder(
r"あなたのパス", # オーディオファイルが含まれるフォルダへの絶対パス
5000, # クロスフェードの時間(ミリ秒)
r"出力先" # 出力ファイルの絶対パス
)