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

# この記事について

この記事は[ユカイ工学株式会社]([https://www.ux-xu.com](https://www.ux-xu.com/))の春のインターン3日間で作成した作品についての記事となります。（インターン詳細：[Wantedly](https://www.wantedly.com/projects/287031)）

# 何を作ったのか

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

## Codama とは

[こちら](https://codama.ux-xu.com/)に詳しく載っています。

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

## BOCCO とは

[こちら](http://www.bocco.me/) に詳しく載っています。

可愛いロボットです。

# 構成

下記のような構成で作りました。
![comp.jpg](https://qiita-image-store.s3.amazonaws.com/0/316468/ecb73f9c-2bc1-88e7-f5c6-49216e14e0cc.jpeg)


セバスチャンについてはこちら ：[PROJECT:SEBASTIEN](https://dev.smt.docomo.ne.jp/?p=common_page&p_name=sebastien_teaser)

# ソースコード

[github](https://github.com/yuma1100/talcco)に載せています。

# 各ソースコードの説明

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

- main.py
- sebastien.py

に記述しています。

基本的にはexampleを参考にしているので、[元のgithub](https://github.com/YUKAI/codama-doc/wiki)を見てください。

変更した部分は 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の取り付けおよび設定ガイド](https://github.com/YUKAI/codama-doc/wiki/Codama-Setup)に載っています。
シェルスクリプトの出力がbytesで出ているため、そこから文字列にし数値のみを取得しています。
**参考元**
[pythonで文字列から数字だけ取り出す](https://qiita.com/sakamossan/items/161db7418ade037f6f3d)
[[Python] unixコマンドを実行する(subprocess)](https://qiita.com/Kodaira_/items/43e0d850c1c54038a7c9)

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

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

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

- communication.py
- bocco_it.py

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

**参考元**
[自然対話APIリファレンス](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_usage_scenario)
[docomo自然対話APIを使ってみる](https://qiita.com/yukky-k/items/c62b4ded525d8e803e9c)

また、今回はGASを用いてスプレッドシート上にテキストを吐き出すようにしています。text_save.gsに記載。
理由はBOCCOのチャットルームだとセバスチャンで認識した音声を送るとそれも発声してしまうからです。
下記はBOCCOのチャットルームで
<img width="387" src="https://qiita-image-store.s3.amazonaws.com/0/316468/678b0a40-3b79-4a52-a11e-3c20320ce61b.png">

下記がスプレッドシートに吐かれている内容です。
<img width="387" alt="Screen Shot 2019-04-04 at 0.34.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/316468/b04c8268-6c52-b641-7710-95a0900496ea.png">

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

# 完成品
今回、ラズパイとCodamaを載せるケースを社員の方が作ってくれました。すごい。
3Dプリンタを自在に使えるようになりたい…
![IMG_20190404_011701.jpg](https://qiita-image-store.s3.amazonaws.com/0/316468/0e2cfde7-dc86-7518-e47a-167744a39f56.jpeg)

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

![IMG_0759.JPG](https://qiita-image-store.s3.amazonaws.com/0/316468/c013b247-8e45-956e-6650-23cf6bbbd683.jpeg)


# デモ動画 Link：[Vimeo](https://vimeo.com/328210072)

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

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

　
発表スライドも最後に載せておきます。
（link:[Speaker Deck](https://speakerdeck.com/yuma1100/yukai-intern2019-04-03-d0280701-4b06-4e85-a3fc-40cf23ec9f71)）
閲覧と共にインターンに採用して頂いた[ユカイ工学](https://www.ux-xu.com)様、ありがとうございました。