ディスカッション (84件)
Jetson Orin NX 16GBを心臓部に搭載し、完全オフラインで稼働する自律型スーツケースロボット「Sparky」を構築しました。Wi-FiもBluetoothも一切不要。Gemma 4 E4Bを搭載し、独自の判断で意見を述べることも可能です。
ハードウェア構成:
・モデル: Gemma 4 E4B (Q4_K_M量子化、llama.cpp、q8_0 KVキャッシュ、flash attention使用)
・性能: 12Kコンテキスト、TTFT(最初のトークン生成までの時間)は約200ms、安定して14-15 tok/sを記録
・音声処理: STTにSenseVoiceSmall、TTSにPiperを使用し、43Hzで口の動きを同期
・インターフェース: 蓋のディスプレイにはPixiJSで描画した顔を表示
・センサー: 30以上のセンサー情報を自然言語として毎ターンプロンプトに統合
今回の最大の技術的成功は、キャッシュ安定化のためのプロンプト構造です。ペルソナとツールを最上部に、履歴を中間に、動的なセンサー・視覚データを最新ユーザーターンの末尾に配置しました。これにより、動的なコンテキストをシステムブロックから分離し、TTFTを数秒から約200msまで劇的に短縮できました。
物理操作:
ネットワークインターフェースは皆無。ボタン列、ジョイスティック、アナログエンコーダーノブを使用して、すべてデバイス上で完結する設定機能を実装しています。
現在、OrinクラスのハードウェアでE4Bを動かしている方は他にいますか?トークン生成速度の比較や、プレフィックスキャッシュを圧迫せずにセンサーやツールコンテキストを扱う手法について、ぜひ情報交換したいです。
ハードウェアの設計めちゃくちゃかっこいいな。
同じく同意!
ケースはElecrowのJetson AIスターターキットを改造したものだよ。もともとセンサーボードのスーツケースと画面が付いてたやつね。センサー学習用のプラットフォームだったものを、「Sparky」に変身させたんだ。会話パイプライン、ペルソナ作り、顔のアニメーション、デバイス上のコントロールパネル、センサーからプロンプトへの統合、そしてキャッシュ安定化のためのプロンプトエンジニアリングまで全部自分でやったよ。Elecrowのキットはベースとして最高だから、もし探してる人がいればおすすめだけど、本来の用途とは違う使い方だね。
センサーと小さな画面だけで450ドルはかなり高いね。まあ、勉強代が含まれてるってことかな。
Jetsonじゃなくてスマホじゃダメなの?
僕が買った時はElecrowから直接で179ドルだったよ(関税は別だけど)。転売屋はかなり上乗せしてるけど、学習用としてはいいスタート地点だったよ。
スマホのCPUでも小さなLLMは動かせるけど、I²C、SPI、GPIO経由で全センサーを制御するのは無理だし、flash attentionと12KのKVキャッシュを使って14-15 tok/sの速度を維持しつつ、ビジョン、STT、TTS、キオスク表示を並行処理するなんてできない。それにUSB周辺機器をつないで長時間ヘッドレスで動作するように作られてないからね。Jetsonは産業用I/Oを備えたエッジAIコンピュートボードだし、僕がやりたかったことを実現するには不可欠だったんだ。
あ、AliExpressで450€で見つけた。Raspberry Piが余ってるからぶち込んで、スマホから推論させるのもアリだな。にしても、クールなプロジェクトだね!
黙れ!金を払わせてくれ!!!
笑、なんだこれ。でもまあ、キッチュでいいんじゃない。
最高にかっこいい。
その人を昇進させるべきだ。
最高!今まで見てきたプロジェクトの中でも間違いなく上位に入る完成度だね。
これ飛行機には絶対持ち込めないわ…笑
それ最初思ったわ。バカなやつが爆弾だって騒ぎ出しそう。
いや、もっとすごい。「スマート爆弾」みたいなものだ。
面白いね。自分はheadlessのOrin Nano 8GBで、llama.cpp/llama-serverを使ってGemma4 E4B Q4_K_N GGUFを動かしてるけど、そこそこのコンテキストで18 t/sくらい出てるよ。TTSとSTTでどれくらいメモリを食うのか気になるな。
いいじゃん、8GBで18 t/sはかなり優秀だよ。自分はNX SUPERで14-15 t/sくらいかな、LLMと他の処理を全部並列で回してるからそのくらいになっちゃうんだよね。
質問への回答だけど、Piper TTSは軽量な方だよ。中品質の音声モデルで常駐60-80MBくらい。生成速度も速いからOrinクラスのハードウェアなら実質タダみたいなもん。SenseVoiceSmall STTは重めで、ロードの仕方にもよるけど800MBから1GBくらい食うかな。自分とこではどっちもCPUバウンド(GPUじゃなくてCPU負荷が高い)だから、LLMとVRAMを取り合うことはない。合わせてもシステムRAMを1GB追加するくらいで、GPUメモリはほぼゼロ消費で済むはず。
8GBのNanoで予算的に考えなきゃいけないのは、画像認識にどれだけ余裕を持てるかだね。Gemma 4のネイティブマルチモーダルを使うなら、mmprojの重みでLLMの上にさらに2GBくらい上乗せされる。画像認識を諦めれば、音声パイプラインには十分な余裕ができるよ。自分が最終的に16GBのNX Superに乗り換えたのはそれが理由。
ちなみに、あえてヘッドレスで運用してるの?それとも単にディスプレイがいらないユースケースだから?
詳細な回答ありがとう!こっちはRAMを節約するためにヘッドレスで走らせてるよ。GNOMEだと600MB以上食っちゃうからね(8GB環境でそれを選ぶのはどうなのって思うけど)。Nano向けの公式LLMチュートリアルはollamaと0.9-1.8Bモデルを推奨してるけど、ollamaはRAM食い虫だし、llama.cppならスワップなしで4Bモデルを動かせることを考えると、かなり奇妙な選択だよね。
GNOMEは頭の痛い問題だよ。一度削除を試みたけどブートプロセスが崩壊してしまった。Yahboomのイメージではgdm3もgnome-shellもaccounts-daemonも、デスクトップなんて触らなくてもシステムに深く食い込んでいるんだ。Sparkyの顔がChromiumのキオスクモードで動いていて、ChromiumがXセッションを必要とするから外せないんだよね。自動起動で全画面のChromiumを立ち上げて、PixiJSの顔の裏に隠しているからユーザーはGNOMEの存在に気づかない仕組み。安全に無効化できるサービスを削るスクリプトはあるけど、グラフィカルなJetsonのベースラインはやっぱり重いね。Ollamaに対するイライラもよく分かる。同じハードウェアで同じモデルを動かしてもllama.cppの方が明らかに数値がいいし、公式チュートリアルがNanoで1BモデルにOllamaを使わせるのは、シリコンの性能というより「出荷のしやすさ」を優先した補助輪みたいなものに感じちゃうよね。
理論上は、Gemma-4-e4bはマルチモーダルサポートでSTT(音声認識)をネイティブに扱えるはずなんだけど、こういうビルドだとあえて別のSTTパイプラインを組み合わせているのをよく見かけるんだよね。理由はよく分からないけど、多分ツールやドキュメントが足りてないせいじゃないかな。
両方使ってるよ。メインのテキストパスはSenseVoiceSmallに任せて、Gemma 4のオーディオエンコーダー(mmprojのgemma4a)は、Sparkyに「今の声のトーンどう?」とか「今何語で喋ってる?」みたいに聞かれた時に、口調やアクセント、言語、背景音を判断するオンデマンド用として使ってる。
ほとんどのビルドでメインのSTT(音声認識)にGemma 4が使われない理由はレイテンシだと思う。マルチモーダルオーディオエンコーダーは、LLMがトークンを認識する前のエンコードパスだけで1ターンあたり約700msかかるんだ。SenseVoiceSmallなら約150msで、VAD(音声区間検出)が常時動いてるからエンドポインティングは実質タダみたいなものだし、ユーザーが喋り終わる頃には文字起こしもほとんど完了してる。llama.cppのオーディオパスはワンショット形式だから、クリップ全体を渡して待たなきゃいけない。チャンクストリーミングの実装は1~2週間かかるパッチが必要だけど、700msの価値があるとは思わなかったんだ。
だからSparkyはハイブリッド構成にしてる。毎ターン安くて速いSTTを使いつつ、単に何を言ったかだけでなく、どう喋っているかを聞き取る必要がある時だけ、ネイティブなマルチモーダルオーディオを使うようにしてるよ。
これ最高。このサブレディット、もっとこういう変なスーツケース型ロボットが増えるといいな。
言ってることの半分も理解できないんだけど。
これめっちゃクールじゃん!!理解してるか確認だけど、デバイスに温度センサーを組み込んでるってこと?GPSや時刻とか他のセンサー入力も活用できたら面白いかもね。使い続けるうちに「学習」したり、前回のセッション内容を「記憶」したりするの?
サンクス!そう、温度センサーは、彼(ロボット)に毎ターン状況を伝える30個くらいのセンサーのうちの1つだよ。光、湿度、気圧、IMU、超音波、PIR、環境マイク、それにカメラからの顔認識と感情解析も入ってる。時刻データもね。公開してないカスタマイズ用インターフェースがあって、個別にセンサーをオンオフできるようにもなってる。
メモリに関しては、セッション内だと12Kのコンテキストを持てる。セッションをまたいでも顔IDは保持されるから、誰が戻ってきたかは名前で認識できるんだけど、会話の記憶はリブート時にリセットされる仕様にしてある。長期間覚えておくべきことのためにローカルのベクターストアも考えたんだけど、何を記憶して何を忘れるかの判断が難しいんだよね。チャットログを全部保存してモデルのファインチューニングも試してみたけど、結果には満足できなかった。
もともとは、周りに漂ってるメタデータを全部かき集める小さなハッカーオウムみたいに作ってたんだよね。WiFiのプローブ要求、BLEの広告、サブGHz帯のリモコン、航空機のADS-B、通り過ぎる車のTPMS、気象観測所、ポケベル、FOB、NFC/RFID、一時はMid-360S LiDARで部屋の形状データまで取ってた。全部アグリゲーターデーモンに送って[SIGNALS]コンテキストブロックとして蒸留してたんだけど、彼が自分を「生きてる」と思い込み始めて、カメラで見たものに対する妙なコメントの方がRFデータよりずっと面白くなったんだ。だからハッカーオウムの役割は降格ってわけ。
クールなプロジェクトだね。
あと、/r/idiotsincars 行き確定だな。
その通り、プロジェクトはかっこいいんだけど /u/CreativelyBankrupt 、兄弟、一体何やってんの?死ぬのが怖くないのは勝手だけど、他人を巻き込んで殺すようなことすんなよ。
正直、愛おしい。
おいおい……マジかよ!この二面性よ!
スカイネットのバージョン0.1アルファ版かよwww最高だね、もっとやってくれ!
宇宙人と話してるみたいで笑える。Sparkyにメモリシステムを組み込んで、少し進化できるようにしてみたらどうかな。
とはいえ「湿気に対する実存的脅威」っていう表現、なかなか渋くて良かったよ。ちゃんと伝わってるぞ、Sparky。
でしょ?あの異質な感じが気に入ってるんだ!
Sparkyはかなり限界に達してるから、今はAGX Thor 128GB Blackwellアーキテクチャを使って別のロボットを組み立ててるところだよ。真の自律性、永続的なメモリ、もっと深い視覚認識を実現したいんだ。Sparkyでコンセプトと技術スタックは実証できたから、次は記憶して進化できるレベルを目指すよ。
かなりのこだわりだね!いいよ!バッテリーは何を使う予定なの?
あと、この冒険の記録ってどこかで公開してる?あなたの経験から学びたいな。
ありがとう!バッテリーは一番手こずった部分だね。NVIDIAが4月にThorの開発キットからMicrofit DC入力を公式に非推奨にしたから、「LiFePO4パックを直結すればいい」という当初の算段は白紙になったんだ。今は28V/140WのUSB-C PD 3.1 EPRが必須条件。だから高出力のAnker Prime 27,650mAh(250W出力、PD 3.1 EPRで140W)を最有力候補にしてる。約100Whで、Thorフルパワーなら1時間、40W運用なら3時間持つ計算。BMSと過電流保護が内蔵されていて、普通のUSB-C PDアダプタで充電できるしね。自作パックよりはスマートじゃないけど、NVIDIAお墨付きだし、バッテリー・BMS・充電器・マルチレール配電を一つのパーツでまかなえる。カスタムのマルチセルLi-ionやLiFePO4も作れるけど、専門家じゃない自分が安全認証まで取るのは無理だしね。家で動くロボットに未加工のセルを積むよりは、商用のUL認証品を使う方が安心だよ。Microfitの道もNVIDIAの指示を無視すれば物理的には可能だけど、保証は無くなるし安全設計も自己責任になっちゃうからね。ドキュメント化について聞いてくれたけど、今のところ予定はないんだ。自分はロボット工学者というより映像制作者だから、このプロジェクトは仕事の合間の夜や週末を使って進めていてね。この野心的な次のステップを完成させるために、ハードルを下げておきたいんだ。無事に動くようになったら分解の投稿くらいはするかもしれないけど、期待しないで待っててくれ。君が作っているものも上手くいくよう応援してるよ!
めちゃくちゃいいね!これに名前はあるの?
おめでとう!『宇宙家族ジェットソン』に出てくるコンピューターの友達、RUDIを発明しちゃったね。
次は『スタートレック:TNG』の船のコンピューターを頼むよ。
とりあえず自分はムーンパイでも食べながら静かに楽しませてもらうよ。すごい時代になったもんだ!
これ開いた時の顔。「おい、またこいつのデタラメかよ」ってなるわ。
堅実なキャッシュ構造だね。急速にサンプリングされるセンサーデータで俺がハマったのは、連続的な読み取り値に含まれる浮動小数点のノイズ(例えば温度が23.14度から次のターンで23.15度になるみたいなやつ)が、意味的には何も変わっていないのにプレフィックスを勝手に無効化しちゃう問題。センサー値をプロンプトに組み込む前に固定精度に丸めると(温度なら小数点以下1桁、距離や光なら整数に)、変動する末尾部分がターンをまたいでも構造的に同じになるから、キャッシュされたパスがより頻繁に機能するようになるよ。タイムスタンプも同じで、秒単位にまとめるか、Sparkyが本当に時系列の推論を必要としていないなら省いちゃってもいい。プロンプト構造をいじらなくても、キャッシュヒット率が確実に改善する小技だよ。
こういう詳細について誰かと話せる機会がなかなかないから嬉しいよ。まさに僕がセンサーデータをプロンプトに組み込み始めた時にハマった罠そのものだね。Sparkyは既にその戦術で動いてるよ。ENV(環境情報)はシステムプロンプトじゃなくてユーザーメッセージに入れるようにしてるから、ペルソナや会話履歴のKV(キーバリュー)は変動する末尾部分に関係なくキャッシュされたままになる。それにクールダウン付きのイベントゲート(閾値を超えた時だけ送信して、カテゴリに応じて1〜10分間は静かにする)を設けてるから、ほとんどのターンではENVブロックが発生せず、きれいなキャッシュ済みプレフィックスにヒットするんだ。
数値はすべてフォーマット前に丸めてるよ。華氏、湿度、光、気圧は整数だし、距離もセンチ単位の整数だ。唯一小数点以下1桁を残してるのは、ユーザーから「今の気温は?」と聞かれた時用のパスの摂氏だけで、これこそ君が指摘してた精度を保つべきケースだね。
唯一の懸念は、整数の境界線で発生する銀行丸め(22.5°Cが72°Fに、22.51°Cが73°Fになるようなやつ)だけど、クールダウンゲートのおかげで最悪でもセッションごとに1回で済むから、今はそのままにしてる。君の環境ではキャッシュヒット率がどれくらい改善したか測定した?実際どれくらい効果があったのか興味があるよ。
正直に答えると、自分の方で正確なヒット率を計測したことはないんだ。ただ、定性的には明らかで、vLLMの長文コンテキストにおけるTTFT(最初のトークン生成時間)が十分に下がったから、回避策として短いプロンプトを使う必要がなくなったよ。
Anthropic APIを使うなら、レスポンスのメタデータでcache_readとcache_creationのトークンが確認できるから、数値が欲しいならそれが一番確実な方法だと思う。イベント発生時にクールダウンを挟むのはうまい抜け道だね。この手のイベントタイプを個別に分類する手法は初めて見たよ。
そう、cache_readの分割が一番分かりやすい指標だよね。llama-serverにもリクエストごとのログ行にそれと似たものがあって、プロンプト評価を見ると新しいトークンとキャッシュされたプレフィックスの長さが分かるけど、まだセッション全体をスクレイピングして割合を計算するところまでは手が回っていない。リストには入れておくよ。イベントタイプの分類自体は別の問題から生まれたものなんだ。Sparkyが直近の [ENV] の内容にこだわりすぎちゃうから、天気について延々と独り言を言わないようにクールダウンを導入したのが最初。キャッシュの効率が上がったのは、その後の副次的なメリットとして気づいたんだ。
この小さな相棒、歩き回るために小さな足が必要だな。
最高。
大好きだ。
一つ欲しい。
すげーじゃん!
ホーマー、そこに写ってるもの全部見てみろよ。お前のロボットが一度も動かなかったのはそのせいだよ。
いやー、こういうの作ってみたいとずっと思ってたんだよね(スタンドアローンというより、このマルチセンサー入力の部分をさ)。
プロンプトとか、まぁ…何か詳細を教えてくれない?どんな情報でもいいから聞きたいな。
GPIO周りは一番いじってて楽しいよ。コツは、センサーの生データをそのままプロンプトに流し込まないこと。本当に伝える価値がある時にだけ、自然言語に変換してSparkyに伝えるようにして、かつ同じ内容を連発しないようにクールダウンを設けるんだ。「temp=48F, humidity=22%, distance=12cm, pir=1」って送る代わりに、モデルには「目の前12cmに誰かの顔があるぞ!」とか「48°Fで凍えそう」って教える感じ。イベントが発生したターンのユーザーメッセージに[ENV]プレフィックスとして追加してる。何も起きないターンが大半だから、キャッシュもいい感じに保てるよ。
カメラも同じで、キーワード連動型にしてる。「見て」「説明して」「何が見える?」と言われた時だけ、直近のフレームをそのターンに添付するんだ。これで他のターンの負荷を大幅に抑えられるし、モデルが画像の描写だけで詰まってしまうのも防げる。
ペルソナはテンプレートシステムで、6つの声(デフォルトのSparky、コメディアン、不機嫌、ストーリーテラー、思想家、SFオタク)をセッション中に切り替えられるようにしてる。一番甘く見てたのは、モデルが自分のパターンをエコーしちゃうのを防ぐためのポストプロセッシング(後処理)かな。これがないと、Gemma 4は30ターンも経つと毎回同じ文体で返答を始めるからね。
あと、Sparkyの妹分としてSparkleも作ったんだ。CrowPi 3の学習ステーションをベースにしてて、4インチの顔ディスプレイ、カメラ、マイク、オンボードセンサー/IOボード、64ピクセルの光るLEDハートマトリックスなんかを搭載してる。RPi5ベースでWiFiとクラウド推論を使ってるんだけど、マイクで拾った会話をGroqホストの120B LLMに送って推論させて、Llama 4 Scoutでカメラのオンデマンドビジョンを処理して、温かい女性の声で返答する。その間、PixiJS/WebGLの顔やLEDハート、ステータスライト、ブザー、ハプティクスで感情や状態を表現するんだ。物理的な体は可愛いサイバネティックな実験台って感じで、小さくてセンサー満載で表情豊か。わざとアート作品っぽくしてて、フロスト加工のカバーを被せると休止中は光るインテリア照明になるよ。
今はまさにワイルド・ウエスト状態で、やれることは山ほどある!ぜひ何か理由を見つけて始めてみてよ。
AIとロボット工学の組み合わせは最高に楽しいよね。ただ、頭脳をRaspberry PiやJetsonみたいな小さなボードに詰め込むのは結構限界があると思う。RAMやパワーが足りなくて動作を滑らかにするのに苦労するのは正直しんどい。クローズドループ回路もいいけど、ワイヤレスで脳と接続するフル機能のロボットも最高にクールだよね。自分自身で考えて動けるものを作ってみたい。メモリやキャッシュの面では、ちゃんとした推論サーバーを使ったほうが圧倒的に楽だしね。
あなたの投稿が人気を集めているので、Discordで紹介させてもらいました!ぜひチェックしてください!
投稿への貢献として特別なフレアも付与しておきました。投稿ありがとうございます!
これはボットによる自動送信メッセージです。
「湿気による存亡の危機が少ない」ってことか 😂
チーズと油分が多すぎる!
Falloutに出てきそうな見た目でめちゃくちゃイイね!
それめっちゃいいね。そんなやり方があるなんて思いつかなかった。手元にある古いゲーミングノートPCを使って、とりあえずパパッと適当に組んでみるのって現実的かな?使ってない古いRazer Bladeがあって、8GBのRTX 2070が載ってるんだよね。
ああ、それなら絶対いけるよ。2070の8GBならE4BをQ4で動かす余裕は十分にある。デスクトップクラスのCUDAは低バッチ環境だとJetsonよりもワットあたりの性能が高いから、たぶん20 tok/s以上は出るはず。
まずは外装とかのハードウェアはスキップしていいと思う。とりあえずローカルでllama.cppを使ってE4Bを動かして、USBマイクの音声をSenseVoiceSmallでテキスト化(STT)して、それをPiper経由で音声合成(TTS)する。これで完全にオフラインな音声ループが完成するよ。
結局のところ、肝心なのはプロンプトとキャラ設定の作り込みだね。Sparkyがうまくいってるのは、システムプロンプトでキャラクターになりきらせて、周囲の情報(センサー、視覚、履歴)をすべてそのフレームワークの中に落とし込んでアドリブを利かせているから。それを学ぶにはノートPCで十分だよ。
E4BとPiperとマイクを用意して、キャラになりきるプロンプトを作って、10回やり取りしてもキャラ崩れしない環境が作れたら、どんなチュートリアルより勉強になると思う。
ちょっと違う用途を考えてるんだけど。2016年モデルの13インチMacBook Proがキーボード故障した状態で転がってるんだよね。捨てようと思ってたんだけど、これを見て、小さなスタンドに固定して古いルンバの上に乗せたら面白いんじゃないかと思いついた。そうすれば「ロボット」が地下室をうろついて、出会った人に話しかけたりできるだろ?「脳」の部分は自宅のWiFi/LANでAI用に動かしてる別のマシンに任せて、このノートPCは顔を表示してI/Oを担当するだけにする。ルンバは少し改造が必要そうだけどね。会話中はちゃんと静止してくれるといいんだけどな。
うわっ、人類を少なくとも40年は未来に進めちゃったよ!!!やべぇ、最高にクールだな
外側に画面がついてて、目玉がついて喋る妙に主張の激しいスーツケースを持ち歩きながら歩けるとか、最高にクールじゃない?
コンプブロ(Compubro)
ロボットの中指を立ててやったら、それを使うだろうな。
キャッシュの安定性に関するポイントこそが、このプロジェクトの真の価値だな。多くのエッジ系プロジェクトは量子化の選択やtok/s(トークン/秒)にこだわりすぎるけど、センサーや視覚、ツールの状態を組み合わせ始めると、プロンプトのレイアウトが隠れたパフォーマンスの鍵になる。揮発性のコンテキストをプレフィックスを汚染する場所じゃなくて末尾に置くっていうのは、まさにデモ止まりのものを実用レベルに引き上げるための地味だけど重要なシステム設計の選択だね。
その通り。モデルがある程度の性能に達すると、生のトークン/秒(tok/s)なんて気にならなくなって、再プリフィル(re-prefill)ではなくキャッシュされたプレフィックスをどれだけ活用できているかが重要になるんだ。Jetsonの場合、キャッシュされたTTFTは240ms前後だけど、8Kコンテキストでコールド状態からのプリフィルだと数秒はかかっちゃう。Sparkyの最近の進歩のほとんどは、モデルの変更じゃなくて、この変化しやすい状態をどこに配置するかを調整したことで得られたものだよ。あと、あまり話題にのぼらないけど重要なのはコンテキストが一杯になった時の挙動だね。Sparkyが話し終わった直後のバックグラウンドのウォームアップサイクルでプリエンプティブなトリミングを行っているから、ユーザーが返信する頃にはキャッシュの整理が完了していて、古いターンが追い出された後でもフォアグラウンドのTTFTを1〜3秒以内に収められているんだ。
サイバーデッキが流行ってるな
素晴らしい
スカイネットのT-1がオンラインになったか。めちゃくちゃクールなプロジェクトだね。
笑、Jetsonでキャッシュ済みのTTFTが200msとかヤバすぎ。会話で使う場合、30個以上のセンサーが提供するコンテキストが完全に重複しないと仮定して、実際どれくらいのキャッシュヒット率になるんだろ?あと、モデルを常時待機させてる時とスリープ状態の時でバッテリーの持ちはどれくらい違うの?
正確なヒット率は出していないけど、平均的なTTFTは1.8〜2.6秒の間に収まっているよ。プレフィックスがキャッシュされていて、新しいユーザーのトークンだけをプリフィルすればいい状態だからね。キャッシュミスが発生するのはセンサーイベントで [ENV] が動くターンに集中するけど、それらは次の静かなターンで自己解決する。もう一つのミスは履歴のトリミングで、だからこそ前述のプリエンプティブなトリミングをウォームサイクルで実行して、フォアグラウンドのTTFTに影響が出ないようにしているわけ。バッテリーについてはまだ正式な検証をしていないけど、50,000mAhのポーチをケースに詰め込んでいて、Jetsonは処理負荷に応じて15-25〜40Wくらいを消費する。一日中オン・オフを繰り返しながら会話する分には十分快適だよ。スタジオに一日持ち込む時も、ACアダプタを持っていくことはほとんどないね。
うわ、それめっちゃかっこいいな。どこかにガイドとかあるの?
キャッシュの安定性に関する詳細が個人的に一番興味深かった。パーソナやツールを安定させて、変化の激しいセンサーのコンテキストを最新のターンに送るというやり方は、単にモデルを入れ替えるよりもはるかに本質的で実用的なアーキテクチャの選択だね。すごくイケてるビルドだ。
最初に頭に浮かんだのがこれだよw N64のPerfect Darkに出てくるDr. Carrolだね。あとは浮かび上がれば完璧、ドローン機能も追加してくれ!
知らないネタを教えてくれて助かるよ。ミレニアムの頃はPCゲームばかりで、N64の波はあまり通ってこなかったんだ。コンソールへの再入門はGameCubeからだったね。
すごい!どうやってリップシンクさせてるの?もしよければ教えてくれないかな。Riveとかを使っているの?
Riveじゃなくて、PixiJSでレンダリングしてるよ。口の動きはPiper TTSから出力された音声をRMS駆動で直接制御してる感じ。Piperが音声を生成して、こっちで512サンプルのサブウィンドウ(43Hz)ごとにRMSを計算して、その値をWebSocketで顔側にストリーミングしてるんだ。口の形は3次ベジェ曲線を使ってて、上唇はキューピッドボウの形。RMS値を6段階の振幅にマッピングして開閉具合を制御してる。閉じるときは80msの減衰時間を持たせてるから、音節の合間でパッと閉じることなく、ちゃんと喋ってるように見えるんだ。音素のアライメントもビセーム合成も不要で、生の音声さえ取れればどんなTTSでも使えるよ、RMSさえあればいいからね。面白いことに、もともとの計画ではDuolingoのキャラリップシンクを参考にRiveを使うつもりだったんだ。最初はスプライトベースのビセームにしてたし、プロジェクトが落ち着いたらRiveに移行する予定だった。でも、3次ベジェとRMS、それに感情表現の口角変化を追加して実装したら、画面上での見栄えが十分良くて、結局Riveはロードマップから消えたよ。わざわざ別のランタイムを追加してまで品質が上がるわけでもないしね。
これ、今まで見た中で最高にサイバーパンクな代物だねw
こういうプロジェクトこそ、このサブレディットの醍醐味だよな。キャッシュ安定化の工夫が地味だけど素晴らしい。揮発性のセンサーコンテキストをプロンプトの末尾に移動させるっていうシンプルなアイデアだけど、これだけでロボットのレスポンスが爆速になるか、話しかけるたびに3秒待たされるかの違いが出る。「湿気による存在論的脅威が減る」っていう表現、しばらく頭から離れそうにないわ。
そう、あの3秒のラグっていうのが、まさにキャッシュミスが発生してる状態なんだよ。一番難しいのは、機能を追加するたびに新しい値がプレフィックスに紛れ込んでくるのをいかに食い止めるかっていう管理の部分だね。
お見事!
レポジトリ公開してくれ、OP!
👀
次は『宇宙家族ジェットソン』のメイドロボットを作ってくれ
めっちゃ可愛い!!
めっちゃいいじゃん✨✨✨✨✨
草。食生活についてデジタルな姉貴に小言言われてるみたいだな。
ねえ…なんでみんな、混んでる高速道路を運転中にこういう動画を撮りたがるの?助手席のロボットに気を取られながら、片手でスマホやカメラを持って、もう片方の手で膝の上の食べ物を食べようとしてるでしょ。しかも自動運転車じゃないし。こういうのを撮影したいなら、ちゃんと駐車場に停めてからにしてよ。自分の命や他人の命を危険にさらす価値なんてないよ。