Wizard Notes

Pythonを使った音楽信号分析の技術録、作曲活動に関する雑記

Python: PyTagLibで音楽ファイル (wav, flac, mp3, m4a, aac) のタグ情報抽出

Pythonで音楽ファイルのタグ情報を抽出するライブラリの一つとして、mutagenがあります。

www.wizard-notes.com

www.wizard-notes.com

mutagenは個々の拡張ファイルに特化したタグ抽出が可能ですが、様々な拡張子をまとめて扱う際には条件分岐が多くなってしまいます。

そこで、様々な拡張子をまとめて扱うのに優れたタグ抽出ライブラリであるPyTagLibを紹介します。

PyTagLib

PyTagLibはC++のタグ抽出ライブラリTagLibPythonラッパーです。

MP3 (ID3v1, ID3v2)だけでなく、FLAC、MPC、Speex、WavPack、TrueAudio、WAV、AIFF、MP4、ASFファイルをサポートしています。

github.com

mutagenと比較すると、より簡単にタグ情報を抽出することができます。

インストール方法

PyTagLib のインストールは、環境によっては厄介かもしれません。

Windowsの場合、単純にpip install pytaglibでインストールしようとするとErrorがでます。

インストール方法は2つあります。

1. C++ライブラリをビルド

少し難易度が高いですが、自身でTagLibをビルドするやりかたです。

詳しい手順は以下のWebページをご参考ください。

qiita.com

GitHub - supermihi/pytaglib: Python audio tagging library

2. ver. 1.4.1をインストール

以下のStack Overflowの回答では、Ubuntu 16.04 and Python 2で pip install pytaglib==1.4.1とすることでpipによるインストールができたという報告がありました。

python - Pip installing pytaglib error - Stack Overflow

私のWin10環境でもインストールできました。

使い方

抽出方法は以下のように非常に簡単に記述できます。

import taglib

filepath = "your_audiofilepath.xxx"
song = taglib.File(filepath)
song.tags # => アーティストやアルバム情報の辞書

# 例:アルバム情報を変更して保存する方法
# song.tags["ALBUM"] = ["Change"]
# song.tags.save()

デモ

同じ楽曲で拡張子のみ異なる各ファイルから、タグ情報を抽出しました。

トラックやアルバムの番号はフォーマットによって形式が異なるため、利用する際は拡張子による場合分けが必要そうです。

$python test_tablib.py
03-10 FLASH.mp3
{'ALBUM': ['Perfume The Best “P Cubed”'],
 'ARTIST': ['Perfume'],
 'DATE': ['2019-09-18'],
 'DISCNUMBER': ['3/3'],
 'TITLE': ['FLASH'],
 'TRACKNUMBER': ['10/18']}

03-10 FLASH.m4a
{'ALBUM': ['Perfume The Best “P Cubed”'],
 'ARTIST': ['Perfume'],
 'DATE': ['2019-09-18'],
 'DISCNUMBER': ['3/3'],
 'ENCODEDBY': ['Nero AAC codec / 1.5.4.0'],
 'TITLE': ['FLASH'],
 'TRACKNUMBER': ['10/18']}

03-10 FLASH.flac
{'ALBUM': ['Perfume The Best “P Cubed”'],
 'ARTIST': ['Perfume'],
 'DATE': ['2019-09-18'],
 'DISCNUMBER': ['3'],
 'DISCTOTAL': ['3'],
 'TITLE': ['FLASH'],
 'TRACKNUMBER': ['10'],
 'TRACKTOTAL': ['18']}

03-10 FLASH.wav
{'ALBUM': ['Perfume The Best “P Cubed”'],
 'ARTIST': ['Perfume'],
 'DATE': ['2019-09-18'],
 'DISCNUMBER': ['3/3'],
 'TITLE': ['FLASH'],
 'TRACKNUMBER': ['10/18']}

デモ ソースコード

# -*- Coding: utf-8 -*-
import taglib
from pprint import pprint


basename = "03-10 FLASH"
exts = [".mp3", ".m4a", ".flac", ".wav"]

for ext in exts:
    filepath = f"{basename}{ext}"
    song = taglib.File(filepath)
    
    print(filepath)
    pprint(song.tags)
    print("")

注意点

pytablibで開いている状態のオーディオファイルはロックされるため、ファイル自体の再生や編集ができません。

同様に、taglibではファイルを開く必要があるため、pytaglibを使ったプログラムを実行中は 操作対象となるオーディオファイルを操作・編集しないように注意が必要です。