IOS10新出的speech(演讲,讲话)框架,可以方便的将语音转化为文字 。
在使用之前,首先介绍几个需要用的类 ,使用方法类似webView
SFSpeechRecognizer (Speech:演讲 Recognizer:识别)
SFSpeechRecognitionRequest (识别请求)
SFTranscription (Transcription:译文)
SFTranscriptionSegment (Segment :段)
先创建一个SFSpeechRecognizer 类似创建一个webView
然后传入求个识别请求 类似webView的网络请求
然后设置代理,监听返回结果。
在使用之前语音之前 先在info.plist里面添加这个key,否则会崩溃
<key>NSSpeechRecognitionUsageDescription</key>
<string>测试语音 </string>
这个是使用录音功能添加的 语音不需要
<key>NSMicrophoneUsageDescription</key>
<string>测试录音 </string>
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishRecognition:(SFSpeechRecognitionResult *)recognitionResult{}
这个代理方法里面返回recognitionResult :
recognitionResult的两个属性
@property (nonatomic, readonly, copy) SFTranscription *bestTranscription;
// Hypotheses for possible transcriptions, sorted in decending order of confidence (more likely first)
@property (nonatomic, readonly, copy) NSArray*transcriptions;
bestTranscription : 返回了最可能的一条表达译文数据
transcriptions:所有的可能的识别数据
SFTranscription的一个属性
@property(nonatomic,readonly,copy)NSArray<SFTranscriptionSegment>*segments;
你所说的一句话,可能是有好几个词语拼成的,transcription就是你所说的那句话,segments就是你所说的你那句话的组成每个单词的集合。SFTranscriptionSegment包含该每个单词信息,比如说这个单词所用的时间。
录音:(好像文章结构有点乱)
录音使用 AVAudioRecorder
录音后的文件 这里保存在了 这个路径里面
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
return [documentPath stringByAppendingPathComponent:@"test.aac"];
关于录音里面的一些参数的设置,demo里面给了较多的注释和讲解。
这里面的录音,每次新录的会覆盖原来的录音
录音完成后转化为文字:
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishRecognition:(SFSpeechRecognitionResult *)recognitionResult
录音转化完成会调用这个方法。
NSLog(@"完成录音转换 %@",recognitionResult.bestTranscription);
取这个recognitionResult.bestTranscription 就是转化完成的语句。不过这个转化完成的语句有个缺点就是它只是一长句话,中间没有什么标点符号。并不像微信里面的那么智能。
对转化后的文字的处理:
这个我也没有什么好的办法。百度上找了好多,介绍的文章也就是到此为止。
这里笔者就是把转化后的每句话做了判断:
如果一句话中的某个片段,时间大于0.6秒 后面就需要拼接标点
根据这个片段的最后一个字,拼接相应的标点
if (speechString.length == 0) return @"";
NSString *lastString = [speechString substringFromIndex:speechString.length - 1];
if ([lastString isEqualToString:@"啊"]) {
return @"!";
}else if ([lastString isEqualToString:@"吧"])
{
return @"~";
}else if ([lastString isEqualToString:@"呢"]){
return @"?";
}else if ([lastString isEqualToString:@"哈"]) {
return @"~~";
}else {
return @",";
}
最后希望有大神能对文章以及后面的这个标点符号的处理多多指正 ~~~~非常感激