如何通过 Objective-C 中的语音框架实现语音转文本?

2023-11-27

我想使用 iOS 语音框架在我的 Objective-C 应用程序中进行语音识别。

我找到了一些 Swift 示例,但在 Objective-C 中找不到任何内容。

是否可以从 Objective-C 访问这个框架?如果是这样,怎么办?


在花了足够的时间寻找 Objective-C 示例之后——即使是在 Apple 文档中——我也找不到任何像样的东西,所以我自己解决了。

头文件(.h)

/*!
 * Import the Speech framework, assign the Delegate and declare variables
 */

#import <Speech/Speech.h>

@interface ViewController : UIViewController <SFSpeechRecognizerDelegate> {
    SFSpeechRecognizer *speechRecognizer;
    SFSpeechAudioBufferRecognitionRequest *recognitionRequest;
    SFSpeechRecognitionTask *recognitionTask;
    AVAudioEngine *audioEngine;
}

方法文件 (.m)

- (void)viewDidLoad {
    [super viewDidLoad];

    // Initialize the Speech Recognizer with the locale, couldn't find a list of locales
    // but I assume it's standard UTF-8 https://wiki.archlinux.org/index.php/locale
    speechRecognizer = [[SFSpeechRecognizer alloc] initWithLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];

    // Set speech recognizer delegate
    speechRecognizer.delegate = self;

    // Request the authorization to make sure the user is asked for permission so you can
    // get an authorized response, also remember to change the .plist file, check the repo's
    // readme file or this project's info.plist
    [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
        switch (status) {
            case SFSpeechRecognizerAuthorizationStatusAuthorized:
                NSLog(@"Authorized");
                break;
            case SFSpeechRecognizerAuthorizationStatusDenied:
                NSLog(@"Denied");
                break;
            case SFSpeechRecognizerAuthorizationStatusNotDetermined:
                NSLog(@"Not Determined");
                break;
            case SFSpeechRecognizerAuthorizationStatusRestricted:
                NSLog(@"Restricted");
                break;
            default:
                break;
        }
    }];

}

/*!
 * @brief Starts listening and recognizing user input through the 
 * phone's microphone
 */

- (void)startListening {

    // Initialize the AVAudioEngine
    audioEngine = [[AVAudioEngine alloc] init];

    // Make sure there's not a recognition task already running
    if (recognitionTask) {
        [recognitionTask cancel];
        recognitionTask = nil;
    }

    // Starts an AVAudio Session
    NSError *error;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
    [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

    // Starts a recognition process, in the block it logs the input or stops the audio
    // process if there's an error.
    recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
    AVAudioInputNode *inputNode = audioEngine.inputNode;
    recognitionRequest.shouldReportPartialResults = YES;
    recognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
        BOOL isFinal = NO;
        if (result) {
            // Whatever you say in the microphone after pressing the button should be being logged
            // in the console.
            NSLog(@"RESULT:%@",result.bestTranscription.formattedString);
            isFinal = !result.isFinal;
        }
        if (error) {
            [audioEngine stop];
            [inputNode removeTapOnBus:0];
            recognitionRequest = nil;
            recognitionTask = nil;
        }
    }];

    // Sets the recording format
    AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0];
    [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
        [recognitionRequest appendAudioPCMBuffer:buffer];
    }];

    // Starts the audio engine, i.e. it starts listening.
    [audioEngine prepare];
    [audioEngine startAndReturnError:&error];
    NSLog(@"Say Something, I'm listening"); 
}

- (IBAction)microPhoneTapped:(id)sender {
    if (audioEngine.isRunning) {
        [audioEngine stop];
        [recognitionRequest endAudio];
    } else {
        [self startListening];
    }
}

现在,添加委托SFSpeechRecognizerDelegate检查语音识别器是否可用。

#pragma mark - SFSpeechRecognizerDelegate Delegate Methods

- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available {
    NSLog(@"Availability:%d",available);
}

说明和注意事项

记得修改.plist文件以获得用户语音识别和使用麦克风的授权,当然<String>值必须根据您的需要进行定制,您可以通过创建和修改中的值来做到这一点Property List或右键单击.plist文件和Open As -> Source Code并将以下行粘贴到</dict> tag.

<key>NSMicrophoneUsageDescription</key>  <string>This app uses your microphone to record what you say, so watch what you say!</string>

<key>NSSpeechRecognitionUsageDescription</key>  <string>This app uses Speech recognition to transform your spoken words into text and then analyze the, so watch what you say!.</string>

另请记住,为了能够将语音框架导入到项目中,您需要拥有 iOS 10.0+。

要运行并测试它,您只需要一个非常基本的 UI,只需创建一个 UIButton 并分配microPhoneTapped对其进行操作,当按下时,应用程序应该开始监听并将通过麦克风听到的所有内容记录到控制台(在示例代码中)NSLog是唯一接收文本的东西)。再次按下时应停止录音。

我创建了一个Github 仓库附带示例项目,尽情享受吧!

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

如何通过 Objective-C 中的语音框架实现语音转文本? 的相关文章

  • 自定义 UITableViewCell 错误

    我收到此错误 Terminating app due to uncaught exception NSUnknownKeyException reason
  • 如何在基于视图的应用程序中添加导航控制器

    我想向基于视图的应用程序添加导航控制器 我们如何以编程方式和使用 xib 文件来完成此操作 如果您需要在 uiviewcontroller 中合并导航控制器 您需要按如下方式初始化它 UIViewController yourViewCon
  • iPad Safari Web Inspector 在页面加载时崩溃

    我有一个用 WordPress 制作的以视频为中心的网站 当我们在 iPad 上测试网站时 我们将其连接到 Mac 笔记本电脑并打开 safari 开发人员工具来检查是否有任何错误等 我们的主页上一切正常 但当我们转到我们添加的任何视频帖子
  • 致命错误:在 flutter 中找不到“Flutter/Flutter.h”文件

    这是错误 在文件中包含来自 Users chetan pub cache hosted pub dartlang org webview flutter 1 0 7 ios Classes JavaScriptChannelHandler
  • 是否可以对 UILabel 的文本颜色变化进行动画处理? [复制]

    这个问题在这里已经有答案了 UIView animateWithDuration 5 animations myLabel textColor UIColor redColor 标签文本颜色立即改变 Try this UIView tran
  • 如何设置 UINavigationbar 的渐变颜色?

    我想设置UINavigationbar backgroundColor渐变颜色 我想通过颜色数组设置它以创建渐变 理想情况下 作为内部的可访问方法UINavigationBar将其颜色更改为此渐变 有什么建议么 除了手动设置图像作为导航栏的
  • iOS5 和 Facebook API

    我想将我的应用程序与 Facebook 集成并从 github 下载 Facebook ios sdk 但是 该 sdk 适用于 Xcode 4 0 代码库 我正在使用 Xcode 4 2 for iOS 5 beta 5 应用程序 是否有
  • UINavigationBar 滑开而不是留在原处

    我创建了演示项目来展示问题 我们在 UINavigationController 中有两个视图控制器 MainViewController这是根 class MainViewController UIViewController lazy
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • Xcode 中的 NSObject 描述和自定义摘要

    我覆盖对象的 NSString description但是 Xcode 总是显示error summary string parsing error在变量视图的摘要字段中 我当前的实现如下 NSString description retu
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 旋转 GPUImageTiltShiftFilter - GPUImage

    我想要一个非水平 GPUImageTiltShiftFilter 旋转 我想将其旋转到任意旋转角度 我还希望过滤器速度快 可以通过带有 UIRotationGestureRecongizer 的 UI 进行旋转 我该怎么做呢 啊 想通了 不
  • Swift 错误:发出 SIGABRT 信号如何解决

    我只是 Swift 编码的初学者 我的想法很简单 就是一个有两个按钮的应用程序 单击时 文本字段将更改其文本 在 Main StoryBoard 中 我添加一个文本字段和两个按钮 在 ViewController swift 文件中 我这样
  • 如何将NSTextView的格式化内容转换为字符串

    我需要将 NSTextView 的内容从 Mac 应用程序传输到 iOS 应用程序 我使用 XML 作为传输文件格式 所以我需要将 NSTextView 的内容 文本 字体 颜色等 保存为字符串 有什么办法可以做到这一点吗 一种方法是存档
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • 播放循环声音的最简单方法是什么?

    在 iPhone 应用程序中播放循环声音的最简单方法是什么 可能最简单的解决方案是使用AVA音频播放器 http developer apple com library ios DOCUMENTATION AVFoundation Refe
  • ObjectiveC 和 JavaScriptCore:使用这种调用回调的方法会导致内存问题吗?

    免责声明 这是一篇很长的文章 但对于那些努力使用新的 ObjectiveC JavascriptCore 框架并在 ObjC 和 JS 之间进行异步编码的人来说可能非常有价值 您好 我对 Objective C 非常陌生 正在将 javas
  • AGVTool new-version 和 What-version 不对应

    当我做 agvtool new version all 99 它更新我的 Info plist 文件 但是 如果我这样做 agvtool what version or agvtool next version 我收到此错误 There d

随机推荐

  • 拉伸和缩放 CSS 背景

    有没有办法让 CSS 中的背景拉伸或缩放以填充其容器 Use the CSS 3财产background size my container background size 100 auto width and height can be
  • 清除Python中所有lru_cache

    我在 python 中有一些带有 lru cache 缓存的函数 例如 lru cache maxsize None def my function 虽然我可以单独清除缓存 例如my function cache clear 有没有办法一次
  • 将字符串转换为私钥和公钥 (RSA)

    私钥和公钥的两个字符串是 static String Public MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH wPrKYG1KVlzQUVtBghR8n9d n zcShSZo0 3KgyVdOea7
  • Mongoose批量更新操作

    有没有办法对猫鼬的集合进行批量更新 我发现的策略使用原始收集驱动程序 如下所示 var bulk Person collection initializeOrderedBulkOp bulk find query update update
  • 我可以使用 Maven 依赖项的路径作为属性吗?

    我的 pom xml 中有一个 Maven 依赖项 如下所示
  • Win32 应用程序窗口最终停止在 Windows 7 上绘制

    我有一个用 C 没有 MFC 或 NET 编写的大型复杂应用程序 使用该软件最频繁的客户端将在启动该软件后大约一个小时内达到所有窗口都停止绘制的状态 我们收到报告称应用程序已 挂起 因为据他们所知没有发生任何事情 实际上 应用程序正在运行
  • 如何避免在 Excel VBA 中使用 Select

    我听说过很多关于使用的厌恶情绪 这是可以理解的 Select在 Excel VBA 中 但我不确定如何避免使用它 我发现如果我能够使用变量而不是变量 我的代码将更具可重用性Select功能 但是 我不确定如何指代事物 例如ActiveCel
  • ASP.NET MVC 是无状态的吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我听说 MVC NET 是
  • 为什么我们使用模板而不是函数?

    只是寻找一些好的理由 这样我就可以开始了解它们 避免重复除了不同类型之外其他方面相同的代码 有时 您根本不能依赖隐式转换或提升 也不能将所有内容都填充到对象层次结构中
  • 如何创建自动启动的C++程序

    我正在用 C 创建一个程序 我希望能够选择让用户让它在 Windows 中自动启动 因此 当用户启动计算机时 Windows 将自动启动该程序 我已经阅读过有关修改注册表或将其放入启动文件夹中的内容 但是最好的 干净 方法是什么 启动文件夹
  • 哈希表到底是什么?

    它们是什么以及它们如何工作 它们用在哪里 我什么时候应该 不 使用它们 我听过这个词很多次 但我不知道它的确切含义 我听到的是 它们允许关联数组 通过哈希函数发送数组键 该函数将其转换为 int 然后使用常规数组 我这样说对吗 注意 这不是
  • Laravel 5.2 的软删除级联

    我正在尝试在 Laravel 中实现软删除 这是我的人际关系 Tournament hasMany CategoryTournament hasOne CategorySettings Tournament hasMany Category
  • 隐藏活动指示器

    在我的主故事板上 我创建了一个活动指示器 我想隐藏我的活动指示器 直到按下按钮 我有办法做到这一点吗 当我按下按钮时 活动指示器开始动画 self indicator hidden NO self indicator startAnimat
  • 在 Postman 中使用集合变量

    所有的例子都在Learning getpostman com站点显示如何保存变量global or environment级别 以便从一个请求到另一个请求获取值 例如 pm environment set variableName Stri
  • 如何在 pandas 中创建多级数据框?

    给定两个不同的 df A a b 2016 11 21 2 1 2016 11 22 3 4 2016 11 23 5 2 2016 11 24 6 3 2016 11 25 6 3 B a b 2016 11 21 3 0 2016 11
  • R中的向后消除

    我试图使用 R 的向后消除来获得最终模型 但在运行代码时收到以下错误消息 有人可以帮我这个吗 base lt lm Eeff NDF data phuong fullmodel lt lm Eeff NDF ADF CP NEL DMI F
  • ReSharper 单元测试运行程序 - TestCase

    我喜欢使用 ReSharper 单元测试运行器 但它不支持 NUnit 2 5 中添加的 TestCase 属性 有什么办法可以解决这个问题吗 显然我可以使用另一个测试运行器 但我喜欢 ReSharper 我喜欢 ReSharper 但它还
  • 为 Eclipse RCP 中的状态栏/装饰做出贡献

    我需要在 Eclipse 应用程序的状态栏中显示状态指示器 我无法通过 ApplicationWindowAdviser 另一个团队拥有核心产品 做出贡献 但我确信我应该能够通过扩展点做出贡献 尽管进行了大量的谷歌搜索 我找不到任何描述如何
  • mapreduce.framework.name 在 mapred-site.xml 中的经典、本地之间有什么区别?

    官方对该参数的描述如下 The runtime framework for executing MapReduce jobs Can be one of local classic or yarn 我知道 yarn 值适用于 MRv2 它将
  • 如何通过 Objective-C 中的语音框架实现语音转文本?

    我想使用 iOS 语音框架在我的 Objective C 应用程序中进行语音识别 我找到了一些 Swift 示例 但在 Objective C 中找不到任何内容 是否可以从 Objective C 访问这个框架 如果是这样 怎么办 在花了足