在后台运行多个SFSpeechRecognitionTask时出错

时间:2019-03-13 11:04:09

标签: ios swift speech sfspeechrecognizer

根据我正在开发的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

的单例对象

让我知道是否有人知道发生了什么以及您建议我做什么。

0 个答案:

没有答案