to_audio.py 技術ドキュメント

プログラムの動作

to_audio.py は、様々な形式の音声ファイルや動画ファイルから音声トラックを抽出し、指定されたオーディオ形式に変換して出力するためのPythonスクリプトです。主に pydub ライブラリと ffmpeg を利用して、柔軟なファイル変換機能を提供します。

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

  • 汎用的な入力対応: ffmpeg がサポートするあらゆる音声・動画ファイルを入力として受け付け、音声トラックを抽出できます。

  • 出力フォーマットの指定: MP3、WAVなど、様々な出力オーディオフォーマットを指定できます。デフォルトはMP3です。

  • ビットレートの調整: 出力オーディオのビットレートを制御し、ファイルサイズと音質のバランスを調整できます。

  • サンプリングレートの変更: 必要に応じて出力オーディオのサンプリングレートを変更できます。

  • ファイルの上書き/更新制御: 出力ファイルが既に存在する場合に、無条件に上書きしたり (--overwrite)、入力ファイルが新しい場合のみ更新したり (--update) するオプションを提供します。

  • ワイルドカード対応: 入力ファイルパスにワイルドカード(例: *.mp4)を使用することで、複数のファイルを一括処理できます。

このプログラムは、例えば動画ファイルからBGMのみを抽出したい場合や、異なるデバイスで再生するためにオーディオファイルの形式や品質を変換したい場合などの課題を解決します。

原理

to_audio.py は、Pythonのpydubライブラリを中核として動作します。pydubは、内部的に強力なマルチメディアフレームワークであるffmpegを利用して、実際の音声処理を実行します。

  1. ファイル読み込み: AudioSegment.from_file(input_path) メソッドが呼び出されると、pydub は入力ファイルの種類(音声か動画か、どのフォーマットか)を自動的に判断し、ffmpeg を用いてそのファイルから音声データをデコードします。この際、動画ファイルであっても音声トラックのみが抽出されます。

  2. サンプリングレートの変更 (オプション): --samplerate オプションが指定された場合、抽出された AudioSegment オブジェクトに対して audio.set_frame_rate(sample_rate) メソッドが適用されます。これにより、音声データは指定されたサンプリングレートに再サンプリングされます。 音声のデジタル化では、アナログ信号を一定時間間隔でサンプリングし、その振幅を数値化(量子化)します。サンプリングレート \(F_s\) は、1秒間に行われるサンプルの数を表し、音の高さ方向の再現性(周波数応答)に影響を与えます。 ナイキスト=シャノンのサンプリング定理によれば、アナログ信号の周波数成分 \(f_{max}\) を完全にデジタル化するためには、サンプリングレート \(F_s\)\(2f_{max}\) 以上である必要があります。 $\(F_s \ge 2f_{max}\)$ 一般的に、人間の可聴周波数上限は約20kHzであるため、CD品質の音声では44.1kHzや48kHzといったサンプリングレートが用いられます。

  3. ファイル書き出し: 最後に、audio.export(output_path, format=format, bitrate=bitrate) メソッドを使用して、処理された音声データを指定されたフォーマットとビットレートでファイルにエンコードし、書き出します。このプロセスもffmpegによって実行されます。 ビットレート \(B\) は、1秒間の音声データを表現するために使用されるビット数を指します。一般的に、ビットレートが高いほど音質は向上しますが、ファイルサイズも大きくなります。例えば、192kbpsのMP3は、1秒あたり192キロビットのデータで音声を表現します。

pydub は、ffmpegへのコマンドライン引数を適切に生成し、その実行結果をPythonプログラムから制御することで、ユーザーに対して使いやすいインターフェースを提供しています。

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

to_audio.py を実行するには、以下の非標準Pythonライブラリと外部プログラムが必要です。

  1. pydub: 音声ファイルの操作を容易にするライブラリです。

  2. PyAudio: pydub が音声再生機能を提供する際に使用されますが、本スクリプトの直接的な実行には必須ではありません。ただし、エラーメッセージでインストールを推奨されているため、インストールを推奨します。

  3. ffmpeg: オーディオ/ビデオファイルを処理するためのオープンソースのマルチメディアフレームワークです。pydub は内部的に ffmpeg を使用します。

インストール方法は以下の通りです。

Pythonライブラリのインストール

pip install pydub PyAudio

ffmpeg のインストール

ffmpeg はシステムにインストールし、その実行ファイルがシステムの PATH 環境変数に含まれている必要があります。

Linuxの場合

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の場合

  1. ffmpeg の公式ダウンロードページ (https://ffmpeg.org/download.html) からビルド済みのバイナリをダウンロードします。

  2. ダウンロードしたZIPファイルを解凍し、bin ディレクトリ(例: ffmpeg-x.x.x-full_build/bin)を任意の場所に配置します。

  3. この bin ディレクトリへのパスをシステムの環境変数 PATH に追加します。

必要な入力ファイル

プログラムは、ffmpeg がサポートするあらゆる音声ファイルおよび動画ファイルを入力として受け付けることができます。

  • 音声ファイル: MP3, WAV, FLAC, OGG, M4A, AACなど

  • 動画ファイル: MP4, AVI, MKV, MOV, WMVなど (この場合、音声トラックのみが抽出されます)

入力ファイルパスには、シェルが展開可能なワイルドカード(例: *.mp4)を含めることができます。これにより、複数のファイルを一度に処理することが可能です。

生成される出力ファイル

プログラムは、変換された音声データを指定された形式でファイルに保存します。

  • ファイル名:

    • --output (-o) オプションが指定された場合、そのパスがそのまま出力ファイル名として使用されます。

    • --output (-o) オプションが省略された場合、入力ファイル名から拡張子を目的のフォーマットの拡張子(例: .mp3, .wav)に変更したものが自動的に生成されます。 例: input.mp4 をMP3に変換する場合、input.mp3 が生成されます。

  • 内容: 入力ファイルから抽出・変換された音声データが格納されます。出力ファイルのフォーマット、ビットレート、およびサンプリングレートは、コマンドライン引数で指定された値に従います。

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

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

python3 to_audio.py <入力ファイルパス> [オプション]

利用可能なオプションは以下の通りです。

  • <入力ファイルパス>:

    • 必須。変換する音声または動画ファイルのパスを指定します。ワイルドカードも使用可能です。

  • -f <フォーマット>, --format <フォーマット>:

    • 出力オーディオファイルのフォーマットを指定します。

    • デフォルト: mp3

    • 例: wav, flac, aac

  • -o <パス>, --output <パス>:

    • 出力ファイルのパスを指定します。

    • 省略した場合、入力ファイル名から拡張子を変更して自動生成されます。

    • 複数の入力ファイルを処理する場合に -o を指定すると、すべての入力が指定された単一の出力ファイルに結合されるか、または最後のファイルのみが処理される可能性があります。個別の出力を意図する場合は通常省略します。

  • -b <ビットレート>, --bitrate <ビットレート>:

    • 出力MP3ファイルのビットレートを指定します。

    • デフォルト: 192k

    • 例: 128k, 256k, 320k

  • -r <サンプリングレート>, --samplerate <サンプリングレート>:

    • 出力オーディオのサンプリングレートをHz単位で指定します。

    • オプション。省略した場合、入力ファイルのサンプリングレートが維持されます。

    • 例: 44100, 48000

  • --update <0|1>:

    • 出力ファイルが既に存在する場合に、入力ファイルの更新日時が出力ファイルの更新日時よりも新しい場合のみ変換を実行します。

    • 1 で有効化、0 で無効化。

    • デフォルト: 0

  • --overwrite <0|1>:

    • 出力ファイルが既に存在する場合でも、無条件に上書きして変換を実行します。

    • 1 で有効化、0 で無効化。

    • デフォルト: 0

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

例1: MP4動画からMP3音声を抽出し、ビットレートを指定する

python3 to_audio.py video.mp4 -f mp3 -o output_audio.mp3 -b 256k

このコマンドは、video.mp4 という動画ファイルから音声を抽出し、output_audio.mp3 というファイル名でMP3形式として保存します。出力MP3のビットレートは256kbpsに設定されます。

実行結果の説明: video.mp4 から音声トラックが読み込まれ、256kbpsのMP3としてエンコードされます。処理が完了すると、カレントディレクトリに output_audio.mp3 が生成されます。

例2: 複数のWAVファイルをFLAC形式に変換し、更新する場合のみ処理

python3 to_audio.py "audio_files/*.wav" -f flac --update 1

このコマンドは、audio_files/ ディレクトリ内のすべての .wav ファイルを対象に、FLAC形式に変換します。例えば audio_files/song1.wavaudio_files/song1.flac として出力されます。 --update 1 オプションが指定されているため、もし audio_files/song1.flac が既に存在する場合、song1.wav の方が新しい場合にのみ変換が実行され、そうでなければスキップされます。

実行結果の説明: audio_files/ 内のすべての .wav ファイルが順に処理されます。各 .wav ファイルに対応する .flac ファイルが生成されますが、既に .flac ファイルが存在し、かつ元の .wav ファイルよりも新しい場合は、変換は行われず「更新しません」というメッセージが表示されます。そうでない場合、変換が実行され新しい .flac ファイルが作成されます。

例3: 既存のMP3ファイルを別のサンプリングレートで上書き変換

python3 to_audio.py original.mp3 -f mp3 -r 44100 --overwrite 1

このコマンドは、original.mp3 を読み込み、サンプリングレートを44.1kHzに再設定した上で、同じファイル名 original.mp3 に上書き保存します。 --overwrite 1 オプションにより、出力ファイルが既に存在しても警告なしに上書きされます。

実行結果の説明: original.mp3 が読み込まれ、サンプリングレートが44100Hzに変更されます。その後、既存の original.mp3 が上書きされ、新しいサンプリングレートが適用されたMP3ファイルに置き換えられます。