Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

librosaにおける16-bitでのWAV書き出し (librosa.output.write_wav)

問題

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

www.wizard-notes.com

参考

github.com