ios 语音识别调研 SFSpeechRecognizer


//
//  DemoTextViewVC.m
//  XMUI_OC
//
//

#import "DemoTextViewVC.h"
#import "XMTextView.h"

#import <AVFoundation/AVFoundation.h>
#import<Speech/Speech.h>


@interface DemoTextViewVC ()<SFSpeechRecognitionTaskDelegate>

@property (nonatomic, strong) XMTextView    *textV;

@property (nonatomic,strong)SFSpeechRecognizer *recognizer;
@property(nonatomic,strong)SFSpeechAudioBufferRecognitionRequest * recognitionRequest;
@property(nonatomic,strong)SFSpeechRecognitionTask * recognitionTask ;
@property (nonatomic,strong)AVAudioEngine * audioEngine;

@end

@implementation DemoTextViewVC

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.customNaviView setTitleStr:@"XMTextView"];
    
    self.textV = [[XMTextView alloc] initWithFrame: CGRectMake(10, 120, kScreenWidth_XM - 20, 500)];
    [self.view addSubview:self.textV];
    self.textV.placeholder = @"请输入内容";
    self.textV.placeholerFont = [UIFont systemFontOfSize:16];
    self.textV.font = [UIFont systemFontOfSize:16];
    self.textV.textColor = [UIColor redColor];
    self.textV.placeholderColor = [UIColor grayColor];
    self.textV.backgroundColor = [UIColor lightGrayColor];
//    self.textV.contentInset = UIEdgeInsetsMake(10, 10, 10, 10);
    
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-CN"];
       _recognizer = [[SFSpeechRecognizer alloc] initWithLocale:locale];
       //把语音识别的代理设置为 self
       _recognizer.delegate = self;

    
    [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
        if (status == SFSpeechRecognizerAuthorizationStatusAuthorized) {
            NSLog(@"认证成功");
            [self startRecording];
        } else {
            NSLog(@"失败");
        }
    }];

}

-(void)startRecording{
    if (self.recognitionTask) {
        [self.recognitionTask cancel];
        self.recognitionTask = nil;
    }
    

    
    self.audioEngine = [[AVAudioEngine alloc] init];
    
    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;
    
    self.recognitionRequest.shouldReportPartialResults = true;
    // ios13后支持离线识别了。
    if (@available(iOS 16, *)) { // 标点符号。
        self.recognitionRequest.addsPunctuation = YES;
    } else {
        // Fallback on earlier versions
    }
    
    //开始识别任务
    self.recognitionTask = [self.recognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
        bool isFinal = false;
        if (result) {
            NSLog(@"result==== %@", result.bestTranscription.formattedString);
            //语音转文本
            isFinal = [result isFinal];
            self.textV.text = result.bestTranscription.formattedString;
        }
        if (error || isFinal) {
            [self.audioEngine stop];
            [inputNode removeTapOnBus:0];
            self.recognitionRequest = nil;
            self.recognitionTask = nil;
        }
    }];
    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];
    NSError *error;
    bool audioEngineBool = [self.audioEngine startAndReturnError:&error];
    NSLog(@"%d === %@",audioEngineBool, error);
}

//当语音识别操作可用性发生改变时会被调用
- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available{
    if (available) {
        
    }else{
        
    }
}


@end


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容