音楽プログラミングの超入門(仮)

Python / 音楽情報処理 初心者が、初心者にも分かるような記事を書きたい。

PythonでWAVファイルを読み込む

音声信号処理を行う場合、大抵、数値列をWAVファイルから読み込むことになると思います。Python でそれを行う方法を2つ紹介します。

waveモジュールを使う

wave モジュールはその名の通り、WAVファイルを扱うためのモジュールです。WAVファイルの読み込みはこんな感じにします。

# -*- coding: utf-8 -*-
import wave
from scipy import fromstring, int16

wavfile = "./test.wav"

# WAVファイルを開く
wr = wave.open(wavfile, "rb")

# WAVファイルの情報を表示(別にいらん)
print "Channel num : ", wr.getnchannels()
print "Sample size : ", wr.getsampwidth()
print "Sampling rate : ", wr.getframerate()
print "Frame num : ", wr.getnframes()
print "Prams : ", wr.getparams()
print "Sec : ", float(wr.getnframes()) / wr.getframerate()

# データの読み込み
data = wr.readframes(wr.getnframes())

# 文字型から数値型に
num_data = fromstring(data, dtype = int16)

if (wr.getnchannels() == 2):
    # 左チャンネル
    left = num_data[::2]
    # 右チャンネル
    right = num_data[1::2]

wr.close()

データを読み込んだら文字型で返ってくるので、数値に変換しています。
ステレオの場合、数値列は左右左右左右・・・みたいに左右チャンネルが交互に入ってるので、1つ置きに数値を取り出しています。
WAVファイルの情報を色々取ったりしています。


SciPyを使う

SciPy を使うとさらにシンプルにいけます。(上のもSciPy使ってるけど・。)自分はいつもこっちを使います。なんだかごちゃごちゃしていないので・・。

# -*- coding: utf-8 -*-
from scipy.io.wavfile import read

wavfile = "./test.wav"

fs, data = read(wavfile)

print "Sampling rate :", fs

if (data.shape[1] == 2):
    left = data[:, 0]
    right = data[:, 1]

ふむ、シンプル。

まとめ

特にWAVファイルの詳しい情報とかが要らなければ、SciPy 側の方法を使っておけば良いと思う。(取れる情報もそんなに変わらない。)

追記

先輩によると scikits.audiolab を使う手もあるようです。