你是要設(shè)置Siri嗎,如果是的話請(qǐng)往下看,操作非常簡(jiǎn)單,就不配圖啦。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出邛崍免費(fèi)做網(wǎng)站回饋大家。
1.進(jìn)入手機(jī)“設(shè)置”界面,點(diǎn)擊并進(jìn)入“通用”選項(xiàng)。
2.我們?cè)凇巴ㄓ谩苯缑嬷?,選擇并點(diǎn)擊“Siri”。
3.這樣,我們可以在“Siri”設(shè)置界面,通過滑動(dòng)開啟“允許‘Hey Siri’”功能。
使用方法:
1.首先,開啟了Voiceover(語音朗讀)功能后,無論你按哪里都會(huì)有出現(xiàn)一個(gè)黑色框框的,有框框跟隨,證明你已經(jīng)開啟了Voiceover功能。
2.然后大家點(diǎn)擊【設(shè)置】按鈕,連按2次。然后在【設(shè)置】界面找到【通用】欄,同樣連按2次。 注:在開啟Voiceover功能后,大家需要選擇哪個(gè)按鍵都需要連按2次才能進(jìn)入。
3.在【通用】界面里選擇【輔助功能】,然后選擇【Voiceover】進(jìn)入。
4.在【Voiceover】界面里,連按2次開關(guān)按鈕,即可關(guān)閉Voiceover功能。
5.最后在檢查[輔助功能】最下面【輔助功能快捷鍵】有沒有關(guān)閉。
打開設(shè)置-Siri與搜索 打開嘿Siri喚醒功能
開啟語音反饋功能就可以了
如果需要語音控制的話可以打開設(shè)置-輔助功能-語音控制
不過這個(gè)和Siri應(yīng)該是不同的功能
iOS在線識(shí)別:
kaldi靜態(tài)庫集成到項(xiàng)目中沒問題后,現(xiàn)在就需要采集音頻發(fā)送給解碼器去解碼。
我這里對(duì)音頻的傳輸采用的是GStreamer的庫,我們也可以采用自己的方式去傳輸音頻,GStreamer的好處就是能將音頻進(jìn)行緩存,每次都能有序的從GstBufferSource中去讀取數(shù)據(jù)進(jìn)行解碼,我們能控制好這個(gè)傳輸?shù)墓艿?,自己?shí)現(xiàn)完全沒問題。
采集
iOS采集音頻的方式有很多種,我這里簡(jiǎn)單貼出我采集的方式:
傳輸
因?yàn)閭鬏斘沂怯玫腉Streamer,所以這里需要我們對(duì)GStreamer有個(gè)了解,不然不知道怎么去跟解碼器串聯(lián)起來,出了問題也不知道怎么查。
通俗的說,GStreamer在這里起到了一個(gè)管道的作用,連通采集跟解碼器,管道內(nèi)部有很多的元件,都是對(duì)音頻的處理,這個(gè)我們不用去關(guān)心它是怎么去處理的,我們只需要知道這個(gè)管道里面都要需要哪些元件,怎么把他們串起來就可以了。
我這里用的元件有:
我們了解了這些元件,通過下面方法創(chuàng)建元件:
我們獲得了這些元件,接下來我們就需要將這些元件加入到管道(pipeline)中:
接下來是將每個(gè)元件關(guān)聯(lián)起來:
以上我們就做好了這個(gè)傳輸數(shù)據(jù)的管道,有些事件的監(jiān)聽和狀態(tài)的設(shè)置也需要在這里做,因?yàn)槎际且恍?biāo)準(zhǔn)的設(shè)置,我這里就不贅述了。
推送數(shù)據(jù)
采集到數(shù)據(jù)后,我們可以通過如下方式推送數(shù)據(jù):
這樣數(shù)據(jù)通過管道就會(huì)到達(dá)識(shí)別解碼器,當(dāng)然解碼器也要做好接收的準(zhǔn)備,這個(gè)后面講自定義解碼器插件的時(shí)候會(huì)說。
至此,我們就完成了音頻的傳輸。
下載和安裝,現(xiàn)在我們使用的最新版本是ibm viavoice9.1簡(jiǎn)體中文版,很多網(wǎng)站都有下載,大家可以用百度搜索,下載來的文件格式一般為iso鏡像,所以要用虛擬光驅(qū)安裝。軟件的安裝沒有什么特別之處,一路下一步就行了,當(dāng)然也可以在安裝向?qū)Ю镄薷陌惭b信息,要注意的是一定要關(guān)閉殺毒軟件,由于軟件在安裝過程中需要重起電腦,重起后還要繼續(xù)安裝,所以最好將殺毒軟件的自動(dòng)運(yùn)行也暫時(shí)關(guān)閉。語音訓(xùn)練:這是使用viavoice最關(guān)鍵的一步,對(duì)于盲人來說也是難度最大的環(huán)節(jié),如果順利過了這一關(guān),我們的工作也就完成了七八成了,剩下的軟件操作其實(shí)并不復(fù)雜。程序安裝完成后,程序自動(dòng)開始運(yùn)行,首先會(huì)出現(xiàn)一段語音提示,緊接著探出用戶向?qū)АR筝斎胗脩裘瓦x擇音頻設(shè)備,采用默認(rèn)即可,如果有兩塊聲卡就要選擇其中之一。點(diǎn)下一步,探出音頻設(shè)置向?qū)Вc(diǎn)擊測(cè)試按鈕,出現(xiàn)一段回放音樂,系統(tǒng)音量測(cè)試成功,下一步進(jìn)入麥克風(fēng)設(shè)置。選擇頭戴式麥克風(fēng),下一步,在音頻輸出設(shè)備的列表里仍然要選擇頭戴式麥克風(fēng)。下一步,要求連接好麥克風(fēng),不用管它,繼續(xù)下一步。開始測(cè)試麥克風(fēng),點(diǎn)測(cè)試即開始測(cè)試環(huán)境噪音,完成后在點(diǎn)下一步。這一部系統(tǒng)詢問你是否有信號(hào)適配器,一定要選是,繼續(xù)下一步。這時(shí)系統(tǒng)要調(diào)整麥克風(fēng)音量。在測(cè)試過程中環(huán)境要保持安靜,關(guān)閉音箱,帶好耳麥,讓讀屏的聲音從耳麥里發(fā)出,并且要將讀屏的語速調(diào)到最慢,因?yàn)橄旅嬉S讀屏朗讀系統(tǒng)給出的語句。點(diǎn)擊開始,讀出系統(tǒng)給出的語句即可,這段文字可以用四六件切換來找到,其內(nèi)容如下:"這里有一小段文章,您必須用正常、輕松的語調(diào)將其讀出。請(qǐng)?jiān)诙温渑c語句之間自然停頓。計(jì)算機(jī)將利用這一過程調(diào)整其音量。當(dāng)這一過程完成以后,您會(huì)聽到一小段結(jié)束提示音,系統(tǒng)將顯示聲音的品質(zhì)。在聽到這一小段提示音之前,您必須不斷地重復(fù)這段文章。"這時(shí)可以用小鍵盤的加減號(hào)及點(diǎn)號(hào)[暫停]來控制跟讀的速度及停頓。待出現(xiàn)聲音提示在點(diǎn)下一步。現(xiàn)在就要開始創(chuàng)建個(gè)人語音模型了。這一步至關(guān)重要,會(huì)直接影響將來語音識(shí)別的效果。在點(diǎn)下一步語音模型的創(chuàng)建就真正開始了。系統(tǒng)要求你讀出下面的文字,四六鍵切換到六可編輯文字處,tab鍵切換到開始按鈕,點(diǎn)擊及開始,用加減號(hào)配合點(diǎn)號(hào)跟隨讀屏朗讀。如果系統(tǒng)跟不上你的朗讀速度,便發(fā)出聲音提示,此時(shí)就點(diǎn)擊暫停,在點(diǎn)繼續(xù)重復(fù)朗讀。讀完后系統(tǒng)提示正在處理請(qǐng)稍候。系統(tǒng)會(huì)進(jìn)行語音訓(xùn)練,訓(xùn)練完畢后,最簡(jiǎn)單的語音模型就建立完畢了,當(dāng)然可以想像得到,這樣輕松建立起來的模型效果并不是很好。稍等片刻在點(diǎn)下一步。這一部是分析你的語音,以便讓系統(tǒng)了解你的說話方式。選擇開始錄音單選按鈕,繼續(xù)下一步。在列表里選擇一篇文章,四六鍵切換到十二可編輯文字處,tab鍵切換到開始按鈕,點(diǎn)擊開始,還是用加減號(hào)配合點(diǎn)號(hào)跟讀,如果我們的說話沒有被系統(tǒng)識(shí)別出來,屏幕上的文字就不會(huì)往下滾動(dòng),并發(fā)出聲音提示。這時(shí)可以按加減號(hào)重復(fù)朗讀,直到出現(xiàn)新的文字,才可以繼續(xù)往下朗讀。為了提高識(shí)別率,建議將列表中的四篇文章全部讀完。讀完文章以后點(diǎn)下一步。系統(tǒng)提示正在處理請(qǐng)稍候,等幾分鐘后點(diǎn)完成。到此,個(gè)人用戶(語音模型)建立完畢,我們可以正式開始使用語音輸入了。語音輸入:語音訓(xùn)練及語音模型的建立雖然比較繁瑣,但是軟件的使用卻非常簡(jiǎn)單。其功能只有聲控命令和語音聽寫。在程序組中啟動(dòng)ibm viavoice語音中心,程序運(yùn)行后在通知區(qū)域工具欄里出現(xiàn)viavoice的圖標(biāo)。我們首先要設(shè)置麥克風(fēng)開關(guān)狀態(tài)的熱鍵,在停止語音輸入時(shí)要立刻官麥,否則會(huì)出現(xiàn)大量的亂碼、或發(fā)出錯(cuò)誤命令導(dǎo)致不必要的麻煩。右鍵單擊通知區(qū)域里的viavoice圖標(biāo),在探出菜單里選用戶選項(xiàng),右光標(biāo),點(diǎn)viavoice選項(xiàng)。在探出的對(duì)話框中選啟動(dòng)選項(xiàng)卡,選中麥克風(fēng)狀態(tài)和發(fā)現(xiàn)問題時(shí)啟動(dòng)識(shí)別向?qū)С绦驈?fù)選礦,要不老有識(shí)別向?qū)鰜頁v亂。在21熱鍵域無處加入快捷鍵。如果創(chuàng)建了幾個(gè)用戶,就要在用戶選項(xiàng)卡里選擇你自己創(chuàng)建的用戶,否則識(shí)別效果會(huì)很差。其它選項(xiàng)涉及到高級(jí)設(shè)置,采用默認(rèn)設(shè)置即可,帶操作熟練后可在作改動(dòng)。點(diǎn)確定關(guān)閉對(duì)話框。此時(shí)按下剛才設(shè)置的快捷鍵打開麥克風(fēng),[當(dāng)然在菜單里也有這個(gè)命令],就進(jìn)入了語音輸入狀態(tài)了。第一次使用會(huì)有語音提示。此時(shí)你就可以向計(jì)算機(jī)下達(dá)任何語音命令,讓它為你做你想做的任何事情。想要了解當(dāng)前有什么命令可用,只要說出當(dāng)前命令及,就會(huì)調(diào)出當(dāng)前可用命令。要了解當(dāng)前幫助,就說學(xué)習(xí)內(nèi)容,就會(huì)調(diào)出當(dāng)前幫助。要想啟動(dòng)某個(gè)程序就說出啟動(dòng)某程序,例如想要啟動(dòng)大智慧,就說啟動(dòng)大智慧,大智慧就隨即啟動(dòng)了。又如在ie里面,只要說出某個(gè)鏈接的名稱即可進(jìn)入該頁面,說出任何菜單和按鈕名稱即可執(zhí)行相應(yīng)的命令,你說出收藏夾,收藏夾就立刻打開了,在說出收藏夾中網(wǎng)站的名稱,就會(huì)打開該網(wǎng)站。viavoice支持幾乎所有的已安裝的或?qū)⒁惭b的應(yīng)用程序的聲控操作和直接聽寫。只要應(yīng)用程序有文本編輯框就可以進(jìn)行語音聽寫,但要先說直接聽寫,進(jìn)入文字聽寫模式,結(jié)束聽寫后要說停止直接聽寫,回到命令輸入模式。如在qq的聊天界面上,激活文本輸入框,說出要輸入的內(nèi)容,即可在編輯框中自動(dòng)寫出相應(yīng)的文字。不過初期使用識(shí)別的準(zhǔn)確率不可能達(dá)到很高,需要進(jìn)行一些手工修改,但是它有自學(xué)習(xí)功能,隨著使用的增多,識(shí)別的準(zhǔn)確率會(huì)越來越高。在進(jìn)行聽寫時(shí),請(qǐng)您使用連續(xù)語音,并注意同時(shí)口述標(biāo)點(diǎn)符號(hào)和編排命令,比如句號(hào),逗號(hào)和另起一段。盡量使用正常的節(jié)奏講話,不要太快,也不要太慢。盡量不要吞音或者滑音,也不要故意拉長(zhǎng)或者略讀某些詞語。盡量不要連讀,也沒有必要故意對(duì)某些音進(jìn)行重讀。開始時(shí)您會(huì)可能會(huì)講話比較快。請(qǐng)耐心一點(diǎn),放慢速度。過了一段時(shí)間之后,您就會(huì)發(fā)現(xiàn)完全可以在不損失準(zhǔn)確率的情況下提高講話速率。不要對(duì)著麥克風(fēng)大聲講話,請(qǐng)使用盡量平和的語音。正確佩戴麥克風(fēng)對(duì)語音識(shí)別率非常重要。請(qǐng)確認(rèn)麥克風(fēng)接收頭(在海綿套的里面)離您的嘴角大約一個(gè)拇指的距離,并檢查麥克風(fēng)上的白點(diǎn)正對(duì)著您的嘴部。不要將海綿套拿走,它可以起過濾作用。 不要將麥克風(fēng)正對(duì)您的嘴部,以防受呼吸影響。每次使用麥克風(fēng)時(shí)請(qǐng)不要變動(dòng)麥克風(fēng)的位置,例如麥克風(fēng)的距離時(shí)遠(yuǎn)時(shí)近。如果進(jìn)行大量文字錄入,建議使用系統(tǒng)自帶的字處理程序[語音板]。說出聽寫到語音板,語音板隨即啟動(dòng)。這是一個(gè)類似寫字板的編輯工具,語音板擁有寫字板的所有功能而且增加了聽寫能力。語音聽寫與其他應(yīng)用程序中的直接聽寫的注意事項(xiàng)基本一致,要想執(zhí)行語音命令,在聽寫過程中稍作停頓,說出菜單命令即可。值得注意的是糾錯(cuò)窗口的使用。 在聽寫的過程中,ViaVoice可能會(huì)發(fā)生誤識(shí)。您可以用糾錯(cuò)窗口對(duì)誤識(shí)詞進(jìn)行糾錯(cuò),以便ViaVoice以后提高識(shí)別率;或者讓ViaVoice分析您已有的文檔,以便讓ViaVoice熟悉您的措辭和行文方式。在口述一段文字以后,查找誤識(shí)的詞。如果要對(duì)某個(gè)詞或短語進(jìn)行糾錯(cuò),先選中該詞,然后說出糾錯(cuò)就會(huì)探出糾錯(cuò)窗口。如果正確的詞已經(jīng)位于候選詞列表中,念出該詞的序號(hào)。這一動(dòng)作將糾正所選的詞或短語。如果正確的詞不在候選詞列表中,你可以單擊糾錯(cuò)窗口的文本編輯框,輸入正確的詞/短語。念糾錯(cuò)或者按回車進(jìn)行確定。z在聽寫完一篇文章以后,建議用文檔分析程序?qū)倢懙奈恼逻M(jìn)行分析,從而修正語言模型,提高識(shí)別率。
沒有識(shí)別,只有找第三方的
百度,云之聲,微信,飛科都有sdk。
原文地址:
一、引言
? ? iOS10系統(tǒng)是一個(gè)較有突破性的系統(tǒng),其在Message,Notification等方面都開放了很多實(shí)用性的開發(fā)接口。本篇博客將主要探討iOS10中新引入的SpeechFramework框架。有個(gè)這個(gè)框架,開發(fā)者可以十分容易的為自己的App添加語音識(shí)別功能,不需要再依賴于其他第三方的語音識(shí)別服務(wù),并且,Apple的Siri應(yīng)用的強(qiáng)大也證明了Apple的語音服務(wù)是足夠強(qiáng)大的,不通過第三方,也大大增強(qiáng)了用戶的安全性。
二、SpeechFramework框架中的重要類
? ? SpeechFramework框架比較輕量級(jí),其中的類并不十分冗雜,在學(xué)習(xí)SpeechFramework框架前,我們需要對(duì)其中類與類與類之間的關(guān)系有個(gè)大致的熟悉了解。
SFSpeechRecognizer:這個(gè)類是語音識(shí)別的操作類,用于語音識(shí)別用戶權(quán)限的申請(qǐng),語言環(huán)境的設(shè)置,語音模式的設(shè)置以及向Apple服務(wù)發(fā)送語音識(shí)別的請(qǐng)求。
SFSpeechRecognitionTask:這個(gè)類是語音識(shí)別服務(wù)請(qǐng)求任務(wù)類,每一個(gè)語音識(shí)別請(qǐng)求都可以抽象為一個(gè)SFSpeechRecognitionTask實(shí)例,其中SFSpeechRecognitionTaskDelegate協(xié)議中約定了許多請(qǐng)求任務(wù)過程中的監(jiān)聽方法。
SFSpeechRecognitionRequest:語音識(shí)別請(qǐng)求類,需要通過其子類來進(jìn)行實(shí)例化。
SFSpeechURLRecognitionRequest:通過音頻URL來創(chuàng)建語音識(shí)別請(qǐng)求。
SFSpeechAudioBufferRecognitionRequest:通過音頻流來創(chuàng)建語音識(shí)別請(qǐng)求。
SFSpeechRecognitionResult:語音識(shí)別請(qǐng)求結(jié)果類。
SFTranscription:語音轉(zhuǎn)換后的信息類。
SFTranscriptionSegment:語音轉(zhuǎn)換中的音頻節(jié)點(diǎn)類。
三、申請(qǐng)用戶語音識(shí)別權(quán)限與進(jìn)行語音識(shí)別請(qǐng)求
? ? 開發(fā)者若要在自己的App中使用語音識(shí)別功能,需要獲取用戶的同意。首先需要在工程的Info.plist文件中添加一個(gè)Privacy-Speech Recognition Usage Description鍵,其實(shí)需要對(duì)應(yīng)一個(gè)String類型的值,這個(gè)值將會(huì)在系統(tǒng)獲取權(quán)限的警告框中顯示,Info.plist文件如下圖所示:
使用SFSpeechRecognize類的requestAuthorization方法來進(jìn)行用戶權(quán)限的申請(qǐng),用戶的反饋結(jié)果會(huì)在這個(gè)方法的回調(diào)block中傳入,如下:
? //申請(qǐng)用戶語音識(shí)別權(quán)限
? [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {? ?
? }];
SFSpeechRecognizerAuthorzationStatus枚舉中定義了用戶的反饋結(jié)果,如下:
typedef NS_ENUM(NSInteger, SFSpeechRecognizerAuthorizationStatus) {
? ? //結(jié)果未知 用戶尚未進(jìn)行選擇
? ? SFSpeechRecognizerAuthorizationStatusNotDetermined,
? ? //用戶拒絕授權(quán)語音識(shí)別
? ? SFSpeechRecognizerAuthorizationStatusDenied,
? ? //設(shè)備不支持語音識(shí)別功能
? ? SFSpeechRecognizerAuthorizationStatusRestricted,
? ? //用戶授權(quán)語音識(shí)別
? ? SFSpeechRecognizerAuthorizationStatusAuthorized,
};
如果申請(qǐng)用戶語音識(shí)別權(quán)限成功,開發(fā)者可以通過SFSpeechRecognizer操作類來進(jìn)行語音識(shí)別請(qǐng)求,示例如下:
? ? //創(chuàng)建語音識(shí)別操作類對(duì)象
? ? SFSpeechRecognizer * rec = [[SFSpeechRecognizer alloc]init];
? ? //通過一個(gè)音頻路徑創(chuàng)建音頻識(shí)別請(qǐng)求
? ? SFSpeechRecognitionRequest * request = [[SFSpeechURLRecognitionRequest alloc]initWithURL:[[NSBundle mainBundle] URLForResource:@"7011" withExtension:@"m4a"]];
? ? //進(jìn)行請(qǐng)求
? ? [rec recognitionTaskWithRequest:request resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
? ? ? ? //打印語音識(shí)別的結(jié)果字符串
? ? ? ? NSLog(@"%@",result.bestTranscription.formattedString);
? ? }];
四、深入SFSpeechRecognizer類
SFSpeechRecognizer類的主要作用是申請(qǐng)權(quán)限,配置參數(shù)與進(jìn)行語音識(shí)別請(qǐng)求。其中比較重要的屬性與方法如下:
//獲取當(dāng)前用戶權(quán)限狀態(tài)
+ (SFSpeechRecognizerAuthorizationStatus)authorizationStatus;
//申請(qǐng)語音識(shí)別用戶權(quán)限
+ (void)requestAuthorization:(void(^)(SFSpeechRecognizerAuthorizationStatus status))handler;
//獲取所支持的所有語言環(huán)境
+ (NSSetNSLocale * *)supportedLocales;
//初始化方法 需要注意 這個(gè)初始化方法將默認(rèn)以設(shè)備當(dāng)前的語言環(huán)境作為語音識(shí)別的語言環(huán)境
- (nullable instancetype)init;
//初始化方法 設(shè)置一個(gè)特定的語言環(huán)境
- (nullable instancetype)initWithLocale:(NSLocale *)locale NS_DESIGNATED_INITIALIZER;
//語音識(shí)別是否可用
@property (nonatomic, readonly, getter=isAvailable) BOOL available;
//語音識(shí)別操作類協(xié)議代理
@property (nonatomic, weak) idSFSpeechRecognizerDelegate delegate;
//設(shè)置語音識(shí)別的配置參數(shù) 需要注意 在每個(gè)語音識(shí)別請(qǐng)求中也有這樣一個(gè)屬性 這里設(shè)置將作為默認(rèn)值
//如果SFSpeechRecognitionRequest對(duì)象中也進(jìn)行了設(shè)置 則會(huì)覆蓋這里的值
/*
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)行語音識(shí)別請(qǐng)求 請(qǐng)求結(jié)果會(huì)在Block中傳入
- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? resultHandler:(void (^)(SFSpeechRecognitionResult * __nullable result, NSError * __nullable error))resultHandler;
//使用代理回調(diào)的方式進(jìn)行語音識(shí)別請(qǐng)求
- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delegate:(id SFSpeechRecognitionTaskDelegate)delegate;
//設(shè)置請(qǐng)求所占用的任務(wù)隊(duì)列
@property (nonatomic, strong) NSOperationQueue *queue;
SFSpeechRecognizerDelegate協(xié)議中只約定了一個(gè)方法,如下:
//當(dāng)語音識(shí)別操作可用性發(fā)生改變時(shí)會(huì)被調(diào)用
- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available;
? ? 通過Block回調(diào)的方式進(jìn)行語音識(shí)別請(qǐng)求十分簡(jiǎn)單,如果使用代理回調(diào)的方式,開發(fā)者需要實(shí)現(xiàn)SFSpeechRecognitionTaskDelegate協(xié)議中的相關(guān)方法,如下:
//當(dāng)開始檢測(cè)音頻源中的語音時(shí)首先調(diào)用此方法
- (void)speechRecognitionDidDetectSpeech:(SFSpeechRecognitionTask *)task;
//當(dāng)識(shí)別出一條可用的信息后 會(huì)調(diào)用
/*
需要注意,apple的語音識(shí)別服務(wù)會(huì)根據(jù)提供的音頻源識(shí)別出多個(gè)可能的結(jié)果 每有一條結(jié)果可用 都會(huì)調(diào)用此方法
*/
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didHypothesizeTranscription:(SFTranscription *)transcription;
//當(dāng)識(shí)別完成所有可用的結(jié)果后調(diào)用
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishRecognition:(SFSpeechRecognitionResult *)recognitionResult;
//當(dāng)不再接受音頻輸入時(shí)調(diào)用 即開始處理語音識(shí)別任務(wù)時(shí)調(diào)用
- (void)speechRecognitionTaskFinishedReadingAudio:(SFSpeechRecognitionTask *)task;
//當(dāng)語音識(shí)別任務(wù)被取消時(shí)調(diào)用
- (void)speechRecognitionTaskWasCancelled:(SFSpeechRecognitionTask *)task;
//語音識(shí)別任務(wù)完成時(shí)被調(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)行音頻讀入 即將返回識(shí)別結(jié)果
SFSpeechRecognitionTaskStateCanceling = 3,? ? ? // 任務(wù)取消
SFSpeechRecognitionTaskStateCompleted = 4,? ? ? // 所有結(jié)果返回完成
};
*/
@property (nonatomic, readonly) SFSpeechRecognitionTaskState state;
//音頻輸入是否完成
@property (nonatomic, readonly, getter=isFinishing) BOOL finishing;
//手動(dòng)完成音頻輸入 不再接收音頻
- (void)finish;
//任務(wù)是否被取消
@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled;
//手動(dòng)取消任務(wù)
- (void)cancel;
關(guān)于音頻識(shí)別請(qǐng)求類,除了可以使用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
五、語音識(shí)別結(jié)果類SFSpeechRecognitionResult
? ? SFSpeechRecognitionResult類是語音識(shí)別結(jié)果的封裝,其中包含了許多套平行的識(shí)別信息,其每一份識(shí)別信息都有可信度屬性來描述其準(zhǔn)確程度。SFSpeechRecognitionResult類中屬性如下:
//識(shí)別到的多套語音轉(zhuǎn)換信息數(shù)組 其會(huì)按照準(zhǔn)確度進(jìn)行排序
@property (nonatomic, readonly, copy) NSArraySFTranscription * *transcriptions;
//準(zhǔn)確性最高的識(shí)別實(shí)例
@property (nonatomic, readonly, copy) SFTranscription *bestTranscription;
//是否已經(jīng)完成 如果YES 則所有所有識(shí)別信息都已經(jīng)獲取完成
@property (nonatomic, readonly, getter=isFinal) BOOL final;
SFSpeechRecognitionResult類只是語音識(shí)別結(jié)果的一個(gè)封裝,真正的識(shí)別信息定義在SFTranscription類中,SFTranscription類中屬性如下:
//完整的語音識(shí)別準(zhǔn)換后的文本信息字符串
@property (nonatomic, readonly, copy) NSString *formattedString;
//語音識(shí)別節(jié)點(diǎn)數(shù)組
@property (nonatomic, readonly, copy) NSArraySFTranscriptionSegment * *segments;
當(dāng)對(duì)一句完整的話進(jìn)行識(shí)別時(shí),Apple的語音識(shí)別服務(wù)實(shí)際上會(huì)把這句語音拆分成若干個(gè)音頻節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可能為一個(gè)單詞,SFTranscription類中的segments屬性就存放這些節(jié)點(diǎn)。SFTranscriptionSegment類中定義的屬性如下:
//當(dāng)前節(jié)點(diǎn)識(shí)別后的文本信息
@property (nonatomic, readonly, copy) NSString *substring;
//當(dāng)前節(jié)點(diǎn)識(shí)別后的文本信息在整體識(shí)別語句中的位置
@property (nonatomic, readonly) NSRange substringRange;
//當(dāng)前節(jié)點(diǎn)的音頻時(shí)間戳
@property (nonatomic, readonly) NSTimeInterval timestamp;
//當(dāng)前節(jié)點(diǎn)音頻的持續(xù)時(shí)間
@property (nonatomic, readonly) NSTimeInterval duration;
//可信度/準(zhǔn)確度 0-1之間
@property (nonatomic, readonly) float confidence;
//關(guān)于此節(jié)點(diǎn)的其他可能的識(shí)別結(jié)果
@property (nonatomic, readonly) NSArrayNSString * *alternativeSubstrings;
溫馨提示:SpeechFramework框架在模擬器上運(yùn)行會(huì)出現(xiàn)異常情況,無法進(jìn)行語音識(shí)別請(qǐng)求。會(huì)報(bào)出kAFAssistantErrorDomain的錯(cuò)誤,還望有知道解決方案的朋友,給些建議,Thanks。