split_audio_with_overlap.py ドキュメント

本ドキュメントは、Pythonプログラム split_audio_with_overlap.py の機能、使用方法、および内部処理について説明します。

概要

split_audio_with_overlap.py は、指定された音声ファイルを、指定された最大サイズとオーバーラップ時間に基づいて複数のチャンクに分割し、それぞれを個別の音声ファイルとして保存するスクリプトです。これにより、大容量の音声ファイルを管理しやすいサイズに分割したり、処理負荷を軽減したりすることが可能になります。

機能

  • 音声ファイルの読み込み: 様々な形式の音声ファイル(pydub がサポートする形式)を読み込みます。

  • サイズベースの分割: 指定された最大サイズ(メガバイト)に基づき、各チャンクの長さを推定します。

  • オーバーラップ処理: 各チャンク間に指定された秒数のオーバーラップ(重複)を持たせ、分割境界での音切れを軽減します。

  • 出力ディレクトリの自動作成: 分割されたファイルを保存するための専用ディレクトリを自動的に作成します。

  • 出力形式とビットレートの指定: 出力ファイルの形式(例: mp3, wav)とビットレートを任意に指定できます。

  • コマンドライン引数での設定変更: 主要な設定値をコマンドライン引数で変更できます。

非標準ライブラリ

本プログラムは、以下の非標準ライブラリを使用しています。

  • pydub: 音声ファイルの操作(読み込み、書き出し、切り出しなど)を行うためのライブラリです。内部で ffmpeg または libav を利用します。

インストール方法

本プログラムを実行するには、まず以下のライブラリと外部ツールをインストールする必要があります。

  1. pydub のインストール

    pip を使用してインストールできます。

    pip install pydub
    
  2. ffmpeg のインストール

    pydubmp3 などの様々な音声形式を処理するために、内部で ffmpeg を利用します。お使いのオペレーティングシステムに応じた方法で ffmpeg をインストールし、システムパスが通っていることを確認してください。

    • macOS:

      brew install ffmpeg
      
    • Ubuntu/Debian:

      sudo apt update
      sudo apt install ffmpeg
      
    • Windows: ffmpeg の公式サイトからバイナリをダウンロードし、実行ファイルへのパスを環境変数 Path に追加してください。

使用方法

基本的な使い方は、入力音声ファイルを指定してスクリプトを実行することです。

python split_audio_with_overlap.py <input_audio_file> [output_format] [bitrate] [max_size_mb] [overlap_sec]

使用例

  1. デフォルト設定で音声ファイルを分割する

    audio.wav をデフォルト設定(出力形式: mp3, ビットレート: 128k, 最大サイズ: 150MB, オーバーラップ: 60 秒)で分割します。

    python split_audio_with_overlap.py audio.wav
    
  2. 出力形式を wav に指定して分割する

    audio.mp3wav 形式で分割します。その他の設定はデフォルトが適用されます。

    python split_audio_with_overlap.py audio.mp3 wav
    
  3. 出力形式とビットレートを指定して分割する

    long_audio.flacmp3 形式、192k ビットレートで分割します。

    python split_audio_with_overlap.py long_audio.flac mp3 192k
    
  4. すべての設定をコマンドラインで指定する

    podcast.oggmp3 形式、160k ビットレート、最大チャンクサイズ 100MB、オーバーラップ 30 秒で分割します。

    python split_audio_with_overlap.py podcast.ogg mp3 160k 100 30
    

引数

プログラムは以下のコマンドライン引数をサポートします。引数は指定された順序で処理されます。

  • <input_audio_file> (必須)

    • 型: 文字列

    • 説明: 分割する元の音声ファイルのパスです。

  • [output_format] (オプション)

    • 型: 文字列

    • 説明: 出力するチャンクファイルの形式です(例: mp3, wav, flac)。省略した場合、デフォルト値の mp3 が使用されます。

    • デフォルト値: mp3

  • [bitrate] (オプション)

    • 型: 文字列

    • 説明: 出力ファイルのビットレートです(例: 128k, 192k, 256k)。省略した場合、デフォルト値の 128k が使用されます。

    • デフォルト値: 128k

  • [max_size_mb] (オプション)

    • 型: 浮動小数点数

    • 説明: 各チャンクの最大サイズをメガバイト (MB) 単位で指定します。省略した場合、デフォルト値の 150 が使用されます。

    • デフォルト値: 150

  • [overlap_sec] (オプション)

    • 型: 浮動小数点数

    • 説明: 各チャンクのオーバーラップ時間(秒)を指定します。省略した場合、デフォルト値の 60 が使用されます。

    • デフォルト値: 60

設定

プログラムの冒頭で、以下の設定変数が定義されています。これらの設定は、コマンドライン引数によって上書きされない限り適用されます。

  • output_dir

    • デフォルト値: "split_fixed"

    • 説明: 分割された音声チャンクを保存するサブディレクトリの名前です。このディレクトリは、入力ファイルと同じ階層に作成されます。コマンドライン引数では変更できません。

  • output_format

    • デフォルト値: "mp3"

    • 説明: 出力ファイルの形式です。コマンドライン引数の2番目で上書き可能です。

  • bitrate

    • デフォルト値: "128k"

    • 説明: 出力ファイルのビットレートです。コマンドライン引数の3番目で上書き可能です。

  • max_size_mb

    • デフォルト値: 150

    • 説明: 各チャンクの最大サイズ(MB)です。コマンドライン引数の4番目で上書き可能です。

  • overlap_sec

    • デフォルト値: 60

    • 説明: 各チャンク間のオーバーラップ時間(秒)です。コマンドライン引数の5番目で上書き可能です。

入出力仕様

入力

  • ファイル: 必須として1つの音声ファイルパスを受け取ります。

  • 形式: pydub がサポートする任意の音声形式(例: .mp3, .wav, .flac, .ogg など)。

出力

  • 出力ディレクトリ:

    • 入力ファイルが存在するディレクトリ内に、output_dir 変数(デフォルトは split_fixed)で指定された名前のサブディレクトリが作成されます。

    • 例: 入力ファイルが /path/to/my_audio.mp3 の場合、出力ディレクトリは /path/to/split_fixed/ となります。

  • 出力ファイル:

    • 分割された各チャンクは、上記の出力ディレクトリ内に保存されます。

    • ファイル名の命名規則は <元のファイル名の本体>_<チャンク番号3桁>. <出力形式> です。

    • チャンク番号は 000 から始まり、 001, 002 と続きます。

    • 例: my_audio_000.mp3, my_audio_001.mp3, ...

  • 形式: output_format 引数(または設定)で指定された形式(例: mp3, wav)。

  • ビットレート: bitrate 引数(または設定)で指定されたビットレート。

処理フロー

split_audio_with_overlap.py は以下のステップで処理を実行します。

  1. 初期設定と引数処理:

    • プログラム冒頭でデフォルトの設定値を定義します。

    • コマンドライン引数を解析し、指定された値でデフォルト設定を上書きします。

    • 引数が不足している場合や、指定された入力ファイルが存在しない場合はエラーメッセージを表示し、終了します。

  2. 音声ファイルの読み込み:

    • 入力ファイルパスから拡張子を抽出し、pydub.AudioSegment.from_file() を使用して音声ファイルを読み込みます。

    • 音声ファイルの合計長さ(秒)を計算します。

  3. 処理情報の出力:

    • 現在の出力設定(出力ディレクトリ、フォーマット、ビットレート、オーバーラップ長、最大サイズ、音声長さ)をコンソールに出力します。

  4. 出力ディレクトリの準備:

    • 入力ファイルが存在するディレクトリのパスを取得し、その中に output_dir (デフォルト split_fixed) を結合して出力ディレクトリのパスを構築します。

    • 出力ディレクトリが存在しない場合は、os.makedirs(exist_ok=True) を使用して作成します。

  5. チャンク長の見積もり:

    • 指定されたビットレート (bitrate) をキロビット毎秒 (kbps) からバイト毎秒 (bytes_per_sec) に変換します。

    • 指定された最大サイズ (max_size_mb) をバイト単位 (max_bytes) に変換します。

    • max_bytesbytes_per_sec で割ることで、各チャンクの最大許容時間 (max_chunk_sec) を秒単位で推定します。

    • 次のチャンクの開始位置を決定するためのステップ幅 (step) を、max_chunk_sec から overlap_sec を引くことで計算します。

    • これらの推定値をコンソールに出力します。

  6. 分割処理ループ:

    • start_sec が音声ファイルの総長 duration_sec を超えるまでループを繰り返します。

    • チャンクの終了時刻の決定: 現在の start_secmax_chunk_sec を加えることで、チャンクの仮の終了時刻 end_sec を計算します。ただし、音声ファイルの総長を超えないように調整します。

    • 音声の切り出し: start_secend_sec をミリ秒に変換し、AudioSegment オブジェクトから該当する範囲の音声を切り出します。

    • ファイル保存:

      • 入力ファイルの本体名と現在のチャンクインデックス (3桁ゼロ埋め) を組み合わせて出力ファイル名を生成します。

      • 出力ディレクトリとファイル名を結合し、完全な出力パスを作成します。

      • 切り出したチャンクを、指定されたフォーマットとビットレートでファイルにエクスポートします。

      • 保存されたファイルパスとチャンクの長さをコンソールに出力します。

    • 次のチャンクへ移動: start_secstep を加算し、次のチャンクの開始位置を設定します。チャンクインデックスもインクリメントします。

  7. 完了メッセージ:

    • すべての分割処理が完了した後、完了メッセージを表示します。

    • ユーザーが ENTER キーを押すまでプログラムの終了を待機します。

エラー処理

本プログラムは以下のエラー処理を行います。

  • 引数不足:

    • コマンドライン引数が input_audio_file ひとつのみでない場合(つまり sys.argv の長さが2未満の場合)、正しい使い方を表示してプログラムを終了します。

  • ファイルの不在:

    • 指定された input_file が存在しない場合、エラーメッセージを表示してプログラムを終了します。

上記以外のファイルI/Oエラーや、pydub 内部でのエラー(例: ffmpeg が見つからない、サポートされていない形式など)が発生した場合、それぞれのライブラリやOSの機構によってエラーが報告されます。