iOS SFSpeechRecognizer 语音识别

这篇具有很好参考价值的文章主要介绍了iOS SFSpeechRecognizer 语音识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SFSpeechRecognizer 属于 Speech 框架,在 iOS 10 首次出现,并在 iOS13 中进行了比较重大的更新,在 iOS 13 上支持离线语音识别以及语音分析。WWDC2019 展示了其在 AI 领域的进步,其中 iOS 13 设备内置语音识别就是一项比较不错功能。
sfspeechrecognizer,ios,语音识别,人工智能

1. 都做了哪些升级

移动端上的离线语音识别模型,减少用户泄露风险,增加了用户隐私。新 API 支持了很多新功能,例如使用语音分析指标跟踪语音质量和语音模式。

同时设备上的离线模型,可以支持无限期地语音识别。与iOS 10 的早期版本只能识别一分钟相比,这是一个很巨大的提升。当然也存在一丢丢的弊端,它并不会像云端模型一样可以在线学习。会导致设备的准确性有些降低。

iOS 13 SFSpeechRecognizer 相比也智能了很多,可以识别语音中的标点符号。比如说句号,它会识别一个句号,同样其他符号也可以支持识别,比如逗号、破折号等等。但是还存在不足的一点就是目前它还不能自己帮助识别的文字添加标点符号,不过这一点已经在 iOS 16 上得到了处理,准确率也做了相应提升,已经可以替换很多付费的语音识别框架了。

2. 实现效果

可以先看效果,可以注意一下,屏幕截图是在飞行模式下拍摄的,完全离线。
这次是通过麦克风进行语音识别的,SFSpeechRecognizer 也可以支持语音文件来识别,有兴趣可以自己了解一下。
sfspeechrecognizer,ios,语音识别,人工智能

3. 工作原理

sfspeechrecognizer,ios,语音识别,人工智能
上图是实时语音识别的内部实现,语音识别依赖于以下四个:

  • AVAudioEngine
  • SFSpeechRecognizer
  • SFRecognitionTask
  • SFSpeechAudioBufferRecognitionRequest

接下来,我们看看这些是如何工作的。

对于新手而言,我先介绍一下用户隐私权限相关的内容:

添加隐私使用说明
这里需要增加麦克风和语音识别的隐私使用说明, 如下所示。
sfspeechrecognizer,ios,语音识别,人工智能

请求权限
SFSpeechRecognizer.requestAuthorization { authStatus in
switch authStatus {
case .authorized:
case .restricted:
case .notDetermined:
case .denied:
}
}

初始化
var speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: “zh-CN”))

4. 实现

4.1 配置 AVAudioEngine

AVAudioEngine 负责采集来自麦克风的音频信号,然后将音频信号传入 SFSpeechAudioBufferRecognitionRequest。

let audioEngine = AVAudioEngine()
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)

let inputNode = audioEngine.inputNode

// 在安装 tap 之前先移除上一个 否则可能报
// "*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: nullptr == Tap()"之类的错误
inputNode.removeTap(onBus: 0)
let recordingFormat = inputNode.outputFormat(forBus: 0)

// bufferSize:传入缓冲区的请求大小
// 创建一个“tap”来记录/监视/观察节点的输出
// bus:连接tap的节点输出总线
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
    self.recognitionRequest?.append(buffer)
}

audioEngine.prepare()
try audioEngine.start()

上面的代码在 上安装了一个 tap ,并设置了输出的缓冲区大小,这个缓冲区用来缓存说话或录音时的音频信号。
一旦该缓冲区大小被填满,就会被发送到 SFSpeechAudioBufferRecognitionRequest。

现在我们看看 SFSpeechAudioBufferRecognitionRequest 是如何使用 SFSpeechRecognizer 和 SFSpeechRecognitionTask 将语音转录为文本。

4.2 启用设备语音识别

recognitionRequest.requiresOnDeviceRecognition = true

设置为 false 将使用 Apple Cloud 进行语音识别。需要注意一下,requiresOnDeviceRecognition 仅适用于 iOS 13、macOS Catalina 及更高版本的设备。它需要 Apple 的 A9 或新的处理器,在 iOS 中 iPhone6s 及以上设备支持。

4.3 创建 SFSpeechRecognitionTask

SFSpeechRecognitionTask 是用来运行 SFSpeechAudioBufferRecognitionRequest 和 SFSpeechRecognizer. 这里有 block 和 delegate 两种方式,下面这个例子是使用了 block 方式,它回调了一个 result,我们通过 result 访问不同的语音属性。bestTranscription 标识置信度最高的一个选项

recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in
    // 处理识别结果
    if let result = result {
        DispatchQueue.main.async {
            let transcribedString = result.bestTranscription.formattedString
            self.transcribedText.text = (transcribedString)
        }
    }
    // 异常处理
    if error != nil {
        self.audioEngine.stop()
        inputNode.removeTap(onBus: 0)
        self.recognitionRequest = nil
        self.recognitionTask = nil
    }
}

4.4 SFVoiceAnalytics

SFVoiceAnalytics 是新引入的类,它包含一组语音指标,用于跟踪语音结果中的音高、闪烁和抖动等特征。 可以从 transcription 的 segments 属性访问它们:

for segment in result.bestTranscription.segments {
    guard let voiceAnalytics = segment.voiceAnalytics else { continue }
    
    let pitch = voiceAnalytics.pitch
    let voicing = voiceAnalytics.voicing.acousticFeatureValuePerFrame
    let jitter = voiceAnalytics.jitter.acousticFeatureValuePerFrame
    let shimmer = voiceAnalytics.shimmer.acousticFeatureValuePerFrame
}

4.5 语音识别

在上面我们提到了四个组件,下面代码看看他整体是如何工作的

private let audioEngine = AVAudioEngine()
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
private var speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-CN"))
private var recognitionTask: SFSpeechRecognitionTask?

func startRecording() throws {

        recognitionTask?.cancel()
        self.recognitionTask = nil

        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        
        let inputNode = audioEngine.inputNode
        inputNode.removeTap(onBus: 0)
        let recordingFormat = inputNode.outputFormat(forBus: 0)
        inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
            self.recognitionRequest?.append(buffer)
        }
        
        audioEngine.prepare()
        try audioEngine.start()
        
        recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        guard let recognitionRequest = recognitionRequest else { fatalError("Unable to create a SFSpeechAudioBufferRecognitionRequest object") }
        // 分部返回结果,每次识别完成就会回调部分结果
        recognitionRequest.shouldReportPartialResults = true
        if #available(iOS 16, *) {
            // iOS 16 已经支持自动添加标点符号,不需要再喊标点符号了
            recognitionRequest.addsPunctuation = true
        }
        if #available(iOS 13, *) {
            if speechRecognizer?.supportsOnDeviceRecognition ?? false{
                recognitionRequest.requiresOnDeviceRecognition = true
            }
        }

        recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in
            if let result = result {
                DispatchQueue.main.async {
                    // 获取置信度最高的 transcription,并格式化为字符串
                    let transcribedString = result.bestTranscription.formattedString
                    self.transcribedText.text = (transcribedString)
                }
            }
            if error != nil {
                self.audioEngine.stop()
                inputNode.removeTap(onBus: 0)
                self.recognitionRequest = nil
                self.recognitionTask = nil
            }
        }
    }

上面的代码比较长,我们讲解一下上面的代码中:

  • 在按开始录音识别的时,先取消任何先前的识别任务。

  • 使用 SFSpeechRecognizer 和 SFSpeechAudioBufferRecognitionRequest 创建识别任务 SFSpeechRecognitionTask。

  • 设置 shouldReportPartialResults 为 true 可以允许在识别期间访问中间结果。

  • result.bestTranscription 会返回具有最高置信度的识别转录,formattedString 属性会给出转录文本。

  • 还可以访问其他属性,例如 speakingRate、averagePauseDuration或 segments 等等。

5. 总结

这基本上就是通过麦克风将语音识别为文本的整个过程了,所使用的 SFSpeechAudioBufferRecognitionRequest是 SFSpeechRecognitionRequest 的子类,它还有另外一个子类 SFSpeechURLRecognitionRequest,它可以通过本地录音文件路径进行识别,有兴趣的自己可以再看一下。

由于再实际应用场景中,还有可能使用第三方 SDK 来提供 AudioBuffer 音频信息的,而我们的示例是使用 AVAudioEngine 来提供 AudioBuffer ,其实也可以通过 recognitionRequest 自己添加 buffer,如果有遇到的可以试一试。文章来源地址https://www.toymoban.com/news/detail-728650.html

到了这里,关于iOS SFSpeechRecognizer 语音识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 构建基于AWSLambda的人工智能应用:语音识别、图像识别和自然语言处理

    作者:禅与计算机程序设计艺术 在人工智能领域,用大数据、机器学习等方法来解决复杂的问题,已经成为越来越多企业和开发者关注的问题。但是,如何把这些方法落地到生产环境中,仍然是一个难题。 随着云计算平台的广泛普及,AWS Lambda作为一项服务正在成为各个公司

    2024年02月09日
    浏览(78)
  • 语音识别与VC维:改变人工智能的未来

    语音识别(Speech Recognition)是一种人工智能技术,它旨在将人类的语音信号转换为文本或其他形式的数据。这项技术在过去几年中得到了巨大的发展,并成为人工智能领域的一个关键技术。VC维(Vocabulary Coverage Dimension)是一种数学模型,用于描述语言模型的表达能力。在本文中,

    2024年02月19日
    浏览(61)
  • 人工智能-语音识别技术paddlespeech的搭建和使用

    PaddleSpeech是百度飞桨(PaddlePaddle)开源深度学习平台的其中一个项目,它基于飞桨的语音方向模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型。PaddleSpeech支持语音识别、语音翻译(英译中)、语音合成、标点恢复等应用示例。

    2024年02月02日
    浏览(64)
  • 【人工智能】科大讯飞语音识别应用开发(第三集)

    这次需要对科大讯飞语音识别接口进行语音识别应用开发,前两次都是通过WebAPI调用接口,这次换一下,通过SDK调用接口 下面是开发的详细记录过程(基于前两次的基础上) 网址:https://www.xfyun.cn/services/voicedictation 不领服务量为500且该包免费( 貌似是不同应用都可以免费领

    2024年02月13日
    浏览(54)
  • 智能语音识别在人工智能应用中的重要性

    作者:禅与计算机程序设计艺术 随着计算机的发展、移动互联网的普及和互联网服务的快速发展,语音识别技术也逐渐走入人们的视野中。相对于手写文字或是拼音方式输入的方式,语音输入的方式带来的便利、准确率提高的效果,使得越来越多的人开始喜欢用语音的方式来

    2024年02月07日
    浏览(68)
  • OpenAI的人工智能语音识别模型Whisper详解及使用

            拥有ChatGPT语言模型的OpenAI公司,开源了 Whisper 自动语音识别系统,OpenAI 强调 Whisper 的语音识别能力已达到人类水准。         Whisper是一个通用的语音识别模型,它使用了大量的多语言和多任务的监督数据来训练,能够在英语语音识别上达到接近人类水平的鲁

    2024年02月09日
    浏览(62)
  • ios apns推送 离线锁屏语音播报

    原文地址:https://zhanglei.blog.csdn.net/article/details/130316253 公司正在研发的一款App,需要在进行消息推送时支持语音播报。 具体要求: 离线:App在用户未打开时,可收到消息推送 锁屏:用户在设备锁屏状态下,仍可收到消息推送 语音播报:收到消息推送时可同时进行语音播放

    2023年04月25日
    浏览(39)
  • 极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践

    业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C++ 移植版本,它具有无依赖项、内存使用量低等特点,重要的是增加了 Core ML 支持,完美适配苹果M系列芯片。 Whisper.cpp的张量

    2024年02月02日
    浏览(68)
  • 人工智能技术在智能音箱中的应用:智能语音识别与智能交互

    作者:禅与计算机程序设计艺术 引言 1.1. 背景介绍 智能音箱作为智能家居的重要组成部分,近年来得到了越来越多的用户青睐。随着人工智能技术的不断发展,智能音箱的核心功能之一——智能语音识别与智能交互也越来越受到人们的关注。智能语音识别技术可以让用户更

    2024年02月07日
    浏览(59)
  • 微信小程序-处理ios无法播放语音的问题

    框架:taro+vue3 问题:今天搞小程序语音播放功能,开放工具播放正常,但是到ios手机上调试时无法播放,在网上找到个好办法 核心代码 略微完整的代码

    2024年02月15日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包