中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Ios語音識別開發(fā),android 語音識別開發(fā)

iOS Speech框架 詳解

原文地址:

在郁南等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作專業(yè)公司,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,郁南網(wǎng)站建設(shè)費(fèi)用合理。

一、引言

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

二、SpeechFramework框架中的重要類

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

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

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

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

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

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

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

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

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

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

? ? 開發(fā)者若要在自己的App中使用語音識別功能,需要獲取用戶的同意。首先需要在工程的Info.plist文件中添加一個Privacy-Speech Recognition Usage Description鍵,其實(shí)需要對應(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)境

+ (NSSetNSLocale * *)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) idSFSpeechRecognizerDelegate 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ù)隊(duì)列

@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ā)者需要實(shí)現(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ù)正在運(yùn)行

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) NSArraySFTranscription * *transcriptions;

//準(zhǔn)確性最高的識別實(shí)例

@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é)點(diǎn)數(shù)組

@property (nonatomic, readonly, copy) NSArraySFTranscriptionSegment * *segments;

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

//當(dāng)前節(jié)點(diǎn)識別后的文本信息

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

//當(dāng)前節(jié)點(diǎn)識別后的文本信息在整體識別語句中的位置

@property (nonatomic, readonly) NSRange substringRange;

//當(dāng)前節(jié)點(diǎn)的音頻時間戳

@property (nonatomic, readonly) NSTimeInterval timestamp;

//當(dāng)前節(jié)點(diǎn)音頻的持續(xù)時間

@property (nonatomic, readonly) NSTimeInterval duration;

//可信度/準(zhǔn)確度 0-1之間

@property (nonatomic, readonly) float confidence;

//關(guān)于此節(jié)點(diǎn)的其他可能的識別結(jié)果

@property (nonatomic, readonly) NSArrayNSString * *alternativeSubstrings;

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

蘋果6語音識別怎么設(shè)置

蘋果6語音識別聲音可通過以下方式進(jìn)行關(guān)閉:

1、打開“設(shè)置”應(yīng)用;

2、點(diǎn)擊打開“通用”選項(xiàng);

3、點(diǎn)擊打開 Siri 選項(xiàng);

4、點(diǎn)擊當(dāng)前已經(jīng)打開的 Siri 開關(guān);

5、提示是否要真的關(guān)閉 Siri 功能,點(diǎn)擊“停用 Siri”按鈕即可關(guān)閉。

蘋果手機(jī)的語音識別怎么設(shè)置?

你是要設(shè)置Siri嗎,如果是的話請往下看,操作非常簡單,就不配圖啦。

1.進(jìn)入手機(jī)“設(shè)置”界面,點(diǎn)擊并進(jìn)入“通用”選項(xiàng)。

2.我們在“通用”界面中,選擇并點(diǎn)擊“Siri”。

3.這樣,我們可以在“Siri”設(shè)置界面,通過滑動開啟“允許‘Hey Siri’”功能。

使用方法:

1.首先,開啟了Voiceover(語音朗讀)功能后,無論你按哪里都會有出現(xiàn)一個黑色框框的,有框框跟隨,證明你已經(jīng)開啟了Voiceover功能。

2.然后大家點(diǎn)擊【設(shè)置】按鈕,連按2次。然后在【設(shè)置】界面找到【通用】欄,同樣連按2次。 注:在開啟Voiceover功能后,大家需要選擇哪個按鍵都需要連按2次才能進(jìn)入。

3.在【通用】界面里選擇【輔助功能】,然后選擇【Voiceover】進(jìn)入。

4.在【Voiceover】界面里,連按2次開關(guān)按鈕,即可關(guān)閉Voiceover功能。

5.最后在檢查[輔助功能】最下面【輔助功能快捷鍵】有沒有關(guān)閉。

網(wǎng)站題目:Ios語音識別開發(fā),android 語音識別開發(fā)
URL標(biāo)題:http://www.rwnh.cn/article32/dsighsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、建站公司、Google、外貿(mào)網(wǎng)站建設(shè)、微信公眾號、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
安仁县| 宁海县| 通河县| 灵丘县| 扎囊县| 化隆| 宁南县| 大渡口区| 太原市| 黄陵县| 蒲江县| 社旗县| 滦平县| 平潭县| 霸州市| 济阳县| 云南省| 金山区| 江门市| 大庆市| 湛江市| 微山县| 颍上县| 越西县| 昆山市| 白水县| 富阳市| 岳普湖县| 公主岭市| 南宫市| 马尔康县| 冷水江市| 皋兰县| 绵竹市| 清丰县| 体育| 深泽县| 泸溪县| 监利县| 友谊县| 甘孜县|