ios语音识别错误域=kAFAssistantErrorDomain代码=216“(null)”

2023-11-23

基本上我正在按照本教程学习ios语音识别模块:https://medium.com/ios-os-x-development/speech-recognition-with-swift-in-ios-10-50d5f4e59c48

但是当我在我的iphone6上测试时,总是出现这个错误: 错误域=kAFAssistantErrorDomain 代码=216“(空)”

我在互联网上搜索了它,但找到了非常罕见的信息。

这是我的代码:

//
//  ViewController.swift
//  speech_sample
//
//  Created by Peizheng Ma on 6/22/17.
//  Copyright © 2017 Peizheng Ma. All rights reserved.
//

import UIKit
import AVFoundation
import Speech

class ViewController: UIViewController, SFSpeechRecognizerDelegate {

//MARK: speech recognize variables
let audioEngine = AVAudioEngine()
let speechRecognizer: SFSpeechRecognizer? = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))
var request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?
var isRecording = false

override func viewDidLoad() {
    // super.viewDidLoad()
    // get Authorization
    self.requestSpeechAuthorization()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//MARK: properties
@IBOutlet weak var detectText: UILabel!
@IBOutlet weak var startButton: UIButton!

//MARK: actions
@IBAction func startButtonTapped(_ sender: UIButton) {
    if isRecording == true {


        audioEngine.stop()
//            if let node = audioEngine.inputNode {
//                node.removeTap(onBus: 0)
//            }
        audioEngine.inputNode?.removeTap(onBus: 0)
        // Indicate that the audio source is finished and no more audio will be appended
        self.request.endAudio()

        // Cancel the previous task if it's running
        if let recognitionTask = recognitionTask {
            recognitionTask.cancel()
            self.recognitionTask = nil
        }


        //recognitionTask?.cancel()
        //self.recognitionTask = nil
        isRecording = false
        startButton.backgroundColor = UIColor.gray
    } else {
        self.recordAndRecognizeSpeech()
        isRecording = true
        startButton.backgroundColor = UIColor.red
    }
}

//MARK: show alert
func showAlert(title: String, message: String, handler: ((UIAlertAction) -> Swift.Void)? = nil) {
    DispatchQueue.main.async { [unowned self] in
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: handler))
        self.present(alertController, animated: true, completion: nil)
    }
}

//MARK: Recognize Speech
func recordAndRecognizeSpeech() {
    // Setup Audio Session
    guard let node = audioEngine.inputNode else { return }
    let recordingFormat = node.outputFormat(forBus: 0)
    node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
        self.request.append(buffer)
    }
    audioEngine.prepare()
    do {
        try audioEngine.start()
    } catch {
        self.showAlert(title: "SpeechNote", message: "There has been an audio engine error.", handler: nil)
        return print(error)
    }
    guard let myRecognizer = SFSpeechRecognizer() else {
        self.showAlert(title: "SpeechNote", message: "Speech recognition is not supported for your current locale.", handler: nil)
        return
    }
    if !myRecognizer.isAvailable {
        self.showAlert(title: "SpeechNote", message: "Speech recognition is not currently available. Check back at a later time.", handler: nil)
        // Recognizer is not available right now
        return
    }
    recognitionTask = speechRecognizer?.recognitionTask(with: request, resultHandler: { result, error in
        if let result = result {

            let bestString = result.bestTranscription.formattedString
            self.detectText.text = bestString

//                var lastString: String = ""
//                for segment in result.bestTranscription.segments {
//                    let indexTo = bestString.index(bestString.startIndex, offsetBy: segment.substringRange.location)
//                    lastString = bestString.substring(from: indexTo)
//                }
//                self.checkForColorsSaid(resultString: lastString)
        } else if let error = error {
            self.showAlert(title: "SpeechNote", message: "There has been a speech recognition error.", handler: nil)
            print(error)
        }
    })
}

//MARK: - Check Authorization Status
func requestSpeechAuthorization() {
    SFSpeechRecognizer.requestAuthorization { authStatus in
        OperationQueue.main.addOperation {
            switch authStatus {
            case .authorized:
                self.startButton.isEnabled = true
            case .denied:
                self.startButton.isEnabled = false
                self.detectText.text = "User denied access to speech recognition"
            case .restricted:
                self.startButton.isEnabled = false
                self.detectText.text = "Speech recognition restricted on this device"
            case .notDetermined:
                self.startButton.isEnabled = false
                self.detectText.text = "Speech recognition not yet authorized"
            }
        }
    }
}


}

非常感谢。


即使在使用 GitHub 上的示例代码时,我在遵循相同(优秀)教程时也遇到了同样的问题。为了解决这个问题,我必须做两件事:

首先,添加request.endAudio()在代码开始处停止在 startButtonTapped 操作中进行录制。这标志着录音的结束。我发现您已经在示例代码中做到了这一点。

其次,在 recordAndRecognizeSpeech 函数中,当“recognitionTask”启动时,如果没有检测到语音,则“result”将为 nil 并触发错误情况。所以,我测试了result != nil在尝试分配结果之前。

因此,这两个函数的代码如下所示: 1.更新了startButtonTapped:

@IBAction func startButtonTapped(_ sender: UIButton) {
    if isRecording {

        request.endAudio() // Added line to mark end of recording
        audioEngine.stop()

        if let node = audioEngine.inputNode {
            node.removeTap(onBus: 0)
        }
        recognitionTask?.cancel()

        isRecording = false
        startButton.backgroundColor = UIColor.gray

    } else {

        self.recordAndRecognizeSpeech()
        isRecording = true
        startButton.backgroundColor = UIColor.red
    }
}

2. 内更新recordAndRecognizeSpeech来自recognitionTask = ... line:

    recognitionTask = speechRecognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
        if result != nil { // check to see if result is empty (i.e. no speech found)
            if let result = result {
                let bestString = result.bestTranscription.formattedString
                self.detectedTextLabel.text = bestString

                var lastString: String = ""
                for segment in result.bestTranscription.segments {
                    let indexTo = bestString.index(bestString.startIndex, offsetBy: segment.substringRange.location)
                    lastString = bestString.substring(from: indexTo)
                }
                self.checkForColoursSaid(resultString: lastString)

            } else if let error = error {
                self.sendAlert(message: "There has been a speech recognition error")
                print(error)
            }
        }

    }) 

我希望这对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios语音识别错误域=kAFAssistantErrorDomain代码=216“(null)” 的相关文章

随机推荐

  • 悬停时旋转或旋转图像

    我想了解如何制作旋转或旋转图像当它悬停时 我想知道如何模拟该功能CSS关于以下代码 img border radius 50 img src http i imgur com 3DWAbmN jpg 您可以使用 CSS3 过渡rotate
  • Sed/Awk - 在模式 x 和 y 之间拉线

    我有一些大型 CSV 文件 我想在其中提取包含模式 x 的 X 行和包含模式 y 的 Y 行之间的所有数据 例如 other data Header data data data Footer other data 我希望能够将页眉 gt
  • Sling 资源与节点

    我无法理解为什么要在吊索中使用资源而不是节点 假设我有一些简单的访问节点 如下所示 NodeIterator headerNode currentNode getNodes loop through and do something wit
  • Div 高度 100%(不包括标题)

    好吧 我知道这个主题有很多问题 但我仍然无法确切地弄清楚如何完成这项工作 This接近问题 但它对我不起作用 我希望我的页面具有 100 的高度 此页面内有一个高度为 40 像素的静态标题 然后是占据剩余高度 100 40 像素 的内容 H
  • 如何使用 Greasemonkey/Tampermonkey 脚本更改类 CSS?

    我正在尝试设置主体的背景图像 但仅限于使用该类的地方banner url HTML如下 基本上 我想强制页面使用以下 CSS banner url background url http www pxleyes com images con
  • Android Studio:无法加载 JVM DLL

    我已经彻底研究了这个问题 并且发布的解决方案对我不起作用 我运行的是 Windows 8 以及最新的 JAVA JDK 64 位 和 Android Studio 版本 系统规格 新 XPS 13 酷睿 i5 8GB RAM SSD 确切的
  • 如何在 F# 中等待异步方法

    如何在 F 中等待异步方法 我有以下代码 type LegoExample let brick Brick BluetoothCommunication COM3 let result brick ConnectAsync Error 成员
  • 在 iOS 15 之前,我只能发送声音本地通知,现在我必须显示横幅

    这在 iOS 15 之前运行良好 let center UNUserNotificationCenter current let content UNMutableNotificationContent content sound UNNo
  • 如何获取JUnit中src/test/resources目录的路径?

    我知道我可以使用以下命令从 src test resources 加载文件 getClass getResource somefile getFile 但是我怎样才能获得 src test resources 的完整路径目录 即我不想加载文
  • 如何在 Rust 中延迟创建其构造使用 self 的映射条目

    我正在尝试在 Rust 中实现惰性构造 记忆化评估 缓存习惯用法 有一个外部类型 它有一堆数据和一个访问器方法 访问器方法需要返回缓存的计算 如果有 或计算它并将返回值存储在映射中以供以后使用 缓存的值不需要引用外部值 因此不存在循环引用问
  • PyQt:有没有更好的方法在代码中设置对象名称?

    当您使用 Qt Designer 或 Qt Creator 设计表单时 任何给定小部件的 objectName 始终设置为某个值 但是 如果您在代码中创建一个小部件并且稍后需要 objectName 则必须显式分配它 那么小部件分配至少需要
  • 未处理的异常:System.Runtime.InteropServices.COMException(0x800A03EC)

    我有一个导出 Excel 文件的 C 应用程序 当我从 Visual Studio 运行它时 它工作正常 但是 当我安排它从 SQL Server 代理运行时 它失败并出现以下错误 未处理的异常 System Runtime Interop
  • 如何修复“Http11NioProtocol:读取请求时出错,已忽略”

    当使用 SSL 在 azure kubernetes 服务上运行时 我的 spring boot 应用程序在 tomcat 服务器中以 NPE 启动后失败 首先 什么是成功的 我有一个使用 Spring Initializr 创建的最小 S
  • 数据库中存在“外键冗余”有坏处吗?

    我正在使用以下简化示例设计数据库结构 Team has many members Member has many clients Client has many projects 假设我的对象具有以下参数 Team id type Memb
  • 未找到“Google_Config”类

    我正在尝试通过说明实现 Google 的登录 APIhere 但由于某种原因 当我尝试运行它时 我总是得到 致命错误 在第 76 行 home Google Client php 中找不到类 Google Config 我很确定我正确链接到
  • onJsAlert 后 Android webview 不响应点击

    我已经覆盖了 WebChromeClient 的 onJsAlert 行为 例如 WebChromeClient wvcc new WebChromeClient Override public boolean onJsAlert WebV
  • 在 Jenkins 中抑制脚本化管道输出

    我相对较新Jenkins并想知道是否有任何关于抑制脚本化管道输出的示例Jenkins I see 这个问题 on jenkins网站 但我不太确定如何实施 我也没有看到明确的答案问题关于Stack Overflow关于这个问题 我基本上想摆
  • github桌面上的小红箭头和无标志是什么?

    get footer gt 右侧的这个小箭头和 no 符号是什么意思 It s the no newline octicon 它告诉您您的文件没有尾随换行符 您可以阅读以下内容了解为什么这一点很重要 这个问题
  • 如何获取我拥有的代币列表?

    我想获取给定钱包公钥的我当前拥有的代币列表 目前我正在使用https api solscan io account tokens address PUBLIC KEY gt price 1获得我拥有的代币 好的 所以我找到了这个 使用 SP
  • ios语音识别错误域=kAFAssistantErrorDomain代码=216“(null)”

    基本上我正在按照本教程学习ios语音识别模块 https medium com ios os x development speech recognition with swift in ios 10 50d5f4e59c48 但是当我在我