iOS10 ?Speech Recognition語音識(shí)別API的使用

SpeechRecognition簡介

iOS10中的公開的新API :Speech Recognition可以用于識(shí)別用戶的語音杯瞻,我們可以根據(jù)識(shí)別結(jié)果來實(shí)現(xiàn)一些我們想要的操作商源。
網(wǎng)上搜羅了下相關(guān)資料不多硕舆,本人參考了一些國外的網(wǎng)站轨香,自己寫了個(gè)DEMO慕的,在這做個(gè)簡單分享:

功能授權(quán)

現(xiàn)在iOS10對(duì)系統(tǒng)功能的使用都需要進(jìn)行一次用戶授權(quán)古胆,所以我們就像設(shè)置相機(jī)一樣,在info.plist文件中也要添加相關(guān)的使用描述香罐,語音識(shí)別功能需要用到兩個(gè)系統(tǒng)功能:
NSSpeechRecognitionUsageDescription: 語音識(shí)別使用描述
NSMicrophoneUsageDescription:麥克風(fēng)使用描述
所以我們添加:

<key>NSSpeechRecognitionUsageDescription</key> 
<string>Speech Recognition</string> 
<key>NSMicrophoneUsageDescription</key> 
<string>Microphone</string> 

這里的string即描述會(huì)在提示用戶的時(shí)候顯示。

圖:

Paste_Image.png

基礎(chǔ)設(shè)置

功能很簡單时肿,點(diǎn)擊按鈕庇茫,開始聽寫,在label上顯示識(shí)別出的內(nèi)容

@property (nonatomic, strong) AVAudioEngine *audioEngine;                           // 聲音處理器
@property (nonatomic, strong) SFSpeechRecognizer *speechRecognizer;                 // 語音識(shí)別器
@property (nonatomic, strong) SFSpeechAudioBufferRecognitionRequest *speechRequest; // 語音請(qǐng)求對(duì)象
@property (nonatomic, strong) SFSpeechRecognitionTask *currentSpeechTask;           // 當(dāng)前語音識(shí)別進(jìn)程
@property (nonatomic, weak) IBOutlet UILabel *showLb;       // 用于展現(xiàn)的label
@property (nonatomic, weak) IBOutlet UIButton *startBtn;    // 啟動(dòng)按鈕

在viewDidLoad中初始化螃成,并判斷用戶授權(quán)是否通過

// 初始化
self.audioEngine = [AVAudioEngine new];
// 這里需要先設(shè)置一個(gè)AVAudioEngine和一個(gè)語音識(shí)別的請(qǐng)求對(duì)象SFSpeechAudioBufferRecognitionRequest
self.speechRecognizer = [SFSpeechRecognizer new];
self.startBtn.enabled = NO;

[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status)
{
    if (status != SFSpeechRecognizerAuthorizationStatusAuthorized)
    {
        // 如果狀態(tài)不是已授權(quán)則return
        return;
    }
    
    // 初始化語音處理器的輸入模式
    [self.audioEngine.inputNode installTapOnBus:0 bufferSize:1024
                                         format:[self.audioEngine.inputNode outputFormatForBus:0]
                                          block:^(AVAudioPCMBuffer * _Nonnull buffer,
                                                  AVAudioTime * _Nonnull when)
    {
        // 為語音識(shí)別請(qǐng)求對(duì)象添加一個(gè)AudioPCMBuffer旦签,來獲取聲音數(shù)據(jù)
        [self.speechRequest appendAudioPCMBuffer:buffer];
    }];
    // 語音處理器準(zhǔn)備就緒(會(huì)為一些audioEngine啟動(dòng)時(shí)所必須的資源開辟內(nèi)存)
    [self.audioEngine prepare];
    
    self.startBtn.enabled = YES;
}];

注意: 如果你在info.plist文件中設(shè)置NSMicrophoneUsageDescription失敗,這時(shí)如果嘗試訪問_audioEngine.InputNode會(huì)使你的app崩潰寸宏,且你無法catch到有用的信息宁炫。

實(shí)現(xiàn)功能

點(diǎn)擊按鈕

- (IBAction)onStartBtnClicked:(id)sender
{
 if (self.currentSpeechTask.state == SFSpeechRecognitionTaskStateRunning)
   {   // 如果當(dāng)前進(jìn)程狀態(tài)是進(jìn)行中
    
      [self.startBtn setTitle:@"Start Dictating" forState:UIControlStateNormal];
      // 停止語音識(shí)別
      [self stopDictating];
  }
   else
    {   // 進(jìn)程狀態(tài)不在進(jìn)行中
     [self.startBtn setTitle:@"Stop Dictaring" forState:UIControlStateNormal];
     self.showLb.text = @"I'm waiting";
        // 開啟語音識(shí)別
     [self startDictating];
    }
}

- (void)startDictating
{
   NSError *error;
  // 啟動(dòng)聲音處理器
   [self.audioEngine startAndReturnError: &error];
   // 初始化
   self.speechRequest = [SFSpeechAudioBufferRecognitionRequest new];

    // 使用speechRequest請(qǐng)求進(jìn)行識(shí)別
  self.currentSpeechTask =
  [self.speechRecognizer recognitionTaskWithRequest:self.speechRequest
                                    resultHandler:^(SFSpeechRecognitionResult * _Nullable result,
                                                    NSError * _Nullable error)
    {
        // 識(shí)別結(jié)果,識(shí)別后的操作
        if (result == NULL) return;
        self.showLb.text = result.bestTranscription.formattedString;
    }];
}

在這個(gè)方法中我們創(chuàng)建了一個(gè)新的識(shí)別請(qǐng)求和語音進(jìn)程氮凝。當(dāng)通過識(shí)別對(duì)象更新數(shù)據(jù)的時(shí)候羔巢,則更新label的text,無論聽寫是否仍然在進(jìn)行中罩阵。
最后 我們只需要實(shí)現(xiàn)stopDictating:

- (void)stopDictating
{
    // 停止聲音處理器竿秆,停止語音識(shí)別請(qǐng)求進(jìn)程
     [self.audioEngine stop];
     [self.speechRequest endAudio];
}

好了,代碼很少永脓,很多東西也在注釋中寫明了袍辞,現(xiàn)在已經(jīng)可以實(shí)現(xiàn)聽寫的功能了。這時(shí)如果我們對(duì)識(shí)別的結(jié)果再進(jìn)行一次判斷常摧,根據(jù)不同的結(jié)果來執(zhí)行不同的操作搅吁,應(yīng)該會(huì)有不錯(cuò)的用戶體驗(yàn)吧。

參考:http://gregshackles.com/using-speech-recognition-in-ios-10/?utm_source=tuicool&utm_medium=referral

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末落午,一起剝皮案震驚了整個(gè)濱河市谎懦,隨后出現(xiàn)的幾起案子厢塘,更是在濱河造成了極大的恐慌上真,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦聊,死亡現(xiàn)場離奇詭異梗劫,居然都是意外死亡享甸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門梳侨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛉威,“玉大人,你說我怎么就攤上這事走哺◎窍樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長择示。 經(jīng)常有香客問我束凑,道長,這世上最難降的妖魔是什么栅盲? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任汪诉,我火速辦了婚禮,結(jié)果婚禮上剪菱,老公的妹妹穿的比我還像新娘摩瞎。我一直安慰自己,他們只是感情好孝常,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚓哩,像睡著了一般构灸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岸梨,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天喜颁,我揣著相機(jī)與錄音,去河邊找鬼曹阔。 笑死半开,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赃份。 我是一名探鬼主播寂拆,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抓韩!你這毒婦竟也來了纠永?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤谒拴,失蹤者是張志新(化名)和其女友劉穎尝江,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體英上,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炭序,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苍日。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭聂。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖易遣,靈堂內(nèi)的尸體忽然破棺而出彼妻,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布侨歉,位于F島的核電站屋摇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏幽邓。R本人自食惡果不足惜炮温,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牵舵。 院中可真熱鬧柒啤,春花似錦、人聲如沸畸颅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没炒。三九已至涛癌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送火,已是汗流浹背拳话。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留种吸,地道東北人弃衍。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像坚俗,于是被迫代替她去往敵國和親镜盯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容