WAVEファイルの再生
Pythonで音声信号処理(2011/05/14)
まずは基本ということでWAVEファイルを再生してみます。Pythonにはwaveモジュールが用意されていてWAVEファイルの読み書き、情報の抽出はできます。しかし、waveモジュールだけでは音を再生できないのでpyaudioという別のモジュールと組み合わせて使います。pyaudioは別途インストールが必要。
#coding: utf-8 import wave import pyaudio def printWaveInfo(wf): """WAVEファイルの情報を取得""" print "チャンネル数:", wf.getnchannels() print "サンプル幅:", wf.getsampwidth() print "サンプリング周波数:", wf.getframerate() print "フレーム数:", wf.getnframes() print "パラメータ:", wf.getparams() print "長さ(秒):", float(wf.getnframes()) / wf.getframerate() if __name__ == '__main__': wf = wave.open("sineWithNoise.wav", "r") printWaveInfo(wf) # ストリームを開く p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # チャンク単位でストリームに出力し音声を再生 chunk = 1024 data = wf.readframes(chunk) while data != '': stream.write(data) data = wf.readframes(chunk) stream.close() p.terminate()
実行すると、
チャンネル数: 1 サンプル幅: 2 サンプリング周波数: 44100 フレーム数: 132300 パラメータ: (1, 2, 44100, 132300, 'NONE', 'not compressed') 長さ(秒): 3
上のプログラムで使った
この音声ファイルは440Hzのサイン波にノイズを乗せた音です。Praatという音声分析ツールで作りました。かなり使い勝手にクセがあるソフトなんですが、スペクトル解析やピッチ編集も簡単にできるため研究でもよく使われているようです。440Hzの音(ドレミの「ラ」)にランダムノイズを乗せた音を作るための波形の式は、
1/2 * sin(2*pi*440*x) + randomGauss(0,0.1)
スクリプトを実行すると、ポーというサイン波にサーというノイズが乗った音が聞こえます。1秒間に44100回サンプリングしているので長さ3秒の音声ファイルは132300個のフレームがあります。
単に音を鳴らしたいだけならpyaudio以外のライブラリもあります。
ではもっと手軽に鳴らせます。しかし、波形を編集してから再生したいなどなってくるとpyaudioのように波形データを直接ストリームに流す方法がベストだと思います。OSの違いも自動的に吸収してくれるし便利です。wav以外にmp3やoggなど他の音声ファイルの再生方法、変換方法もいずれ紹介したいと思います。