Help us understand the problem. What is going on with this article?

pythonのlibrosaでサクッと音声波形を表示する

More than 1 year has passed since last update.

librosa

librosaは音声処理・音楽情報処理を行うときに使えるpythonのpackageです。

手っ取り早くmp3音源の波形を眺めたいなと考えたときにこちらの記事を見つけて、手軽そうなので試してみました。

2016年当時の記事を見てコードを書くと AttributeError: module 'librosa' has no attribute 'display' エラーが出てハマるので、解決方法を書きます。

TL;DR

librosaはversion 0.5.0から displayモジュールを読み込まなくなりました。displayモジュールを利用する場合には明示的にimportする必要があります。

import librosa
import librosa.display # この行が必要

a, sr = librosa.load('test.mp3')
librosa.display.waveplot(a, sr)

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54
$ python --version
Python 3.7.2
$ pip list | grep librosa
librosa      0.6.3

次のようなコードとmp3ファイルを用意します。

main.py
import librosa

a, sr = librosa.load('test.mp3')
librosa.display.waveplot(a, sr)

実行

$ python main.py
Traceback (most recent call last):
  File "main.py", line 10, in <module>
    main()
  File "main.py", line 6, in main
    librosa.display.waveplot(a[0])
AttributeError: module 'librosa' has no attribute 'display'

librosa.displayなんて無いよとエラーが出ました。

確認

実際にlibrosa.displayが存在しないのか確認してみます。

$ python
Python 3.7.2 (default, Feb 12 2019, 08:15:36)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import librosa
>>> dir(librosa)
['A_weighting', 'LibrosaError', 'ParameterError', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'amplitude_to_db', 'audio', 'autocorrelate', 'beat', 'cache', 'chirp', 'clicks', 'constantq', 'core', 'cqt', 'cqt_frequencies', 'db_to_amplitude', 'db_to_power', 'decompose', 'dtw', 'effects', 'estimate_tuning', 'feature', 'fft_frequencies', 'fill_off_diagonal', 'filters', 'fmt', 'frames_to_samples', 'frames_to_time', 'get_duration', 'harmonic', 'hybrid_cqt', 'hz_to_mel', 'hz_to_midi', 'hz_to_note', 'hz_to_octs', 'icqt', 'ifgram', 'iirt', 'interp_harmonics', 'istft', 'load', 'magphase', 'mel_frequencies', 'mel_to_hz', 'midi_to_hz', 'midi_to_note', 'note_to_hz', 'note_to_midi', 'octs_to_hz', 'onset', 'output', 'pcen', 'perceptual_weighting', 'phase_vocoder', 'piptrack', 'pitch', 'pitch_tuning', 'power_to_db', 'pseudo_cqt', 're', 'resample', 'salience', 'samples_like', 'samples_to_frames', 'samples_to_time', 'segment', 'sequence', 'show_versions', 'spectrum', 'stft', 'tempo_frequencies', 'time_frequency', 'time_to_frames', 'time_to_samples', 'times_like', 'to_mono', 'tone', 'util', 'version', 'warnings', 'zero_crossings']

ちょっと横に長くなってしまって見づらいですが、確かにlibrosaはdisplay attributeを持っていません。

実際に読み込まれているコードを見ると、このあたりでサブモジュールを読み込んでいます。しかしdisplayをimportしている様子はありません。

# And all the librosa sub-modules
from ._cache import cache
from . import core
from . import beat
from . import decompose
from . import effects
from . import feature
from . import filters
from . import onset
from . import output
from . import segment
from . import sequence
from . import util

公式ドキュメントを探してみてもそれらしい原因は見当たらりません。

原因

なにがあったかというと、このコミットで読み込まないように変更があったようです。

そのあたりの議論がこのissueでされています。

We use librosa for signal processing only and use our own visualization tools when needed, but in production, where no visualization in python is needed, we really don't want to install and import matplotlib.

(翻訳)私達はlibrosaを信号処理用途でだけ使っていて、可視化する必要があるときは別のツールを適宜使っている。可視化の必要がないときにもmatplotlibがimportされるなんてごめんだ。

議論からの引用ですが、これに尽きるかなと思います。

この議論の結果、 以前は次のように一行でdisplay submoduleまで読み込んでいたのですが、

import librosa

librosa.displayを利用する際には2行importが必要になりました。
librosaで可視化を利用しない場合には2行目は不要です。

import librosa
import librosa.display # この行が必要

この変更は v0.5.0から反映されています。
librosaのversionはpipで確認できます。

$ pip show librosa | grep Version
Version: 0.6.3 # 0.5.0以上

波形を表示

最終的にはこんな感じで、matplotlib.pyplot.show でグラフを表示させてやります。

import librosa
import librosa.display

a, sr = librosa.load('test.mp3')
librosa.display.waveplot(a, sr=sr)

import matplotlib.pyplot as plt
plt.show()

figure1.png

できました✌

参考

https://qiita.com/tackey/items/225fdb5f07f2033377fa
https://librosa.github.io/librosa/
https://github.com/librosa/librosa

amuyikam
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away