【0から学ぶAI】第304回:波形データの可視化 〜音声信号をグラフで表示する方法を解説

目次

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

こんにちは!前回は、Pythonの音声処理ライブラリであるLibROSAを使って、音声データの基本操作について学びました。LibROSAを利用することで、音声ファイルの読み込み、再生、特徴量抽出が簡単に行えることが分かりましたね。

今回は、音声信号を視覚的に分析するために、波形データの可視化に焦点を当てます。波形データは、音声の振幅変化を時間軸に沿って表示することで、音の強弱や構造を視覚的に確認できる重要な情報源です。この記事では、LibROSAとMatplotlibを使って、音声の波形をどのように表示するかを解説します。

波形データとは?

波形データは、音声信号の振幅の変化を時間軸に沿って記録したものです。音声は空気の圧力変化によって生まれ、その変化をデジタルデータとして記録したのが波形データです。波形を見ることで、音声の強弱や特定のイベント(例:ドラムのヒットや声の区切り)を直感的に把握できます。

LibROSAで音声の波形を可視化する

LibROSAとMatplotlibを使って、音声データを波形として表示する基本的な手順を説明します。

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

まずは、LibROSAを使って音声ファイルを読み込みます。音声ファイルは、サンプリングレートと波形データの配列として返されます。

import librosa

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

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

2. 波形の可視化

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 (seconds)')
plt.ylabel('Amplitude')
plt.show()
  • librosa.display.waveshow(): 波形データを時間軸に沿って表示する関数です。ysrを指定することで、波形が適切にスケーリングされて表示されます。
  • plt.xlabel()plt.ylabel(): x軸に「時間(秒)」、y軸に「振幅」とラベルをつけ、グラフを理解しやすくします。

このコードを実行すると、音声の振幅が時間軸に沿って表示され、視覚的に音声の構造が確認できます。

波形データの詳細な分析

波形を表示することで、音声の特定の瞬間(例えば、音が急に大きくなる瞬間や、無音の部分)を視覚的に確認できます。これにより、音声編集や分析の際に、どの部分に注目すべきかが直感的に分かります。

複数の波形データの比較

異なる音声ファイルや異なる加工を施した音声データを比較したい場合もあります。以下は、元の音声と速度を変えた音声を同じグラフ上に表示する例です。

# 音声を時間的に伸縮(速度変更)
y_fast = librosa.effects.time_stretch(y, 1.5)

# 複数の波形を比較
plt.figure(figsize=(10, 6))

# 元の波形
plt.subplot(2, 1, 1)
librosa.display.waveshow(y, sr=sr)
plt.title('Original Waveform')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')

# 速度を変えた波形
plt.subplot(2, 1, 2)
librosa.display.waveshow(y_fast, sr=sr)
plt.title('Stretched Waveform (1.5x speed)')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')

plt.tight_layout()
plt.show()
  • librosa.effects.time_stretch(): 音声の速度を変更します。この例では、速度を1.5倍にしています。
  • plt.subplot(): 複数の波形を一つの図に配置するために使用します。

このようにして、異なる波形データを比較することで、音声の加工がどのような影響を及ぼすかが直感的に分かります。

音声の部分的な可視化

長い音声ファイルでは、特定の部分だけを拡大して詳細に分析したい場合があります。LibROSAでは、音声データの一部だけを抽出して表示することも簡単です。

# 特定の範囲(例: 0秒から5秒まで)の波形を表示
start_sample = 0
end_sample = sr * 5  # サンプリングレート × 秒数

plt.figure(figsize=(10, 4))
librosa.display.waveshow(y[start_sample:end_sample], sr=sr)
plt.title('Waveform (0-5 seconds)')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.show()

このコードでは、最初の5秒間の音声データのみを抽出し、その部分の波形を表示します。特定の音声イベント(例:ドラムヒットや声の開始)を拡大して分析するのに有効です。

高速フーリエ変換(FFT)による周波数成分の分析

波形データだけでは、音声の周波数成分を直接確認するのが難しい場合があります。このような場合、短時間フーリエ変換(STFT)を用いて、波形データを周波数領域に変換することが有効です。これにより、特定の時間にどの周波数成分が含まれているかを視覚的に確認できます。

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

# 振幅スペクトルをデシベルスケールに変換
S_db = librosa.amplitude_to_db(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()

このスペクトログラムは、波形データの周波数成分を視覚的に表示するためのものです。これにより、音声データに含まれる音の特徴(例:ピッチやノイズ)を詳細に分析できます。

実践例:人の声と楽器音の比較

音声の波形データは、異なる音源(例:人の声と楽器音)を比較する際にも役立ちます。以下は、人の声と楽器(ギター)の波形を並べて比較する例です。

# 人の声と楽器音の音声ファイルを読み込む
voice_path = 'voice.wav'
guitar_path = 'guitar.wav'

y_voice, sr_voice = librosa.load(voice_path, sr=None)
y_guitar, sr_guitar = librosa.load(guitar_path, sr=None)

# 人の声と楽器音の波形を比較
plt.figure(figsize=(10, 8))

# 人の声
plt.subplot(2, 1, 1)
librosa.display.waveshow(y_voice, sr=sr_voice)
plt.title('Voice Waveform')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')

# 楽器音(ギター)
plt.subplot(2, 1, 2)
librosa.display.waveshow(y_guitar, sr=sr_g

uitar)
plt.title('Guitar Waveform')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')

plt.tight_layout()
plt.show()

このコードでは、異なる音源の波形データを並べて表示することで、視覚的に音声の違いを確認できます。

まとめ

今回は、波形データの可視化について解説し、音声信号をグラフで表示する方法を学びました。LibROSAを活用することで、音声データの波形やその一部を簡単に可視化し、視覚的に分析できることが分かりましたね。このスキルを活かして、音声の特徴や変化を掴み、次のステップである周波数成分の分析へと進めていきましょう。

次回予告

次回は、スペクトログラムとはとして、周波数成分を時間軸で表示する方法について解説します。波形だけでは見えない音声の特性を、スペクトログラムを使って詳細に分析していきましょう!


注釈

  • 波形データ: 音声信号の振幅を時間軸に沿って記録したもの。音声の強弱やイベントを視覚的に確認できる。
  • 短時間フーリエ変換(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.

コメント

コメントする

目次