2013年12月10日火曜日

OpenEarsを使ってみた



AppCon2013で作ったBlack Rabbit
怪しさをお楽しみください。
http://fandroid-ej.org/appcon_2013/

作った物はこちら
http://www.youtube.com/watch?v=eAA2ktd_cCw
自分でもなんなんだかよくわからないけど、音声認識に対応したカメラです。w
機能は写真撮影、動画撮影、ズーム、ライトです。
UIImagePickerControllerとかも初めて使ったので苦戦しました。





前々から興味のあった音声認識のアプリを作ってみました。
使ったのはオープンライブラリーのOpenEarsというもの。

OpenEarsのサイトはこちら。
http://www.politepix.com/openears/

なにが出来るかっていうと、音声合成と音声認識。
英語とスペイン語の辞書が入ってるようで、それらを喋らせることが出来ます。

今回は元々OpenEarsで提供してるサンプルアプリを題材に、機能の分かった部分と使い方を書いていきます。
先述した公式ファイルからライブラリーをDLします。その中にサンプルアプリのファイルがあるので、それです。
ダウンロードはサイトの右側にあるここから。




使い方を学ぶ際、こちらなどを参考にさせていただきました。
http://qiita.com/shu223/items/eda02dc7d334c339ff64
http://www.politepix.com/openears/tutorial/


サンプルアプリの仕組み

1.機能


これがサンプルアプリの画面です。
Status:Pocketsphinx is now listening.となっている状態で
GO, TURN, LEFT, RIGHT, FORWARD, BACKWARD, CHANGE, MODEL
のいずれかの単語を発話すると、マイクで聞き取って合成音声が喋ってくれます。

CHANGE MODELと言うと辞書が切り替わって
MONDAY, TUESDAY, ..., SUNDAY
の曜日の単語を認識するようになります。

もう一度CHANGE MODELと言うと元のGOとかの辞書に戻る。

あとは
Input level = 聞き取り度
Output level = 合成音声の音量
Stop Listening = 聞き取り終了
Suspend Recognition = 認識を一時停止

2.FrameworkファイルとVocablaryFiles

プロジェクトファイルを開くとFrameworkとVocablaryFilesというフォルが入っています。
















Frameworkは文字通りOpenEarsを使う時に必要なフレームワークです。

問題はVocablaryFilesの方で、事前に登録してある単語の辞書だと思われます。
イマイチ中に入っているファイルの内容はわかりませんが、おそらく辞書です。
写経してる時、このファイルを追加するのを見落として時間がかかりました。要注意。

3.クラス紹介

OpenEarsを使うのに必要なクラスは3つ。
FliteControllerクラスとSltクラスとPocketsphinxControllerクラスの3つ。

・FliteControllerクラス
合成音声を受け持つクラス。
- (void) say:(NSString *)statement withVoice:(FliteVoice *)voiceToUse;
メソッドで音声を再生させたり、プロパティで音声の高低や再生速度を変えたり出来ます。

・Sltクラス
合成音声そのもののクラス。

・PocketsphinxController
音声認識を受け持つクラス。



4.ざっくりした解説

最初に単語の辞書を登録する必要があります。






認識させたい単語を入れてやればOKです。


あとは基本的にデリゲートをセットして
- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID;
メソッドの中に単語が発話された時の処理を書くっていうので使えます。

















サンプルコードだと↑の部分。
hypothesisというのは認識された単語を持つ変数。

if([hypothesis isEqualToString:@"HOGE"])
{
処理
}
ってやれば認識した単語に応じた処理をさせてやることができます。



ざっくりと一通りコード読んで大体使えるようになったけど、まだ理解が足りてないので中途半端です。
サンプルで大体必要な機能が載ってるので、それを元に書いたり読んだりしていけば良いと思います。

2013年2月23日土曜日

h_Mission1

現在プログラマーのHさんにiOS開発を教えていただいていまして、課題をだしていただいています。
その課題の復習も兼ねてブログにまとめようと、と、と


課題1:UITableViewで1〜100までをリスト表示する画面を作ってください。ただし、素数の場合は文字色を赤とすること。通常は黒。



プロジェクト名:h_Mission1



StoryBoardにはTableViewを貼っただけ。































ViewController.h



説明
コメントの通り。


ViewController.m


説明
viewDidLoad内では1〜100の数字の配列を用意する。
ViewController.hで宣言したarrayのcapacityを100用意する。100個数字入れるから。
for文で100回数字を足す式をループさせる。

[array addObject:[NSNumber numberWithInteger:i]];

ではint iで用意した数字をarrayに入れる。
intはプリミティブ型という単純な数字しか扱えないもので、NSArrayはオブジェクト型しか扱えないのでint iをオブジェクト型のNSNumberに変換してから入れてやる。



TableViewに表示できる行の数は端末の画面の関係上限られてくる。
なので計算して用意した値には待機していてもらわなきゃいけない。
そこで用意するのがこれ。

cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

これは画面をスクロールしていった時に画面にデータを表示してくれる一文。
キュー=先に入力したデータが先に出力されるという特徴をもつ、データ構造体の一種。
とのこと。


コメントアウトしてある文に

cell.textLabel.text = [array objectAtIndex:indexPath.row];

があるけれど、これだとうまくarrayが入力されない。
というのも、textで出力するには数字では駄目で、Stringにしてやらないといけないから。

cell.textLabel.text = [NSString stringWithFormat:@"%d", ((NSNumber*)[array objectAtIndex:indexPath.row]).integerValue];

だとうまくいく。
[NSString stringWithFormat: でNSNumberをNSString型に変換して入力する。
ポインタとは、他の変数やメモリ領域のアドレスを示す変数のことで、間接的にデータにアクセスするもの。
integerValueは整数値を返り値にしているということ。

cell.textLabel.textColor = [UIColor redColor];
これは色を赤色に変えているだけ。



結果






























うまくいきましたー。
でも素数がまだできていません。
次の木曜までに素数の部分は仕上げます。



始めたばかりで説明の仕方とか、プログラミングの用語の使い方とか、つたないところが多々ありますが、ツッコミいただければありがたいです!