歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python】wav形式の音声ファイルをPythonで再生&波形をプロット

音楽の特徴量抽出器みたいなのを作ったらボロ儲けできるんじゃないかと思っていろいろ調べてみています。アメリカのインターネットラジオPandoraのミュージックゲノム計画も、専門家の人海戦術で特徴量を抽出しているようですし、そこを自動化できたら目がある気がしないでもないです。

 

そこでちょっと調べてみたところ、「音楽情報処理」という分野があることを知りました。なかなか面白そうな話が転がってそうです。

音楽情報科学研究会 » 「SIGMUS第100回記念シンポジウム」(情報処理学会 音楽情報科学研究会 第100回研究発表会)の参加案内

 

ちょっとググってみたら、京都大学の大学院の講義資料が見つかりました。実際にPythonpyaudioなどのパッケージを使った分析を行っており、実践的で面白そうです。

計算機科学実験及演習4「音楽情報処理」

というわけでこれになぞって勉強することにしました。

 

最初はpyaudioというパッケージそ使ってwav形式のファイルを再生するコード。

import pyaudio
import wave
input_filename = 'onsei/mkizm.wav' buffer_size = 4096 wav_file = wave.open ( input_filename , 'rb' ) p = pyaudio.PyAudio () stream = p.open ( format = p.get_format_from_width ( wav_file . getsampwidth ()) , channels = wav_file.getnchannels () , rate = wav_file.getframerate () , output = True ) remain = wav_file.getnframes () while remain > 0: buf = wav_file.readframes ( min ( buffer_size , remain )) stream.write ( buf ) remain -= buffer_size stream.close () p.terminate () wav_file.close ()

 

次は音の波形をプロットするコードです。

# -*- coding : utf -8 -*-
import sys
import scipy.io.wavfile
import numpy
import pylab

def plot_waveform ( waveform , sampling_rate ):
    sampling_interval = 1.0 / sampling_rate
    times = numpy.arange ( len ( waveform )) * sampling_interval
    pylab.plot ( times , waveform ) # pair of two x - and y - coordinate lists / arrays
    pylab.title ( ' Waveform ' )
    pylab.xlabel ( ' Time [ sec ] ' )
    pylab.ylabel ( ' Amplitude ' )
    pylab.xlim ([0 , len ( waveform ) * sampling_interval ])
    pylab.ylim ([ -1 , 1])
    pylab.show ()
    
# main function of Python programs
argv = sys.argv
if len ( argv ) == 1:
    print ' no input files . '
    exit
    
filename = argv[1]
sampling_rate , waveform = scipy.io.wavfile.read ( "onsei/mkizm.wav" )
waveform = waveform / 32768.0 # assume 16 - bit integer
plot_waveform ( waveform , sampling_rate )

ちなみに「まきいづみすぺしゃるボイスCD vol3」の10トラック目をWAVE形式に変換したファイルを使っています。

f:id:takeshi0406:20131208210844p:plain

 

ちなみにPyAudioというパッケージは、Windowsの64bitのインストーラーが無いようで、例によって非公式のインストーラーを使用しました。やっぱりPythonやRにはLinux環境を用意したほうがいろいろと楽そうですね。