がんばらない日常のためのヒント - an effortless life

日々をゆるーく生きるためのモノ・コトを紹介しています

オーディオファイルを複数のトラックに分割する

こんにちは、本ブログの管理人のえるです。

オーディオファイルがトラックごとに分かれていないと、ミュージック管理アプリケーションに取り込むとき困ってしまいますね。トラックごとに分割するのはQuickTime PlayerとかAudacityとか同様のアプリケーションを使えば特に難しいことではありませんが、トラック数が多いと手作業で分割するポイントを指定したりトラック名を入力するのが大変です。

まして、複数トラックの情報が「HH:MM:SS トラック名」という形式のテキストファイルのリストで与えられているならば、それをまた手作業でコピペするのは本当に無駄!

日常的に使わないアプリケーションをトラック分割のためだけにインストールするのもなんだか嫌な気持ちがします。

というわけで、Pythonを使って、トラックリストのテキストファイルに基づいてオーディオファイルを分割する簡単なスクリプトを用意してみました。(正確にはChatGPTに質問して生成してもらったコードを手直ししただけです。いい時代になったものですね。)

なお、このスクリプトを使用するには、Pythonとpydubをインストールする必要があります。Python(とpip)のインストールは他の情報源を参照してください。pydubはpipをインストールした後に以下のコマンドでインストールできます。

pip install pydub

スクリプト本体

'''
split_audio.py - Split an audit file into tracks
'''

import os
import argparse
from pydub import AudioSegment
from datetime import datetime, timedelta

def hms_to_milliseconds(hms):
    td = datetime.strptime(hms, '%H:%M:%S') - datetime.strptime("00:00:00", '%H:%M:%S')
    return td.total_seconds()*1000

if __name__ == '__main__':
    # コマンドライン引数の解析
    parser = argparse.ArgumentParser(description='Split an audio file into tracks.')
    parser.add_argument('audio_file', help='path to the audio file to split')
    parser.add_argument('track_list', help='path to the text file containing track start times and names')
    parser.add_argument('output_dir', help='path to the output directory for the split tracks')
    args = parser.parse_args()
    
    # オーディオファイルを読み込む
    audio = AudioSegment.from_file(args.audio_file)
    
    # トラックリストを読み込む
    with open(args.track_list) as f:
        track_times = [line.strip().split('\t') for line in f]
    
    # トラックを切り出す
    for i, (start_time, track_name) in enumerate(track_times):
        start_time = hms_to_milliseconds(start_time)
        if i == len(track_times) - 1:
            end_time = len(audio)
        else:
            end_time = hms_to_milliseconds(track_times[i+1][0])
        track = audio[start_time:end_time]
        output_path = os.path.join(args.output_dir, track_name + '.mp3')
        track.export(output_path, format='mp3')

コマンドラインから実行する場合は、上記のコードをsplit_audio.pyという名前のファイルに保存し、以下のように実行します。

python split_audio.py audio_file.mp3 track_list.txt output_dir/

ここで、audio_file.mp3は分割するオーディオファイルのパス、track_list.txtはトラックの開始時間とトラック名が書かれたテキストファイルのパス、output_dir/はトラックを書き込むディレクトリのパスです。

オーディオファイルのフォーマットはmp3決め打ちにしていますが、pydubが解釈できる他のフォーマットでも大丈夫なはずです。その場合、コードの'mp3'の部分は適当に書き換えてください。 トラックリストは次の形式で与えてください。*1

HH:MM:SS トラック名

00:00:00    トラック01
00:02:55    トラック02
00:05:11    トラック03
00:07:35    トラック04
...

開始時間とトラック名はタブで区切ります。pydubは時間をミリ秒で扱っていますが、人間の読むトラックリストにミリ秒が表記されていることはないと思うので、スクリプトの中では秒未満の位置をすべて000ミリ秒としています。

えるのところではこれで無事に100トラック近くが含まれたmp3ファイルを分割できました。こんなの手作業でがんばってやりたくないよー。

*1:トラック名が出力されるファイル名になりますが、ファイルシステムで使用できない文字が含まれているかどうかのチェックはさぼっているので注意してくださいね。