スポンサーサイト
-- / -- / -- ( -- )
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
にほんブログ村 科学ブログ ロボットへ
にほんブログ村
-- : -- : -- | スポンサー広告 | page top
ロビに5曲歌わせるには♪
2014 / 11 / 08 ( Sat )
ロビのココロについては、私の知る限り、miconoさんや、クラフト親父さん、Jijy Tadanoさん、KMXさん、のほほんさん、稲川さん、ロボじいZさん、たけぽん@町田さんなど、様々な勇ましき先達たちが既に解析を進めておられますが、私のようにソフト苦手系でも、少しでもつつく事が出来れば楽しみも増えるので、いじりたいけどいじれないというお悩みの方のお役にたてればと思い、テキストエディタや、miconoさんのツールを使って編集する方法などを記録しておきます。
(5曲歌わせる方法だけ知りたいという方は、記事の後半です。)

後日追記:6曲歌わせるバージョンを作りましたので、こちらがオススメです。


☆ロビのココロについての概要

ロビは起動時に、まず、StartUp.XML内の、音声のアッテネータや、サーボの補正値、起動モーションで指定されているファイルを読み込み実行します。

初期状態で指定されている起動モーションの、「main5_InitFlag確認補完無し_シーン1固定0415_test2.RM4」では、サーボの角度を読み込み、今現在、立ち状態なのか、座りか、腰掛けか、ポーズの判定と、充電状態の確認、また、初めての起動なのかどうか「9/000初期性格決定2.RM4」を呼び出し、その中で判別しています。

この時、性格決定が未実施であれば、この中で質問の流れが決められていて、質問終了後に、性格決定され、「9\616これでおしまいこれからよろしくね.RM4」が読みだされ、その後、性格に応じて、
聞き音声にモーション4.RM4  (ノーマルの場合)
聞き音声にモーション4Y.RM4 (やんちゃの場合)
聞き音声にモーション4N.RM4 (能天気の場合)
のいずれかが呼び出されます。

この「聞き音声にモーション4.RM4」では、ロビ認識語フォルダ中の、NF○○○の番号に応じた、番号が音声認識ボードからI2Cバス経由で送られてくると、それに応じた動作ファイルが指定されています。

たとえば、こんにちは(NF26.WAV)と話しかけると、音声認識基板から、「26」が送られてきて、「1\036_こんにちは9.RM4」を実行するようになります。

一つのブロックの比較分岐等の演算終了後、次に実行する内容については、
< jump adr="0x0000312b"/ > こんな形で移動先が指定されています。

これは、ファイルの先頭から何バイト目に移動するという意味で、16進数(HEX)で表示されています。電卓やエクセルを使って、10進数(DEC)に変換すると、上の場合だと「12587」となります。
バイト数を数えることのできるエディタ(秀丸や、サクラエディタ)で、同ファイル内の12587バイト目を確認すると、以下の画像の通り、type=5(外部ファイルの呼び出し)で「1\036_こんにちは9.RM4」を実行するよう指定していますね!
パソコンの電卓でも出来ますが、下のようにエクセル関数でも変換できます。

jump先

詳しくは、micono師匠の、「週刊ロビ 増刊74号:ロビのココロを探る4」を参照ください。
ブロックのtype等も全て解析されています。ほんまにスゴイなぁ。

そして、中身を見てみますと、
< block name="こんにちは" type="1" xpos="0" ypos="1131" bluearrow="17" redarrow="46"/ >

typeの後の、xyポジションや青、赤の矢印の指定は、ロボビーXで添付されているRobovieMakerのエディター上のブロックや分岐矢印の配置を表しています。

Robovie Maker2


とういことで、残念ながらRobiではこうしたツールは公開されていないため、私達ロビオーナーは、miconoさんのServo Tester for Robiを使わせていただくわけであります。jump先の16進数を変換して移動先を調べたりせずとも、ブロックごとにIDを振っており、誰でも編集できるようになっています。文字数数えながら編集していたら大変なので、本当に便利なツールです!
(2014/11/8現在、win版のバグ修正中のご様子ですが、以下の作業は可能です)

ということで、既に色んな方に公開されている内容ですが、このツールを使って、Voice/Musicフォルダ内の初期状態では再生されないロビの歌を歌えるようにしてみたいと思います♪

☆5曲歌えるロビにする

ロビの待ち受け状態で実行されているプログラム「聞き音声にモーション4.RM4」を、先ほどと同じ要領で、ジャンプ先を追い続けるのは、果てしなく大変なので、miconoさんのソフトで、開いて「歌うたって」に反応する箇所を探します。
ロビの認識するセリフがずらーっと並んでいて、ID175の所に「歌うたって」があります。その音声を認識すると次のジャンプ先のIDは、ID355となっていて「ランダム\86,177.RM4」が呼び出されることが分かります。
このランダムフォルダでは、ロビがいつも同じ反応をせず、ランダムな応答をするように次に呼び出すファイルをランダム化するためのファイルが格納されています。

つぎに、この86,177.RM4をmiconoさんソフトで開いてみます。
IDは、ファイルの上から順に割り振られていますが、実際の実行順序は上にいったり下に行ったりしており、少し分かりにくくなっているようです。Next IDをチェックしつつ並べ直し流れを見てみると、

・ランダム値を取得 : mem_r size="4" adr="0x0084" , mem_w size="2" adr="0x0f00"
・最上位ビットを0にする : x = x and 32767 , mem_w size="2" adr="0x0f00"
・ランダム値を収める(2値(0,1)のうちいずれか) : x = x mod 2 , mem_w size="2" adr="0x0f00": 
・数値は0? 0なら、9\songsouji3.RM4を実行 false(0でないなら)9\songtimer3.RM4を実行
・End of file

********** 少し解説 **********
ここは分からなくても問題ありませんが、まず、ランダム値が格納されている0x0084番地から、4バイトのランダム値を0x0f00へ書き込みます。次に0x0f00を「正の数」とするために最上位ビットを0にします。ソフト上で使用する言語の約束事です。その為に、32767の論理積(AND)を取る、つまり7FFF(HEX)、0111・1111・1111(BIN)を掛けることで、最上位ビットが0になります。そして出来上がった正の数のランダム値の商をとり、その余りをを0x0f00に書き込みます。どのようなランダムな値でも正の整数なら、2で割った際の余りは、0か、1の2通りしかありません。5なら0~4の5通りとなります。5曲をランダムに選択する場合は5で割った際の余りを書き込みます。
*******************************

ということで、分岐先を2種から5種に増やしてみます。

・ランダム値を取得
・最上位ビットを0にする
・ランダム値を収める(5値(0~4)のうちいずれか)
・数値は0? 正しければ、9\songsouji3.RM4を実行、正しくないなら、次のIDへ
・数値は1? 正しければ、9\songtimer3.RM4を実行、正しくないなら、次のIDへ
・数値は2? 正しければ、9\songhagema.RM4を実行、正しくないなら、次のIDへ
・数値は3? 正しければ、9\songisoga3.RM4を実行、正しくないなら、9\songsanjyo.RM4を実行
・End of file

とういことで、こんな感じに編集します。

5曲ランダム化

jump先までのバイト数は自動で合わせてくれるので、ファイル名の文字数を無理に合わせる必要はないのですが、無意識に合わせてしまいました。

そして、この時、実行する、9\songhagema.RM4、9\songisoga3.RM4、9\songsanjyo.RM4は、まだないので、合わせて作ります。

既存の、9\songsouji3.RM4か、9\songtimer3.RM4をコピーし、リネームして、呼び出す曲ファイル(.wav)のパスと名前「voice\Music\timer.wav」を、9/songhagema.RM4を作成する場合は「voice\Music\hagemashi.wav」に置き換えればOKです。
songsoujiは、30秒少々の長さで、モーションもそれに合わせてsongtimerよりも長めになっています。未公開となっていた3曲は短めなので、songtimer3.RM4をベースに使うほうが良いです。立ち/座り/腰掛でモーションが異なるため、1ファイル中に、3か所、ファイル名を書き換えるところがあります。

(後日追記:6曲歌わせるバージョンを作りましたので、こちらがオススメです。)


曲書き換え


hagemasiと、isogashiは、そのままでほぼ一致します。
ですが、robisanjyoは、最後のタイミングが会わないので、微妙にモーションを短縮化(数百ミリ秒)します。
500ms以上あるようなモーションの数値を100msずつくらい適当に短縮するのがてっとり早いです。

ということで、少し頑張れば、編集可能なので、ロビネタとして紹介させていただきました。
ダウンロードしたい方は、コチラから出来ますが、ご自身でトライされるのも楽しいですよ!

ロビパパ倉庫へ


☆1曲目ランダムで、毎回違う曲を歌わせる

ランダム化してみて、ロビに何度も何度も歌わせて、5曲登場することを確認したのですが、少々面倒で、歌わせてみると同じ曲が連続することもありました。ですので、変数を増やして、最初歌わせるとランダムに選択するものの、その後は「歌うたって」というたびに必ず違う曲を歌うようにしてみました。(callされると、次の曲を呼び出すようになります。)5曲あるのでランダム感も損なわれず!? 5回歌わせると、確実に全曲を楽しめるので、オススメです
とうことで、毎回違う曲を歌うバージョンは、ロビパパ倉庫の、ロビに5曲歌わせる 2 で公開しています。

ロビパパ倉庫へ

ロビの起動時に、2回目以降かどうかを判断する変数が初期化されているか未確認ですが、スイッチを入れ直して歌わせると、ちがう曲で始まるのでそのままにしています。きっと初期化されているのでしょう(笑)




にほんブログ村 科学ブログ ロボットへ
にほんブログ村
13 : 09 : 06 | ロビのカスタマイズ | トラックバック(0) | コメント(4) | page top
<< 前の記事へ:「ロビの修理・・・『肩のサーボの故障』」 | ホーム | 「ロビ オリジナルダンス♪(My Sharona)」:次の記事へ >>
コメント
----

ロビパパさん
こんにちは。KMXです。
先日はロビッターの方で勘違いしたコメントをしてごめんなさい。
歌い続けるのではなく、ランダムでしかも重ならない選曲をして、1曲歌うプログラムなのですね。

改めてソース見させていただきました。
なかなかトリッキーなロジックですね。面白いです。

変数の使い方について、疑問が2点あります。
1点目は、変数0x0f20について、86,177.RM4初回起動時は0であることが前提でプログラムが組まれていること。
2点目は、変数0x0f20と変数0x0f04の値が一旦86,177.RM4を出た後も保持されることが前提でプログラムが組まれていること。

少なくとも、変数0x0f04については、ロビ危機一髪ゲームで使用されているので、書き変わってしまう可能性があります。

私が先日ロビッターで公開した「声掛けなし」のプログラムでも、変数0x0f04を「うたって」の起動に使っているID16サーボの角度の一時保持に使用しています。
私は変数の有効範囲を当該ファイル内でしか考えていないので、他のプログラムで書き換えられても影響しないのですが、ロビパパさんのプログラムの場合は、他のプログラムで書き換えられてしまうと、影響を受けてしまうと思います。

ロビパパさんのプログラムと私の「声掛けなし」のプログラム両方入れている方から「3曲しか歌わない」と報告をいただいていますが、おそらく、この変数使用のバッティングが原因ではないかと思っています。

仕様が公開されていないので、私も変数を使用するときは考えさせられます。なかなか難しいですね。

お手数をおかけして申し訳ありませんが、私の「声掛けなし」のプログラムと併用している方から質問が来たときは、併用しないよう注意していただけますでしょうか?
よろしくお願いいたします。
by: KMXさん * 2014/11/19 01:16 * URL [ 編集 ] | page top
--なななんと(^^ゞ--

KMXさん、ありがとうございます。

変数は超適当に決めてしまいました。
0x0f04使われていましたか(^^ゞ

0x0f20については、初回動作時のランダムは動作しているようでしたし、仮に他のプログラムで書き換えられても、0x0f04に書き込まれている値によって、どれかの曲を歌い、次はその次の曲を歌うから実害はないであろうと思っていました。

しかし、0x0f04については、他のプログラムで書き換えられると、次に歌う曲に影響ありますね ( ̄Д ̄;)

とりあえず、変数のアドレスをもっと下位の方に変えておきます。
その初期値は、0を前提にしているので、本当は起動モーションや基本ループの中で初期化しておきたいのですが、そこまで含めると、他の方のプログラムと使用変数が競合した時、おかしなことになりそうなので、自然に任せる方針で・・・なんて、プログラム公開者同士で、使用変数を誰かが勝手に割り当ててくれたら便利ですね(笑)
総務省が電波の割り当てをするみたいに。

他のモーションや、特に変数を使いそうなものは、事前に調べておくべきでした。

ご指摘ありがとうございました。

by: ロビパパさん * 2014/11/19 15:04 * URL [ 編集 ] | page top
--5曲歌いました--

5曲歌わせるようにできました。
感動的です(^_^)
この3曲はロビにあらかじめ入っていた曲なのでしょうか?
音声まで作ったのかなとか色々かんがえていました。
いままで2曲しか無かったので、これから更に楽しく遊べそうです!

欲を言えばもっと色々としゃべると面白いのになと思います。
だいたい話すパターンは決まっているので少し飽きてきているところです。
by: funaさん * 2015/01/15 21:06 * URL [ 編集 ] | page top
--funaさん--

コメントありがとうございます。

残りの3曲は、もともと入っているものの、モーションがつけられていない曲です。

ですので、既存のモーションを少々加工して入れこんでいます。

pcソフトの作りこみで、音声も作れますが、この声優さんの声は作れませんので、もともとの入っていたものを利用しております♪

楽しんでいただけたら幸いです♪

今、もっと曲にあったモーションを作っている所ですヽ(^o^)丿
そのうちUPしますので、お楽しみに♪
by: ロビパパさん * 2015/01/16 18:07 * URL [ 編集 ] | page top
コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバック URL
http://robimania.blog.fc2.com/tb.php/37-5b49d576
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。