iOS中實(shí)現(xiàn)語音轉(zhuǎn)文字尤慰,除了一些第三方闯袒,常見的有科大訊飛語音推掸、百度語音屯换。
訊飛 - 收費(fèi)的,穩(wěn)定性和準(zhǔn)確率較高挽牢,個(gè)性化詞庫
百度語音 -?免費(fèi)的谱煤,個(gè)性化詞庫,語義解析
個(gè)性化詞庫 - 如果你說的語句中的詞語包含在個(gè)性化詞庫中卓研,那么會(huì)優(yōu)先識(shí)別個(gè)性化詞庫的詞
語義解析 - 就是你設(shè)置好問答趴俘,然后你問上一句睹簇,他會(huì)自動(dòng)答出下一句奏赘。
一、何通過蘋果API來實(shí)現(xiàn)語音轉(zhuǎn)文字
特點(diǎn)是:百度語音支持離線并免費(fèi)太惠。訊飛的也支持離線磨淌,識(shí)別率很高也很精準(zhǔn),但是是收費(fèi)的凿渊,而且由于訊飛科大的功能太多,包太大)蘋果官方也推出了自己的一套識(shí)別標(biāo)準(zhǔn)(iOS語音識(shí)別Api只支持iOS10SDK以及以后的版本)梁只。
1、添加Speech.framework庫埃脏,導(dǎo)入頭文件#import<Speech/Speech.h>
2搪锣、在info.plist文件里添加鍵值Privacy - Speech Recognition Usage
3、申請(qǐng)用戶語音識(shí)別權(quán)限
4彩掐、具體實(shí)現(xiàn)代碼如下
? ?通過打印的文字發(fā)現(xiàn)打印了好多次不完整的字符串,在這個(gè)過程中他會(huì)循環(huán)矯正多次,最后得到結(jié)果,我們要用最終的結(jié)果:
// 1. 初始化一個(gè)識(shí)別器
SFSpeechRecognizer *recognizer = [[SFSpeechRecognizer alloc] initWithLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
// 2. 初始化mp3的url? (我在Bundle中導(dǎo)入了一個(gè)本地的MP3文件進(jìn)行演示)
?NSURL*fileUrl = [[NSBundlemainBundle]URLForResource:@"laohu.mp3"withExtension:nil];
?// 3. 根據(jù)Url創(chuàng)建請(qǐng)求
SFSpeechURLRecognitionRequest *request = [[SFSpeechURLRecognitionRequest alloc] initWithURL:fileUrl];
?// 4. 發(fā)起請(qǐng)求
[recognizerrecognition TaskWithRequest: requestresultHandler: ^(SFSpeechRecognitionResult *_Nullableresult, NSError *_Nullableerror) {
? ? ? ? ? ? ? ? ? ? if(error !=nil) {
? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"識(shí)別錯(cuò)誤:%@",error);
? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? self.contentLabel.text = result.bestTranscription.formattedString;
? ? ? ? ? ? ? ? ? ? //打印語音識(shí)別的結(jié)果字符串
? ? ? ? ? ? ? ? ? ? NSLog(@"%@",result.bestTranscription.formattedString);
? ? ? ? ? ? ? ? }];
需要注意的地方就是需請(qǐng)求授權(quán),并配置Info.plist,否則Crash.
二构舟、通過BDs語音實(shí)現(xiàn)語音轉(zhuǎn)文字。
支持的語種:普通話堵幽、英語狗超、粵語、四川話朴下;
格式支持:pcm(不壓縮)努咐、wav(不壓縮,pcm編碼)殴胧、amr(壓縮格式)渗稍。推薦pcm?
采樣率 :16000 固定值。?
編碼:16bit 位深的單聲道团滥。
百度語音sdk接入:
注意:必須在真機(jī)語音才可以識(shí)別成功竿屹,在模擬器始終會(huì)返回錯(cuò)誤。
1惫撰、百度語音開放平臺(tái)注冊(cè)應(yīng)用獲取對(duì)應(yīng)的API_KEY, SECRET_KEY, APP_ID:
2羔沙、導(dǎo)入必備的庫,并添加下載的sdk厨钻,如下圖:
3扼雏、添加頭文件
#import "BDSEventManager.h"
#import "BDSASRDefines.h"
#import "BDSASRParameters.h"
4坚嗜、代碼實(shí)現(xiàn)
? ??首先配置百度語音識(shí)別
-(void)configureBDVoice{
? ? //創(chuàng)建相關(guān)接口對(duì)象
? ? self.asrManager = [BDSEventManager createEventManagerWithName:BDS_ASR_NAME];
? ? //設(shè)置代理
? ? [self.asrManager setDelegate:self];
? ? //配置參數(shù)
? ? //1.設(shè)置DEBUG_LOG的級(jí)別
? ? [self.asrManager setParameter:@(EVRDebugLogLevelTrace) forKey:BDS_ASR_DEBUG_LOG_LEVEL];
? ? //2.配置API_KEY 和 SECRET_KEY 和 APP_ID
? ? [self.asrManager setParameter:@[API_KEY, SECRET_KEY] forKey:BDS_ASR_API_SECRET_KEYS];
? ? [self.asrManager setParameter:APP_ID forKey:BDS_ASR_OFFLINE_APP_CODE];
? ? //3.配置端點(diǎn)檢測(cè)
? ? NSString*modelVAD_filepath = [[NSBundlemainBundle]pathForResource:@"bds_easr_basic_model"ofType:@"dat"];
//? ? NSLog(@"modelVAD_filepath = %@",modelVAD_filepath);
? ? [self.asrManager setParameter:modelVAD_filepath forKey:BDS_ASR_MODEL_VAD_DAT_FILE];
? ? [self.asrManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_MODEL_VAD];
? ? //4.開啟語義理解
? ? [self.asrManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_NLU];
? ? [self.asrManager setParameter:@"15361" forKey:BDS_ASR_PRODUCT_ID];
}
語音識(shí)別完成后的回調(diào)如下,可在回調(diào)中獲取識(shí)別的文字或者識(shí)別失敗的原因:
-(void)VoiceRecognitionClientWorkStatus:(int)workStatus obj:(id)aObj{
? ? switch(workStatus) {
? ? ? ? case EVoiceRecognitionClientWorkStatusNewRecordData:
? ? ? ??{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusNewRecordData");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusStartWorkIng:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusStartWorkIng");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusStart:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusStart");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusEnd:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusEnd");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusFlushData:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusFlushData");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusFinish:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusFinish");
? ? ? ? ? ? NSLog(@"aObj = %@",aObj);
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusMeterLevel:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusMeterLevel");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusCancel:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusCancel");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusError: {
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusError");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusLoaded:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusLoaded");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusUnLoaded:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusUnLoaded");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusChunkThirdData:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusChunkThirdData");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusChunkNlu:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusChunkNlu");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusChunkEnd:
? ? ? ?{
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusChunkEnd");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusFeedback:
? ? ? ? {
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusFeedback");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusRecorderEnd:
? ? ? ? {
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusRecorderEnd");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case EVoiceRecognitionClientWorkStatusLongSpeechEnd:
? ? ? ? {
? ? ? ? ? ? NSLog(@"EVoiceRecognitionClientWorkStatusLongSpeechEnd");
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
}