You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bash脚本调用Whisper处理损坏音频文件时,首次返回1后续却始终返回0的原因排查

Bash脚本调用Whisper处理损坏音频文件时,首次返回1后续却始终返回0的原因排查

我来帮你分析下这个有点奇怪的问题——第一次碰到损坏音频文件时脚本返回错误码1,之后再运行却始终返回0,大概率是下面这几个原因:

最可能的原因:Whisper的音频预处理缓存机制

这是触发这类问题最常见的原因。Whisper在处理音频文件时,会把解码后的标准化音频(比如转换成它内部兼容的WAV格式)缓存到特定目录,通常是系统临时目录(比如/tmp下的Whisper相关文件夹),或者通过WHISPER_CACHE_DIR环境变量指定的路径。

第一次运行时,原文件损坏导致ffmpeg解码失败,返回错误码1;但如果后续运行时,Whisper检测到该文件的缓存已经存在(哪怕是第一次报错时生成的不完整缓存,或者程序误判缓存有效),就会直接跳过ffmpeg解码步骤,读取缓存文件继续处理,自然不会再触发解码错误,返回码也就变成了0。

你可以试试这个验证方法:

  • 找到Whisper的缓存目录,清空里面的所有文件
  • 单独用Whisper命令处理那个损坏的音频文件,看看是否会再次触发ffmpeg错误,返回非0码
  • 重新运行你的bash脚本,观察是否重现第一次的报错

损坏文件的隐性状态变化

虽然你说要重现错误,但也可以排查下这个可能性:有没有可能第一次运行后,这个损坏文件的状态被悄悄改变了?比如:

  • 你的脚本里有没有隐含的文件修复、备份逻辑?
  • 系统的磁盘修复工具、杀毒软件等后台进程意外修改了文件?
  • 文件的读写权限发生了变化,第一次运行时无法正常读取,之后权限恢复?

你可以对比第一次报错前后,文件的大小、修改时间、MD5哈希值,确认文件本身有没有被改动。

脚本的错误处理逻辑漏洞

最后可以检查下你的bash脚本本身:

  • 是不是第一次运行时,脚本正确捕获了Whisper的错误返回码,但后续循环处理时,返回值被其他命令覆盖了?
  • 脚本里有没有set -e这类退出选项,第一次触发退出后,后续运行时脚本跳过了损坏文件的处理(比如通过标记文件、计数判断)?

你可以单独执行处理损坏文件的命令(比如whisper /path/to/corrupted-file.mp3),看返回码是多少。如果单独运行也返回0,那问题肯定出在Whisper的缓存或文件本身,和脚本逻辑无关。

补充:从你提供的第一次运行的Traceback来看,错误确实是ffmpeg解码失败导致的——Whisper在load_audio函数里调用ffmpeg时抛出了异常。如果后续运行不再触发这个异常,基本可以锁定是缓存机制跳过了解码步骤。

备注:内容来源于stack exchange,提问作者d-b

火山引擎 最新活动