根据我正在开发的应用程序的要求,我必须将多个音频文件传递给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:] 错误域=kAFAssistantErrorDomain 代码=209 "(null)"
我在互联网上搜索了此错误,但没有包含其详细信息的文档。
这可能是由于SFSpeechRecognitionTask
并行运行,但在此处的官方 Apple 文档中,他们并没有禁止这样做,因为我们可以SFSpeechRecognitionRequest
单独创建对象。我们不使用单例对象SFSpeechRecognizer
让我知道是否有人知道发生了什么以及您建议我做什么。