一、遇到报错
笔者在进行代码复现的时候,在数据读取时遇到报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 41: invalid start byte
报错原因:查阅资料,这句话的意思是遇到了utf-8
无法解码的字节。
最可能的情况是:出现了错误数据,导致解码出错。需要查看自己的数据中是否存在错误文件
。
二、错误分析与解决
摆出代码:
song_path = os.path.join(AUDIO_FOLDER, str(int(song_id)) + SOUND_EXTENSION)
# print(song_path)
audio_file = tf.io.read_file(song_path)
waveforms, _ = tf.audio.decode_wav(contents=audio_file) # 报错代码
根据报错信息显示:waveforms, _ = tf.audio.decode_wav(contents=audio_file)
这句出错。
因此从该行代码往上
进行错误排查:
-
定位到
audio_file
-
定位到
song_path
-
此时,不妨将
song_path
打印出来:print(song_path)
-
观察打印结果。如下图所示,当打印到
10.wav
时就停止打印并报错了,因此排查10.wav
文件。
原来,此处的10.wav
文件当初是手动从10.mp3
经过修改后缀
得来的,这种方式使得文件出错,此时没有办法被正确读取。因此,笔者通过librosa+soundfile用4行代码,重新根据10.mp3
生成了10.wav
文件。想知道如何将MP3文件修改为wav文件的,可以查看笔者之前的文章《librosa实现音频格式转换(单曲&批量) | MP3转wav》
在此,我们要在此强调一次,
wav
文件不要通过修改后缀的形式生成!虽然很方便,但是后续程序读取的时候很可能会出错。而且,通过librosa
+soundfile
,以代码的形式进行格式更改很方便速度也很快,生成的文件也不会出错,它不香嘛! -
修改后,重新运行代码。
可以看到,print
语句顺利地打印出了后面的wav
信息,并且不再报错。说明报错确实是因为10.wav
存在文件错误。
debug小技巧:善用
根据
(本文完)
参考:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte