🚥

モールス信号でBedrockとナイショ話する

2024/06/08に公開

たくさんの生成AIモデルの台頭により、AIと友達になる…そんな夢も現実味を帯びてきました。
今回はその一歩としてモールス信号を使った「ひみつの友達」を作ってみました。

実現したかったこと

「AIと信号灯での回光通信」
ボタン押してでモールス符号を送信したら、数秒後にLEDが光って返答してくれるっていうやつ。

本当は送信側も回光信号で通信をしたかったのですが、生成AIは光を検知してモールス符号化が難しいため、人間からの入力はボタンで入力としました。

イメージ↓

光らせたかったのと、Pythonでの開発を前提としていたのでラズパイとLEDを採用。
またAmazon Bedrockの検証も兼ねていたので、生成AIはBedrcok固定です。

使用したもの

この無接点プッシュスイッチが、ボタンを押してることを実感できる音で最高です。

実際に作ったもの

プッシュボタンでモールス信号を入力し、それをラズパイで日本語に変換後、Bedrock APIに投げています。
そのBedrockから返ってきた返答をモールス信号に変換し、LEDを点灯させます。
※Bedrock側のモデルは「Claude 3 Sonnet」を使用

プログラム側でboto3を使用してBedrcokのAPIを呼び出し、リクエストを投げています。

こんな感じで動きます。
この動画では「やあ」と送った後に「こわいよね」と返ってきてます。(うまくいってない)
https://x.com/kumaouu/status/1798372765256519749

受信後に光のモールス信号として私が認識できる必要があったので、回答文を10文字程度に制限したことで返答精度が落ち、プロンプトの調整に大変苦労しました。
レスポンス速度を重視するなら「Claude 3 Haiku」も検討する価値があります。

また、今回使用したスイッチが無接点プッシュスイッチだったことで、チャタリングの発生確率が低くなっていますが、可能性がゼロではないためソフトウェア側でデバウンス処理を入れています。

実装したデバウンス処理
def debounce(pin, debounce_time=0.02):
    
    start = time.time()

    while time.time() - start < debounce_time:
        if GPIO.input(pin) != GPIO.LOW:
            return False
    
    return True

https://zenn.dev/kumao/scraps/74ee3a92684f48

実装したすべてのコードはこちら
https://github.com/kumaotto/bedrock-morse-connector

さいごに

生成AIとのコミュニケーション手段として面白いものを探していたので、モールス信号での試みは個人的に面白かったです。改良の余地はまだまだあるので、プロンプトエンジニアリングを頑張ります。

また今回のアイディアはfumi_30n06さんのツイートを拝見し、モールス信号をボタンで入力するアイディアに触発されました。
記事の内容も非常に勉強にさせていただきました。ありがとうございます!

参考

https://ja.wikipedia.org/wiki/モールス符号
https://deviceplus.jp/mc-general/control-device-with-python-vol2-02/

アイレット株式会社

Discussion