4 ポイント 投稿者 GN⁺ 2024-05-14 | 1件のコメント | WhatsAppで共有
  • Pi-C.A.R.D は Raspberry Pi 上で完全にローカル実行される AI 音声アシスタントで、対話型 LLM 機能を Raspberry Pi ハードウェア上で実現するプロジェクト
  • 対話方法は wake word ベースの main.py と GPIO ボタンベースの main_button.py の2種類で、会話中は wake word を繰り返す必要がない
  • 会話履歴は config.py で調整でき、メモリサイズを小さくするとより速い応答が得られる
  • 高速かつ軽量にするため、whisper.cppllama.cpp などの C++ 実装を使用し、外部情報へのアクセス判断には fine-tuned BERT の tool-bert2 を使用する
  • カメラベースの機能は README の複数箇所で設定方法が説明されているが、現在は llama.cpp の vision model サポート変更 により一時的に削除されているとの注意書きがある

Pi-C.A.R.D が行うこと

  • Pi-C.A.R.D は Raspberry Pi 上で動作する AI ベースのアシスタントで、ChatGPT のような標準的な LLM が対話環境で行う処理をローカルで実行することを目指している
  • 名前は Raspberry Pi - Camera Audio Recognition Device の略
  • プロジェクトは継続して開発中で、issue や pull request を受け付けるとしている
  • 新たに追加された Docker サポートにより、セットアップと修正がより容易になることを期待していると述べている
  • 紹介動画はまだ提供されておらず、今後提供予定

動作方式

  • wake word 方式

    • main.py を実行すると、システムが wake word を聞き取り、会話を開始する
    • デフォルトの wake word は "raspberry""barry""razbear"
    • 会話が始まった後は、毎回 wake word を繰り返す必要はない
    • "stop""exit""goodbye" のような言葉を言うと会話を終了する
    • wake word と関連動作は config.py で変更できる
  • ボタン方式

    • ブレッドボード、配線、ボタンを使うと GPIO ボタンで会話を開始できる
    • ボタンを押してからコマンドを話す方式で、README ではよりスムーズな対話方式として紹介されている
    • ボタン設定は main_button.py の案内に従う
    • ボタン版では、ボタンで会話を開始したり、assistant をいつでも中断したりできる
  • 会話メモリ

    • チャットボットは設定可能な会話メモリを持つ
    • 以前の発話を繰り返させたり、前の話題をより詳しく扱わせたりできる
    • より速い応答が必要な場合は、config.py でメモリ値を小さく設定できる

ローカル実行の目標と限界

  • プロジェクトの目標は、Raspberry Pi という比較的安価なハードウェア上で、完全にオフラインな音声アシスタントをどれだけ効率よく作れるかを確認すること
  • すべての処理をローカルで実行するため、クラウドベースのシステムほど強力でも高速でもない
  • README は、ここ1年で小型 LLM モデルに大きな進展があり、このプロジェクトもそれに伴って改善できると見ている
  • アプリにしなかった理由は、完全オフラインの音声アシスタントを Raspberry Pi 上で高速に動作させることが最も難しい部分だと考えたため
  • この方式が動作すれば、より強力なハードウェアでは類似のシステムがより高速に動作できると説明している

実行と設定

  • リポジトリをダウンロードし、要件と設定を完了した後、次のコマンドで実行する
python main.py
  • ボタン版は次のコマンドで実行する
python main_button.py
  • Docker 実行は推奨方式として紹介されており、次のコマンドを使用する
sudo docker-compose build
sudo docker-compose up
  • Docker サポートは最近追加された機能のため、完全には動作しない可能性がある
  • Docker 方式は wake-word 版のみ動作し、GPIO アクセスをコンテナへ渡す方法はまだ明確ではない

使用ソフトウェアとツール

  • 高速で軽量なシステムを作るため、可能な箇所では C++ 実装を使用する
  • 音声文字起こしには whisper.cpp を使用し、quick-start ガイドに従って設定する必要がある
  • README は vision 機能に llama.cpp を使用すると説明しているが、冒頭の注意書きでは llama.cpp が vision model をもはや積極的にサポートしていないため、カメラ機能は一時的に削除されたとしている
  • assistant が実際の秘書に近い形で動作するよう、いくつかのツールアクセス機能を提供する
    • ツールアクセスの判断は tool-bert で行う
    • tool-bert2 は外部情報へアクセスするタイミングを決定する fine-tuned BERT
    • このモデルを作る方法は tool-bert リポジトリ に案内されている
    • ツールアクセスを有効にするには、.env.example で必要なキーとシークレットを確認する必要がある

カメラとビジョン機能の状態

  • README 本文では、Raspberry Pi にカメラを接続すると写真を撮り、見えているものを説明し、その画像について質問できると紹介している
  • ビジョン機能の設定は、config.pyvision_modelvlm に変更する方式
  • 使用するモデルとして Qwen2-VL-2B-Instruct が言及されている
  • 入力画像のトークンサイズは動的なため、撮影した写真のサイズを小さくすると推論時間を短縮できると説明している
  • ただしプロジェクト冒頭の注意書きによると、現在カメラ機能は一時削除されている

必要なハードウェア

  • 基本ハードウェア構成は Raspberry Pi 5 Model B、USB マイク、スピーカー
  • USB マイクとスピーカーは Raspberry Pi の USB ポートに接続する
  • カメラは Raspberry Pi のカメラポートに接続する
  • README で使用された構成品は次のとおり
  • Raspberry Pi 5 は新しいカメラポートを使用するため、新しいカメラコネクタが必要
  • カメラコネクタは任意だが、カメラ機能を使うには購入する必要がある
  • GPIO ボタン設定には チュートリアル の前半が役立ったと案内している
  • プロジェクトは Raspberry Pi 5 で動作するように調整することへ注力しているが、他のデバイスでも動作する可能性があると説明している

ロードマップと進捗状況

  • 実装完了と表示されている項目には、基本会話機能、カメラ機能、応答時間ベンチマーク、オーバークロックテスト、whisper 時間短縮方法の探索が含まれる
  • assistant を中断して新しい質問をする機能、custom tuned model の使用、外部サービス関数モデルである tool-bert の改善も完了として表示されている
  • 携帯用電源接続テストと、より多くのデバイステストのための Docker 化も完了している
  • 残る項目には、改善されたチュートリアルと動画、entropix を使った選択的モデル生成、他言語テスト、より多くの外部サービス追加がある
  • 進捗追跡用の Notion ボードはまだ完成しておらず、リンク が提供されている

1件のコメント

 
GN⁺ 2024-05-14
Hacker Newsのコメント
  • ユーザーのプライバシーを守り、データが第三者サーバーに送られないようにするため、インターネット接続がまったく不要な完全オフライン音声アシスタントを作りたかったとのこと。
    いい試みだし、ありがたい。

    • Apple/Google には、デバイスのカメラ/マイクがインジケーター点灯時にしか取得できず、アプリやOSの上位レイヤーでもそれをごまかせないことを証明・検証可能にする技術を入れてほしい。
    • どんな「アシスタント」であっても、最優先で欲しい機能はオフライン動作
      これが Pi5 でしか動かないのか、それとも Raspberry Pi 以外のボードでも動くのか気になる。
    • 名前もいいし、昔のPicard facepalmミームを使っているのもさらに良い。
      真面目な話、名前のせいで目に留まり、紹介を読んで「話したことを全部 Amazon にアップロードしない Alexa なら自分にも使い道がありそうだ」と思った。
      デフォルトのウェイクワードが「hey assistant」なら、「Computer」を勧めたい :) もちろん声は https://en.wikipedia.org/wiki/Majel_Barrett っぽくあるべき。
  • 必要なのは、RPi 4で処理できて、HomeAssistantと統合でき、完全オフラインで自分のデータをどこにも送らない音声アシスタント。
    これまで見たものと比べると、このプロジェクトはほぼすべての条件を満たしているようで、よくできていると思う。
    ついでに、Alexa 的な用途に使える RPi 互換マイクのお勧めがあれば知りたい。

    • Rhasspyを見てみるとよい。
      4B で大規模言語モデルを実用的に動かすのは難しいが、必ずしも大規模言語モデルベースである必要はない。
      Rhasspy コミュニティでは、マイク付きのサテライト機器上で安価かつ軽量なウェイクワード検出をローカル実行し(ここなら 4B でも十分)、実際の録音はより良い結果のためローカルネットワーク経由で中央ハブにストリーミングする構成が一般的。
    • https://www.robotshop.com/products/respeaker-usb-microphone-...
    • Playstation 3/4 カメラにはマイクも付いていて、結果はかなり良かった。
      eBay なら 15〜20 ドルほどで手に入る。
    • HA に統合されたVoice Assistant機能を確認したか気になる: https://www.home-assistant.io/voice_control/
      NabuCasa が Rhasspy のメイン開発者を雇ってこの機能に取り組ませており、アップデートのたびに良くなっている。
  • 「なぜ Pi-card なのか? Raspberry Pi - Camera Audio Recognition Device だから」だとすると、LCARSのチャンスを逃した気がする。
    LLM Camera Audio Recognition Service にして、もちろん「computer」というキーワードに反応すべきだった。Pi 以外でも動くなら LCARS にできる。

    • Pi-C.A.R.D は完璧。
      100% Picard と読めるし、LCARS よりずっと分かりやすい。
    • だからこそクールな LCARS グッズは持てないのだ: https://en.wikipedia.org/wiki/LCARS#Legal
    • あるいは LLM Offline Camera, User Trained Understanding Speech にして、LOCUTUS という手もある。
    • Beneficial Audio Realtime Recognition Electronic Transformer みたいな名前であるべき。
  • これを試すのが楽しみ。
    公開されていて、安定していて、柔軟で、プライバシー重視の音声アシスタントは今でも本当に少ないと思うので、このプロジェクトには勢いがついてほしい。
    1年ほど前、家族が Alexa を本気で導入したがっていたが、家に Bezos の監視装置を置きたくなかったので、自作しようと説得した。Pi 4 で Mycroft を選んだものの、うまくいかなかったし、ウェイクワード検出は不安定で、統合機能も足りず、その時点では実質的に放置されたプロジェクトのように見えた。プロジェクトや詰まっていた統合機能に貢献しようとしたが、生活に追われて戻れず、幸い家族も Alexa のことを忘れてくれた。

    • Target で売られていた一部のメイカー製品には、段ボール箱、上部のアーケード風 RGB-LED ボタン、スピーカー、RPi 用の「hat」に付いたマイク4本が入っていた。
      nano か pico か、とにかく SO-DIMM くらいの大きさのボードだった。ウェイクワードはなく、白く光ったボタンを押すと色が2回変わり、1回は押下確認、もう1回はリスニング中の表示だった。話し終えるとまた色が変わり、応答を話してくれた。
      バックエンドには Google 系の何かを使っていて、設定して動かし続けるのは本当に面倒だったが、動作はした。そういう機器が2台あって、似たようなものをセルフホストできる何かをずっと待っていた。
    • この記事を読んで本当に励まされたし、役に立つことを願っている。
      ここにさらに作業する予定。現状の品質を判断できる短い動作デモが YouTube にいくつかある: https://www.youtube.com/watch?v=OryGVbh5JZE
  • これを一般的な Linux マシンで実行できるのか気になる。
    あるいは、そういうことが可能な似たプロジェクトを知っている人がいれば知りたい。
    以前に調べたことはあるが、この分野は複雑で、制約条件も微妙だった。

    • Raspberry Pi は一般的な Linux マシンととてもよく似ていて、一番大きな違いは Intel/AMD CPU ではなくARMであるため、サポート範囲が少し狭いことくらい。
      全体として Pi-C.A.R.D は Python と C++ を使っているようなので、Python と C++ を実行・コンパイルできる環境なら、どこでも動かすのに大きな問題はなさそう。
  • 約3年前、初期世代のRPI 4でこういうものを作ろうとしたが、ハードウェアの限界と自分の知識不足にぶつかった。
    今こうして実際に動くものを見ると、本当にすごい。

  • GPUを挿せる raspi hat があれば面白そうだが、実用的あるいは実現可能かはよく分からない。
    今日のグラフィックカードは明日の電子廃棄物なのだから、こうした DIY raspi プロジェクトを強化するために第二の命を得られるかもしれない。

    • 単一プラットフォームを取り巻くエコシステムを除けば、Raspberry Pi の差別化要因の大半は フォームファクタと消費電力 にある。
      安価な CUDA コアを活用しようとして GPU / アダプタ / 電源ユニットを追加すると、電力・価格・サイズの面で、より優れた SoC や x86 NUC ソリューションよりかえって悪くなる可能性が高い。
    • 暗号資産マイニング用には、PCIe スロット 1 本を 4 本の x1 PCIe スロットに変えたり、最初から 12 本以上の x1 PCIe スロットを備えたボードを使ったりしていた。
      PCIe にどんな魔法が入っているのかは分からないが、少なくとも市販ボードの 1 つである Atomic Pi には「露出した」PCIe インターフェースがあった。
      とにかく GPU は小さな PCB の上にあり、その PCB は USB3 ケーブルを通じて、マザーボード側 PCIe スロットのさらに小さな PCB に接続されていた。要するに、PCIe が何であれ、USB3 ケーブル経由で GPU に届けて動かすことができるということだ。
  • ハードウェア一覧に スピーカー が見えるが、これが音声でも応答するのか気になる。

    • そのとおり。
      今は https://espeak.sourceforge.net/ を使っているので、聞いていてとても心地よいというほどではない。
      さらに、大規模言語モデルの応答をストリーミングしているので、返答を受け取るまでそれほど長くはかからない。チャンク単位で処理しているため、ときどき単語の一部だけを一瞬発話してしまうことがある。もちろん、どのモデルを使っているか、コンテキストサイズがどれくらいかによって待ち時間も変わる。
  • Picard はなぜいつも Earl Grey の 温度の好み まで指定しなければならないのだろう?
    それほど賢い AI なら、すでに好みを学習しているべきではないのか?

    • 完全に話題外だが、おそらく実際にはそうする必要はない。
      ドラマでは多くの登場人物がレプリケーターにもっと柔軟に指示している。「Tea, Earl Grey, Hot」は Picard の癖のようなもので、Enterprise-D のレプリケーターよりも原始的な飲食物ディスペンサーで身についた習慣なのかもしれない。
    • 好みというより、ぬるすぎる訴訟対策の強いデフォルト値を上書きするには、具体的に言う必要があるのかもしれない。
      欠乏後の世界にも訴訟は残っているのだろうか? おそらく。
    • 単に習慣の力かもしれない。
      Starfleet の人たちの大半は、レプリケーターの正しい使い方を知らないように見える。それほど賢い装置があるのに、説明書を読んだことのない普通の家電のように使い、機能の 90% を見逃したうえでレプリケーター食品はまずいと文句を言っている。
    • むしろ彼は十分に具体的に言っていない。
      https://i.redd.it/hluqexh3oqc91.jpg
    • 一度 "Tea, Earl Grey" とだけ言ったら、コンピューターが "Tea, Earl Grey, luke warm" と聞き取ったのだ。
  • ウェイクワード はどう動作するのか気になる。
    常時聞き続けていて、最後の数秒にウェイクワードやフレーズがなければ無視する方式なのか?

    • おおむねその考え方で合っている。
      もう少し正確には、複数の音声チャンクを保存して最も古いものを捨てる方式、つまり ローリングウィンドウ だ。