MacOS下SFSpeechRecognizer批量音频转文本循环处理问题求助
MacOS批量音频转文本问题
我在MacOS系统上尝试批量转录文件夹中的音频文件为文本,单个文件处理正常,但批量时只有一个文件成功,其余都报错。试过用DispatchGroup,结果所有任务还是一次性提交,没等前一个完成就开下一个;换成串行DispatchQueue后,只能转录一个文件,程序还会挂起。下面是两段相关代码:
第一段代码
let recognizer = SFSpeechRecognizer() recognizer?.supportsOnDeviceRecognition = true let group = DispatchGroup() let fd = FileManager.default fd.enumerator(at: url, includingPropertiesForKeys: nil)?.forEach({ (e) in if let url = e as? URL, url.pathExtension == "wav" || url.pathExtension == "aiff" { let request = SFSpeechURLRecognitionRequest(url: url) group.enter() let task = recognizer?.recognitionTask(with: request) { (result, error) in print("Transcribing \(url.lastPathComponent)") guard let result = result else { print("\(url.lastPathComponent): No message") group.leave() return } while result.isFinal == false { sleep(1) } print("\(url.lastPathComponent): \(result.bestTranscription.formattedString)") group.leave() } group.wait() } }) group.notify(queue: .main) { print("Done") }
更新后的代码
let recognizer = SFSpeechRecognizer() recognizer?.supportsOnDeviceRecognition = true let fd = FileManager.default let q = DispatchQueue(label: "serial q") fd.enumerator(at: url, includingPropertiesForKeys: nil)?.forEach({ (e) in if let url = e as? URL, url.pathExtension == "wav" { let request = SFSpeechURLRecognitionRequest(url: url) q.sync { let task = recognizer?.recognitionTask(with: request) { (result, error) in guard let result = result else { print("\(url.lastPathComponent): No message") return } if result.isFinal { print("\(url.lastPathComponent): \(result.bestTranscription.formattedString)") } } } } }) print("Done")
内容的提问来源于stack exchange,提问作者jl303
相关产品推荐
相关产品推荐

