語(yǔ)音轉(zhuǎn)文字

iOS中實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字,除了一些第三方,常見(jiàn)的有科大訊飛語(yǔ)音、百度語(yǔ)音。

訊飛 - 收費(fèi)的,穩(wěn)定性和準(zhǔn)確率較高,個(gè)性化詞庫(kù)

百度語(yǔ)音 -?免費(fèi)的,個(gè)性化詞庫(kù),語(yǔ)義解析

個(gè)性化詞庫(kù) - 如果你說(shuō)的語(yǔ)句中的詞語(yǔ)包含在個(gè)性化詞庫(kù)中,那么會(huì)優(yōu)先識(shí)別個(gè)性化詞庫(kù)的詞

語(yǔ)義解析 - 就是你設(shè)置好問(wèn)答,然后你問(wèn)上一句,他會(huì)自動(dòng)答出下一句。

一、何通過(guò)蘋果API來(lái)實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字

特點(diǎn)是:百度語(yǔ)音支持離線并免費(fèi)。訊飛的也支持離線,識(shí)別率很高也很精準(zhǔn),但是是收費(fèi)的,而且由于訊飛科大的功能太多,包太大)蘋果官方也推出了自己的一套識(shí)別標(biāo)準(zhǔn)(iOS語(yǔ)音識(shí)別Api只支持iOS10SDK以及以后的版本)。

1、添加Speech.framework庫(kù),導(dǎo)入頭文件#import<Speech/Speech.h>

2、在info.plist文件里添加鍵值Privacy - Speech Recognition Usage

plist文件添加鍵值

3、申請(qǐng)用戶語(yǔ)音識(shí)別權(quán)限

申請(qǐng)語(yǔ)音識(shí)別權(quán)限

4、具體實(shí)現(xiàn)代碼如下

? ?通過(guò)打印的文字發(fā)現(xiàn)打印了好多次不完整的字符串,在這個(gè)過(guò)程中他會(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;

? ? ? ? ? ? ? ? ? ? //打印語(yǔ)音識(shí)別的結(jié)果字符串

? ? ? ? ? ? ? ? ? ? NSLog(@"%@",result.bestTranscription.formattedString);

? ? ? ? ? ? ? ? }];

需要注意的地方就是需請(qǐng)求授權(quán),并配置Info.plist,否則Crash.

二、通過(guò)BDs語(yǔ)音實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字。

支持的語(yǔ)種:普通話、英語(yǔ)、粵語(yǔ)、四川話;

格式支持:pcm(不壓縮)、wav(不壓縮,pcm編碼)、amr(壓縮格式)。推薦pcm?

采樣率 :16000 固定值。?

編碼:16bit 位深的單聲道。

百度語(yǔ)音sdk接入:

注意:必須在真機(jī)語(yǔ)音才可以識(shí)別成功,在模擬器始終會(huì)返回錯(cuò)誤。

1、百度語(yǔ)音開(kāi)放平臺(tái)注冊(cè)應(yīng)用獲取對(duì)應(yīng)的API_KEY, SECRET_KEY, APP_ID:

2、導(dǎo)入必備的庫(kù),并添加下載的sdk,如下圖:

3、添加頭文件

#import "BDSEventManager.h"

#import "BDSASRDefines.h"

#import "BDSASRParameters.h"

4、代碼實(shí)現(xiàn)

? ??首先配置百度語(yǔ)音識(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.開(kāi)啟語(yǔ)義理解

? ? [self.asrManager setParameter:@(YES) forKey:BDS_ASR_ENABLE_NLU];

? ? [self.asrManager setParameter:@"15361" forKey:BDS_ASR_PRODUCT_ID];

}

語(yǔ)音識(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;

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近終于有一點(diǎn)時(shí)間抽空來(lái)看看最近的新技術(shù),然后發(fā)現(xiàn)了蘋果在去年出的新框架,可以直接語(yǔ)音轉(zhuǎn)文字,簡(jiǎn)直厲害了,...
    NBeanN閱讀 7,806評(píng)論 8 14
  • 這里簡(jiǎn)單使用一下百度官網(wǎng)的語(yǔ)音SDK 首先官網(wǎng)創(chuàng)建一個(gè)應(yīng)用拿到APP_KEY 和APP_ID還有SECRET_KE...
    Cn11閱讀 2,144評(píng)論 0 0
  • 效果是把識(shí)別的語(yǔ)音展示在textFiled上 以下是官方集成文檔里面有的代碼,目的是導(dǎo)...
    本客閱讀 966評(píng)論 0 0
  • 語(yǔ)音識(shí)別(Automatic Speech Recognition)是以語(yǔ)音為研究對(duì)象,通過(guò)語(yǔ)音信號(hào)處理和模式識(shí)別...
    Colleen_oh閱讀 59,114評(píng)論 6 26
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,646評(píng)論 2 7

友情鏈接更多精彩內(nèi)容