問題点
表題の通り、以下のコードでエラーが発生します。
import librosa sr=44100 #オーディオ信号をNumpy形式でロードし、yに格納 y, sr = librosa.core.load(input_filepath, sr=sr, mono=False) # yをwavフォーマットで書き出し # ここで、yがステレオ信号、すなわち2次元配列 y.shape=(チャネル数, 時間サンプル数)のとき struct.error発生 librosa.output.write_wav(output_wav_filepath, y, sr)
Traceback (most recent call last): File ..., in xxxxx.py librosa.output.write_wav(output_wav, y, sr) File "C:\ProgramData\Anaconda3\lib\site-packages\librosa\output.py", line 236, in write_wav scipy.io.wavfile.write(path, sr, wav) File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\io\wavfile.py", line 359, in write bytes_per_second, block_align, bit_depth) <b>struct.error: ushort format requires 0 <= number <= 0xffff</b>
解決方法
以下のgithub issueで議論されているように、ステレオ信号を書き出す場合、 librosa.output.write_wavに引数として与えるNumPy配列は、 y.shape=(時間サンプル数, チャネル数)とする必要がある。
output.wave_write fails to write stereo · Issue #131 · librosa/librosa · GitHub
つまり、
・librosa.core.load()
の返り値y
はy.shape=(チャネル数, 時間サンプル数)
・librosa.output.write_wav()
の引数y
はy.shape=(時間サンプル数, チャネル数)
ということで、librosa.output.write_wav(output_wav, y.T, sr)
とすると、無事wav形式で書き出せました。