Pythonでの音声ファイルメタデータ操作
Pythonは、音声ファイルのメタデータを取得、編集、追加するための強力なツールを提供します。これらのメタデータは、アーティスト名、アルバム名、トラック番号、ジャンル、カバーアートなど、音声ファイルに関する情報を含みます。この情報は、メディアプレーヤーでの整理や検索、再生リストの作成に不可欠です。Pythonを使用することで、これらのメタデータをプログラム的に管理し、大量のファイルを効率的に処理することが可能になります。
主要なライブラリ
Pythonで音声ファイルのメタデータを操作するための主要なライブラリはいくつか存在します。それぞれのライブラリは、特定のファイル形式やメタデータタグの形式に特化している場合もありますが、一般的に広く利用されているのは以下のライブラリです。
Mutagen
Mutagenは、MP3、FLAC、Ogg Vorbis、M4A(MP4オーディオ)、WMAなどの様々なオーディオファイル形式のメタデータを扱うための、最も人気があり、機能豊富なライブラリの一つです。Mutagenは、ID3タグ(MP3で一般的に使用)、Vorbisコメント(Ogg VorbisおよびFLAC)、MP4メタデータ(M4A)など、様々なタグ形式をサポートしています。
Mutagenの利点は、その柔軟性と、多様なメタデータフィールドへのアクセスを可能にする点にあります。例えば、アーティスト、アルバム、タイトルといった基本的な情報だけでなく、作曲者、レーベル、リリース年、さらにはカスタムタグまで取得・編集できます。また、カバーアートの埋め込みや抽出もサポートしています。
Mutagenを使用したメタデータ操作の基本的な流れは以下のようになります。
1. **ファイルの読み込み**: `mutagen.File()` 関数を使用して、音声ファイルを読み込みます。
2. **メタデータの取得**: 読み込んだファイルオブジェクトから、`tags` 属性を介してメタデータにアクセスします。タグの形式に応じて、辞書のようなインターフェースや、特定のオブジェクトを通じてメタデータフィールドにアクセスできます。
3. **メタデータの編集**: 取得したメタデータオブジェクトを直接編集し、新しい値を追加したり、既存の値を変更したりします。
4. **ファイルの保存**: 編集したメタデータをファイルに保存するには、ファイルオブジェクトの `save()` メソッドを呼び出します。
例として、MP3ファイルのタイトルとアーティストを変更するコードを以下に示します。
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, TIT2, TPE1
audio = MP3("sample.mp3")
# ID3タグが存在しない場合は作成
if audio.tags is None:
audio.add_tags()
# タイトルとアーティストを変更
audio.tags.add(TIT2(encoding=3, text="新しいタイトル"))
audio.tags.add(TPE1(encoding=3, text="新しいアーティスト"))
# 変更を保存
audio.save()
この例では、`mutagen.mp3.MP3` クラスを使用してMP3ファイルを読み込み、`mutagen.id3.TIT2`(タイトル)と `mutagen.id3.TPE1`(アーティスト)を使用してタグを操作しています。`encoding=3` はUTF-8エンコーディングを示しており、多くの言語に対応するために推奨されます。
Pydub
Pydubは、音声ファイルの操作(分割、結合、フォーマット変換など)に特化したライブラリですが、メタデータの操作も限定的にサポートしています。Pydubは、ffmpegまたはlibavをバックエンドとして使用するため、これらのツールがシステムにインストールされている必要があります。
Pydubでメタデータを操作する場合、通常は、`AudioSegment` オブジェクトを取得した後に、`export()` メソッドの引数としてメタデータを指定する形になります。これは、新しいファイルとしてエクスポートする際にメタデータを付与する、というアプローチです。
例:
from pydub import AudioSegment
from pydub.utils import get_settings
# ffmpegのパスを設定(必要に応じて)
# get_settings()['ffmpeg'] = '/path/to/ffmpeg'
audio = AudioSegment.from_file("sample.wav")
# メタデータ辞書を作成
metadata = {
"artist": "サンプルアーティスト",
"album": "サンプルアルバム",
"title": "サンプルトラック",
"genre": "Rock",
"track": 1,
"date": "2023"
}
# メタデータを付与してエクスポート
audio.export("output_with_metadata.mp3", format="mp3", parameters=["-metadata", f"artist={metadata['artist']}", "-metadata", f"album={metadata['album']}"])
Pydubは、ffmpegのコマンドラインオプションを直接操作する形でメタデータを付与します。このため、Mutagenのように直接タグを読み書きするよりも、やや間接的な操作になります。しかし、音声処理とメタデータ付与を一つのワークフローで行いたい場合には便利です。
メタデータ操作の応用例
Pythonによる音声ファイルメタデータ操作は、様々な場面で活用できます。
一括リネームと整理
大量の音声ファイルを、メタデータに基づいて自動的にリネームしたり、フォルダ分けしたりすることができます。例えば、アーティスト名とアルバム名を使って「アーティスト名/アルバム名/トラック番号 – タイトル.mp3」のようなファイル構造を作成することが可能です。
“`python
import os
from mutagen.mp3 import MP3
from mutagen.id3 import TIT2, TPE1, TRCK, TALB
def organize_music(music_dir):
for root, _, files in os.walk(music_dir):
for file in files:
if file.endswith(“.mp3”):
filepath = os.path.join(root, file)
try:
audio = MP3(filepath)
tags = audio.tags
if tags:
artist = tags.get(“TPE1”, [“Unknown Artist”])[0]
album = tags.get(“TALB”, [“Unknown Album”])[0]
title = tags.get(“TIT2”, [“Unknown Title”])[0]
track = tags.get(“TRCK”, [“00”])[0]
# ファイル名からトラック番号を抽出(例: “01 – Song.mp3” -> “01”)
if isinstance(track, str) and track.split(‘ ‘)[0].isdigit():
track_num = track.split(‘ ‘)[0].zfill(2)
else:
track_num = “00”
new_filename = f”{track_num} – {title}.mp3″
new_dir = os.path.join(music_dir, artist, album)
# ディレクトリを作成
os.makedirs(new_dir, exist_ok=True)
new_filepath = os.path.join(new_dir, new_filename)
os.rename(filepath, new_filepath)
print(f”Renamed: {file} to {new_filepath}”)
except Exception as e:
print(f”Error processing {filepath}: {e}”)
# 音楽ファイルが保存されているディレクトリを指定
# organize_music(“/path/to/your/music”)
“`
このスクリプトは、指定されたディレクトリ内のMP3ファイルを走査し、アーティスト、アルバム、トラック番号、タイトルのメタデータを取得します。そして、それらの情報に基づいて新しいディレクトリ構造(アーティスト/アルバム/)を作成し、ファイルを移動・リネームします。
メタデータの自動補完
ローカルに保存されている音声ファイルの一部にメタデータが欠けている場合、オンラインの音楽データベース(例:MusicBrainz、Discogs)と連携して、メタデータを自動的に取得・補完することが可能です。これは、MusicBrainz APIなどを利用するPythonライブラリ(`musicbrainzngs`など)と組み合わせることで実現できます。
“`python
import musicbrainzngs
from mutagen.mp3 import MP3
from mutagen.id3 import TIT2, TPE1, TALB, TDRC, TCON
# MusicBrainzの認証設定
musicbrainzngs.set_user_agent(“MyAppName”, “1.0”, “myemail@example.com”)
def get_and_set_metadata(filepath):
try:
audio = MP3(filepath)
if audio.tags is None:
audio.add_tags()
title = audio.tags.get(“TIT2”, [None])[0]
artist = audio.tags.get(“TPE1”, [None])[0]
album = audio.tags.get(“TALB”, [None])[0]
if not title or not artist or not album:
print(f”Searching for metadata for: {filepath}”)
# ファイル名やその他の情報から検索(より高度な実装が必要)
# ここでは簡易的にファイル名から検索する例を示す
base_name = os.path.splitext(os.path.basename(filepath))[0]
results = musicbrainzngs.search_recordings(query=base_name, limit=1)
if results and results[“recordings”]:
recording = results[“recordings”][0]
mb_title = recording[“title”]
mb_artist = recording[“artists”][0][“name”] if recording.get(“artists”) else “Unknown Artist”
mb_album = “Unknown Album” # アルバム情報は recording から直接取得しにくい場合がある
if recording.get(“releases”):
mb_album = recording[“releases”][0][“title”]
print(f”Found: Title='{mb_title}’, Artist='{mb_artist}’, Album='{mb_album}'”)
# メタデータを更新
audio.tags.add(TIT2(encoding=3, text=mb_title))
audio.tags.add(TPE1(encoding=3, text=mb_artist))
audio.tags.add(TALB(encoding=3, text=mb_album))
# 必要に応じてリリース年やジャンルも取得
if recording.get(“date”):
audio.tags.add(TDRC(encoding=3, text=recording[“date”]))
if recording.get(“genres”):
audio.tags.add(TCON(encoding=3, text=recording[“genres”][0][“name”]))
audio.save()
print(f”Metadata updated for: {filepath}”)
else:
print(“No metadata found.”)
else:
print(f”Metadata already exists for: {filepath}”)
except Exception as e:
print(f”Error processing {filepath}: {e}”)
# 音楽ファイルが保存されているディレクトリを指定
# music_directory = “/path/to/your/music”
# for filename in os.listdir(music_directory):
# if filename.endswith(“.mp3”):
# get_and_set_metadata(os.path.join(music_directory, filename))
“`
この例は、ファイルにタイトル、アーティスト、アルバムのいずれかが欠けている場合に、MusicBrainzにクエリを送信して情報を取得し、メタデータを更新します。実際の運用では、より堅牢な検索ロジックやエラーハンドリングが必要になります。
カスタムメタデータの管理
一部のファイル形式では、標準的なタグフィールドに加えて、カスタムタグを保存することができます。これにより、独自の分類や情報を音声ファイルに関連付けることが可能になります。Mutagenのようなライブラリは、これらのカスタムタグにもアクセスし、操作する機能を提供します。
注意点とベストプラクティス
* **ファイル形式の互換性**: すべてのライブラリがすべてのファイル形式とすべてのメタデータタグ形式を完全にサポートしているわけではありません。使用するライブラリが、対象とする音声ファイル形式とメタデータタグ(ID3v1, ID3v2, MP4 atoms, Vorbis commentsなど)に対応しているか確認してください。
* **エンコーディング**: メタデータ文字列のエンコーディングは重要です。特に、非ASCII文字(日本語など)を扱う場合は、UTF-8などの適切なエンコーディングを使用するように注意してください。Mutagenでは、タグオブジェクトを作成する際に `encoding` パラメータを指定することが一般的です。
* **バックアップ**: メタデータの変更は、元のファイルを上書きします。重要なファイルを扱う場合は、必ず事前にバックアップを取るようにしてください。
* **エラーハンドリング**: ファイルの破損、メタデータタグの形式エラー、ライブラリの制約など、予期せぬ問題が発生する可能性があります。`try-except` ブロックを使用して、これらのエラーを適切に処理し、スクリプトの堅牢性を高めることが重要です。
* **パフォーマンス**: 大量のファイルを処理する場合、パフォーマンスが問題になることがあります。ファイルを開いたり閉じたりする操作はリソースを消費するため、可能な限り効率的なコードを記述するように心がけましょう。例えば、一度に複数のファイルを処理するのではなく、バッチ処理を検討したり、不要なファイル操作を削減したりします。
* **ライブラリの選択**: 目的とする操作とファイル形式に応じて、最適なライブラリを選択することが重要です。単にメタデータを読み書きしたいだけであればMutagenが適していますが、音声処理とメタデータ付与を同時に行いたいのであればPydub(ffmpegとの連携)が有用です。
まとめ
Pythonは、音声ファイルのメタデータを効率的かつ柔軟に操作するための強力なエコシステムを提供しています。Mutagenのようなライブラリは、ID3タグ、Vorbisコメント、MP4メタデータなど、多様なタグ形式をサポートし、メタデータの取得、編集、追加を容易にします。Pydubは、音声処理とメタデータ付与を組み合わせたワークフローに適しています。これらのツールを活用することで、音声ライブラリの整理、情報の一括更新、カスタムメタデータの管理など、さまざまなタスクを自動化できます。メタデータ操作は、デジタルメディアライブラリの管理において、非常に価値のあるスキルとなります。
