Не удалось открыть файл file.wav как WAV из-за: файл не начинается с идентификатора RIFF
Я получаю эту ошибку при попытке открыть файл RIFF (который, как я понимаю, является типом WAV) в Python.
Failed to open file file.wav as a WAV due to: file does not start with RIFF id
Когда я проверяю его с помощью различных инструментов, это наводит меня на мысль, что это действительно файл WAV / RIFF.
$ file file.wav
file.wav: MBWF/RF64 audio, stereo 96000 Hz
$ file -i file.wav
file.wav: audio/x-wav; charset=binary
$ mediainfo file.wav
General
Complete name : file.wav
Format : Wave
Format profile : RF64
File size : 4.10 GiB
Duration : 2h 7mn
Overall bit rate mode : Constant
Overall bit rate : 4 608 Kbps
Audio
Format : PCM
Format settings, Endianness : Little
Format settings, Sign : Signed
Codec ID : 1
Duration : 2h 7mn
Bit rate mode : Constant
Bit rate : 4 608 Kbps
Channel(s) : 2 channels
Sampling rate : 96.0 KHz
Bit depth : 24 bits
Stream size : 4.10 GiB (100%)
2 ответа
То, что у вас есть, это 64-битный RIFF. wave
не поддерживает 64-битные файлы RIFF.
Если с вашим звуком все в порядке, и вы можете прочитать файл с помощью librosa или scipy.io, мы можем просто прочитать файл, записать его обратно во временный файл wav и затем снова прочитать его с помощью пакета wave.
Пример. Ниже мы получаем ошибку идентификатора RIFF.
>>> import wave
>>> wave.open('./SA1.WAV')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/pytorch/anaconda3/lib/python3.6/wave.py", line 499, in open
return Wave_read(f)
File "/home/pytorch/anaconda3/lib/python3.6/wave.py", line 163, in __init__
self.initfp(f)
File "/home/pytorch/anaconda3/lib/python3.6/wave.py", line 130, in initfp
raise Error('file does not start with RIFF id')
wave.Error: file does not start with RIFF id
Мы читаем numpy с помощью librosa, записываем обратно с помощью звукового файла.
import librosa
import soundfile as sf
>>> x,_ = librosa.load('./SA1.WAV', sr=16000)
>>> sf.write('tmp.wav', x, 16000)
>>> wave.open('tmp.wav','r')
<wave.Wave_read object at 0x7fbcb4c8cf28>
Подобно ответу @kakrafoon, но с использованием soundfile
как для чтения, так и для записи (если вы заботитесь об ограничении количества внешних зависимостей):
import soundfile
import wave
file_path = "your_file.wav"
# Read and rewrite the file with soundfile
data, samplerate = soundfile.read(file_path)
soundfile.write(file_path, data, samplerate)
# Now try to open the file with wave
with wave.open(file_path) as file:
print('File opened!')
У меня есть слово, я переименовываю суффикс файла в "mp3" и преобразую его в "wav", тогда я смог бы прочитать его.
subprocess.call(['ffmpeg', '-i', 'XXX.mp3', 'XXX.wav'])