У меня есть файл .wav с частотой дискретизации 44,1 кГц, я хочу повторно сэмплировать его в 16 кГц, используя librosa.resample. Хотя output.wav звучит великолепно, и это 16 кГц, но я получаю сообщение об ошибке при попытке прочитать его с помощью wave.open.
и эта проблема очень похожа на мою:
Открытие волнового файла в python: неизвестный формат: 49. Что не так?
Это мой код:
if __name__ == "__main__":
input_wav = '1d13eeb2febdb5fc41d3aa7db311fa33.wav'
output_wav = 'result.wav'
y, sr = librosa.load(input_wav, sr=None)
print(sr)
y = librosa.resample(y, orig_sr=sr, target_sr=16000)
librosa.output.write_wav(output_wav, y, sr=16000)
wave.open(output_wav)
И я получил ошибку на последнем шаге wave.open(output_wav)
Исключение составляют следующие:
Traceback (most recent call last):
File "/Users/range/Code/PycharmProjects/Speaker/test.py", line 204, in <module>
wave.open(output_wav)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 499, in open
return Wave_read(f)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 163, in __init__
self.initfp(f)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 143, in initfp
self._read_fmt_chunk(chunk)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wave.py", line 260, in _read_fmt_chunk
raise Error('unknown format: %r' % (wFormatTag,))
wave.Error: unknown format: 3
Я просто не знаю, почему wave.open не может прочитать wav_flie, и мне нужно пересчитать wav, чтобы выполнить мою дальнейшую работу.
Интересно, изменил ли librosa.output.write
тип wav.
Так что я должен написать функцию повторной выборки самостоятельно. К счастью, это работает.
Это мой код:
def resample(input_wav, output_wav, tar_fs=16000):
audio_file = wave.open(input_wav, 'rb')
audio_data = audio_file.readframes(audio_file.getnframes())
audio_data_short = np.fromstring(audio_data, np.short)
src_fs = audio_file.getframerate()
dtype = audio_data_short.dtype
audio_len = len(audio_data_short)
audio_time_max = 1.0*(audio_len-1) / src_fs
src_time = 1.0 * np.linspace(0, audio_len, audio_len) / src_fs
tar_time = 1.0 * np.linspace(0, np.int(audio_time_max*tar_fs), np.int(audio_time_max*tar_fs)) / tar_fs
output_signal = np.interp(tar_time, src_time, audio_data_short).astype(dtype)
with wave.open(output_wav, 'wb') as f:
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(tar_fs)
f.writeframes(output_signal)
Я надеюсь, что вы сможете помочь мне понять, что не так, когда пересматриваете wav с помощью librosa, и я рад, что мой код может помочь другим людям, у которых есть такая же проблема. :)