在代码再现过程中,笔者在读取数据时遇到错误:
[En]
In the process of code reproduction, the author encountered an error when reading the data:
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小技巧:善用
根据
(本文完)
Original: https://blog.csdn.net/qq_44250700/article/details/125342128
Author: Begonia_cat
Title: UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 41: invalid start byte
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/527069/
转载文章受原作者版权保护。转载请注明原作者出处!