服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS10语音识别框架SpeechFramework应用详解

iOS10语音识别框架SpeechFramework应用详解

2021-02-01 16:28珲少 IOS

在iOS10系统了,apple开放了与语音识别相关的接口,开发者可以将其应用到自己的App中,实现用户通过语音进行功能操作。 这篇文章主要介绍了iOS10语音识别框架SpeechFramework应用,需要的朋友可以参考下

摘要: ios10语音识别框架speechframework应用

一、引言

        ios10系统是一个较有突破性的系统,其在message,notification等方面都开放了很多实用性的开发接口。本篇博客将主要探讨ios10中新引入的speechframework框架。有个这个框架,开发者可以十分容易的为自己的app添加语音识别功能,不需要再依赖于其他第三方的语音识别服务,并且,apple的siri应用的强大也证明了apple的语音服务是足够强大的,不通过第三方,也大大增强了用户的安全性。

二、speechframework框架中的重要类

        speechframework框架比较轻量级,其中的类并不十分冗杂,在学习speechframework框架前,我们需要对其中类与类与类之间的关系有个大致的熟悉了解。

sfspeechrecognizer:这个类是语音识别的操作类,用于语音识别用户权限的申请,语言环境的设置,语音模式的设置以及向apple服务发送语音识别的请求。

sfspeechrecognitiontask:这个类是语音识别服务请求任务类,每一个语音识别请求都可以抽象为一个sfspeechrecognitiontask实例,其中sfspeechrecognitiontaskdelegate协议中约定了许多请求任务过程中的监听方法。

sfspeechrecognitionrequest:语音识别请求类,需要通过其子类来进行实例化。

sfspeechurlrecognitionrequest:通过音频url来创建语音识别请求。

sfspeechaudiobufferrecognitionrequest:通过音频流来创建语音识别请求。

sfspeechrecognitionresult:语音识别请求结果类。

sftranscription:语音转换后的信息类。

sftranscriptionsegment:语音转换中的音频节点类。

        了解了上述类的作用于其之间的联系,使用speechframework框架将十分容易。

三、申请用户语音识别权限与进行语音识别请求

        开发者若要在自己的app中使用语音识别功能,需要获取用户的同意。首先需要在工程的info.plist文件中添加一个privacy-speech recognition usage description键,其实需要对应一个string类型的值,这个值将会在系统获取权限的警告框中显示,info.plist文件如下图所示:

iOS10语音识别框架SpeechFramework应用详解

使用sfspeechrecognize类的requestauthorization方法来进行用户权限的申请,用户的反馈结果会在这个方法的回调block中传入,如下:

?
1
2
3
//申请用户语音识别权限
[sfspeechrecognizer requestauthorization:^(sfspeechrecognizerauthorizationstatus status) {
}];

sfspeechrecognizerauthorzationstatus枚举中定义了用户的反馈结果,如下:

?
1
2
3
4
5
6
7
8
9
10
typedef ns_enum(nsinteger, sfspeechrecognizerauthorizationstatus) {
 //结果未知 用户尚未进行选择
 sfspeechrecognizerauthorizationstatusnotdetermined,
 //用户拒绝授权语音识别
 sfspeechrecognizerauthorizationstatusdenied,
 //设备不支持语音识别功能
 sfspeechrecognizerauthorizationstatusrestricted,
 //用户授权语音识别
 sfspeechrecognizerauthorizationstatusauthorized,
};

        如果申请用户语音识别权限成功,开发者可以通过sfspeechrecognizer操作类来进行语音识别请求,示例如下:

?
1
2
3
4
5
6
7
8
9
//创建语音识别操作类对象
sfspeechrecognizer * rec = [[sfspeechrecognizer alloc]init];
//通过一个音频路径创建音频识别请求
sfspeechrecognitionrequest * request = [[sfspeechurlrecognitionrequest alloc]initwithurl:[[nsbundle mainbundle] urlforresource:@"7011" withextension:@"m4a"]];
//进行请求
[rec recognitiontaskwithrequest:request resulthandler:^(sfspeechrecognitionresult * _nullable result, nserror * _nullable error) {
 //打印语音识别的结果字符串
 nslog(@"%@",result.besttranscription.formattedstring);
}];

四、深入sfspeechrecognizer类

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//获取当前用户权限状态
+ (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协议中只约定了一个方法,如下:

?
1
2
//当语音识别操作可用性发生改变时会被调用
- (void)speechrecognizer:(sfspeechrecognizer *)speechrecognizer availabilitydidchange:(bool)available;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//当开始检测音频源中的语音时首先调用此方法
- (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类中封装了属性和方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//此任务的当前状态
/*
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类来进行创建:

?
1
2
3
4
5
6
7
8
9
10
@interface sfspeechaudiobufferrecognitionrequest : sfspeechrecognitionrequest
 
@property (nonatomic, readonly) avaudioformat *nativeaudioformat;
//拼接音频流
- (void)appendaudiopcmbuffer:(avaudiopcmbuffer *)audiopcmbuffer;
- (void)appendaudiosamplebuffer:(cmsamplebufferref)samplebuffer;
//完成输入
- (void)endaudio;
 
@end

五、语音识别结果类sfspeechrecognitionresult

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

?
1
2
3
4
5
6
//识别到的多套语音转换信息数组 其会按照准确度进行排序
@property (nonatomic, readonly, copy) nsarray<sftranscription *> *transcriptions;
//准确性最高的识别实例
@property (nonatomic, readonly, copy) sftranscription *besttranscription;
//是否已经完成 如果yes 则所有所有识别信息都已经获取完成
@property (nonatomic, readonly, getter=isfinal) bool final;

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

?
1
2
3
4
//完整的语音识别准换后的文本信息字符串
@property (nonatomic, readonly, copy) nsstring *formattedstring;
//语音识别节点数组
@property (nonatomic, readonly, copy) nsarray<sftranscriptionsegment *> *segments;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
//当前节点识别后的文本信息
@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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

延伸 · 阅读

精彩推荐
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22