メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックカンパニーのエンジニアブログです。読者に有用な情報発信ができるよう心がけたいので応援のほどよろしくお願いします。

Raspberry Pi + ChatGPT で会話ロボットを作った

会話の間が長く、スムーズでなくてすいません💦

長期休みに入る子供対策 R&Dの一環で子供達と会話してくれる AI ロボットを作りました。

github.com

会話の例

日々このような会話が繰り広げられる様になりました。

例1

  • 🤖「こんにちは。今日はどんなサッカー練習をしましたか?」
  • 👦「今日はダイレクトシュートの練習をしました」
  • 🤖「それは良いですね。ダイレクトシュートは難しいですよね。どんなダイレクトシュートの練習ですか?」
  • 👦「インサイドキックです」
  • 🤖「サッカーの試合で使われるキックの7割がインサイドキックと言われていますね。試合でもインサイドキックをしますか?」

例2

  • 🤖「こんにちは。どんなサッカー選手が好きですか?」
  • 👦「ドリブルやパスが上手な選手です。」
  • 🤖「どの選手が好きですか?」
  • 👦「モドリッチです。」

などなど、普段親子での会話では出ない様な回答が引き出せて面白いです。

ロボットには敬語使うんだなというのも興味深いです。

システム概要図

*1

大まかな処理の流れ

  1. モーションセンサー検知
  2. OpenAI に会話開始テキストを送信し、レスポンスを音声変換しスピーカーから再生
  3. 以下繰り返し
    1. ビープ音再生
    2. RPi 録音開始
    3. 子供しゃべる
    4. 録音内容を音声ファイルに保存
    5. 音声ファイルを Cloud Speech to Text API でテキスト変換*2
    6. テキストを OpenAI に送信しレスポンスを音声変換しスピーカーから再生

工夫点

  • 会話のきっかけはロボットから
    • 「話しかけられた」方が子供は嬉しいと思ったので 👦
  • 子供の話すターンの終了は無言3秒経過したら
    • 「最初は録音開始から10秒以内に話す」ルールにしたが、話したいことが言えなかった
    • pyaudio の無言時間計測できる仕様があったのでそれを利用した
  • 子供が話して良いタイミングにはビープ音を鳴らす
    • 話して良い合図がないとロボットとの会話は難しかった
    • ビープ音と一緒に話している間は LED を光らせる様に視覚的にも会話期間を認識させる
  • 会話は返答無視で自動終了
    • ある程度遊んだらロボットの返事待たずどこかへいってしまう為
    • 返答を 5秒無視で会話終了
      • 再度モーションセンサーが検知したら会話開始となる
  • 日本語・英語どちらでも話せる様にした
    • 私個人の英語学習の為に英会話もさせたかった

ChatGPT にお願いする会話の制約

英語・日本語で制約を指定しています。

先の動画では以下のような指示をしています。

ja:
  system_content: >-
    #指示:
    以下の制約の下でチャットしてください。

    #制約条件:
    私は日本のサッカーが大好きな小学生2年生です。
    会話のトピックはどんなサッカー選手が好きか、とか、今日はどんなサッカーの練習をしたとか、をお願いします。
    回答は極力短くお願いします。

使ったもの

  • RPi 4B
    • OS: Raspbian GNU/Linux 10 (buster)
  • OpenAI API
  • Cloud Speech to Text API
  • モーションセンサー
  • スピーカー
  • マイク

諸々購入しましたが、弊社エンジニアは実質 0 円です😄
弊社のテックサポート制度で購入をサポートしている為です 🎉

ブレッドボードの設定

SunFounder で各種モジュールの設定方法があったので参考にしました。

https://docs.sunfounder.com/projects/kepler-kit/en/latest/

難しかったこと

3歳の舌足らずなところはうまく聞き取ってもらえなかったです。 でも会話が継続されているのでこれはこれで良いのかもしれない😅

また、こちらの話終わりを「無言になってから3秒経過したら」としましたが、ノイズを拾ってしまい3秒以上かかることがありました。

マイクの性能にも依存するのかもしれませんが、スマートホームのようなスムーズな会話を実現するには録音ライブラリの微調整と機材の向上は必要かと感じました。*3

もしくは、視覚的にローディング待ち状態がわかる仕掛けがあると良いかなと思いました。

子供達の反応

  • 長男:
    • もっと自分に合ってるサッカーの練習方法を教えて欲しい⚽️
    • これいつまで話せばいいの?
  • 次男:
    • ロボットになりたい🤖

カスタマーからストイックな要求も飛び出し、改良の余地がありました。
会話を続ける限り続けられてしまうので質問攻めの苦痛もあった様です。*4
次男のサイボーグ化は家族会議します。

まとめ

シンプルにモジュールと API を繋ぎ合わせて Raspberry Pi + ChatGPT で会話ロボットを作ってみました。

今後、さらに会話した感が増すように唇が動いたり、表情筋を再現できるような仕組みを作りたいと思っています。(怖い)

以上
参考になれば幸いです。


是非読者になってください


メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!

■募集ポジションはこちら

medpeer.co.jp

■エンジニア紹介ページはこちら

engineer.medpeer.co.jp

*1:シーケンス図は https://github.com/kenzo0107/raspi-talk#system-overview

*2:音声のテキスト変換について、julius: 日本語音声を認識できるものの、辞書の作成や各種ライブラリのインストールが必要で手間でした。 pocketsphinx はインストールの難易度が高く、解決しなかったので見送りました。最終的に音声ファイルからテキストに変換する際の精度と導入の簡易さから Cloud Speech to Text を選択しました。他良い選択があれば是非ともご教示ください🙇‍♂️

*3:動画では途中早送りしてます

*4:数ターンで会話終了する仕組みを入れても良さそう