Python
音響信号処理

ハイレゾ音響信号処理(1) -- Pythonで24bitのwavファイルを読む方法

More than 1 year has passed since last update.


概要

ちょっと前にハイレゾ音源に対する信号処理を行う機会があり,

その際に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の読み書きが可能.


test_audiolab.py

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読み書きが可能.


test_wavio.py

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で実装しましょう.