音声データの処理や解析は、機械学習や音楽情報処理、音声認識などの分野で非常に重要なスキルです。Python
には音声処理を簡単に行うためのライブラリがいくつかありますが、その中でもlibrosa
は、音声データの読み込み、分析、可視化が可能な強力なツールです。本記事では、librosaを使って音声データを解析し、特徴量の抽出や可視化を行う方法について紹介します。
librosaとは?
librosa
は、Python
で音楽や音声信号を処理・分析するためのライブラリです。音声データを簡単に読み込み、スペクトログラムの生成、ピッチやテンポの解析、リズムや調の検出など、音声処理に必要なさまざまな機能を提供しています。音声認識や音楽データの解析に広く利用されています。
librosaの主な機能
- 音声データの読み込みと再生
- スペクトログラム、メルスペクトログラム、クロマ特徴の生成
- 音声のピッチ、テンポ、ビートの検出
- 音声データの時間・周波数特性の解析
- 音声の可視化
librosaのインストール
librosaは、以下のコマンドでインストールできます。
pip install librosa
また、音声データの可視化にはmatplotlib
も使用するので、こちらもインストールしておきましょう。
pip install matplotlib
音声データの読み込み
まず、librosaを使って音声データを読み込みます。librosaのload()
関数を使うと、音声ファイルをサンプルデータ(波形)とサンプリングレートとして読み込むことができます。
音声データの読み込み
import librosa
# 音声ファイルを読み込む
audio_path = 'example.wav'
y, sr = librosa.load(audio_path)
print(f"サンプルデータの長さ: {len(y)}")
print(f"サンプリングレート: {sr}")
y
:音声のサンプルデータ(波形)sr
:サンプリングレート(1秒あたりのサンプル数)
音声データの可視化
音声データを視覚的に解析するために、librosaはlibrosa.display
を使って波形やスペクトログラムを描画することができます。ここでは、音声の波形を可視化してみます。
波形の描画
import librosa.display
import matplotlib.pyplot as plt
# 音声データの波形を描画
plt.figure(figsize=(10, 4))
librosa.display.waveshow(y, sr=sr)
plt.title('Waveform')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()
このコードを実行すると、音声の時間軸に沿った波形(振幅の変化)が表示されます。音声データの全体的な構造や特徴を視覚的に把握するのに役立ちます。
スペクトログラムの生成
音声の時間-周波数特性を解析するために、スペクトログラム
を使います。スペクトログラムは、時間とともに周波数成分がどのように変化するかを可視化したものです。
メルスペクトログラムの作成
音声信号のスペクトログラムを生成するために、まずメルスペクトログラムを計算します。メルスペクトログラムは、人間の聴覚に基づいた尺度で、音声認識などでよく使われます。
# メルスペクトログラムを計算
S = librosa.feature.melspectrogram(y, sr=sr, n_mels=128)
# デシベル単位に変換
S_dB = librosa.power_to_db(S, ref=np.max)
# メルスペクトログラムを表示
plt.figure(figsize=(10, 4))
librosa.display.specshow(S_dB, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram')
plt.tight_layout()
plt.show()
melspectrogram()
:メルスペクトログラムを計算します。power_to_db()
:スペクトログラムをデシベル(dB)に変換し、視覚的に解釈しやすくします。librosa.display.specshow()
:スペクトログラムを描画します。
スペクトログラムの解釈
スペクトログラムの横軸は時間、縦軸は周波数を表し、色の濃さが音の強さ(エネルギー)を示しています。これにより、音声中の音の周波数成分が時間の経過とともにどのように変化しているかを視覚的に確認できます。
音声特徴量の抽出
音声データから特徴量を抽出することで、音声認識や音楽分類などのタスクで使用できる情報を得ることができます。librosaはさまざまな音声特徴量を提供しています。
ピッチ(基本周波数)の検出
ピッチ(基本周波数)は、音の高さを表します。librosaでは、librosa.piptrack()
を使ってピッチを検出できます。
pitches, magnitudes = librosa.piptrack(y=y, sr=sr)
# ピッチの抽出
plt.figure(figsize=(10, 4))
plt.plot(pitches)
plt.title('Pitch Contour')
plt.xlabel('Time (frames)')
plt.ylabel('Frequency (Hz)')
plt.show()
このコードで、音声のピッチ(周波数)の変化を時間軸に沿って描画できます。
ゼロ交差率の計算
ゼロ交差率は、音声波形が時間軸でゼロを横切る回数を測定し、ノイズの検出や音声の有無を判断するのに役立ちます。
# ゼロ交差率を計算
zero_crossings = librosa.feature.zero_crossing_rate(y)
# ゼロ交差率を可視化
plt.figure(figsize=(10, 4))
plt.plot(zero_crossings[0])
plt.title('Zero Crossing Rate')
plt.xlabel('Time (frames)')
plt.ylabel('Rate')
plt.show()
ゼロ交差率が高いと、ノイズや高い周波数成分が含まれていること が多いです。
テンポとビートの検出
音楽データの場合、テンポ(BPM)やビートを検出することも重要です。
# テンポとビートを検出
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
print(f"推定テンポ: {tempo} BPM")
beat_track()
関数を使うことで、テンポを推定し、ビートの位置を取得できます。
音声データの変換
librosaを使えば、音声データの変換も簡単に行えます。例えば、ピッチシフトやタイムストレッチなどが可能です。
ピッチシフト
音声のピッチを変えるには、librosa.effects.pitch_shift()
を使います。
# 音声のピッチを2半音上げる
y_shifted = librosa.effects.pitch_shift(y, sr, n_steps=2)
# ピッチシフト後の波形を表示
plt.figure(figsize=(10, 4))
librosa.display.waveshow(y_shifted, sr=sr)
plt.title('Pitch Shifted Waveform')
plt.show()
タイムストレッチ
音声の再生速度を変更するには、librosa.effects.time_stretch()
を使います。
# 音声を1.5倍速で再生
y_stretched = librosa.effects.time_stretch(y, 1.5)
# タイムストレッチ後の波形を表示
plt.figure(figsize=(10, 4))
librosa.display.waveshow(y_stretched, sr=sr)
plt.title('Time Stretched Waveform')
plt.show()
まとめ
Python
のlibrosa
ライブラリを使うことで、音声データの読み込み、特徴量の抽出、解析、可視化が簡単に行えます。今回紹介した基本的な音声解析手法をベースに、さらに高度な音声処理や機械学習への応用を目指してみてください。librosaは多くの機能を提供しており、音声データを扱うプロジェクトにおいて非常に有用なツールです。