UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 41: invalid start byte

一、遇到报错

笔者在进行代码复现的时候,在数据读取时遇到报错:

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小技巧:善用print
根据print打印的信息可以帮助我们更好地看到程序执行的过程,从而与我们期望的结果进行比对,发现错误。

(本文完)


参考:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值