split_audio.py 技術ドキュメント

プログラムの動作

split_audio.py は、長時間の音声ファイルを、人工知能モデルWhisperによって検出された文節(セグメント)に基づいて、指定された最大ファイルサイズ以下に分割して保存するPythonスクリプトです。

主な機能は以下の通りです。

  1. 音声ファイルの読み込み: 指定された入力音声ファイルを読み込みます。

  2. Whisperによるセグメント検出: OpenAIのWhisperモデルを利用して、入力音声ファイルを文字起こしし、その過程で意味のある文節の開始時刻と終了時刻(セグメント)を特定します。

  3. サイズ制限付きの分割: 検出されたセグメントを順次結合していき、合計サイズが指定された最大サイズ(MB)を超える直前で一つの出力ファイルとして保存します。これにより、分割された各ファイルは話の途中で途切れることなく、かつ指定されたサイズ制限を満たします。

  4. 出力ファイルの生成: 分割された音声チャンクを、指定された出力ディレクトリ、ファイルフォーマット、およびビットレートで保存します。

このプログラムは、特に以下の課題を解決するのに役立ちます。

  • 長大なポッドキャストや講演の録音など、ファイルサイズが大きすぎて扱いにくい音声を、文節単位で区切りながら管理しやすいサイズに分割したい場合。

  • 特定のプラットフォーム(例: アップロードサイズに制限があるSNSやコンテンツ配信サービス)に合わせたファイル分割が必要な場合。

原理

split_audio.py は、主に二つの主要なライブラリとアルゴリズムに基づいて動作します。

  1. Whisperモデルによるセグメント検出: プログラムはOpenAIが開発した音声認識モデル whisper を使用します。このモデルは、入力音声ファイルに対して文字起こしを実行し、その結果として音声が意味的に区切られた「セグメント」のリストを返します。各セグメントには、開始時間(start)と終了時間(end)がミリ秒単位で含まれています。 split_audio.py は、これらのセグメント情報を利用して、出力音声ファイルの分割点を決定します。これにより、文脈が途切れることなく、自然な区切りで音声が分割されます。

  2. pydubによる音声処理とファイルサイズ推定: 音声の読み込み、セグメントの抽出、結合、そして最終的なファイル出力は、pydub ライブラリによって行われます。pydub は内部的にFFmpegを利用してこれらの処理を効率的に実行します。

    ファイルサイズを管理するため、各音声セグメントの追加時にその推定サイズを計算します。この推定サイズは、セグメントの長さと出力ビットレートに基づいて算出されます。

    ある音声セグメント(長さ $Length_{milliseconds}$ ミリ秒)の推定ファイルサイズ(バイト)は、指定されたビットレート $bitrate_{kbps}$"128k" のような形式で指定され、kbps 単位に変換される)を使用して、以下の数式で計算されます。

    \[EstimatedSize_{bytes} = \frac{bitrate_{kbps} \times 1000}{8} \times \frac{Length_{milliseconds}}{1000}\]

    ここで、

    • $bitrate_{kbps}$ は出力ビットレート(キロビット/秒)。

    • $1000$ はキロビットをビットに変換するため、およびミリ秒を秒に変換するための係数。

    • $8$ はビットをバイトに変換するための係数(1バイト = 8ビット)。

    • $Length_{milliseconds}$ は音声セグメントの長さ(ミリ秒)。

    プログラムは、現在のチャンクにセグメントを追加するたびに合計推定サイズを更新し、この合計サイズが $max\_size\_mb$ (MB単位で指定)の閾値を超えた場合に、現在のチャンクを新しいファイルとして保存し、次のチャンクの処理を開始します。

必要な非標準ライブラリとインストール方法

このプログラムを実行するには、以下の非標準ライブラリと外部ツールが必要です。

  • Pythonライブラリ:

    • pydub: 音声ファイルを扱うためのライブラリ。

    • whisper: OpenAIの音声認識モデル。

    • PyAudio: pydub が依存する可能性のあるライブラリ(特に再生機能などで)。

    これらのPythonライブラリは、pip コマンドを使用してインストールできます。

    pip install pydub whisper PyAudio
    
  • 外部ツール:

    • ffmpeg: pydub が音声処理のバックエンドとして利用する強力なマルチメディアフレームワーク。システムにインストールし、実行パス(PATH 環境変数)に追加する必要があります。

    ffmpeg のインストール方法はOSによって異なります。

    • Linux (Debian/Ubuntu系):

      sudo apt update
      sudo apt install ffmpeg
      sudo apt-get install python3-dev libasound-dev # PyAudioの依存関係
      
    • macOS (Homebrewを使用):

      brew install ffmpeg portaudio # portaudioはPyAudioの依存関係
      
    • Windows: ffmpeg の公式ダウンロードページ(https://ffmpeg.org/download.html)からバイナリをダウンロードし、展開したディレクトリ内の bin フォルダへのパスをシステム環境変数 PATH に追加してください。

必要な入力ファイル

  • 単一の音声ファイル: プログラムは、分割対象となる単一の音声ファイルを入力として受け取ります。

  • 対応フォーマット: MP3, WAV, FLAC, M4Aなど、ffmpeg がサポートする一般的なあらゆる音声フォーマットに対応しています。

  • ファイルパス: コマンドライン引数としてファイルパスを渡します。指定しない場合のデフォルトは your_audio.mp3 です。

生成される出力ファイル

プログラムは、指定された出力ディレクトリ内に、分割された複数の音声ファイルと、実行時のログメッセージを生成します。

  • 出力ディレクトリ: デフォルトでは split_audio という名前のディレクトリが作成されます。コマンドライン引数で別のディレクトリを指定することも可能です。

  • 音声ファイル:

    • ファイル名形式: chunk_XXX.出力フォーマット の形式でファイルが生成されます。XXX はゼロ埋めされた3桁の連番(例: chunk_000.mp3, chunk_001.mp3)。

    • 内容: 入力音声ファイルが、Whisperのセグメント境界と指定された最大ファイルサイズに基づいて分割された音声チャンク。

    • フォーマットとビットレート: コマンドライン引数で指定された出力フォーマット(デフォルトは mp3)とビットレート(デフォルトは 128k)で保存されます。

コマンドラインでの使用例 (Usage)

split_audio.py は、以下の形式でコマンドラインから実行できます。

python split_audio.py [入力ファイルパス] [出力ディレクトリ] [Whisperモデルサイズ] [最大サイズMB] [出力フォーマット] [出力ビットレート]

各引数の説明とデフォルト値は以下の通りです。

  • [入力ファイルパス]:

    • 必須。分割する音声ファイルのパス。

    • デフォルト値: your_audio.mp3

  • [出力ディレクトリ]:

    • オプション。分割されたファイルが保存されるディレクトリ名。

    • デフォルト値: split_audio

  • [Whisperモデルサイズ]:

    • オプション。使用するWhisperモデルのサイズ。利用可能なサイズは base, small, medium, large などです。モデルサイズが大きいほど文字起こし精度が高まりますが、処理時間とメモリ消費も増加します。

    • デフォルト値: small

  • [最大サイズMB]:

    • オプション。各分割ファイルの最大サイズ(メガバイト単位)。

    • デフォルト値: 150 (MB)

  • [出力フォーマット]:

    • オプション。生成される音声ファイルのフォーマット(例: mp3, wav, flac)。

    • デフォルト値: mp3

  • [出力ビットレート]:

    • オプション。MP3などの圧縮フォーマットで使用されるビットレート。"128k", "192k", "64k", "320k" のように指定します。k はキロビット/秒を意味します。

    • デフォルト値: 128k

コマンドラインでの具体的な使用例

例1: 基本的な使用 (入力ファイルのみ指定)

my_long_podcast.mp3 というファイルをデフォルト設定で分割します。

python split_audio.py my_long_podcast.mp3

実行結果:

  • my_long_podcast.mp3 が入力ファイルとして処理されます。

  • 出力ディレクトリ split_audio が作成され、その中に chunk_000.mp3, chunk_001.mp3, ... のように、最大150MBのMP3ファイル(ビットレート128kbps)がWhisperのsmallモデルで検出された文節に基づいて生成されます。

例2: 全ての引数を指定

input_lecture.wav というファイルを、lecture_chunks ディレクトリに、Whisperのmediumモデルを使い、各ファイルの最大サイズを200MBとし、FLACフォーマットで、ビットレート192kbps(FLACは可逆圧縮なのでこのビットレートは設定が無視される可能性がありますが、指定は可能です)で分割します。

python split_audio.py input_lecture.wav lecture_chunks medium 200 flac 192k

実行結果:

  • input_lecture.wav が入力ファイルとして処理されます。

  • 出力ディレクトリ lecture_chunks が作成され、その中に chunk_000.flac, chunk_001.flac, ... のように、最大200MBのFLACファイル(ビットレート192kbps)がWhisperのmediumモデルで検出された文節に基づいて生成されます。

  • コンソールには、処理状況(セグメント分割、ファイル保存など)を示すメッセージが表示されます。