iOS:iOS10和Xcode8 一起建立Siri 功能

來源:互聯網
上載者:User

標籤:others   frame   text   family   str   err   normal   net   title   

前奏:

  iOS 10 出來之後,我們開發人員也可以使用類似Siri的功能。它是使用Siri裡面的一個語音辨識架構Speech framework來處理siri的。現在, 讓我們來看看 一些 主要的代碼吧。 我們需要一個 UITextView 和 UIButton 就 能體現了。

 

實現:

  • 第一步:定義屬性
@interface ViewController ()  <SFSpeechRecognizerDelegate>@property (strong, nonatomic) UIButton *siriBtu;//siri按鈕@property (strong, nonatomic) UITextView *siriTextView; //顯示語音轉化成的文本@property (strong, nonatomic) SFSpeechRecognitionTask *recognitionTask; //語音辨識任務@property (strong, nonatomic)SFSpeechRecognizer *speechRecognizer; //語音辨識器@property (strong, nonatomic) SFSpeechAudioBufferRecognitionRequest *recognitionRequest; //識別請求@property (strong, nonatomic)AVAudioEngine *audioEngine; //錄音引擎@end
  • 第二步:進行語音辨識檢測
- (void)viewDidLoad {    [super viewDidLoad];

//裝置識別語言為中文 NSLocale *cale = [[NSLocale alloc]initWithLocaleIdentifier:@"zh-CN"]; self.speechRecognizer = [[SFSpeechRecognizer alloc]initWithLocale:cale]; self.siriBtu.enabled = false;

  //設定代理 _speechRecognizer.delegate = self;

  //發送語音認證請求(首先要判斷裝置是否支援語音辨識功能) [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) { bool isButtonEnabled = false; switch (status) { case SFSpeechRecognizerAuthorizationStatusAuthorized: isButtonEnabled = true; NSLog(@"可以語音辨識"); break; case SFSpeechRecognizerAuthorizationStatusDenied: isButtonEnabled = false; NSLog(@"使用者被拒絕訪問語音辨識"); break; case SFSpeechRecognizerAuthorizationStatusRestricted: isButtonEnabled = false; NSLog(@"不能在該裝置上進行語音辨識"); break; case SFSpeechRecognizerAuthorizationStatusNotDetermined: isButtonEnabled = false; NSLog(@"沒有授權語音辨識"); break; default: break; } self.siriBtu.enabled = isButtonEnabled; }];

  //建立錄音引擎 self.audioEngine = [[AVAudioEngine alloc]init];}
  • 第三步:按鈕的點擊事件
- (void)microphoneTap:(UIButton *)sender {    if ([self.audioEngine isRunning]) {        [self.audioEngine stop];        [self.recognitionRequest endAudio];        self.siriBtu.enabled = YES;        [self.siriBtu setTitle:@"開始錄製" forState:UIControlStateNormal];    }else{        [self startRecording];        [self.siriBtu setTitle:@"停止錄製" forState:UIControlStateNormal];    }}
  • 第四步:開始錄製語音,並將語音轉為文本
-(void)startRecording{    if (self.recognitionTask) {        [self.recognitionTask cancel];        self.recognitionTask = nil;    }    AVAudioSession *audioSession = [AVAudioSession sharedInstance];    bool  audioBool = [audioSession setCategory:AVAudioSessionCategoryRecord error:nil];    bool  audioBool1= [audioSession setMode:AVAudioSessionModeMeasurement error:nil];    bool  audioBool2= [audioSession setActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];    if (audioBool || audioBool1||  audioBool2) {        NSLog(@"可以使用");    }else{        NSLog(@"這裡說明有的功能不支援");    }    self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init];    AVAudioInputNode *inputNode = self.audioEngine.inputNode;    SFSpeechAudioBufferRecognitionRequest *recognitionRequest;    self.recognitionRequest.shouldReportPartialResults = true;

  //開始識別任務 self.recognitionTask = [self.speechRecognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { bool isFinal = false; if (result) { self.siriTextView.text = [[result bestTranscription] formattedString]; //語音轉文本 isFinal = [result isFinal]; } if (error || isFinal) { [self.audioEngine stop]; [inputNode removeTapOnBus:0]; self.recognitionRequest = nil; self.recognitionTask = nil; self.siriBtu.enabled = true; } }]; AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { [self.recognitionRequest appendAudioPCMBuffer:buffer]; }]; [self.audioEngine prepare]; bool audioEngineBool = [self.audioEngine startAndReturnError:nil]; NSLog(@"%d",audioEngineBool); self.siriTextView.text = @"我是小冰!Siri 冰,你說我聽";}
  • 第五步:實現這個代理方法,就實現siri語音功能了
-(void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available{    if(available){        self.siriBtu.enabled = true;    }else{        self.siriBtu.enabled = false;    }}

為原博主點贊:http://www.jianshu.com/p/b29069529bc2

 

iOS:iOS10和Xcode8 一起建立Siri 功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.