ごえもん・シナモンのピグマリオン計画
プログラムB セリフファイル組み込み

2002年1月12日
ERS-210は111と違って人まねしゃべりをしたり、自分の名前やオーナーの名前をMID再生を使ってしゃべる機能があります。カタコトでしゃべってる様でほほえましくはあるのだけど、まだR-CODEでしゃべらせる事ができません。とりあえず、ERS-111のようにWAVEファイル再生でセリフをしゃべらせてみます。210ではアイボペットさんのEditor23が良好に動作するので口パクモーションを加えてよりそれらしく。
1.セリフファイルを作る。  
ここはERS-111とまったく同じ。
アイボが再生できるWAVEファイルはサンプリング周波数:8kHz データ:8ビット チャンネル:1チャンネルのPCM音源です。

再生するファイルを作ったらこの形式に変換します。変換にはWindows付属の「サウンドレコーダー」も使えますが、使い勝手のいいフリーソフトもあるので適当に良いものを使う。普通に録音した音声を使うとレベルが低くなってしまうので音声ファイルを加工し、レベルを上げておくと良い。今回使用したセリフファイルは録音時レベルの400%に修正しています。

2.ODAファイルを作成する。  
ERS-210は組み込みモーションが暗号化されています。マスタースタジオで作ったアクションは外部アクションファイルとして別ファイルを作るようです。アイボペットさんの「AEditor23」にはWAVEファイルに合わせた口パクファイルやLEDファイルを生成する機能があるのでこれを使います。ODAファイルの作成には「DUMPODA」と「MAKEODA」が使えます。ただし、AEditor23はマスタースタジオで作る「全身モーション」を編集するためのツールなので口パクだけの「口パクモーション」やオリジナルモーションファイルの編集には使えません。また、新規モーションファイルを作ることもできません。既存モーションのキーフレーム数を増やすことも出来ないので長いセリフファイル用の口パクモーションを作ることができません。そこでPerlで@「全身モーション→口パクモーション変換プログラム」A「キーフレームとフレーム間隔を指定して空モーションファイル作成できるプログラム」を作りました。それらを使っての外部モーションファイルを作ります。
  1. 空のモーションファイルを作成する。
    AEditor23で編集できるのはマスタースタジオで生成した全身モーションファイルのみなので、これ相当のモーションファイルを用意する。AEditor23上ではキーフレームの削除しかできないので、セリフの長さに合わせた長さの(長めの)モーションファイルが必要となる。以降の管理を容易にするためにセリフファイル・モーションファイルの命名ルールを決めておく。
    セリフ こんにちは
    WAVファイル cin_konnitiwa.wav
    モーションファイル m_any#any_cin_konnitiwa.mtn
    モーションファイルの命名ルールはAIBO側の制限があるので詳細はページ後半の資料を参照。
    表中のモーションファイル名は口モーションファイル名になっているが、この段階では全身モーションファイルを作る。

    > perl makemtn.pl -f15 -w4 -ncin_konnitiwa

    上記コマンドで「a_any#any_cin_konnitiwa.mtn」が生成される。
  2. セリフファイルとモーションファイルの名前を合わせる。
    1.に従い、セリフファイルとモーションファイルを用意したが、AEditor23で、サウンドファイルとモーションファイルを同期して扱うにはファイル名(拡張子を除く)を合わせる必要がある。ここでは、1.の命名ルールはどうでもいいので、「editor.*」にする。二つのファイルを同じディレクトリに入れ、

    > ren cin_konnitiwa.wav editor.wav
    > ren a_any#any_cin_konnitiwa.mtn


    とする。
  3. モーションファイルを編集する。
    AEditor23を立ち上げ、editor.mtnを呼び出す。「Generate Mouth」を使うと簡単に口パクモーションを作ってくれる。範囲を選び、「Generate Mouth」を選択する。納得行く口パクが出来たらSAVEする。セリフに比べてモーションが長い時は、「Trim End」を使って長さを調整する。短くはできるが、長くは出来ないので注意。
    また、「Motion Posname」で、モーション名の先頭文字「a」を「m」に変更する。次の作業でここを読み取って変換をかけるので注意。

  4. モーションファイルを口モーションファイルに変換する。
    すべての口パクファイルを編集したら、出来たモーションファイルを口モーションファイルに変換する。

    > perl mtnconv.pl editor.mtn

    これで、editor.mtnから最終的なモーション名を読み取り、モーション名に合わせたモーター定義・モーター情報に変換したモーションファイルを生成する。ファイル名はモーションファイル名と同じ名前になる。ここでは「m_any#any_cin_konnitiwa.mtn」が生成させる。
  5. 口モーションファイルをODAファイルに変換する。
    こうして出来た口パクモーションファイルをまとめて外部モーションファイルにする。モーションファイルはあらかじめまとめて、「motion」フォルダに格納しておく。外部モーションファイルは圧縮されているので変換後に圧縮もかける。

    > makeoda motion motion.oda
    > gzip_aibo -6 motion.oda
    > ren motion.oda.gz motion.oda

  6. セリフファイルをODAファイルに変換する。
    同様にしてセリフファイルも外部モーションファイルに変換する。セリフファイルは「audio」フォルダに格納しておく。

    > makeoda audio audio.oda
    > gzip -6 audio.oda
    > ren audio.oda.gz audio.oda

  7. 追加アクションを登録する。
    口パク付きセリフファイルをR-CODEで再生するにはMWCIDを登録しなければならない。これにはr-codeさんの「DumpMWC」と「MakeMWC」を使う。

    > dumpmwc ers-210.mwc

    生成した「ERS-210.csv」に追加するアクションを記述する。CMAIDにルールがあり、種類・部位を表している。詳細は後述する資料による。追加する記述例をあげる。
    MWCID MCAID _ _ _ _ _ モーション名
    40026 0x00002010 1 0x00000000 0x00000000 0 0 cin_konnitiwa
    40026 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_konnitiwa

    すべての記述を追加したら、ERS-210.MWCに書き戻す。

    > makemwc ers-210.csv
3.ODAファイルMSに格納する  
出来たファイルをメモリースティックに書き込む。
それぞれのファイルのMS上でのフルパスを示す。
  • MS/OPEN-R/MW/CONF/ERS-210.MWC
  • MS/OPEN-R/MW/DATA/P/MOTION.ODA
  • MS/OPEN-R/MW/DATA/P/AUDIO.ODA
あとはR-CODE上でMWCIDを呼び出してPLAYすれば口パクします。
プログラム  
  • 空モーションファイル生成:makemtn.pl
    空の全身モーションファイルを生成します。モーションデータはすべてゼロ。モーションファイル名・キーフレーム数・フレーム間隔を指定できます。生成したモーションファイルはアイボペットさんのAEditor23で編集可能です。
  • 全身モーション→口モーション変換:mtnconv.pl
    モーションファイルをモーション名に合わせて変換します。変換するモーション部位はモーション名によって決定します。不要なモーションデータはすべて捨てます。
  • 口パク編集環境作成:makeeditenv.pl
    soundフォルダーにあるWAVファイルを調べ、口パクモーション編集環境を作ります。
    WAVファイル名のフォルダーを生成し、そこにWAVファイルのファイル名を「editor.wav」に変更してコピーします。makemtn.plを呼び出し、「editor.mtn」を生成して格納します。
  • 口パクモーションファイル収集:correctmtn.pl
    makeeditenvで生成した作業用フォルダーを調べ、フォルダー内にある「editor.mtn」を口モーションに変換します。生成したモーションファイルをmotionフォルダーに格納します。
資料
CMAID
LED
0x00003000 額のLED  
0x00003030 目のLED  
0x00003050 尻尾のLED  
モーション
0x00001010 全身の動き パフォーマンス系
0x00001020 口の動き
0x00001030 首の動き
0x00001040 足の動き
0x00001050 尻尾の動き
0x00001060 耳の動き
0x00001100 コマンド実行・
0x00001120 口の動き 自律行動系
0x00001130 首の動き
0x00001140 足の動き
サウンド
0x00002010 サウンド  
モーションファイル名命名ルール
モーション部位   開始姿勢 終了姿勢   名称
a (all) _
(under bar)
any # any _
(under bar)
free
e (ear) stand stand
h (head) sit sit
l (legs) lift lift
t (tail) sleep sleep
n (null) station station
walk walk
ex:e_stand#stand_abc→立っている時の耳のモーション
追加したセリフ一覧
MWCID CMAID _ _ _ _ _ motion name セリフ
40000 0x00002010 1 0x00000000 0x00000000 1 0 cin_1ban いちばん
40000 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_1ban  
40001 0x00002010 1 0x00000000 0x00000000 1 0 cin_2ban にばん
40001 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_2ban  
40002 0x00002010 1 0x00000000 0x00000000 1 0 cin_3ban さんばん
40002 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_3ban  
40003 0x00002010 1 0x00000000 0x00000000 1 0 cin_4ban よんばん
40003 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_4ban  
40004 0x00002010 1 0x00000000 0x00000000 1 0 cin_5ban ごばん
40004 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_5ban  
40005 0x00002010 1 0x00000000 0x00000000 1 0 cin_are あれ?
40005 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_are  
40006 0x00002010 1 0x00000000 0x00000000 1 0 cin_asonde 遊んで
40006 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_asonde  
40007 0x00002010 1 0x00000000 0x00000000 1 0 cin_atti あっち
40007 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_atti  
40008 0x00002010 1 0x00000000 0x00000000 1 0 cin_ball ボール
40008 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_ball  
40009 0x00002010 1 0x00000000 0x00000000 1 0 cin_blue
40009 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_blue  
40010 0x00002010 1 0x00000000 0x00000000 1 0 cin_cinnamon シナモン
40010 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_cinnamon  
40011 0x00002010 1 0x00000000 0x00000000 1 0 cin_doko どこ?
40011 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_doko  
40012 0x00002010 1 0x00000000 0x00000000 1 0 cin_e え?
40012 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_e  
40013 0x00002010 1 0x00000000 0x00000000 1 0 cin_fuseru 伏せるよ
40013 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_fuseru  
40014 0x00002010 1 0x00000000 0x00000000 1 0 cin_goemon ごえもん
40014 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_goemon  
40015 0x00002010 1 0x00000000 0x00000000 1 0 cin_gomen ごめんね
40015 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_gomen  
40016 0x00002010 1 0x00000000 0x00000000 1 0 cin_hai はい
40016 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_hai  
40017 0x00002010 1 0x00000000 0x00000000 1 0 cin_hidari ひだり
40017 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_hidari  
40018 0x00002010 1 0x00000000 0x00000000 1 0 cin_iiyo いいよ
40018 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_iiyo  
40019 0x00002010 1 0x00000000 0x00000000 1 0 cin_ikuyo 行くよ
40019 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_ikuyo  
40020 0x00002010 1 0x00000000 0x00000000 1 0 cin_iyada いやだよ
40020 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_iyada  
40021 0x00002010 1 0x00000000 0x00000000 1 0 cin_kenchan けんちゃん
40021 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_kenchan  
40022 0x00002010 1 0x00000000 0x00000000 1 0 cin_kick キックー
40022 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_kick  
40023 0x00002010 1 0x00000000 0x00000000 1 0 cin_koketa こけちゃった
40023 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_koketa  
40024 0x00002010 1 0x00000000 0x00000000 0 0 cin_koko ここ
40024 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_koko  
40025 0x00002010 1 0x00000000 0x00000000 0 0 cin_konbanwa こんばんは
40025 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_konbanwa  
40026 0x00002010 1 0x00000000 0x00000000 0 0 cin_konnitiwa こんにちは
40026 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_konnitiwa  
40027 0x00002010 1 0x00000000 0x00000000 0 0 cin_kontin コンチン
40027 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_kontin  
40028 0x00002010 1 0x00000000 0x00000000 0 0 cin_kotti こっち
40028 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_kotti  
40029 0x00002010 1 0x00000000 0x00000000 0 0 cin_kowaiyo こわいよー
40029 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_kowaiyo  
40030 0x00002010 1 0x00000000 0x00000000 0 0 cin_mae
40030 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_mae  
40031 0x00002010 1 0x00000000 0x00000000 0 0 cin_magaru 曲がるよ
40031 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_magaru  
40032 0x00002010 1 0x00000000 0x00000000 0 0 cin_migi
40032 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_migi  
40033 0x00002010 1 0x00000000 0x00000000 0 0 cin_mituketa みつけた
40033 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_mituketa  
40034 0x00002010 1 0x00000000 0x00000000 0 0 cin_miya みや
40034 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_miya  
40035 0x00002010 1 0x00000000 0x00000000 0 0 cin_modoruyo 戻るよ
40035 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_modoruyo  
40036 0x00002010 1 0x00000000 0x00000000 0 0 cin_mouiiya もういいや
40036 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_mouiiya  
40037 0x00002010 1 0x00000000 0x00000000 0 0 cin_nakunatta なくなった
40037 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_nakunatta  
40038 0x00002010 1 0x00000000 0x00000000 0 0 cin_nazete なぜて
40038 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_nazete  
40039 0x00002010 1 0x00000000 0x00000000 0 0 cin_nemutai 眠たい
40039 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_nemutai  
40040 0x00002010 1 0x00000000 0x00000000 0 0 cin_ohayou おはよう
40040 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_ohayou  
40041 0x00002010 1 0x00000000 0x00000000 0 0 cin_okotta 怒った
40041 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_okotta  
40042 0x00002010 1 0x00000000 0x00000000 0 0 cin_onakasuita おなかすいた
40042 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_onakasuita  
40043 0x00002010 1 0x00000000 0x00000000 0 0 cin_orange オレンジ
40043 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_orange  
40044 0x00002010 1 0x00000000 0x00000000 0 0 cin_ote お手
40044 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_ote  
40045 0x00002010 1 0x00000000 0x00000000 0 0 cin_oyasumi おやすみ
40045 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_oyasumi  
40046 0x00002010 1 0x00000000 0x00000000 0 0 cin_pink ピンク
40046 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_pink  
40047 0x00002010 1 0x00000000 0x00000000 0 0 cin_sayonara さよなら
40047 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_sayonara  
40048 0x00002010 1 0x00000000 0x00000000 0 0 cin_soudayo そうだよ
40048 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_soudayo  
40049 0x00002010 1 0x00000000 0x00000000 0 0 cin_susumu 進むよ
40049 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_susumu  
40050 0x00002010 1 0x00000000 0x00000000 0 0 cin_suwaru 座るよ
40050 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_suwaru  
40051 0x00002010 1 0x00000000 0x00000000 0 0 cin_taikutu 退屈だよ
40051 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_taikutu  
40052 0x00002010 1 0x00000000 0x00000000 0 0 cin_tanosii 楽しいよ
40052 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_tanosii  
40053 0x00002010 1 0x00000000 0x00000000 0 0 cin_tatu 立つよ
40053 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_tatu  
40054 0x00002010 1 0x00000000 0x00000000 0 0 cin_tigauyo 違うよ
40054 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_tigauyo  
40055 0x00002010 1 0x00000000 0x00000000 0 0 cin_tyoudai ちょうだい
40055 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_tyoudai  
40056 0x00002010 1 0x00000000 0x00000000 0 0 cin_uresii 嬉しい
40056 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_uresii  
40057 0x00002010 1 0x00000000 0x00000000 0 0 cin_usiro 後ろ
40057 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_usiro  
40058 0x00002010 1 0x00000000 0x00000000 0 0 cin_wai わーい
40058 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_wai  
40059 0x00002010 1 0x00000000 0x00000000 0 0 cin_yuko ゆうこ
40059 0x00001020 1 0x00000000 0x00000000 1 0 m_any#any_cin_yuko  
4.最後に  
アイボメッセンジャーというメールやWEBを読み上げるソフトのデモを見て、アイボはしゃべった方が親近感あるような気がしたのでしゃべらせてはみたけれど結局大事なのはしゃべるまでのプロセスなんですよね。元々そっち(自律・人工知能)に興味があってロボットに興味を持ってるのだから本質を忘れてはいけません。次は自律プログラムで何か成果としてあらわせるものを作りたいと思います。