LoginSignup
13
9

More than 5 years have passed since last update.

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

Posted at

概要

ちょっと前にハイレゾ音源に対する信号処理を行う機会があり,
その際に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で実装しましょう.

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9