3

根据我正在开发的应用程序的要求,我必须将多个音频文件传递给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

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

4

0 回答 0