iOS10 ?Speech Recognition語音識別API的使用

SpeechRecognition簡介

iOS10中的公開的新API :Speech Recognition可以用于識別用戶的語音,我們可以根據識別結果來實現一些我們想要的操作。
網上搜羅了下相關資料不多,本人參考了一些國外的網站,自己寫了個DEMO,在這做個簡單分享:

功能授權

現在iOS10對系統功能的使用都需要進行一次用戶授權,所以我們就像設置相機一樣,在info.plist文件中也要添加相關的使用描述,語音識別功能需要用到兩個系統功能:
NSSpeechRecognitionUsageDescription: 語音識別使用描述
NSMicrophoneUsageDescription:麥克風使用描述
所以我們添加:

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

這里的string即描述會在提示用戶的時候顯示。

圖:

Paste_Image.png

基礎設置

功能很簡單,點擊按鈕,開始聽寫,在label上顯示識別出的內容

@property (nonatomic, strong) AVAudioEngine *audioEngine;                           // 聲音處理器
@property (nonatomic, strong) SFSpeechRecognizer *speechRecognizer;                 // 語音識別器
@property (nonatomic, strong) SFSpeechAudioBufferRecognitionRequest *speechRequest; // 語音請求對象
@property (nonatomic, strong) SFSpeechRecognitionTask *currentSpeechTask;           // 當前語音識別進程
@property (nonatomic, weak) IBOutlet UILabel *showLb;       // 用于展現的label
@property (nonatomic, weak) IBOutlet UIButton *startBtn;    // 啟動按鈕

在viewDidLoad中初始化,并判斷用戶授權是否通過

// 初始化
self.audioEngine = [AVAudioEngine new];
// 這里需要先設置一個AVAudioEngine和一個語音識別的請求對象SFSpeechAudioBufferRecognitionRequest
self.speechRecognizer = [SFSpeechRecognizer new];
self.startBtn.enabled = NO;

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

注意: 如果你在info.plist文件中設置NSMicrophoneUsageDescription失敗,這時如果嘗試訪問_audioEngine.InputNode會使你的app崩潰,且你無法catch到有用的信息。

實現功能

點擊按鈕

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

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

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

在這個方法中我們創建了一個新的識別請求和語音進程。當通過識別對象更新數據的時候,則更新label的text,無論聽寫是否仍然在進行中。
最后 我們只需要實現stopDictating:

- (void)stopDictating
{
    // 停止聲音處理器,停止語音識別請求進程
     [self.audioEngine stop];
     [self.speechRequest endAudio];
}

好了,代碼很少,很多東西也在注釋中寫明了,現在已經可以實現聽寫的功能了。這時如果我們對識別的結果再進行一次判斷,根據不同的結果來執行不同的操作,應該會有不錯的用戶體驗吧。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容