【Pythonでコピペ一撃】クロスフェードでBGMを作成するサンプルコード

🚨 緊急のお知らせとお願い 🚨

いつもKotaro Studioをご覧いただき、心より感謝申し上げます。
今回、私たちの活動をさらに広げるため、音楽家人生をかけたクラウドファンディングをスタートしました。
ヒーリング音楽の世界で、より多くの人々に癒しと希望を届けるための挑戦です。皆様のお力添えがあれば、この夢を現実にすることができます。
ご支援をいただける方はもちろん、サイトをシェアしていただくだけでも大きな励みになります。また、応援の声をSNSでシェアしていただければ、私たちの士気も大きく高まります。
短い期間ではありますが、11月30日までに目標を達成し、皆様に素晴らしい音楽をお届けできるよう全力を尽くします。どうか応援をよろしくお願いいたします。

詳しく見る Xで応援 Instagramで応援
NEW

録音した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文で、実行中に表示できるようにしました。

重たいファイルだとオーディオといえども結構時間がかかるので。

コードの解説

このコードのポイントは次の通りです:

  1. from pydub import AudioSegmentpydubライブラリのAudioSegmentを使ってオーディオファイルを読み込み・編集します。
  2. crossfade_audio関数:2つのオーディオファイルを指定したクロスフェード時間で結合し、指定のフォルダに出力します。
  3. オーディオの結合とクロスフェードaudio1.append(audio2, crossfade=crossfade_duration_ms)で2つのオーディオファイルをクロスフェードで結合しています。crossfade_duration_msにはクロスフェードの長さ(ミリ秒)を指定します。
  4. 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"出力先"  # 出力ファイルの絶対パス
)