Codamaを用いた対話できるロボットの作成


この記事について

この記事はユカイ工学株式会社の春のインターン3日間で作成した作品についての記事となります。(インターン詳細:Wantedly

何を作ったのか

Codamaを用いた対話型BOCCOを作成しました。

Codama とは

こちらに詳しく載っています。

ノイズの少ない録音と、ウェイクアップ・ワードと呼ばれる、反応してほしいワードを自分で決めることが容易にできるのが特徴です。

BOCCO とは

こちら に詳しく載っています。

可愛いロボットです。

構成

下記のような構成で作りました。

セバスチャンについてはこちら :PROJECT:SEBASTIEN

ソースコード

githubに載せています。

各ソースコードの説明

1. Codamaから音声を取得しSebastienに渡すまで

  • main.py
  • sebastien.py

に記述しています。

基本的にはexampleを参考にしているので、元のgithubを見てください。

変更した部分は sebastien.pyの中に音声の角度を取得する get_angle 関数と text_out の出力をする前にmuteをしているところです。
後者は処理している最中に音が入ると永遠に終わらないようになるので、それを止めるためCodamaから取得できる音声入力をOFFにしています。
これでもたまに取得してしまうことがありますが、sdkに渡す際のラグで反応しているかと思われます。
前者の get_angle 関数について説明をします。

sebastien.py
# coding:utf-8
def get_angle():
    i = 0
    values = []
    while i < 5:
        value = subprocess.check_output('sleep 0.1s; /home/pi/codama/codama-doc/utils/codama_i2c DOAANGLE;',shell=True)
        value = str(value,encoding='utf-8',errors='replace')
        value = int(re.sub(r'\D','',value))
        # print(value)
        values.append(value)
        i += 1

    # 平均値の取得
    s = sum(values)
    N = len(values)
    ave = int(s/N)
    return ave

subprocessを用いてシェルスクリプトを叩いています。
シェルスクリプトはcodamaの取り付けおよび設定ガイドに載っています。
シェルスクリプトの出力がbytesで出ているため、そこから文字列にし数値のみを取得しています。
参考元
pythonで文字列から数字だけ取り出す
[Python] unixコマンドを実行する(subprocess)

そんなにpythonを書いたことがなかったので、見よう見まねです。

またsleepが0.1s で 5回ループするので 0.5s の平均値をreturnします。これは一瞬だと信頼性にかけるかなと思い、こういう仕様にしました。

2. Sebastienから自然対話APIに流してBOCCO APIを叩くところまで

  • communication.py
  • bocco_it.py

に記述しています。
communication.pyはdocomoが提供している自然対話APIを使用しています。
自然対話APIを採用した理由はセバスチャン単体だと、自分で会話の構成を考えないと行けなかったため、時間の都合上採用しました。(参照:非エンジニアでも作れる! ドコモのAIエージェント基盤「セバスチャン」勉強会でエキスパートエージェントを作ってきた

参考元
自然対話APIリファレンス
docomo自然対話APIを使ってみる

また、今回はGASを用いてスプレッドシート上にテキストを吐き出すようにしています。text_save.gsに記載。
理由はBOCCOのチャットルームだとセバスチャンで認識した音声を送るとそれも発声してしまうからです。
下記はBOCCOのチャットルームで

下記がスプレッドシートに吐かれている内容です。

※/hack コマンドは特別に用意してくれました。
hackコマンドによりCodamaから取得した音声方向の向きに一時的に向くなどのBOCCOの見た目の変化をつけることができています。
参考元
GASでJSONを返すAPIを作る

完成品

今回、ラズパイとCodamaを載せるケースを社員の方が作ってくれました。すごい。
3Dプリンタを自在に使えるようになりたい…

動き回る物ではなかったので、小さくシンプルにまとめました。下からラズパイ、モバイルバッテリー、BOCCOとなっていて、プラスチックダンボールを使いました。

デモ動画 Link:Vimeo

かなりのタイムラグがあります。
BOCCOの音声再生の構造上+自然対話APIが主な原因です。
作ってみると改めてGoogleHome、Alexaなどがどれだけ優秀かがわかります。
電波の良い場所でも10秒ほどタイムラグがあります。

改善点 や 感想

  • 意外とdocomoの自然対話APIとお話ができなかった
    • 自分の日本語力不足でしょうきっと
  • ラグがすごすぎる(10秒のラグなんて人前でデモは本来できないレベル)
    • 5Gの世界が早く来てほしいですね
  • 首だけではなく装置の下にモータをつけて体ごと向けることができればさらにインパクトが
    • 時間がなかった
  • ラズパイがどの程度の負荷に耐えれるかわからないからAPIを叩くようにすれば軽い処理で済むと思うと言ったら批判がなかった
    • 自分の考えていることは間違っていないということが判明

 
発表スライドも最後に載せておきます。
(link:Speaker Deck
閲覧と共にインターンに採用して頂いたユカイ工学様、ありがとうございました。