Распознавание речи и AudioPlaying работают на симуляторе, но не на iPhone? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь использовать распознавание речи, чтобы преобразовать его в текст и отобразить его. Распознавание речи и AudioPlaying работают на симуляторе, но не на iPhone? Почему это так?

Я получаю эту ошибку в консоли при попытке распознавания на iphone:

Домен = kAFAssistantErrorDomain Code = 203 «Corrupt» UserInfo = {NSLocalizedDescription = Corrupt, NSUnderlyingError = 0x28063f240 {Ошибка домена = SiriSpeechErrorDomain Code = 102 "(null)"}}

Это мой код:

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    self.animateSpinner(forStatus: false)
    do {
        try audioPlayer = AVAudioPlayer(contentsOf: recorder.url)
        audioPlayer.play()
    } catch let error {
        debugPrint(error)
    }

    SFSpeechRecognizer.requestAuthorization({ (authStatus) in
        if authStatus == .authorized {
            let recognizer = SFSpeechRecognizer(locale: Locale(identifier: self.language))
            let request = SFSpeechURLRecognitionRequest(url: recorder.url)
            recognizer?.recognitionTask(with: request, resultHandler: { (result, err) in
                if let err = err {
                    debugPrint(err)
                    return
                }
                self.textView.text = result?.bestTranscription.formattedString
            })
        }
    })
}

а вот настройка рекордера в viewDidLoad ()

func setupRecorder() {
    let dirPaths = FileManager.default.urls(for: .documentDirectory,
                                            in: .userDomainMask)

    let soundFileURL = dirPaths[0].appendingPathComponent("sound.caf")
    do {
        audioRecorder = try AVAudioRecorder(url: soundFileURL, settings: [
            AVEncoderAudioQualityKey: AVAudioQuality.min.rawValue,
            AVEncoderBitRateKey: 16,
            AVNumberOfChannelsKey: 2,
            AVSampleRateKey: 44100.0])
        audioRecorder.delegate = self
        audioRecorder.prepareToRecord()
    }
    catch let error {
        debugPrint(error)
    }
}

Ответы [ 3 ]

0 голосов
/ 25 января 2019
SFSpeechRecognizer.requestAuthorization { authStatus in
    if authStatus == SFSpeechRecognizerAuthorizationStatus.authorized {
        if let path = Bundle.main().urlForResource("test", withExtension: "m4a") {
            let recognizer = SFSpeechRecognizer()
            let request = SFSpeechURLRecognitionRequest(url: path)
             request.cancel()
            recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
                if let error = error {
                    print("There was an error: \(error)")
                } else {
                    print (result?.bestTranscription.formattedString)
                }
            })
        }
    }
}

отмените запрос, прежде чем начать распознавать. проверьте код здесь

0 голосов
/ 19 июня 2019

Для меня добавьте

inputNode.removeTap(onBus: 0)
sleep(1)

до

inputNode.installTap(onBus: 0, bufferSize: 4096, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
            self.recognitionRequest?.append(buffer)}

решить проблему

0 голосов
/ 25 января 2019

Вызов этого в viewDidLoad исправил проблему:

var audioSession: AVAudioSession = AVAudioSession.sharedInstance()

do {
        try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .spokenAudio, options: .defaultToSpeaker)
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
    } catch let error{
        print("audioSession properties weren't set because of an error: ", error)
    }
...