ロボホンアプリを開発する機会がありました
ドキュメントを読んでみたり実際に作ってみたりしてさぐりさぐりロボホンを知ろうとしています
以前に簡単にロボホンを喋らせるアプリを作ってみたりしていました
これらを踏まえてロボホンのアプリを作る上で重要だと思うところをメモしておきます
注意
このメモはロボホンを100%使うためのメモではありません
喋らせたり簡単な手振りをするところまでであり、また簡単なアプリを作ってみて躓いた箇所等をメモ程度でまとめたものです
プロジェクタでの投影や、こってこてに踊らせたい場合はドキュメントを読んでください
重ねて、個人的な解釈が含まれているので正式なドキュメントと差異がある場合があります
ロボホンとは
ロボホンとは、SHARPから発売されている人型のロボットです
OSにはAndroid5.0を搭載しているため、Android環境で開発が可能です
基本的な機能として、カメラや9軸(加速度・角速度・地軸)センサ、照度センサがついている他、プロジェクタによる投影、顔認識も可能です
3G・LTE版(SR-01M-W)とWifi版(SR-02M-W)があり、3G・LTE版だとsimを挿入することで通話やsmsをすることができます
上記の他にもロボホンは、自由に踊らせることや柔軟に体制を変えることができる点がアドバンテージだと思います
各関節部分にサーボモータが搭載しており、これによって立ち上がるモーションや踊るモーションといったあらゆる動きが可能となっています
ロボホンの機能を使うにはココロプランというものに加入しなければなりません
現時点(2018/10/14)では、月1,058円プランと月2,678円プランがあります
結構高いです
しかし、これに登録しないとロボホンアプリを開発するためのドキュメントやSDKを入手することができません
喋らせる上で注意
ロボホンにはSHARPが定めた人格・性格があります
開発者はこの人格・性格に沿って言葉や言い回しを考えて喋らせなければなりません
ロボホンは5歳くらいの男の子という設定です
5歳くらいというとボキャブラリーは多くはありません
「わかったー」とか「たのしいねー」とか「これはなぁに」とか子供っぽい言葉を選んで喋らせるフレーズを作ります
もちろん、汚い言葉はNGであり、ネガティブな発言も基本的にはしません
また、ロボホンは強く断定(好き嫌いをはっきりしない)を基本しません
「この花すごくきれいだね」ではなく「この花はきれいだね」といったそれとなく話します
※このルールを厳格に守るとロボホンが喋れなくなるためケースバイケースで喋らせます
さらに嘘をつくことも基本NGです
基本というのは例えばゲームアプリを作成した場合、ルール上仕方なくといった特例は嘘つくことは許容されています
ロボホン自身ができないこと(ex:水泳していい?)や、確実ではないもの(ex:天気予報)に対しては、言わせないまたは、ぼやかせて言う必要があります
ロボホンの性格についてはSHARPが細かく定めているのでドキュメントに目を通したほうが良いです
動けなくなる条件
ダンスや身振り手振りで喋れる一方で動けなくなる条件があります
複数ありますが、個人的に重要なところを抜粋(詳細はドキュメント参照)
- ロボホンとPC等がUSBケーブルにて接続されている状態
- 電池残量が残り少ない状態
電池残量が残り僅かになると動作を停止し、おしゃべりオンリーになります
アプリケーション開発
SDK
現時点(2018/10/14)においては全部で8個のSDKが提供されています
- アクションのライブラリ
- jp.co.sharp.android.rb.action.framework.jar
- 電話帳のライブラリ
- jp.co.sharp.android.rb.addressbook.framework.jar
- カメラのライブラリ
- jp.co.sharp.android.rb.cameralibrary.jar
- メッセージのライブラリ
- jp.co.sharp.android.rb.messaging.framework.jar
- プロジェクタのライブラリ
- jp.co.sharp.android.rb.projector.framework.jar
- ダンスのライブラリ
- jp.co.sharp.android.rb.rbdance.framework.jar
- 歌を歌うライブラリ
- jp.co.sharp.android.rb.song.framework.jar
- おしゃべり(音声UI)のライブラリ
- jp.co.sharp.android.voiceui.framework.jar
とりあえずロボホンをおしゃべりさせて簡単な身振り手振りさせたかったらおしゃべりのライブラリ(jp.co.sharp.android.voiceui.framework.jar)のみインポートすればおkです
簡単な身振り手振りというものは、ロボホンには文章に合わせて自動でモーションを追加することができます(詳細はHVMLにて説明)
「とりあえずおしゃべりさせながらロボホンを動かしたい」でしたら自動モーションで簡単につけることができます
アクションを作り込むのであれば、アクションのライブラリが必要かもしれません
ファイル構成
ロボホンのサンプルを開くとMainActivity.javaの他に様々なファイルが生成されています
MainActivity.java以外で編集するものはcustomizeに入っているScenarioDefinitions.javaです
ScenarioDefinitions.javaではHVML(ロボホン独自のマークアップ言語)の呼び出すための登録のようなものをしています
HVML
HVMLはロボホンを喋らせるたりモーションを付けるためのマークアップ言語です
HVMLに喋らせたい文章とそれに合わせた振り付けを記述します
オリジナルのhvmlファイルはassets/otherディレクトリにいれます
また、assets/homeもありますが、ここにはテンプレートが入っています
hvmlファイルを入れる注意として、Androidパッケージ名+ユニークな文字列.hvmlにする必要があります
Androidパッケージ名の入れ方も特殊でピリオド「.」をアンダーバー「_」に変換して記述します
EX)
パッケージ名:com.example.kananote.mysamplerobohonvoice
ユニークな文字列:myhvml
↓変換
com_example_kananote_mysamplerobohonvoice_myhvml.hvml
ファイル構成は以下のようになります
-- app
L assets
L hvml
L other
L com_example_kananote_mysamplerobohonvoice_myhvml.hvml
HVMLの書き方
HVMLの書き方はロボホンを簡単に喋らせるサンプルプログラムを例にして記述します
上記のプログラムはすでにブログにて投稿しているので参考にしてください

ロボホンを簡単に喋らせるサンプルプログラムのHVMLは下記のようになっており、これを使いまわしています
<?xml version="1.0" ?>
<hvml version="2.0">
<head>
<producer>com.example.kananote.mysamplerobohonvoice</producer>
<!-- TODO このシナリオの説明文を入力してください(プログラムに影響はありません) -->
<description>ロボホンがお話するhvml</description>
<!--sence_commonで登録-->
<scene value="com.example.kananote.mysamplerobohonvoice.scene_common"/>
<version value="1.0"/>
<accost priority="75" topic_id="t1" word="com.example.kananote.mysamplerobohonvoice.myhvml.accost"/>
</head>
<body>
<topic id="t1" listen="false">
<action index="1">
<!--メモリに登録-->
<speech>${memory_p:com.example.kananote.mysamplerobohonvoice.speech}</speech>
<behavior id="assign" type="general"/>
<control function="myhvml" target="com.example.kananote.mysamplerobohonvoice"/>
</action>
</topic>
</body>
</hvml>
タグの解説
- description
- hvmlの概要.
- producer
- Androidパッケージ名.
- scene
- “Androidパッケージ名 + .scene_common”で登録. アプリを起動時にhvmlを読み込ませるためにこのように書く(アプリ共通シーンとしてhvmlを追加).
- accost
- priority
- hvmlの優先順位 デフォルトは”75”.
- topic_id
- hvmlを実行したときに最初に実行されるべきtopicタグにあるidを記述.
- word
- hvmlの名称(accostの名称). オリジナルの名称にする. “Androidパッケージ名” + “お好きな文字列”で登録(お好きな文字列はhvmlの名前でいいと思う).
- priority
- speech
-
ロボホンを喋らせるワードを記入します.
(EX)<speech>こんにちは</speech>
-
${memory_p:value}とするとspeechのところを変数化することができます. valueには”Androidパッケージ名” + “変数名”にて記述.
-
- behavior
- ロボホンのモーションの登録. 専用のモーションIDを登録もできるが、言葉に合わせて自動でモーションを付けることができます. 自動モーションにはAとBがあります. サンプルではモーションBであり、汎用的なモーションが自動で付け加えられます. モーションAでは一回で喋らせる文字数が30文字範囲内であると特定のフレーズに対して自動でモーションが付け加えられます.
- control
- function
- hvmlファイル名のAndroidパッケージ名の後半にあるユニークな文字列.
- target
- Androidパッケージ名.
- function
プログラム
HVMLのくくりつけ
新規に作成したHVMLはScenarioDefinitions.javaに以下のように記述します
※例として上記のHVML(com_example_kananote_mysamplerobohonvoice_myhvml.hvml)としています
/**
* Package名.
*/
protected static final String PACKAGE = "com.example.kananote.mysamplerobohonvoice";
/**
* memory_pを指定するタグ
*/
public static final String TAG_MEMORY_PERMANENT = "memory_p:";
//ADD
public static final String ACC_ACCOST = ScenarioDefinitions.PACKAGE + ".myhvml.accost";
public static final String MY_SPEECH = ScenarioDefinitions.TAG_MEMORY_PERMANENT + ScenarioDefinitions.PACKAGE + ".speech";
ACC_ACCOSTには、“com.example.kananote.mysamplerobohonvoice.myhvml.accost”が入っており、つまりhvmlのaccostタグにあるwordにあたります
ACC_ACCOSTにてhvmlの呼び出すための登録(くくりつけ)をしています
MY_SPEECHはは、“memory_p:com.example.kananote.mysamplerobohonvoice.myhvml.speech”が入っており、つまりhvmlのspeechtタグにあたります
MY_SPEECHがロボホンが喋らせるフレーズの変数となっています
ロボホンをおしゃべりさせる
HVMLとHVMLを呼び出すための準備をしました
やっとロボホンをおしゃべりさせてみます
ロボホンをおしゃべりさせるには下記のように記述をします
//喋らせたい文章
String talk = "こんにちは,僕ロボホンだよ";
int ret = VoiceUIManager.VOICEUI_ERROR;
//speechタグにて喋らせる文章を登録
ret = VoiceUIVariableUtil.setVariableData(mVoiceUIManager, ScenarioDefinitions.MY_SPEECH, talk);
//エラーであった場合
if(ret == VoiceUIManager.VOICEUI_ERROR){
Log.d(TAG, "setVariableData:VARIABLE_REGISTER_FAILED");
}
//発話
VoiceUIVariableListHelper helper = new VoiceUIVariableListHelper().addAccost(ScenarioDefinitions.ACC_ACCOST);
VoiceUIManagerUtil.updateAppInfo(mVoiceUIManager, helper.getVariableList(), true);
VoiceUIVariableUtil.setVariableDataにて、hvmlのspeechタグに発話させたい文章を登録しています
VoiceUIVariableListHelper().addAccostにて、hvmlを呼び出し発話をさせています
Tipsとしてロボホンの発話を途中で止めるには以下のプログラムを記述すると止まります
VoiceUIManager.stopSpeech();
ロボホンの概要からしゃべらせるまでの一通りを個人的な解釈でまとめてみました
はじめてロボホンを作るときはかなーり悩みました
HVMLとはなんぞやから始まり、勝手に生成されているjavaファイルが行っている処理とは一体・・・などの困難がありました
実際に作ってみてなんとなーく理解はしましたが、振り返ると「構成がシャープだなぁ」という印象です
プロジェクタや顔認識もできますが、私としてはロボホンが喋って身振り手振りできれば十分という考えです
ロボホンを100%使うのであればドキュメントを読むことを推奨します
記事内にもでてきていますが、簡単にロボホンを喋らせるプログラムを作ってみたので試してみてください