根据我正在开发的App的要求,我必须将多个音频文件传递到SFSpeechRecognizer
并获得转录。
我有两种方式
第一种方法-使用递归(正确运行,可以根据需要跳过它)
我首先通过逐笔转录完成了这项任务。也就是说,SFSpeechRecognitionTask
完成后,结果将被保存,并且该过程通过递归调用再次运行。
class Transcription
{
let url = [URL(fileURLWithPath: "sad")]
var fileCount = 3
let totalFiles = 4;
func getTranscriptionRecursive()
{
getTranscriptionOfAudioFile(atURL: url[fileCount], fileCount: fileCount, totalFiles: totalFiles) { (result) in
if(self.fileCount <= self.totalFiles)
{
self.fileCount = self.fileCount+1
self.getTranscriptionRecursive()
}
}
}
func getTranscriptionOfAudioFile(atURL url: URL, fileCount: Int, totalFiles: Int, completion: @escaping ((SFSpeechRecognitionResult?)->Void))
{
let request = SFSpeechURLRecognitionRequest(url: url)
request.shouldReportPartialResults = false
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))
if (recognizer?.isAvailable)! {
recognizer?.recognitionTask(with: request) { result, error in
//error handling
completion(result)
}
}
}
}
此方法效果很好,但是由于每个SFSpeechRecognizer
请求都需要花费时间才能完成。
第二种方法-使用循环和后台线程 (这个有问题)
我尝试创建多个请求并在后台一次执行它们。
为此,我创建了一个For循环,直到音频文件计数为止。在该循环中,我调用了创建SFSpeechRecognizer
请求和任务的函数。
for index in 0..<urls.count
{
DispatchQueue.global(qos: .background).async {
self.getTranscriptionOfAudio(atURL: self.urls[index]) { (result, myError, message) in
//error handling
//process Results
}
}
}
其中获得语音识别结果的功能是
func getTranscriptionOfAudio(atURL audioURL: URL?, completion: @escaping ((SFSpeechRecognitionResult? , Error?, String?)->Void))
{
let request = SFSpeechURLRecognitionRequest(url: audioURL!)
request.shouldReportPartialResults = false
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))
if (recognizer?.isAvailable)! {
recognizer?.recognitionTask(with: request) { result, error in
//error handling
completion(results,nil,nil)
}
} else {
completion(nil,nil,"Reognizer could not be initialized");
}
}
运行此代码时,只有一个任务执行,而其他任务给出此错误
+ [AFAggregator logDictationFailedWithError:]错误 Domain = kAFAssistantErrorDomain Code = 209“(null)”
我在Internet上搜索了此错误,但没有包含该错误详细信息的文档。
这可能是由于并行运行SFSpeechRecognitionTask
引起的,但是在Apple官方文档here中并没有禁止这样做,因为我们可以单独创建SFSpeechRecognitionRequest
对象。我们不使用SFSpeechRecognizer
让我知道是否有人知道发生了什么以及您建议我做什么。