【问题标题】:iPhone simulator 10.0 - Speech recognition unavailableiPhone 模拟器 10.0 - 语音识别不可用
【发布时间】:2017-06-15 05:17:22
【问题描述】:

快速入门的新手!我正在尝试实现一个使用语音识别器将语音转换为文本的应用程序。

问题
SFSpeechRecognizer().isAvailablefalse

private let request = SFSpeechAudioBufferRecognitionRequest()
private var task: SFSpeechRecognitionTask?
private let engine = AVAudioEngine()

func recognize() {
        guard let node = engine.inputNode else {
            return
        }

        let recordingFormat = node.outputFormat(forBus: 0)
        node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
            self.recognitionRequest.append(buffer);
        }

        engine.prepare()
        do {
            try engine.start()
        } catch {
            return print(error)
        }

        guard let systemRecognizer = SFSpeechRecognizer() else {
            return
        }

        if !systemRecognizer.isAvailable {
            self.log(.debug, msg: "Entered this condition and stopped!")
            return
        }
}

问题
我不确定它为什么会在模拟器中停止。麦克风可以在 iPhone 模拟器中使用吗?

更新 我尝试使用以下代码测试音频文件,

let audioFile = Bundle.main.url(forResource: "create_activity", withExtension: "m4a", subdirectory: "Sample Recordings")
let recognitionRequest = SFSpeechURLRecognitionRequest(url: audioFile!)

收到错误消息,Error Domain=kAFAssistantErrorDomain Code=1101 "(null)"

【问题讨论】:

标签: ios iphone swift speech-recognition


【解决方案1】:

看起来模拟器已经获得了 iOS 11 的麦克风访问权限。 不幸的是,我找不到任何文档来确认这一点,但可以使用以下代码示例确认此功能。在 iOS 11 模拟器上完美运行,但在 iOS 10 模拟器(或更早版本)上无任何作用。

import UIKit
import Speech

class ViewController: UIViewController {

    private var recognizer = SFSpeechRecognizer()
    private var request = SFSpeechAudioBufferRecognitionRequest()
    private let engine = AVAudioEngine()

    override func viewDidLoad() {
        super.viewDidLoad()

        requestPermissions()
    }

    private func requestPermissions() {
        //
        // Do not forget to add `NSMicrophoneUsageDescription` and `NSSpeechRecognitionUsageDescription` to `Info.plist`
        //

        // Request recording permission
        AVAudioSession.sharedInstance().requestRecordPermission { allowed in
            if allowed {
                // Request speech recognition authorization
                SFSpeechRecognizer.requestAuthorization { status in
                    switch status {
                    case .authorized: self.prepareSpeechRecognition()
                    case .notDetermined, .denied, .restricted: print("SFSpeechRecognizer authorization status: \(status).")
                    }
                }

            } else {
                print("AVAudioSession record permission: \(allowed).")
            }
        }
    }

    private func prepareSpeechRecognition() {
        // Check if recognizer is available (has failable initializer)
        guard let recognizer = recognizer else {
            print("SFSpeechRecognizer not supported.")
            return
        }

        // Prepare recognition task
        recognizer.recognitionTask(with: request) { (result, error) in
            if let result = result {
                print("SFSpeechRecognizer result: \(result.bestTranscription.formattedString)")
            } else {
                print("SFSpeechRecognizer error: \(String(describing: error))")
            }
        }

        // Install tap to audio engine input node
        let inputNode = engine.inputNode
        let busNumber = 0
        let recordingFormat = inputNode.outputFormat(forBus: busNumber)
        inputNode.installTap(onBus: busNumber, bufferSize: 1024, format: recordingFormat) { buffer, time in
            self.request.append(buffer);
        }

        // Prepare and start audio engine
        engine.prepare()

        do {
            try engine.start()
        } catch {
            return print(error)
        }
    }

}

不要忘记将NSMicrophoneUsageDescriptionNSSpeechRecognitionUsageDescription 添加到Info.plist

【讨论】:

  • 麦克风和语音识别都需要开启。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
相关资源
最近更新 更多