ぽきたに 〜ありきたりな非凡〜

現役F欄大学生が送るゴミ溜めと独り言

【Python】複数のWAVファイルの波形を表示するプログラム【サウンドプログラミング】

どうもこんにちは。たっきーです。

最近カフェインをよく摂取している。

 

 

参考

ism1000ch.hatenablog.com

tacky0612.hatenablog.com

tacky0612.hatenablog.com

 

 

なにする?

WAVファイルの波形をmatplotlibで複数表示する。

ただし、読み込まれるデータはバイナリなので数値を変換する必要がある。

割りとここのパクってfor文で回してるだけな感じある。(ありがとうございます。)

 

環境

  • numpy 1.13.3
  • matplotlib 2.1.0

 

下準備

ここで作ったWAVデータを用意する。

まぁ、実は複数の連番WAVファイルを用意するだけでいいが。

 

コード

とりあえず関数の定義。WAVファイルの数値変換と振幅正規化してる。

time = ○○で表示する時間を指定できる。

わかりやすいようにx軸y軸にラベルとグラフタイトルと付け加えている。

一応、y軸を固定しないと勝手に最適化(?)されてしまうのでy軸を-1~1で固定してある。

#coding:utf-8
%matplotlib inline
import wave
import numpy as np
import matplotlib.pyplot as plt

def wave_plot(filename):
#     open wave file
    wf = wave.open(filename,'r')
    channels = wf.getnchannels()
#     print(wf.getparams())

#     load wave data
    time = 1 #sec
    chunk_size =44100*time #1sec = 44100
    amp  = (2**8) ** wf.getsampwidth() / 2
    data = wf.readframes(chunk_size)   # バイナリ読み込み
    data = np.frombuffer(data,'int16') # intに変換
    data = data / amp                  # 振幅正規化(-1~1)

    # make time axis
    rate = wf.getframerate()
    size = float(chunk_size)
    x = np.arange(0, size/rate, 1.0/rate)

    # plot マルチチャンネルに対応
    for i in range(channels):
        plt.plot(x,data[i::channels])

    plt.title(filename)
    plt.xlabel("time[s]")
    plt.ylabel("standerdized amplitude")
    
    plt.ylim([-1,1]) #y軸を-1~1で固定
    plt.show()
#     print(data)
#     print(len(data))
#     print(type(data))
#     print("===========================================================")

 

あとは 以下のように関数を呼び出すとグラフが表示出来る。

wave_plot("filename.wav")

 OUTPUT

f:id:tacky0612:20171128124424p:plain

多分、青色が左の音の波形で、橙色が右の音の波形(だと思う) 

 

 

 あとはfor文で回すだけ。

print("count of data")
count = input() #終点の位置を入力
print("instrument")
instrument = input()
for i in range(int(count)):
    name = "./" + instrument + "/output/" + str(i) +".wav"
#     print(name)
    wave_plot(name)

 OUTPUT(略)

f:id:tacky0612:20171128125141p:plain

 

こんな感じで表示される。

2列〜3列で表示したいんだがどうしたらいいんだ…って感じ。

 

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

 
入門 Python 3

入門 Python 3

 

 

 

おわりに・感想

ささっと書いたのですごい雑なコードになってしまった。。。

今回は波形を1秒毎に表示してみたけど、案外1秒間ずっと無音の部分とかあった。

なので、今度時間がある時に無音部分を判別してはじくプログラムとか組んでみたいなぁ(どうせやらない。)

楽器(今回はpiano,guitar,bass,drams)の音色を機械学習で分類したいんだが、流石に波形みるだけじゃあまり規則性みたいなものは目視ではあまり感じられなかった。(timeを短くしてみてもあまりわからなかった。)

もっとmatplotlibを上手く使いこなせるようになりてぇ。。。

 

 

 

 

スポンサードリンク