概要
ちょっと前にハイレゾ音源に対する信号処理を行う機会があり,
その際に24bitのwavが読み込めるPythonライブラリをいろいろ調べたので備忘録がてらメモ.
Pythonでwavを読むライブラリとしてはscipy.io.wavfile
があるが,
これは量子化bit数={8,16,32,64,96,128}のwavのみ対応.
つまり,24bitのwavが読み込めない.
巷のハイレゾ音源で一番多いのが24bitのものなので,
これは困るということで24bit wavを読む方法を調べてみた.
候補
- 標準のwaveモジュールでがんばる
- scikits.audiolab
- wavio
標準のwaveモジュールでがんばる
(実装してはいないので間違ってたらすみませn)
readframes()
で得られるbytes
オブジェクトをnumpy.ndarrayに適切に変換・格納すればイケるはず.
ただし24bit単位のバイト列を32bit型に格納する必要があるのでunpack処理が若干めんどくさいと思われる.
scikits.audiolab
http://cournape.github.io/audiolab/
わりと昔からあるlibsndfileラッパー.
MATLABライクな記法でwavの読み書きが可能.
from scikits.audiolab import wavread
data, fs, fmt = wavread(fn)
利点
- libsndfileのラッパーなのでwav以外でもlibsndfileに対応している形式は扱える(flac等も可能)
- MATLABユーザに優しいAPI
- Sndfileオブジェクトを直接操作できるのでよりlow-levelに近い処理もできる
欠点
- libsndfileに依存しているのでインストールがめんどくさい
- 2010年を最後に更新が止まっている
- ので当然Python3非対応
wavio
https://github.com/WarrenWeckesser/wavio
比較的新しいライブラリ.
(内部的にはwaveを使って実装している模様)
24bit含め任意のfs/量子化ビット数のwav読み書きが可能.
import wavio
w = wavio.read(fn_in)
fs = w.rate
bit = 8 * w.sampwidth
data = w.data.T
data = data / float( 2**(bit-1) ) # -1.0 to 1.0に正規化
利点
- Python3対応
- Pure-python (外部libへの依存なし)
- APIもわりとわかりやすい
欠点
- wavのみ対応
で、結局どれ使えばいいの?
個人的にはwavio
が現状の最適解な気がする.
wav以外使えない,という欠点はあるが,最悪soxとかffmpegで変換するという手が使えなくはないし.
「標準以外のライブラリ依存を増やしたくない」という場合はおとなしくwaveで実装しましょう.