Spleeter音轨分离出现进程启动RuntimeError报错如何解决
问题根因
之前的if __name__ == '__main__'写法完全失效:你把这段判断写在了do_seperation()函数内部,还手动给局部变量__name__赋值为'__main__',Python运行时根本识别不到模块级别的主入口保护,多进程启动时就会触发引导阶段未完成的报错。另外直接调用Spleeter内部私有方法_separate_librosa会绕过官方自带的多进程安全逻辑,也会加剧这个问题。
修复方案
- 删掉函数内部错误的
__name__赋值和嵌套判断,把主入口判断放到模块最外层,不要包裹在任何自定义函数内 - 不要调用下划线开头的私有方法
_separate_librosa,改用官方公开的separate方法执行分离,自动适配多进程运行逻辑 - 如果你用的是Windows或macOS默认spawn多进程模式,可在主入口最开头加上
freeze_support()兼容所有运行场景
修复后可运行代码
from spleeter.separator import Separator from spleeter.audio.adapter import AudioAdapter from multiprocessing import freeze_support def seperator(): separator = Separator('spleeter:4stems') file = "test.wav" audio_loader = AudioAdapter.default() sample_rate = 44100 waveform, _ = audio_loader.load(file, sample_rate=sample_rate) # 替换私有方法调用为官方公开方法 prediction = separator.separate(waveform) print(prediction['vocals']) # 如需保存分离后的音轨到本地,可放开下面这行注释,指定输出目录即可 # separator.save_to_file(prediction, sample_rate, "./output") if __name__ == '__main__': # 不需要打包成exe的场景可以注释掉下一行,加上可以兼容所有运行环境 freeze_support() seperator()
注意事项
__name__是Python为每个模块自动赋值的内置属性,不要在函数内部手动给同名局部变量赋值,这种写法完全起不到主入口判断的作用- 涉及多进程初始化的逻辑(比如Spleeter模型加载、分离任务执行),必须放在
if __name__ == '__main__':块的调用链中,不能直接写在模块全局位置执行 - 下划线开头的类方法属于内部私有API,版本迭代时可能随意调整逻辑,没有对外兼容承诺,日常使用优先调用官方公开方法
内容的提问来源于stack exchange,提问作者wroex24
相关产品推荐
相关产品推荐

