音声認識の結果が出てから次の処理に進みたい(DispatchSemaphoreを使っています
let request = SFSpeechURLRecognitionRequest(url:voiceFileURL)
let semaphore = DispatchSemaphore(value: 0)
let queue = DispatchQueue.global(qos: .default)
queue.async {
self.speechRecognizer.recognitionTask(with: request){ (result, error) in
guard let result = result else {
print("=============Recognition failed, so check error for details and handle it")
return
}
if result.isFinal {
self.recognitionText = (result.bestTranscription.formattedString)
semaphore.signal()
print("============A recognitionText : ",self.recognitionText)
}
}
}
semaphore.wait()
print("============wait done ")
recognitionTaskの終了をisFinalで調べてsemaphore.signal()を行いsemaphore.wait()を抜けたいのですが、semaphore.wait()で止まってしまいます。 なにか基本的に間違いを起こしているでしょうか?
@IBAction func addButton(_ sender: UIBarButtonItem) {
let todo = Todo(context: self.context)
let voiceFile = audioInit()
todo.voiceFileName = voiceFile
todo.dateTime = Date()
audioRecorder?.record(forDuration:10.0)
print("=================:Sleep Start11")
Thread.sleep(forTimeInterval: 11.0)
print("=================:Sleep End11")
todo.text = voiceRecognition(voiceFileName:voiceFile)
self.todos.append(todo)
(UIApplication.shared.delegate as! AppDelegate).saveContext()
}
func voiceRecognition(voiceFileName : String) -> String{
let fileMgr = FileManager.default
let dirPaths = fileMgr.urls(for: .documentDirectory,in: .userDomainMask)
let voiceFileURL = dirPaths[0].appendingPathComponent(voiceFileName)
let request = SFSpeechURLRecognitionRequest(url:voiceFileURL)
let semaphore = DispatchSemaphore(value: 0)
let queue = DispatchQueue.global(qos: .default)
queue.async {
self.speechRecognizer.recognitionTask(with: request){ (result, error) in
guard let result = result else {
print("=============Recognition failed, so check error for details and handle it")
return
}
if result.isFinal {
self.recognitionText = (result.bestTranscription.formattedString)
semaphore.signal()
print("============A recognitionText : ",self.recognitionText)
}
}
}
semaphore.wait()
print("============wait done ")
return(self.recognitionText)
}
ソースコードを関連箇所に変更しました。ご指摘通り@IBActionのなかでwaitしています。やりたいことは、addButtonが押されると音声を録音し、音声認識して結果をCoreDataに保存することです。
CoreDataの定義は以下です。
CoreData Entitis : Todo
Attribute Type
・dateTime Date
・text String
・voiceFileName String