CMUSphinx开源语音识别工具包,可以基于CMUSphinx开发iOS版本的语音识别和语音合成库。

本文介绍的语音识别库使您可以轻松快速地将多种语言的离线语音识别和合成语音添加到iOS应用程序中。它让开发者从使用高级语音应用程序接口中获得巨大的便利,本库用独特的人类可读语法规范语言设计的,你只需创建NSArray或NSDictionary。

因为语音库是完全离线的,所以它不使用网络,也不向第三方服务公开用户的私人言论,而且没有隐藏的成本或账户设置。如果您有更具体的应用程序需求。V2.5版本现在已经发布,支持7种语言的离线语音识别,包括中文,德语,法语,意大利语,荷兰语。支持Objective-C和Swift版本!

本教程需要Xcode 8.0或更高版本。以前的版本在添加框架时有bug,不受支持。

创建您的APP工程项目,例如,”MyAPP”。下载本文语音识别库的Framework文件。

一、项目配置:

1、在您下载的压缩包中有一个名为“Framework”的文件夹。将该文件夹拖到Xcode的应用程序项目中。一定要确保在“添加”对话框中选中“Create groups for any added folders”,而不是“Create folder references for any added folders”,并且选中“Copy items into destination group's folder (if needed)”。此处的错误设置将导致你的应用程序无法进行语音识别工作。

2、下一步,导航到Xcode的项目设置TARGETS标签,在“Build Setting”中找到“Framework Search Paths”设置项。仔细检查本文中的Framework文件夹路径是否已添加到其中,并且路径看起来没有异常(例如,多余的引号或反斜杠或者拼写错误等)。如果发现错误,请更正)。

  3、将iOS 的AudioToolbox 和AVFoundation框架添加到您的项目工程中。

二、代码实现:

  • 使用OELanguageModelGenerator

在本文的离线语音识别中,您可以自定义希望你的APP能够识别的预设词汇表。这称为语言模型或语法。预设词汇表定义了您的APP能够识别的单词和短语。对于iPhone、iPod或iPad上的离线语音识别应用程序来说,一个好的词汇量是10到500个单词。

预设字汇表的创建方法如下,将以下头文件内容添加到实现文件中(.m文件):

在Controller顶部的@interface关键字下包含头文件:

#import <OpenEars/OELanguageModelGenerator.h>
#import <OpenEars/OEAcousticModel.h>

在你要创建语言模型的方法(例如viewDidLoad方法)中,添加以下方法的调用(将“WORD”和“A PHRASE”等预设词语替换为您希望能够识别的实际单词和短语):

OELanguageModelGenerator *lmGenerator = [[OELanguageModelGenerator alloc] init];
NSArray *words = [NSArray arrayWithObjects:@"WORD", @"STATEMENT", @"OTHER WORD", @"A PHRASE", nil];
NSString *name = @"NameIWantForMyLanguageModelFiles";
NSError *err = [lmGenerator generateLanguageModelFromArray:words withFilesNamed:name forAcousticModelAtPath:[OEAcousticModel pathToModel:@"AcousticModelEnglish"]]; 

NSString *lmPath = nil;
NSString *dicPath = nil;

if(err == nil) {
   lmPath = [lmGenerator pathToSuccessfullyGeneratedLanguageModelWithRequestedName:@"NameIWantForMyLanguageModelFiles"];
   dicPath = [lmGenerator pathToSuccessfullyGeneratedDictionaryWithRequestedName:@"NameIWantForMyLanguageModelFiles"];
} else {
   NSLog(@"Error: %@",[err localizedDescription]);
}

 

  • 使用OEPocketsphinxController

OEPocketsphinxController是控制本地语音识别的类。要使用OEPocketsphinxController(执行语音识别的类),您需要一个语言模型和一个包含词汇的词典。这些文件定义OEPocketsphinxController能够识别哪些单词。我们刚刚使用oLanguageModelGenerator在上面创建了它们。除此之外,还需要一个声学模型,本库支持7个国家的声学模型,包括中文,德语,法语,意大利语,荷兰语等。这里以英文为例。

 

首先,添加以下头文件:在顶部的@implementation关键字下:

#import <OpenEars/OEPocketsphinxController.h>
#import <OpenEars/OEAcousticModel.h>

在要识别语音的方法中(这里我们仅进行测试,所以将其添加到viewDidLoad方法中),添加以下方法调用:

[[OEPocketsphinxController sharedInstance] setActive:TRUE error:nil];

[[OEPocketsphinxController sharedInstance] startListeningWithLanguageModelAtPath:lmPath dictionaryAtPath:dicPath acousticModelAtPath:[OEAcousticModel pathToModel:@"AcousticModelEnglish"] languageModelIsJSGF:NO];

注意,在调用OEPocketsphinxController进行语音识别之前,您应向iOS系统申请麦克风权限。

  • 使用OEEventsObserver进行过程监听:

oeventsobserver是一个类,它通过委托回调,让您不断更新侦听会话的状态。将以下行添加到头文件(.h文件)中:

#import <OpenEars/OEEventsObserver.h>

 

在@interface声明中,添加oeventsobserverdelegate的代理声明。在名为ViewController的视图控制器的示例如下所示:

@interface ViewController : UIViewController <OEEventsObserverDelegate>

并将此属性添加到其类属性中(OEEventsObserver必须声明为类的属性,否则将无法工作):

@property (strong, nonatomic) OEEventsObserver *openEarsEventsObserver;

将以下内容添加到实现(.m文件):需在调用OEPocketsphinxController的方法(可能在viewDidLoad中)之前,实例化oeventsobserver并按如下方式设置其委托:

self.openEarsEventsObserver = [[OEEventsObserver alloc] init];

[self.openEarsEventsObserver setDelegate:self];

将openEarsEventsObserver 的这些委托方法添加到类中,您将在该类中接收到有关语音识别的过程事件或者其他语音UI事件的信息:

- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID {

    NSLog(@"The received hypothesis is %@ with a score of %@ and an ID of %@", hypothesis, recognitionScore, utteranceID);

}

以上代理回调的返回结果hypothesis即为当前识别到的语音结果,您可以依据此结果字符串来处理您的业务逻辑。

- (void) pocketsphinxDidStartListening {

    NSLog(@"Pocketsphinx is now listening.");
}



- (void) pocketsphinxDidDetectSpeech {

    NSLog(@"Pocketsphinx has detected speech.");
}



- (void) pocketsphinxDidDetectFinishedSpeech {

    NSLog(@"Pocketsphinx has detected a period of silence, concluding an utterance.");
}



- (void) pocketsphinxDidStopListening {

    NSLog(@"Pocketsphinx has stopped listening.");
}



- (void) pocketsphinxDidSuspendRecognition {

    NSLog(@"Pocketsphinx has suspended recognition.");
}



- (void) pocketsphinxDidResumeRecognition {

    NSLog(@"Pocketsphinx has resumed recognition."); 
}



- (void) pocketsphinxDidChangeLanguageModelToFile:(NSString *)newLanguageModelPathAsString andDictionary:(NSString *)newDictionaryPathAsString {

    NSLog(@"Pocketsphinx is now using the following language model: \n%@ and the following dictionary: %@",newLanguageModelPathAsString,newDictionaryPathAsString);
}



- (void) pocketSphinxContinuousSetupDidFailWithReason:(NSString *)reasonForFailure {

    NSLog(@"Listening setup wasn't successful and returned the failure reason: %@", reasonForFailure);
}



- (void) pocketSphinxContinuousTeardownDidFailWithReason:(NSString *)reasonForFailure {

    NSLog(@"Listening teardown wasn't successful and returned the failure reason: %@", reasonForFailure);
}



- (void) testRecognitionCompleted {

    NSLog(@"A test file that was submitted for recognition is now complete.");
}

以上即为英文版本语音识别全过程。其他语言版本的识别设置与此类似,仅需更换或添加语言库文件的bundle文件即可。例如,本文的英文模型AcousticModelEnglish,可在Framework文件夹下找到”AcousticModelEnglish.bundle”。当需要西班牙语支持时,添加“AcousticModelSpanish.bundle”并更改代码的相应配置即可。

 

如需Demo代码和相关库文件请联系:yuanming.su@foxmail.com

更多分享,请搜索并关注微信公众号:“苏叁币Notes

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐