問題
最近のバージョンの librosa
では、信号を保存する時、16-bit 整数(int)型のWAVファイルで書き出そうとすると、以下のようなエラーが出てしまい、ファイル出力できません。
>>> import numpy as np >>> import librosa >>> y = np.sin(2.0*np.pi*440*np.linspace(0.0, 1.0, sr)) >>> librosa.output.write_wav("sin440.wav", y.astype(np.int16), sr) … librosa.util.exceptions.ParameterError: Audio data must be floating-point >>>
従って、現状の librosa.output.write_wav
は浮動小数点のWAV形式でしか書き出せません。
浮動小数点のWAV形式は信号の加工用としてはよいのですが、再生できるオーディオプレイヤーは限られ、また、ファイルサイズが大きくなるので不便です。
解決方法
librosa.output.write_wav
の代わりに、SoundFile
というオーディオの読み書き用モジュールを使うことで解決できます。
インストールは、pip install soundfile
で完了します。
>>> import soundfile as sf >>> sf.write("test.wav", y, sr, subtype="PCM_24") # 24-bit >>> sf.write("test.wav", y, sr, subtype="PCM_16") # 16-bit
入力として与えるデータは、int16
, int32
, float32
, float64
であれば大丈夫です。
なので、入力信号の dtype を変換する必要がないため楽です。
また、y
が2チャネル以上の場合、
y.shape
=(サンプル数,チャンネル数)であることに注意が必要です。