iOS10语音识别框架SpeechFramework应用(二)

简介: iOS10语音识别框架SpeechFramework应用

四、深入SFSpeechRecognizer类


       SFSpeechRecognizer类的主要作用是申请权限,配置参数与进行语音识别请求。其中比较重要的属性与方法如下:


//获取当前用户权限状态

+ (SFSpeechRecognizerAuthorizationStatus)authorizationStatus;

//申请语音识别用户权限

+ (void)requestAuthorization:(void(^)(SFSpeechRecognizerAuthorizationStatus status))handler;

//获取所支持的所有语言环境

+ (NSSet<NSLocale *> *)supportedLocales;

//初始化方法 需要注意 这个初始化方法将默认以设备当前的语言环境作为语音识别的语言环境

- (nullable instancetype)init;

//初始化方法 设置一个特定的语言环境

- (nullable instancetype)initWithLocale:(NSLocale *)locale NS_DESIGNATED_INITIALIZER;

//语音识别是否可用

@property (nonatomic, readonly, getter=isAvailable) BOOL available;

//语音识别操作类协议代理

@property (nonatomic, weak) id<SFSpeechRecognizerDelegate> delegate;

//设置语音识别的配置参数 需要注意 在每个语音识别请求中也有这样一个属性 这里设置将作为默认值

//如果SFSpeechRecognitionRequest对象中也进行了设置 则会覆盖这里的值

/*

typedef NS_ENUM(NSInteger, SFSpeechRecognitionTaskHint) {

   SFSpeechRecognitionTaskHintUnspecified = 0,     // 无定义

   SFSpeechRecognitionTaskHintDictation = 1,       // 正常的听写风格

   SFSpeechRecognitionTaskHintSearch = 2,          // 搜索风格

   SFSpeechRecognitionTaskHintConfirmation = 3,    // 短语风格

};

*/

@property (nonatomic) SFSpeechRecognitionTaskHint defaultTaskHint;

//使用回调Block的方式进行语音识别请求 请求结果会在Block中传入

- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request

                                         resultHandler:(void (^)(SFSpeechRecognitionResult * __nullable result, NSError * __nullable error))resultHandler;

//使用代理回调的方式进行语音识别请求

- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request

                                              delegate:(id <SFSpeechRecognitionTaskDelegate>)delegate;

//设置请求所占用的任务队列

@property (nonatomic, strong) NSOperationQueue *queue;

SFSpeechRecognizerDelegate协议中只约定了一个方法,如下:


//当语音识别操作可用性发生改变时会被调用

- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available;

       通过Block回调的方式进行语音识别请求十分简单,如果使用代理回调的方式,开发者需要实现SFSpeechRecognitionTaskDelegate协议中的相关方法,如下:


//当开始检测音频源中的语音时首先调用此方法

- (void)speechRecognitionDidDetectSpeech:(SFSpeechRecognitionTask *)task;

//当识别出一条可用的信息后 会调用

/*

需要注意,apple的语音识别服务会根据提供的音频源识别出多个可能的结果 每有一条结果可用 都会调用此方法

*/

- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didHypothesizeTranscription:(SFTranscription *)transcription;

//当识别完成所有可用的结果后调用

- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishRecognition:(SFSpeechRecognitionResult *)recognitionResult;

//当不再接受音频输入时调用 即开始处理语音识别任务时调用

- (void)speechRecognitionTaskFinishedReadingAudio:(SFSpeechRecognitionTask *)task;

//当语音识别任务被取消时调用

- (void)speechRecognitionTaskWasCancelled:(SFSpeechRecognitionTask *)task;

//语音识别任务完成时被调用

- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishSuccessfully:(BOOL)successfully;

       SFSpeechRecognitionTask类中封装了属性和方法如下:


//此任务的当前状态

/*

typedef NS_ENUM(NSInteger, SFSpeechRecognitionTaskState) {

   SFSpeechRecognitionTaskStateStarting = 0,       // 任务开始

   SFSpeechRecognitionTaskStateRunning = 1,        // 任务正在运行

   SFSpeechRecognitionTaskStateFinishing = 2,      // 不在进行音频读入 即将返回识别结果

   SFSpeechRecognitionTaskStateCanceling = 3,      // 任务取消

   SFSpeechRecognitionTaskStateCompleted = 4,      // 所有结果返回完成

};

*/

@property (nonatomic, readonly) SFSpeechRecognitionTaskState state;

//音频输入是否完成

@property (nonatomic, readonly, getter=isFinishing) BOOL finishing;

//手动完成音频输入 不再接收音频

- (void)finish;

//任务是否被取消

@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled;

//手动取消任务

- (void)cancel;

       关于音频识别请求类,除了可以使用SFSpeechURLRecognitionRequest类来进行创建外,还可以使用SFSpeechAudioBufferRecognitionRequest类来进行创建:


@interface SFSpeechAudioBufferRecognitionRequest : SFSpeechRecognitionRequest


@property (nonatomic, readonly) AVAudioFormat *nativeAudioFormat;

//拼接音频流

- (void)appendAudioPCMBuffer:(AVAudioPCMBuffer *)audioPCMBuffer;

- (void)appendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;

//完成输入

- (void)endAudio;


@end

五、语音识别结果类SFSpeechRecognitionResult


       SFSpeechRecognitionResult类是语音识别结果的封装,其中包含了许多套平行的识别信息,其每一份识别信息都有可信度属性来描述其准确程度。SFSpeechRecognitionResult类中属性如下:


//识别到的多套语音转换信息数组 其会按照准确度进行排序

@property (nonatomic, readonly, copy) NSArray<SFTranscription *> *transcriptions;

//准确性最高的识别实例

@property (nonatomic, readonly, copy) SFTranscription *bestTranscription;

//是否已经完成 如果YES 则所有所有识别信息都已经获取完成

@property (nonatomic, readonly, getter=isFinal) BOOL final;

SFSpeechRecognitionResult类只是语音识别结果的一个封装,真正的识别信息定义在SFTranscription类中,SFTranscription类中属性如下:


//完整的语音识别准换后的文本信息字符串

@property (nonatomic, readonly, copy) NSString *formattedString;

//语音识别节点数组

@property (nonatomic, readonly, copy) NSArray<SFTranscriptionSegment *> *segments;

当对一句完整的话进行识别时,Apple的语音识别服务实际上会把这句语音拆分成若干个音频节点,每个节点可能为一个单词,SFTranscription类中的segments属性就存放这些节点。SFTranscriptionSegment类中定义的属性如下:


//当前节点识别后的文本信息

@property (nonatomic, readonly, copy) NSString *substring;

//当前节点识别后的文本信息在整体识别语句中的位置

@property (nonatomic, readonly) NSRange substringRange;

//当前节点的音频时间戳

@property (nonatomic, readonly) NSTimeInterval timestamp;

//当前节点音频的持续时间

@property (nonatomic, readonly) NSTimeInterval duration;

//可信度/准确度 0-1之间

@property (nonatomic, readonly) float confidence;

//关于此节点的其他可能的识别结果

@property (nonatomic, readonly) NSArray<NSString *> *alternativeSubstrings;

温馨提示:SpeechFramework框架在模拟器上运行会出现异常情况,无法进行语音识别请求。会报出kAFAssistantErrorDomain的错误,还望有知道解决方案的朋友,给些建议,Thanks。

相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
目录
相关文章
|
1月前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
188 60
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
166 4
|
11天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
98 66
|
2月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
1月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
33 2
|
1月前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
1月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
59 1
|
1月前
|
机器学习/深度学习 自然语言处理 搜索推荐
智能语音交互:技术原理与应用前景####
【10月更文挑战第25天】 一句话概括本文主旨,并引发读者兴趣。 智能语音交互技术,作为人工智能领域的重要分支,正以前所未有的速度融入我们的生活,从简单的语音助手到复杂的多轮对话系统,它不仅重塑了人机交互的方式,还为多个行业带来了革命性的变化。本文将深入浅出地探讨智能语音交互的技术原理、当前主流技术路线、面临的挑战及未来发展趋势,为读者揭开这一高科技领域的神秘面纱。 ####