その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

OpenEars 1.6で音声認識を行う

フリーのiOS向け音声認識/音声合成ライブラリ『OpenEars』について半年ほど前に記事を書いたのですが、

このときのバージョンは1.3.6でしたが、2014年1月現在の最新バージョンは1.64となっています。


で、もうAPIも結構変わっていて、上記記事のコードだと動かない(ビルドエラーになる)部分も多いので、改めて実装手順を書いておきます。


ちなみに音声合成は今回は省きます。iOS7でAVSpeechSynthesizerも追加されたし、もういいかなと。。

1. フレームワーク・リソースをプロジェクトに追加

とりあえず英語の認識だけでよければ、

  • OpenEars.framework
  • AcousticModelEnglish.bundle

の2つをプロジェクトに追加します。

2. ヘッダをインポート

#import <OpenEars/LanguageModelGenerator.h>
#import <OpenEars/PocketsphinxController.h>
#import <OpenEars/AcousticModel.h>

3. 言語モデル生成

プロパティを定義しておき、

@property (strong, nonatomic) NSString *amPath;
@property (strong, nonatomic) NSString *lmPath;
@property (strong, nonatomic) NSString *dicPath;


LanguageModelGeneratorで言語モデルを生成し、プロパティに格納しておきます。

NSArray *words = @[
                   @"SUNDAY",
                   @"MONDAY",
                   @"TUESDAY",
                   @"WEDNESDAY",
                   @"THURSDAY",
                   @"FRIDAY",
                   @"SATURDAY",
                   @"QUIDNUNC",
                   @"CHANGE MODEL",
                   ];
self.amPath = [AcousticModel pathToModel:@"AcousticModelEnglish"];
LanguageModelGenerator *generator = [[LanguageModelGenerator alloc] init];
NSError *error = [generator generateLanguageModelFromArray:words
                                            withFilesNamed:@"OpenEarsDynamicGrammar"
                                    forAcousticModelAtPath:self.amPath];

if (error.code != noErr) {
    
    NSLog(@"Error: %@",[error localizedDescription]);
}
else {
    
    NSDictionary *languageGeneratorResults = [error userInfo];
    
    self.lmPath = [languageGeneratorResults objectForKey:@"LMPath"];
    self.dicPath = [languageGeneratorResults objectForKey:@"DictionaryPath"];
}

4. 各種オブジェクト初期化/プロトコル実装

ここは旧バージョンと変わってないので省略します。

上記記事の3, 4を参考にしてください。

5. 認識スタート

[self.pocketsphinxController startListeningWithLanguageModelAtPath:self.lmPath
                                                  dictionaryAtPath:self.dicPath
                                               acousticModelAtPath:self.amPath
                                               languageModelIsJSGF:NO];

こんな感じです。


変更箇所を見ると、全体的に音響モデルを取り替えやすくするようにAPIを変更したのかなーと感じました。