微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果播放Apple Music中的音频,SFSpeechRecognizer在实际设备上不起作用

如何解决如果播放Apple Music中的音频,SFSpeechRecognizer在实际设备上不起作用

已实现语音到文本功能,如果我正在对着麦克风讲话,该功能会很好用。但是我希望它能够从Apple Music中选择音频。 我正在使用MPMediaPickerController播放音频,并且音频播放完美。问题是它没有将其转换为文本。 这是我的代码: ''' func startRecording(){

        // Clear all prevIoUs session data and cancel task
        if recognitionTask != nil {
            recognitionTask?.cancel()
            recognitionTask = nil
        }
        
        // Create instance of audio session to record voice
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(AVAudioSession.Category.record,mode: AVAudioSession.Mode.measurement,options: AVAudioSession.CategoryOptions.duckOthers)
            try audioSession.setActive(true,options: .notifyOthersOnDeactivation)
        } catch {
            print("audioSession properties weren't set because of an error.")
        }
        
        self.recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        
        let inputNode = audioEngine.inputNode
        
        guard let recognitionRequest = recognitionRequest else {
            fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
        }
        
        // Keep speech recognition data on device
        if #available(iOS 13,*) {
             recognitionRequest.requiresOnDeviceRecognition = true
        }
        
        recognitionRequest.shouldReportPartialResults = true
        self.recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest,resultHandler: { (result,error) in
            
            var isFinal = false
            
            if result != nil {
                
                self.timer.invalidate()
                if self.count == 0 {
                    self.textView.text = result!.bestTranscription.formattedString
                } else {
                    self.textView.text = self.text + result!.bestTranscription.formattedString
                }
                isFinal = (result?.isFinal)!
            }
            else if result == nil || !isFinal {
                self.textView.text = "Press record button and say something,I'm listening!"
            }
            
            if isFinal {
// this is to remove 1 minute limit.
                self.count = self.count + 1
                self.text = self.textView.text
                
                self.timer = Timer.scheduledTimer(timeInterval: TimeInterval(1),target: self,selector: #selector(self.againStartRec),userInfo: nil,repeats: false)
                
                self.audioEngine.stop()
                inputNode.removeTap(onBus: 0)
                
                self.recognitionRequest = nil
                self.recognitionTask = nil
                isFinal = false
                self.MicButton.isEnabled = true
            }
            
            if error != nil {
                URLCache.shared.removeAllCachedResponses()
                self.audioEngine.stop()
                inputNode.removeTap(onBus: 0)
                
                guard let task = self.recognitionTask else { return }
                task.cancel()
                task.finish()
            }
        })
        audioEngine.reset()
        inputNode.removeTap(onBus: 0)
        
        let recordingFormat = inputNode.outputFormat(forBus: 0)
        inputNode.installTap(onBus: 0,bufferSize: 1024,format: recordingFormat) { (buffer: AVAudioPCMBuffer,when: AVAudioTime) in
            self.analyzer.analyze(buffer,atAudioFramePosition: when.sampleTime)
            self.recognitionRequest?.append(buffer)
        }
        
        self.audioEngine.prepare()
        
        do {
            try self.audioEngine.start()
        } catch {
            print("audioEngine Couldn't start because of an error.")
        }
    } 
'''

解决方法

我找到了答案,如果将来有人需要,请在这里提及。 因此,我使用的是SFSpeechAudioBufferRecognitionRequest()而不是SFSpeechURLRecognitionRequest()。 如果要从设备中选择媒体,则需要获取所选音频文件的url,并将其传递给SFSpeechURLRecognitionRequest(url:audioURL)。这对我有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。