Wizard Notes

音楽信号解析の技術録、音楽のレビューおよび分析、作曲活動に関する雑記です

LibROSA: ステレオ信号のWAV書き出し(write_wav)におけるstruct.errorの解決方法

この記事をシェアする

問題点

表題の通り、以下のコードでエラーが発生します。

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()の返り値yy.shape=(チャネル数, 時間サンプル数)
librosa.output.write_wav()の引数yy.shape=(時間サンプル数, チャネル数)

ということで、librosa.output.write_wav(output_wav, y.T, sr)とすると、無事wav形式で書き出せました。