iOS---語音轉文字

iOS中實現(xiàn)語音轉文字,除了一些第三方报强,如科大訊飛語音灸姊、百度語音等第三方的外(這種第三方的在其官方都有詳細的教程,這里就不在敘述了秉溉。特點是:百度語音支持離線并免費力惯。訊飛的也支持離線碗誉,雖然識別率很高也很精準,但是收費)父晶,蘋果官方也推出了自己的一套識別標準哮缺。

蘋果官方的文字轉語音支持iOS10之后

文字轉語音的需求:

1.創(chuàng)建一個按鈕用來控制啟動、關閉錄音

?2.創(chuàng)建一個語音控制器甲喝,一個語音識別器 尝苇。一個語音任務管理器,

?3.創(chuàng)建顯示轉換好的文字的控件

步驟:

?iOS語音轉文字:1.需要添加Speech.framework庫? ? 2.導入頭文件#import


?3.在info.plist文件里添加了兩個鍵值Privacy - Microphone Usage Description埠胖、Privacy - Speech Recognition Usage Description

具體代碼如下:

#import "ViewController.h"

#import<Speech/Speech.h>

#import<AVFoundation/AVFoundation.h>

@interface ViewController ()

@property (nonatomic,strong)UIButton *swicthBut;

@property (nonatomic,strong)UILabel *labText;

@property(nonatomic,strong)SFSpeechRecognizer*speechRecognizer;//語音識別器

@property (nonatomic,strong) SFSpeechAudioBufferRecognitionRequest *recognitionRequest;//語音識別請求

@property (nonatomic, strong) SFSpeechRecognitionTask *recognitionTask;//語音任務管理器

@property (nonatomic,strong) AVAudioEngine *audioEngine;//語音控制器

@end

@implementation ViewController

- (void)viewDidLoad {

? ? [super viewDidLoad];

? ? //發(fā)送語音認證請求(首先要判斷設備是否支持語音識別功能)

? ? [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {

? ? ? ? boolisButtonEnabled =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;

? ? ? ? }


? ? }];



? ? // Do any additional setup after loading the view, typically from a nib.

? ? self.title=@"測試";

? ? self.view.backgroundColor = [UIColor whiteColor];

? ? [self.viewaddSubview:self.swicthBut];

? ? [self.viewaddSubview:self.labText];



}

- (void)speechRecognizer:(SFSpeechRecognizer*)speechRecognizer availabilityDidChange:(BOOL)available{

? ? if(available) {

? ? ? ? self.swicthBut.enabled=YES;

? ? ? ? ? [self.swicthBut setTitle:@"開始錄音" forState:UIControlStateNormal];

? ? }else{


? ? ? ? self.swicthBut.enabled=NO;

? ? ? ? ? [self.swicthBut setTitle:@"語音識別不可用" forState:UIControlStateNormal];

? ? }

}

#pragma mark----語音識別

- (SFSpeechRecognizer*)speechRecognizer{


? ? if (!_speechRecognizer) {

? ? ? ? NSLocale *cale = [[NSLocale alloc]initWithLocaleIdentifier:@"zh-CN"];

?? ? ? _speechRecognizer= [[SFSpeechRecognizeralloc]initWithLocale:cale];


? ? ? ? //設置代理

? ? ? ? _speechRecognizer.delegate = self;

? ? }

? ? return _speechRecognizer;

}

#pragma mark---停止錄音

- (void)endRecording{

? ? [self.audioEngine stop];

? ? if (_recognitionRequest) {

? ? ? ? [_recognitionRequest endAudio];

? ? }


? ? if (_recognitionTask) {

? ? ? ? [_recognitionTask cancel];

? ? ? ? _recognitionTask = nil;

? ? }

? ? self.swicthBut.enabled=NO;

}

#pragma? mark---開始錄音

- (void)startRecording{

? ? if (self.recognitionTask) {

? ? ? ? [self.recognitionTask cancel];

? ? ? ? self.recognitionTask = nil;

? ? }

? ? AVAudioSession *audioSession = [AVAudioSession sharedInstance];

? ? NSError*error;

? ? bool? audioBool = [audioSessionsetCategory:AVAudioSessionCategoryRecorderror:&error];

? ? NSParameterAssert(!error);

? ? bool? audioBool1= [audioSessionsetMode:AVAudioSessionModeMeasurementerror:&error];

? ? ? NSParameterAssert(!error);

? ? bool? audioBool2= [audioSessionsetActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

? ? ? NSParameterAssert(!error);

? ? if(audioBool || audioBool1||? audioBool2) {

? ? ? ? NSLog(@"可以使用");

? ? }else{

? ? ? ? NSLog(@"這里說明有的功能不支持");

? ? }

? ? self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init];

? ? AVAudioInputNode *inputNode = self.audioEngine.inputNode;

? ? NSAssert(inputNode,@"錄入設備沒有準備好");

? ? NSAssert(self.recognitionRequest, @"請求初始化失敗");


? ? self.recognitionRequest.shouldReportPartialResults = true;

?? ? __weaktypeof(self) weakSelf =self;


? ? //開始識別任務

? ? self.recognitionTask = [self.speechRecognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {

? ? ? ? __strongtypeof(weakSelf) strongSelf = weakSelf;

? ? ? ? boolisFinal =false;

? ? ? ? if(result) {

? ? ? ? ? ? strongSelf.labText.text= [[resultbestTranscription]formattedString];//語音轉文本

? ? ? ? ? ? isFinal = [resultisFinal];

? ? ? ? }

? ? ? ? if(error || isFinal) {

? ? ? ? ? ? [strongSelf.audioEnginestop];

? ? ? ? ? ? [inputNoderemoveTapOnBus:0];

? ? ? ? ? ? strongSelf.recognitionRequest=nil;

? ? ? ? ? ? strongSelf.recognitionTask=nil;

? ? ? ? ? ? [strongSelf.swicthButsetTitle:@"開始錄音"forState:UIControlStateNormal];

? ? ? ? ? ? strongSelf.swicthBut.enabled=true;

? ? ? ? }

? ? }];

? ? AVAudioFormat*recordingFormat = [inputNodeoutputFormatForBus:0];

? ? //在添加tap之前先移除上一個? 不然有可能報"Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio',"之類的錯誤

? ? [inputNoderemoveTapOnBus:0];

? ? [inputNodeinstallTapOnBus:0bufferSize:1024format:recordingFormatblock:^(AVAudioPCMBuffer*_Nonnullbuffer,AVAudioTime*_Nonnullwhen) {

?? ? ? ? __strongtypeof(weakSelf) strongSelf = weakSelf;

? ? ? ? if(strongSelf.recognitionRequest) {

? ? ? ? ? ? [strongSelf.recognitionRequestappendAudioPCMBuffer:buffer];

? ? ? ? }


? ? }];

? ? [self.audioEngine prepare];

? ? boolaudioEngineBool = [self.audioEnginestartAndReturnError:&error];

?? ? NSParameterAssert(!error);

? ? self.labText.text = @"正在錄音糠溜。。直撤。";

? ? NSLog(@"%d",audioEngineBool);



}

#pragma mark---創(chuàng)建錄音引擎

- (AVAudioEngine*)audioEngine{


? ? if (!_audioEngine) {

? ? ? ? _audioEngine= [[AVAudioEnginealloc]init];

? ? }

? ? return _audioEngine;

}

#pragma mark----顯示控件

- (UILabel*)labText{


? ? if(!_labText) {

? ? ? ? _labText= [[UILabelalloc]init];

? ? ? ? _labText.frame = CGRectMake(0, 140, [UIScreen mainScreen].bounds.size.width, 50);

? ? ? ? _labText.font= [UIFontsystemFontOfSize:13.0f];

? ? ? ? _labText.numberOfLines = 0;

? ? ? ? _labText.textAlignment = NSTextAlignmentCenter;

? ? ? ? _labText.textColor = [UIColor yellowColor];

? ? }

? ? return _labText;

}

#pragma mark----開關

- (UIButton*)swicthBut{


? ? if (!_swicthBut) {

? ? ? ? _swicthBut= [[UIButtonalloc]init];

? ? ? ? _swicthBut.frame=CGRectMake(50,100,80,30);

? ? ? ? _swicthBut.titleLabel.textAlignment = NSTextAlignmentCenter;

? ? ? ? [_swicthBut setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];

? ? ? ? [_swicthBut addTarget:self action:@selector(switchOn:) forControlEvents:UIControlEventTouchUpInside];

? ? ? ? [_swicthBut setTitle:@"開始錄音" forState:UIControlStateNormal];

? ? }

? ? return _swicthBut;

}

- (void)switchOn:(id)sender{


? ? if([self.audioEngineisRunning]) {

? ? ? ? [self endRecording];

?? ? ? [_swicthBut setTitle:@"開始錄音" forState:UIControlStateNormal];

? ? }else{

? ? ? ? [self startRecording];

?? ? ? ? [_swicthBut setTitle:@"關閉" forState:UIControlStateNormal];

? ? }

}

#pragma mark---識別本地音頻文件

- (void)recognizeLocalAudioFile:(UIButton*)sender {

? ? NSLocale *local =[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

? ? SFSpeechRecognizer *localRecognizer =[[SFSpeechRecognizer alloc] initWithLocale:local];

? ? NSURL *url =[[NSBundle mainBundle] URLForResource:@"錄音.m4a" withExtension:nil];

? ? if(!url)return;

? ? SFSpeechURLRecognitionRequest *res =[[SFSpeechURLRecognitionRequest alloc] initWithURL:url];

? ? __weak typeof(self) weakSelf = self;

? ? [localRecognizerrecognitionTaskWithRequest:resresultHandler:^(SFSpeechRecognitionResult*_Nullableresult,NSError*_Nullableerror) {

? ? ? ? if(error) {

? ? ? ? ? ? NSLog(@"語音識別解析失敗,%@",error);

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? weakSelf.labText.text = result.bestTranscription.formattedString;

? ? ? ? }

? ? }];

}

- (void)didReceiveMemoryWarning {

? ? [super didReceiveMemoryWarning];

? ? // Dispose of any resources that can be recreated.

}

@end

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末非竿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谋竖,更是在濱河造成了極大的恐慌红柱,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圈盔,死亡現(xiàn)場離奇詭異豹芯,居然都是意外死亡,警方通過查閱死者的電腦和手機驱敲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門铁蹈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人众眨,你說我怎么就攤上這事握牧。” “怎么了娩梨?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵沿腰,是天一觀的道長。 經(jīng)常有香客問我狈定,道長颂龙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任纽什,我火速辦了婚禮措嵌,結果婚禮上,老公的妹妹穿的比我還像新娘芦缰。我一直安慰自己企巢,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布让蕾。 她就那樣靜靜地躺著浪规,像睡著了一般或听。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笋婿,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天誉裆,我揣著相機與錄音,去河邊找鬼缸濒。 笑死找御,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的绍填。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼栖疑,長吁一口氣:“原來是場噩夢啊……” “哼讨永!你這毒婦竟也來了?” 一聲冷哼從身側響起遇革,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤卿闹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萝快,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锻霎,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年揪漩,在試婚紗的時候發(fā)現(xiàn)自己被綠了旋恼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡奄容,死狀恐怖冰更,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昂勒,我是刑警寧澤蜀细,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站戈盈,受9級特大地震影響奠衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塘娶,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一归斤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧血柳,春花似錦官册、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸦难。三九已至,卻和暖如春员淫,著一層夾襖步出監(jiān)牢的瞬間合蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工介返, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拴事,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓圣蝎,卻偏偏與公主長得像刃宵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子徘公,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 龜鈕吉語印“八千萬” 【尺寸牲证、重量】印面縱9.76毫米橫9.4毫米,總高7.66毫米关面,重2.6克 【描述】漢印...
    清語宛如閱讀 439評論 0 0
  • 你緊拽著皺紋穿過一路的狂奔 退卻到生命最初的宅院 古老的香樟沉悶了許多年 喜鵲和啄木鳥都已不知去向 風溫柔的撫慰著...
    默默huangjuan閱讀 434評論 18 21
  • 你是站在什么角度去看待一個事情的是與非的坦袍?你怎么就知道你不是自以為是的明辨是非?在你大義凜然的輕易明辨是非的時候等太,...
    funny1229閱讀 266評論 0 0
  • 人必須要有朋友嗎缩抡?我覺得交朋友也不怎么讓我快樂奠宜,還耗費很多精力,所以人必須交朋友嗎瞻想?
    予川以風閱讀 290評論 0 0
  • 紛紛揚揚的雪花 清清靜靜飄下 喝一...
    芳小棠閱讀 179評論 0 1