iOS中实现语音转文字,除了一些第三方,常见的有科大讯飞语音、百度语音。
讯飞 - 收费的,稳定性和准确率较高,个性化词库
百度语音 - 免费的,个性化词库,语义解析
个性化词库 - 如果你说的语句中的词语包含在个性化词库中,那么会优先识别个性化词库的词
语义解析 - 就是你设置好问答,然后你问上一句,他会自动答出下一句。
一、何通过苹果API来实现语音转文字
特点是:百度语音支持离线并免费。讯飞的也支持离线,识别率很高也很精准,但是是收费的,而且由于讯飞科大的功能太多,包太大)苹果官方也推出了自己的一套识别标准(iOS语音识别Api只支持iOS10SDK以及以后的版本)。
1、添加Speech.framework库,导入头文件#import<Speech/Speech.h>
2、在info.plist文件里添加键值Privacy - Speech Recognition Usage
3、申请用户语音识别权限
4、具体实现代码如下
通过打印的文字发现打印了好多次不完整的字符串,在这个过程中他会循环矫正多次,最后得到结果,我们要用最终的结果:
// 1. 初始化一个识别器
SFSpeechRecognizer *recognizer = [[SFSpeechRecognizer alloc] initWithLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
// 2. 初始化mp3的url (我在Bundle中导入了一个本地的MP3文件进行演示)
NSURL*fileUrl = [[NSBundlemainBundle]URLForResource:@"laohu.mp3"withExtension:nil];
// 3. 根据Url创建请求
SFSpeechURLRecognitionRequest *request = [[SFSpeechURLRecognitionRequest alloc] initWithURL:fileUrl];
// 4. 发起请求
[recognizerrecognition TaskWithRequest: requestresultHandler: ^(SFSpeechRecognitionResult *_Nullableresult, NSError *_Nullableerror) {
if(error !=nil) {
NSLog(@"识别错误:%@",error);
return;
}
self.contentLabel.text = result.bestTranscription.formattedString;
//打印语音识别的结果字符串
NSLog(@"%@",result.bestTranscription.formattedString);
}];
需要注意的地方就是需请求授权,并配置Info.plist,否则Crash.
二、通过BDs语音实现语音转文字。
支持的语种:普通话、英语、粤语、四川话;
格式支持:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)。推荐pcm
采样率 :16000 固定值。
编码:16bit 位深的单声道。
百度语音sdk接入:
注意:必须在真机语音才可以识别成功,在模拟器始终会返回错误。
1、百度语音开放平台注册应用获取对应的API_KEY, SECRET_KEY, APP_ID:
2、导入必备的库,并添加下载的sdk,如下图:
3、添加头文件
#import "BDSEventManager.h"
#import "BDSASRDefines.h"
#import "BDSASRParameters.h"
4、代码实现
首先配置百度语音识别
-(void)configureBDVoice{
//创建相关接口对象
self.asrManager = [BDSEventManager createEventManagerWithName:BDS_ASR_NAME];
//设置代理
[self.asrManager setDelegate:self];
//配置参数
//1.设置DEBUG_LOG的级别
[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.配置端点检测
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];
}
语音识别完成后的回调如下,可在回调中获取识别的文字或者识别失败的原因:
-(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;
}
}