SFSpeechRecognizer – обнаруживает конец высказывания

Я взламываю небольшой проект, используя встроенное распознавание речи iOS 10. У меня есть результаты работы с использованием микрофона устройства, моя речь признана очень точно.

Моя проблема заключается в том, что для каждой доступной частичной транскрипции вызывается вызов обратного вызова задачи, и я хочу, чтобы он обнаружил, что человек остановился, и вызовет обратный вызов с свойством isFinal установленным в true. Этого не происходит – приложение слушает бесконечно.

Является ли SFSpeechRecognizer когда-либо способным обнаруживать конец предложения?

Вот мой код – он основан на примере, найденном на интернет-страницах, в основном это шаблон, который необходимо распознать из источника микрофона. Я изменил его, добавив taskHint . Я также устанавливаю для параметра shouldReportPartialResults значение false, но, похоже, оно было проигнорировано.

  func startRecording() { if recognitionTask != nil { recognitionTask?.cancel() recognitionTask = nil } let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryRecord) try audioSession.setMode(AVAudioSessionModeMeasurement) try audioSession.setActive(true, with: .notifyOthersOnDeactivation) } catch { print("audioSession properties weren't set because of an error.") } recognitionRequest = SFSpeechAudioBufferRecognitionRequest() recognitionRequest?.shouldReportPartialResults = false recognitionRequest?.taskHint = .search guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") } guard let recognitionRequest = recognitionRequest else { fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object") } recognitionRequest.shouldReportPartialResults = true recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in var isFinal = false if result != nil { print("RECOGNIZED \(result?.bestTranscription.formattedString)") self.transcriptLabel.text = result?.bestTranscription.formattedString isFinal = (result?.isFinal)! } if error != nil || isFinal { self.state = .Idle self.audioEngine.stop() inputNode.removeTap(onBus: 0) self.recognitionRequest = nil self.recognitionTask = nil self.micButton.isEnabled = true self.say(text: "OK. Let me see.") } }) let recordingFormat = inputNode.outputFormat(forBus: 0) inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in self.recognitionRequest?.append(buffer) } audioEngine.prepare() do { try audioEngine.start() } catch { print("audioEngine couldn't start because of an error.") } transcriptLabel.text = "Say something, I'm listening!" state = .Listening } 

Кажется, что флаг isFinal не стал истинным, когда пользователь перестает говорить, как ожидалось. Я предполагаю, что это яблоко от Apple, потому что событие «Пользователь прекращает разговор» является неопределенным событием.

Я считаю, что самым простым способом достижения вашей цели является следующее:

  • Вы должны установить «интервал молчания», который означает, что если пользователь не разговаривает в течение времени, превышающего ваш интервал, он прекратил говорить (т.е. 2 секунды).

  • Создайте таймер в начале сеанса аудио:

var timer = NSTimer.scheduledTimerWithTimeInterval (2, target: self, selector: "didFinishTalk", userInfo: nil, repeat: false)

  • когда вы получаете новые транскрипции в recognitionTask Task invalidate и перезапускаете свой таймер

    timer.invalidate () timer = NSTimer.scheduledTimerWithTimeInterval (2, target: self, selector: "didFinishTalk", userInfo: nil, repeat: false)

  • если таймер истекает, это означает, что пользователь не разговаривает с 2 секунд. Вы можете спокойно остановить сеанс аудио и выйти

  • Как заставить iOS Speech API читать только цифры и распознавать «один» как «1»,
  • Как улучшить распознавание речи в ios для ввода цифр?
  • Давайте будем гением компьютера.