Python 実践 データ加工/可視化 100本ノック に挑戦 ノック75

ノック75 : 音データを可視化してみよう

音声データの波形を表示します。

 

import librosa
import librosa.display

audio1,sr1 = librosa.load('data/音声.mp3',sr=None,offset=0,duration=1)
audio2,sr2 = librosa.load('data/携帯電話着信音.mp3',sr=None,offset=0,duration=1)

o1 = librosa.display.waveplot(audio1,sr1)

 

以下のエラーが発生しました。

AttributeError: module 'librosa.display' has no attribute 'waveplot'

 

pip show librosaでlibrosaのバージョンを見ると、

Version: 0.9.1

 

本の使用バージョンはlibrosa0.8.1なので仕様が変更されているようです。

以下のURLに削除したと書かれています。

  • #1416 Removed deprecated functions librosa.display.waveplot and librosa.util.example_audio_file. Brian McFee

 

github.com

 

新しいバージョンを使用する場合はwaveshowを使用するということなので、

記述を変更して再実行してみます。

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

audio1,sr1 = librosa.load('data/音声.mp3',sr=None,offset=0,duration=1)
librosa.display.waveshow(audio1, sr=sr1)
plt.show()

 

 

実行結果

音声データの波形

 

22050Hzデータの波形と比較します。青が元データ、オレンジが22050Hzのデータです。

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

audio1,sr1 = librosa.load('data/音声.mp3',sr=None,offset=0,duration=1)
audio1_sr22,sr1_sr22 = librosa.load('data/音声.mp3',sr=22050,offset=0,duration=1)
librosa.display.waveshow(audio1, sr=sr1)
librosa.display.waveshow(audio1_sr22, sr=sr1_sr22)

plt.show()

 

実行結果

22050Hzデータ

 

時間0.4から0.5にかけて波形のデータが一部失われていることがわかります。

 

次に携帯電話着信音のデータを見てみます。

まず音を聞くには以下を実行します。

from playsound import playsound
playsound('data/携帯電話着信音.mp3')

 

が・・・、

「ドライバーは指定されたコマンド パラメーターを認識できません。」とエラーが

表示されました。

ワークアラウンド探すと、バージョンを1.3から1.2.2に落とせばよさそうです。

pip show plysound で確認すると、Version: 1.3.0 と表示されたので

pip install playsound==1.2.2 を実行しバージョンを下げて実行してみます。

 

実行すると、今度は

「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte」

とメッセージが・・。

携帯電話着信音.mp3のファイル名をとりあえずtest.mp3という名前にコピーして

再実行すると、成功しました。

 

このデータを波形表示してみます。

audio2,sr2 = librosa.load('data/test.mp3',sr=None,offset=0,duration=1)
librosa.display.waveshow(audio2, sr=sr2)
plt.show()

test.mp3(携帯電話着信音.mp3)

5回着信音が鳴るのですが、そのうちの2回分のデータが表示されています。

/* -----codeの行番号----- */