【0から学ぶAI】第305回:スペクトログラムとは 〜周波数成分を時間軸で表示する方法を説明

目次

前回のおさらいと今回のテーマ

こんにちは!前回は、波形データの可視化について解説し、音声信号を時間軸に沿って振幅の変化として表示する方法を学びました。波形を視覚的に確認することで、音の強弱や特定の音声イベントを把握する手段を理解しましたね。

今回は、音声データのスペクトログラムについて解説します。スペクトログラムは、音声の周波数成分を時間軸に沿って視覚化する方法で、音声の詳細な特徴を解析するための重要な手法です。この記事では、スペクトログラムの基本から、その生成方法、解析方法までを学び、PythonのLibROSAを使って実際にスペクトログラムを表示する方法を紹介します。

スペクトログラムとは?

スペクトログラムは、音声信号の周波数成分を時間軸に沿って表示したグラフです。音声は様々な周波数の音波が合成されて成り立っており、その周波数成分が時間と共にどのように変化するかを視覚化することで、音声の特性や変化を詳細に理解することができます。

スペクトログラムの構成要素

  1. 横軸(時間軸): 時間の経過を示します。音声データの長さに対応し、音声が再生される時間と一致します。
  2. 縦軸(周波数軸): 各時点における周波数成分を示します。低周波から高周波までの範囲が表示されます。
  3. 色の濃淡(振幅): 各周波数成分の強さ(振幅)を示し、明るい色ほど大きな振幅を意味します。

スペクトログラムは、音楽の分析、音声認識、異常音の検出、さらには動物の鳴き声の解析など、様々な分野で利用されています。

スペクトログラムの生成方法

スペクトログラムを生成するためには、短時間フーリエ変換(Short-Time Fourier Transform: STFT)という手法が使われます。STFTは、音声信号を小さな時間区間(ウィンドウ)に区切り、各区間でフーリエ変換を行って周波数成分を抽出する方法です。

短時間フーリエ変換(STFT)とは?

フーリエ変換は、音声信号を周波数成分に分解する手法ですが、通常のフーリエ変換では時間情報が失われます。そこで、STFTを使うことで、音声信号を小さな時間区間に分けてフーリエ変換を行い、時間と周波数の両方の情報を取得します。

  • ウィンドウサイズ: 音声信号を区切る時間区間の長さです。短いウィンドウサイズでは時間分解能が高くなり、長いウィンドウサイズでは周波数分解能が高くなります。
  • フレームシフト(ホップサイズ): 次のウィンドウを開始する位置です。オーバーラップさせることで、時間的に連続した情報を得ることができます。

STFTを行うことで、各時間区間ごとに周波数スペクトルが得られ、これを時間軸に沿って並べたものがスペクトログラムです。

LibROSAでスペクトログラムを表示する

LibROSAを使ってスペクトログラムを表示する方法を見ていきましょう。まず、音声ファイルを読み込み、STFTを計算し、それをスペクトログラムとして表示します。

1. 音声ファイルの読み込み

import librosa

# 音声ファイルのパスを指定
audio_path = 'example.wav'

# 音声ファイルの読み込み
y, sr = librosa.load(audio_path, sr=None)
  • librosa.load(audio_path, sr=None): 音声ファイルを読み込み、波形データ(y)とサンプリングレート(sr)を取得します。

2. STFTの計算とスペクトログラムの生成

import numpy as np
import matplotlib.pyplot as plt
import librosa.display

# 短時間フーリエ変換(STFT)
D = librosa.stft(y)

# 振幅スペクトルをデシベルスケールに変換
S_db = librosa.amplitude_to_db(np.abs(D))

# スペクトログラムの表示
plt.figure(figsize=(10, 4))
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.xlabel('Time (seconds)')
plt.ylabel('Frequency (Hz)')
plt.show()
  • librosa.stft(y): 短時間フーリエ変換を行い、複素数のスペクトルデータを生成します。
  • librosa.amplitude_to_db(): 振幅スペクトルをデシベルスケールに変換し、視覚的に分かりやすくします。
  • librosa.display.specshow(): スペクトログラムを表示する関数で、時間軸(x_axis='time')と対数スケールの周波数軸(y_axis='log')を指定します。

このコードを実行すると、音声の時間と周波数成分が可視化されたスペクトログラムが表示され、音声の特徴を直感的に理解することができます。

周波数軸のスケール

y_axisには、以下のオプションがあり、用途に応じて適切なスケールを選ぶことができます。

  • linear: 線形スケール。高音域の細かな変化を確認する際に有効です。
  • log: 対数スケール。低音域から高音域まで広範囲をカバーでき、音声解析で一般的に使われます。
  • mel: メルスケール(人間の聴覚特性に基づく)。音声認識など、人間の聴覚に基づく分析に適しています。

スペクトログラムの解析

スペクトログラムを見ることで、音声の特定の特徴やイベントを識別できます。例えば、以下のような分析が可能です。

1. 周波数の強調

特定の音声や楽器は特定の周波数帯に強い成分を持ちます。スペクトログラムを見ることで、どの周波数帯が強調されているかを確認し、音の特徴を把握できます。

2. 音の持続時間

スペクトログラムでは、特定の周波数成分がどのくらいの時間にわたって持続するかが視覚化されます。これにより、音の長さやリズムのパターンを視覚的に確認することができます。

3. ノイズの識別

音声信号中にノイズが含まれている場合、スペクトログラムにおいてノイズ成分が広範囲にわたって表示されることがあります。特に高周波ノイズは、スペクトログラムで視覚的に識別しやすく、ノイズキャンセリング処理の参考になります。

実践例:異なる音声イベントの解析

音声データには、異なる音声イベント(例えば、楽器の音、声、ノイズ)が含まれています。スペクトログラムを用いることで、これらのイベントがどの時間帯でどのように発生しているかを解析することができます。

# スペクトログラムの表示
plt.figure(figsize=(10, 6))
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.xlabel('Time (seconds)')
plt.ylabel('Frequency (Hz)')
plt.show()

このスペクトログラムを分析することで、例えば以下のようなことが分かります。

  • 楽器の音: 特定の周波

数帯が強く表示され、パターンが一定のリズムで繰り返される。

  • 人の声: 広範囲の周波数に渡る複雑なパターンが現れ、特定の瞬間に強いピークが発生する。
  • ノイズ: 一定の周波数帯に持続的な成分が存在し、不規則に現れることが多い。

まとめ

今回は、スペクトログラムについて、周波数成分を時間軸で表示する方法を解説しました。スペクトログラムは、音声の特性やイベントを視覚的に分析するための重要な手法であり、音楽、音声認識、さらには異常音検出にまで応用可能です。次回は、このスペクトログラムの分析に関連する特徴量であるメル周波数ケプストラム係数(MFCC)について詳しく解説します。

次回予告

次回は、メル周波数ケプストラム係数(MFCC)について、音声特徴量の抽出方法を紹介します。MFCCは音声認識において重要な役割を果たす特徴量であり、その計算方法と利用方法を学びます。


注釈

  • 短時間フーリエ変換(STFT): 音声信号を時間と周波数の両方で分析する手法。
  • デシベルスケール: 振幅を対数スケールで表現することで、音の強弱を視覚的に理解しやすくする方法。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社PROMPTは生成AIに関する様々な情報を発信しています。
記事にしてほしいテーマや調べてほしいテーマがあればお問合せフォームからご連絡ください。
---
PROMPT Inc. provides a variety of information related to generative AI.
If there is a topic you would like us to write an article about or research, please contact us using the inquiry form.

コメント

コメントする

目次