使用Spleeter-Android-iOS进行人声分离时process返回1的问题求助
Spleeter-Android-iOS人声分离process返回1失败问题排查
使用Spleeter-Android-iOS库做人声分离时,调用spleeterSDK.process(wavPath!, outPath: path)返回值为1而非预期的0,无法执行后续流程。
相关处理代码
let ret = spleeterSDK.process(wavPath!, outPath: path) // 预期ret为0 if(ret == 0) { let queue = DispatchQueue(label: "process-queue") queue.async { while(true) { let progress = self.spleeterSDK.progress() DispatchQueue.main.async { self.progress.text = String(progress) + "%" } usleep(1000 * 1000); if(progress == 100) { break } } self.spleeterSDK.saveOne(url.path + "/record.wav", stemRatio: UnsafeMutablePointer<Float32>(mutating: self.stemRatio)) DispatchQueue.main.async { self.btnProcess.isEnabled = true do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default) try AVAudioSession.sharedInstance().setActive(true) self.player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path + "/record.wav")) guard let player = self.player else { return } player.play() } catch let error { print(error.localizedDescription) } } } }
更新的关键信息
SDK创建代码(返回值为2)
spleeterSDK = SpleeterSDK(); let ret = spleeterSDK.createSDK() spleeterSDK.release() print("create SDK: ", ret) // 打印结果为2
输入WAV路径获取
let wavPath = Bundle.main.path(forResource: "_input.wav", ofType: nil)
输出路径获取
let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] print(url.path) let path = url.path
问题分析与修复建议
SDK初始化后立即释放是核心错误
你在调用createSDK()后马上执行了spleeterSDK.release(),这会直接销毁SDK实例,导致后续调用process时SDK已经处于不可用状态,必然返回错误码1。必须在整个SDK使用周期结束后(比如App退出、页面销毁且不再需要人声分离功能时)再调用release。排查createSDK返回码2的原因
返回码2通常表示SDK初始化失败,常见原因包括:- 模型文件未正确打包到App Bundle中,或模型路径配置错误
- 设备不支持SDK依赖的硬件加速(如Metal/NNAPI)
- 初始化时内存不足,无法加载模型资源
验证输入WAV文件有效性
确保_input.wav符合Spleeter要求的格式:16位深度、采样率44100Hz(或匹配模型指定的采样率)、单/双声道均可,文件本身未损坏。输出路径权限确认
虽然使用了documentDirectory(App默认有权限),但可以手动打印路径后,检查该目录是否存在、是否可写入,排除路径异常问题。
修正后的SDK初始化示例
// 定义为类成员变量,避免提前释放 var spleeterSDK: SpleeterSDK! // 在合适的时机(如viewDidLoad)初始化SDK override func viewDidLoad() { super.viewDidLoad() spleeterSDK = SpleeterSDK() let ret = spleeterSDK.createSDK() print("create SDK: ", ret) // 正常应返回0 // 不要在这里调用release } // 在页面销毁或不再使用时释放SDK deinit { spleeterSDK?.release() }
内容的提问来源于stack exchange,提问作者Aarfeen Ahmad
相关产品推荐
相关产品推荐

