問題
最近のバージョンの 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=(サンプル数,チャンネル数)であることに注意が必要です。