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

在代码再现过程中,笔者在读取数据时遇到错误:

[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文件。
    UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 41: invalid start byte
    原来,此处的 10.wav文件当初是手动从 10.mp3经过 修改后缀得来的,这种方式使得文件出错,此时没有办法被正确读取。因此,笔者通过librosa+soundfile用4行代码,重新根据 10.mp3生成了 10.wav文件。

    想知道如何将MP3文件修改为wav文件的,可以查看笔者之前的文章《librosa实现音频格式转换(单曲&批量) | MP3转wav
    在此,我们要在此强调一次, wav文件不要通过修改后缀的形式生成!虽然很方便,但是后续程序读取的时候很可能会出错。而且,通过 librosa+ soundfile,以代码的形式进行格式更改很方便速度也很快,生成的文件也不会出错,它不香嘛!

  • 修改后,重新运行代码。
    可以看到, print语句顺利地打印出了后面的 wav信息,并且不再报错。说明报错确实是因为 10.wav存在文件错误。
    UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 41: invalid start byte

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

(本文完)

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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球