最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS10語音識別框架SpeechFramework應(yīng)用詳解

 更新時間:2016年09月27日 10:44:51   作者:琿少  
在iOS10系統(tǒng)了,apple開放了與語音識別相關(guān)的接口,開發(fā)者可以將其應(yīng)用到自己的App中,實現(xiàn)用戶通過語音進(jìn)行功能操作。 這篇文章主要介紹了iOS10語音識別框架SpeechFramework應(yīng)用,需要的朋友可以參考下

摘要: iOS10語音識別框架SpeechFramework應(yīng)用

一、引言

        iOS10系統(tǒng)是一個較有突破性的系統(tǒng),其在Message,Notification等方面都開放了很多實用性的開發(fā)接口。本篇博客將主要探討iOS10中新引入的SpeechFramework框架。有個這個框架,開發(fā)者可以十分容易的為自己的App添加語音識別功能,不需要再依賴于其他第三方的語音識別服務(wù),并且,Apple的Siri應(yīng)用的強大也證明了Apple的語音服務(wù)是足夠強大的,不通過第三方,也大大增強了用戶的安全性。

二、SpeechFramework框架中的重要類

        SpeechFramework框架比較輕量級,其中的類并不十分冗雜,在學(xué)習(xí)SpeechFramework框架前,我們需要對其中類與類與類之間的關(guān)系有個大致的熟悉了解。

SFSpeechRecognizer:這個類是語音識別的操作類,用于語音識別用戶權(quán)限的申請,語言環(huán)境的設(shè)置,語音模式的設(shè)置以及向Apple服務(wù)發(fā)送語音識別的請求。

SFSpeechRecognitionTask:這個類是語音識別服務(wù)請求任務(wù)類,每一個語音識別請求都可以抽象為一個SFSpeechRecognitionTask實例,其中SFSpeechRecognitionTaskDelegate協(xié)議中約定了許多請求任務(wù)過程中的監(jiān)聽方法。

SFSpeechRecognitionRequest:語音識別請求類,需要通過其子類來進(jìn)行實例化。

SFSpeechURLRecognitionRequest:通過音頻URL來創(chuàng)建語音識別請求。

SFSpeechAudioBufferRecognitionRequest:通過音頻流來創(chuàng)建語音識別請求。

SFSpeechRecognitionResult:語音識別請求結(jié)果類。

SFTranscription:語音轉(zhuǎn)換后的信息類。

SFTranscriptionSegment:語音轉(zhuǎn)換中的音頻節(jié)點類。

        了解了上述類的作用于其之間的聯(lián)系,使用SpeechFramework框架將十分容易。

三、申請用戶語音識別權(quán)限與進(jìn)行語音識別請求

        開發(fā)者若要在自己的App中使用語音識別功能,需要獲取用戶的同意。首先需要在工程的Info.plist文件中添加一個Privacy-Speech Recognition Usage Description鍵,其實需要對應(yīng)一個String類型的值,這個值將會在系統(tǒng)獲取權(quán)限的警告框中顯示,Info.plist文件如下圖所示:

使用SFSpeechRecognize類的requestAuthorization方法來進(jìn)行用戶權(quán)限的申請,用戶的反饋結(jié)果會在這個方法的回調(diào)block中傳入,如下:

 //申請用戶語音識別權(quán)限
 [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) { 
 }];

SFSpeechRecognizerAuthorzationStatus枚舉中定義了用戶的反饋結(jié)果,如下:

typedef NS_ENUM(NSInteger, SFSpeechRecognizerAuthorizationStatus) {
 //結(jié)果未知 用戶尚未進(jìn)行選擇
 SFSpeechRecognizerAuthorizationStatusNotDetermined,
 //用戶拒絕授權(quán)語音識別
 SFSpeechRecognizerAuthorizationStatusDenied,
 //設(shè)備不支持語音識別功能
 SFSpeechRecognizerAuthorizationStatusRestricted,
 //用戶授權(quán)語音識別
 SFSpeechRecognizerAuthorizationStatusAuthorized,
};

        如果申請用戶語音識別權(quán)限成功,開發(fā)者可以通過SFSpeechRecognizer操作類來進(jìn)行語音識別請求,示例如下:

 //創(chuàng)建語音識別操作類對象
 SFSpeechRecognizer * rec = [[SFSpeechRecognizer alloc]init];
 //通過一個音頻路徑創(chuàng)建音頻識別請求
 SFSpeechRecognitionRequest * request = [[SFSpeechURLRecognitionRequest alloc]initWithURL:[[NSBundle mainBundle] URLForResource:@"7011" withExtension:@"m4a"]];
 //進(jìn)行請求
 [rec recognitionTaskWithRequest:request resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
  //打印語音識別的結(jié)果字符串
  NSLog(@"%@",result.bestTranscription.formattedString);
 }];

四、深入SFSpeechRecognizer類

        SFSpeechRecognizer類的主要作用是申請權(quán)限,配置參數(shù)與進(jìn)行語音識別請求。其中比較重要的屬性與方法如下:

//獲取當(dāng)前用戶權(quán)限狀態(tài)
+ (SFSpeechRecognizerAuthorizationStatus)authorizationStatus;
//申請語音識別用戶權(quán)限
+ (void)requestAuthorization:(void(^)(SFSpeechRecognizerAuthorizationStatus status))handler;
//獲取所支持的所有語言環(huán)境
+ (NSSet<NSLocale *> *)supportedLocales;
//初始化方法 需要注意 這個初始化方法將默認(rèn)以設(shè)備當(dāng)前的語言環(huán)境作為語音識別的語言環(huán)境
- (nullable instancetype)init;
//初始化方法 設(shè)置一個特定的語言環(huán)境
- (nullable instancetype)initWithLocale:(NSLocale *)locale NS_DESIGNATED_INITIALIZER;
//語音識別是否可用
@property (nonatomic, readonly, getter=isAvailable) BOOL available;
//語音識別操作類協(xié)議代理
@property (nonatomic, weak) id<SFSpeechRecognizerDelegate> delegate;
//設(shè)置語音識別的配置參數(shù) 需要注意 在每個語音識別請求中也有這樣一個屬性 這里設(shè)置將作為默認(rèn)值
//如果SFSpeechRecognitionRequest對象中也進(jìn)行了設(shè)置 則會覆蓋這里的值
/*
typedef NS_ENUM(NSInteger, SFSpeechRecognitionTaskHint) {
 SFSpeechRecognitionTaskHintUnspecified = 0,  // 無定義
 SFSpeechRecognitionTaskHintDictation = 1,  // 正常的聽寫風(fēng)格
 SFSpeechRecognitionTaskHintSearch = 2,   // 搜索風(fēng)格
 SFSpeechRecognitionTaskHintConfirmation = 3, // 短語風(fēng)格
};
*/
@property (nonatomic) SFSpeechRecognitionTaskHint defaultTaskHint;
//使用回調(diào)Block的方式進(jìn)行語音識別請求 請求結(jié)果會在Block中傳入
- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
           resultHandler:(void (^)(SFSpeechRecognitionResult * __nullable result, NSError * __nullable error))resultHandler;
//使用代理回調(diào)的方式進(jìn)行語音識別請求
- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
            delegate:(id <SFSpeechRecognitionTaskDelegate>)delegate;
//設(shè)置請求所占用的任務(wù)隊列
@property (nonatomic, strong) NSOperationQueue *queue;

SFSpeechRecognizerDelegate協(xié)議中只約定了一個方法,如下:

//當(dāng)語音識別操作可用性發(fā)生改變時會被調(diào)用
- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available;

        通過Block回調(diào)的方式進(jìn)行語音識別請求十分簡單,如果使用代理回調(diào)的方式,開發(fā)者需要實現(xiàn)SFSpeechRecognitionTaskDelegate協(xié)議中的相關(guān)方法,如下:

//當(dāng)開始檢測音頻源中的語音時首先調(diào)用此方法
- (void)speechRecognitionDidDetectSpeech:(SFSpeechRecognitionTask *)task;
//當(dāng)識別出一條可用的信息后 會調(diào)用
/*
需要注意,apple的語音識別服務(wù)會根據(jù)提供的音頻源識別出多個可能的結(jié)果 每有一條結(jié)果可用 都會調(diào)用此方法
*/
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didHypothesizeTranscription:(SFTranscription *)transcription;
//當(dāng)識別完成所有可用的結(jié)果后調(diào)用
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishRecognition:(SFSpeechRecognitionResult *)recognitionResult;
//當(dāng)不再接受音頻輸入時調(diào)用 即開始處理語音識別任務(wù)時調(diào)用
- (void)speechRecognitionTaskFinishedReadingAudio:(SFSpeechRecognitionTask *)task;
//當(dāng)語音識別任務(wù)被取消時調(diào)用
- (void)speechRecognitionTaskWasCancelled:(SFSpeechRecognitionTask *)task;
//語音識別任務(wù)完成時被調(diào)用
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishSuccessfully:(BOOL)successfully;

SFSpeechRecognitionTask類中封裝了屬性和方法如下:

//此任務(wù)的當(dāng)前狀態(tài)
/*
typedef NS_ENUM(NSInteger, SFSpeechRecognitionTaskState) {
 SFSpeechRecognitionTaskStateStarting = 0,  // 任務(wù)開始
 SFSpeechRecognitionTaskStateRunning = 1,  // 任務(wù)正在運行
 SFSpeechRecognitionTaskStateFinishing = 2,  // 不在進(jìn)行音頻讀入 即將返回識別結(jié)果
 SFSpeechRecognitionTaskStateCanceling = 3,  // 任務(wù)取消
 SFSpeechRecognitionTaskStateCompleted = 4,  // 所有結(jié)果返回完成
};
*/
@property (nonatomic, readonly) SFSpeechRecognitionTaskState state;
//音頻輸入是否完成
@property (nonatomic, readonly, getter=isFinishing) BOOL finishing;
//手動完成音頻輸入 不再接收音頻
- (void)finish;
//任務(wù)是否被取消
@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled;
//手動取消任務(wù)
- (void)cancel;

關(guān)于音頻識別請求類,除了可以使用SFSpeechURLRecognitionRequest類來進(jìn)行創(chuàng)建外,還可以使用SFSpeechAudioBufferRecognitionRequest類來進(jìn)行創(chuàng)建:

@interface SFSpeechAudioBufferRecognitionRequest : SFSpeechRecognitionRequest

@property (nonatomic, readonly) AVAudioFormat *nativeAudioFormat;
//拼接音頻流
- (void)appendAudioPCMBuffer:(AVAudioPCMBuffer *)audioPCMBuffer;
- (void)appendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;
//完成輸入
- (void)endAudio;

@end

五、語音識別結(jié)果類SFSpeechRecognitionResult

SFSpeechRecognitionResult類是語音識別結(jié)果的封裝,其中包含了許多套平行的識別信息,其每一份識別信息都有可信度屬性來描述其準(zhǔn)確程度。SFSpeechRecognitionResult類中屬性如下:

//識別到的多套語音轉(zhuǎn)換信息數(shù)組 其會按照準(zhǔn)確度進(jìn)行排序
@property (nonatomic, readonly, copy) NSArray<SFTranscription *> *transcriptions;
//準(zhǔn)確性最高的識別實例
@property (nonatomic, readonly, copy) SFTranscription *bestTranscription;
//是否已經(jīng)完成 如果YES 則所有所有識別信息都已經(jīng)獲取完成
@property (nonatomic, readonly, getter=isFinal) BOOL final;

SFSpeechRecognitionResult類只是語音識別結(jié)果的一個封裝,真正的識別信息定義在SFTranscription類中,SFTranscription類中屬性如下:

//完整的語音識別準(zhǔn)換后的文本信息字符串
@property (nonatomic, readonly, copy) NSString *formattedString;
//語音識別節(jié)點數(shù)組
@property (nonatomic, readonly, copy) NSArray<SFTranscriptionSegment *> *segments;

當(dāng)對一句完整的話進(jìn)行識別時,Apple的語音識別服務(wù)實際上會把這句語音拆分成若干個音頻節(jié)點,每個節(jié)點可能為一個單詞,SFTranscription類中的segments屬性就存放這些節(jié)點。SFTranscriptionSegment類中定義的屬性如下:

//當(dāng)前節(jié)點識別后的文本信息
@property (nonatomic, readonly, copy) NSString *substring;
//當(dāng)前節(jié)點識別后的文本信息在整體識別語句中的位置
@property (nonatomic, readonly) NSRange substringRange;
//當(dāng)前節(jié)點的音頻時間戳
@property (nonatomic, readonly) NSTimeInterval timestamp;
//當(dāng)前節(jié)點音頻的持續(xù)時間
@property (nonatomic, readonly) NSTimeInterval duration;
//可信度/準(zhǔn)確度 0-1之間
@property (nonatomic, readonly) float confidence;
//關(guān)于此節(jié)點的其他可能的識別結(jié)果 
@property (nonatomic, readonly) NSArray<NSString *> *alternativeSubstrings;


溫馨提示:SpeechFramework框架在模擬器上運行會出現(xiàn)異常情況,無法進(jìn)行語音識別請求。會報出kAFAssistantErrorDomain的錯誤,還望有知道解決方案的朋友,給些建議,Thanks。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS實現(xiàn)轉(zhuǎn)盤效果

    iOS實現(xiàn)轉(zhuǎn)盤效果

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)轉(zhuǎn)盤效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 舉例講解iOS開發(fā)中拖動視圖的實現(xiàn)

    舉例講解iOS開發(fā)中拖動視圖的實現(xiàn)

    這篇文章主要介紹了舉例講解iOS開發(fā)中的拖動視圖實現(xiàn),代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-10-10
  • iOS開發(fā)之UITableView詳解

    iOS開發(fā)之UITableView詳解

    在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似于微信、QQ、新浪微博等軟件基本上隨處都是UITableView。當(dāng)然它的廣泛使用自然離不開它強大的功能,今天這篇文章將針對UITableView重點展開討論
    2016-04-04
  • 支付寶支付開發(fā)IOS圖文教程案例

    支付寶支付開發(fā)IOS圖文教程案例

    這篇文章主要介紹了支付寶支付開發(fā)IOS案例的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • IOS中UIImageView方法實現(xiàn)簡單動畫

    IOS中UIImageView方法實現(xiàn)簡單動畫

    這篇文章主要介紹了IOS中UIImageView方法實現(xiàn)簡單動畫的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • iOS 動畫實戰(zhàn)之釣魚小游戲?qū)嵗a

    iOS 動畫實戰(zhàn)之釣魚小游戲?qū)嵗a

    最近小編做了一個釣魚小游戲,平時沒有做過,所以上手有點急躁,不過,最終還是實現(xiàn)了,下面小編給大家分享iOS 動畫實戰(zhàn)之釣魚小游戲的實現(xiàn)思路,感興趣的朋友一起看看吧
    2018-02-02
  • iOS開發(fā)教程之登錄與訪客的邏輯實現(xiàn)

    iOS開發(fā)教程之登錄與訪客的邏輯實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之登錄與訪客的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • iOS App中調(diào)用相冊中圖片及獲取最近的一張圖片的方法

    iOS App中調(diào)用相冊中圖片及獲取最近的一張圖片的方法

    這篇文章主要介紹了iOS App中調(diào)用相冊中圖片及獲取最近的一張圖片的方法,示例代碼為傳統(tǒng)的Objective-C語言,需要的朋友可以參考下
    2016-03-03
  • iOS中解決Xcode 8控制臺亂碼的方式

    iOS中解決Xcode 8控制臺亂碼的方式

    這篇文章給大家介紹了iOS中解決Xcode 8控制臺亂碼的方式,文中給出了詳細(xì)解決步驟,相信對大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • iOS用AutoLayout實現(xiàn)分頁滾動功能

    iOS用AutoLayout實現(xiàn)分頁滾動功能

    這篇文章主要給大家介紹了關(guān)于iOS用AutoLayout實現(xiàn)分頁滾動功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評論

抚远县| 临沧市| 长顺县| 二连浩特市| 乌兰县| 高密市| 汉川市| 贡觉县| 噶尔县| 铜梁县| 阳朔县| 龙陵县| 汝城县| 道孚县| 合川市| 潍坊市| 航空| 民勤县| 满城县| 囊谦县| 钦州市| 连云港市| 康平县| 萨迦县| 临沂市| 孝昌县| 江城| 宣汉县| 双辽市| 宁蒗| 武功县| 桐庐县| 长寿区| 鸡泽县| 麻栗坡县| 尤溪县| 营山县| 西吉县| 乃东县| 霍州市| 婺源县|