本文へスキップ
hdknr blog
戻る

Rokid スマートAIグラスで何を作るか — 実装 2 本でわかった制約から、道案内と売り場検索を設計する

Rokid のスマートグラスで何が作れるか、というネタ出しをしている。候補として挙がっているのは道案内と小売店売り場での商品検索の 2 つ。

結論から書くと、道案内は地図アプリとして作ると標準機能と正面衝突するが、順路のチェックリストとして設計し直せば成立する。売り場検索のほうは後述する 4 つの原則を全部満たし、残る変数は店舗側に API があるかどうかだけになる。

そう判定できるのは、先にアプリを 2 本作って実機まで動かしてあるからだ。スマートグラスのアイデア出しは、ハードの制約を知らずにやると全部「スマホでいいのでは」に着地する。逆に制約を先に押さえると、案の良し悪しがかなり機械的に判定できるようになる。なので、この記事も制約の説明から始める。

Rokid スマートAIグラスというハードウェア

Rokid スマートAIグラス(グローバルでの製品名は Rokid Glasses)は、フューチャーモデル株式会社が日本で展開しているスマートグラスだ。2026 年 9 月時点の公式オンラインショップ価格は 109,890 円(税込)。

ハード面で押さえておきたいのは次のあたり。

標準機能として翻訳・撮影・AI 検索・ナビ・文字起こしが載っている。翻訳はオンラインで 89 言語以上に対応する。うち 8 言語(日本語・英語・中国語・韓国語・ロシア語・ドイツ語・フランス語・スペイン語)は、翻訳モデルを事前インストールすればオフラインでも動く。

この「標準で載っている」リストは、アイデア出しでは引き算の材料になる。翻訳と文字起こしとナビは既にあるので、そこに素朴にかぶせる案は基本的に筋が悪い。

AIUI でアプリはどう作るのか — Craft と .ink コンポーネント

Rokid のグラス向けアプリ基盤は AIUI と呼ばれるもので、ブラウザ IDE「Craft」(js.rokid.com/craft)で書く。実機投入にケーブルは要らず、Craft の「パッケージ化」で .aix を作り、スマホの Rokid アプリからグラスへ配信する。

Rokid スマートAIグラスのハードウェア構成と、AIUI ランタイム・スマートフォンアプリ・クラウド API の関係を示した図。グラス側はディスプレイ・カメラ・マイク・タッチパッド・デュアルチップ・バッテリーを持ち、AIUI ランタイムは .ink コンポーネントで動く。実機には crypto と btoa が存在しない

言語は JavaScript で、画面は .ink という単一ファイルコンポーネントで書く。<script def> / <script setup> / <page> / <style> の 4 セクションからなり、感覚としては Vue の .vue に近い。テンプレートは WeChat ミニプログラム互換で、div ではなく view、テキストは text で囲む。条件分岐は ink:if、ループは ink:for。

最小構成はこれくらい。

hello-glass/
├─ AGENTS.md          # エージェントの人格・システム指示
├─ app.js
├─ app.json
├─ package.json
└─ pages/index/index.ink

ただし WeChat ミニプログラム互換と聞いて App({...}) / Page({...}) で書くと実行時に落ちる。AIUI は ES module の default export だった。

// app.js
export default {
  onLaunch() {},
  globalData: {}
};
<!-- pages/index/index.ink -->
<script setup>
export default {
  data: { message: 'hello' },
  onLoad() {},
  onKeyUp(event) { /* タップ・スワイプはキーイベントで届く */ }
};
</script>

操作系は独立した API ではなく、タップ/ダブルタップ/スワイプが Enter / Backspace / ArrowUp / ArrowDown といったキーイベントとして届く。ダブルタップ(Backspace)はホーム操作に使われがちなので横取りせず、スワイプで済ませるのが無難だった。

AIUI 実装 2 本でわかった「効く制約」

競馬天気予報アプリと SwitchBot 連携のスマートホーム操作アプリを作る過程で踏んだ地雷のうち、アイデアの実現性に直結するものを 3 つ挙げる。

1. 実機に crypto が無い

SwitchBot API v1.1 はリクエストごとに HMAC-SHA256 の署名を要求する。通常なら crypto.subtle で作れるはずが、Rokid 実機のランタイムには crypto が存在しなかった(ドキュメントには載っているのに crypto is not defined)。btoa もない。

結果として SHA-256 をスクラッチ実装し、HMAC も Base64 も手書きすることになった。

// crypto を使わず、自前の hmacSha256 / base64 で認証ヘッダを作る
function sbHeaders() {
  const t = '' + Date.now();
  const nonce = 'n' + Date.now() + Math.floor(Math.random() * 1e9);
  const sign = base64(hmacSha256(strBytes(SECRET), strBytes(TOKEN + t + nonce)));
  return { Authorization: TOKEN, sign, t, nonce, 'Content-Type': 'application/json' };
}

裏を返せば 署名さえ自前で作れば、中継サーバーを立てずにクラウド API を直接叩ける。これは設計の自由度としてかなり大きい。

なお外部通信には、AIUI Studio でエージェント作成時に Permission の「Network Access(Internet)」を ON にしておく必要がある。

2. TTS(speechSynthesis)は途中で止められない

読み上げは Web Speech API の speechSynthesis.speak() を使う。IPC でネイティブに転送されるため音が出るのは実機のみで、プレビューは無音。そして cancel() が未サポートなので、読み上げの途中停止ができない。

日本語の日付読みも不規則で、「29 日」がうまく読めない。読み仮名を直接渡して回避した。読み上げ設計は「短い 1 文を作る」以外に選択肢がない、と考えたほうがいい。

3. エージェント名が予約ワードと衝突する

地味に効いたのがこれ。エージェント名を「スマートホーム」「家電連携」にすると音声アシスタントの予約ワードと衝突し、「操作する機能は提供されていません」と言われて起動できない。「家の確認」のような中立な名前にすると起動した。

音声起動が入口である以上、アプリ名の名前空間がアシスタントと共有されているという前提で設計する必要がある。


3 つに共通しているのは、ドキュメントの記述と実機の挙動がずれるという点だ。crypto も TTS のクセもそうだし、他にも fetch(url, undefined) が Error converting from js 'undefined' into type 'object' で落ちる(引数 1 個で呼べば通る)といった細かいズレがある。

const res = options ? await fetch(url, options) : await fetch(url);

プレビューで動いても実機で落ちることがある。逆に、配信直後だけ実機で落ちて、グラスを再起動したら直ったこともあった(原因はコードではなく配信スタック側だった)。検証は必ず実機で——この原則が徹底的に効く。切り分けには「動く既存アプリとコードを完全一致させて試す」が有効だった。

制約から逆算する設計原則

ハードの素性と、実装で踏んだ地雷をまとめると、AIUI アプリの案は次の 4 つを満たしているかで振るい落とせる。

  1. 表示が数行に収まるか — グリーン単色で視界の一部。地図も写真も表も、出す余地がない。答えが「A-7 通路 中段」のような短い文字列に落ちるものが向いている
  2. 常時動かさずに済むか — 210mAh で、常時ネットワーク接続は現実的でない。「呼ばれたときだけ起動して、答えたら止まる」形に落とせるか
  3. 既存の標準機能とかぶっていないか — 翻訳・文字起こし・AI 検索・ナビは標準で載っている。素朴な再実装に価値はない
  4. 答えを返す API が既にあるか — グラスから直接 REST を叩けるので、叩き先があるかどうかがそのまま実現性になる

原則 1〜3 はハードの素性から、原則 4 は実装経験から出ている。この 4 つで見ると、冒頭に挙げた 2 つの案の評価はかなりはっきりする。

案 1: 道案内 — 屋内の順路チェックリストに絞れば成立する

そのままだと筋が悪い。ナビは標準機能として既に載っているので、汎用の歩行ナビを作り直す理由がない(原則 3)。

ただし「標準ナビが扱わない経路」に限定すると話が変わる。

つまり道案内は「地図アプリ」ではなく「順路のチェックリスト」として設計すると成立する。これなら表示は 2〜3 行で足りるし、通信も遷移のたびに 1 回で済む。

順路データそのものは、競馬アプリで年間開催日程を .ics からパースしてアプリに内蔵したのと同じ手が使える。静的データで足りるなら、原則 4 を通信なしで満たせることになる。

工場や倉庫、巡回点検といった現場の課題感については、SORACOM の IoT ソリューションは建設・工事現場で求められているかや建築設備メンテナンス視点で SORACOM の IoT を分類し直すでも扱っている。

案 2: 小売店売り場での商品検索 — 4 原則を全部満たす

こちらは 4 つの原則をきれいに全部満たす。

Rokid スマートAIグラスの売り場検索アプリの処理フロー図。グラス・AIUI アプリ・店舗システムの 3 レーンで、音声起動から商品名照会、商品マスタへの問い合わせ、表示の最小化、視界への表示と読み上げまでの 5 ステップを示す

想定する利用者は、買い物客より店員だろう。理由は 3 つある。

  1. 客に 11 万円のデバイスを貸し出す運用は成立しにくい
  2. 店員なら「A-7 通路 中段」のような社内コードがそのまま通じる。客向けには変換が要り、表示行数が増える
  3. 接客中に手が塞がっている場面こそ、スマホを出さずに答えられる価値が出る

実装上の注意点は 3 つ。ひとつめは、SwitchBot で踏んだ署名の壁がそのまま再来すること。店舗システムの API に署名が要るなら、HMAC は自前実装になる。逆に言えば、それさえ越えれば普通の REST クライアントを書くだけになる。

ふたつめは読み上げで、cancel() がない以上「A-7 通路、中段」の 1 文で言い切る必要がある。長い説明を流し始めると止められない。

みっつめがエージェント名だ。「売り場検索」「在庫確認」のような汎用語は予約ワードと衝突しうるので、店舗固有の名前を付けておくほうが安全だと思う。

なお、ここでいう「API が既にある」は、外から叩ける形で公開されているという意味で読む必要がある。公開されていても形が違えば直接は叩けない例として、kabu ステーション API はクラウド API ではない — localhost:18080 に立つサイドカー型の正体を書いたことがある。グラスから直接 fetch する設計では、この違いが致命的になる。

その他の案

同じ 4 原則で振るうと、他にも通りそうな案がいくつか出てくる。業務系はほぼ売り場検索と同じ骨格で、「答えが短い文字列に落ちる」「呼ばれたときだけ動く」「現場固有のデータなので AI 検索では出てこない」の 3 つが揃う。

案視界に出す内容叩く先
設備点検・検針機器名 / 前回値 / 今回の点検項目設備台帳・点検履歴
倉庫のピッキングロケーション / SKU / 数量WMS
飲食店ホールの卓別確認卓番 / 未提供品 / アレルゲンPOS・オーダーシステム
電気工事の結線確認端子番号 / 線色 / 回路名結線表(静的データで足りる)
訪問看護・介護の申し送り利用者 / 前回バイタル / 当日の手順記録システム
農業の圃場作業指示区画 / 作業 / 前回散布日営農記録

どれも実現性を決めるのは原則 4 だけで、既存システムに REST の口があるかどうかに尽きる。結線確認のように、そもそもデータが静的で済むならアプリに内蔵してしまえば通信すら要らない。

個人向けだと次のあたり。

逆に、原則に照らして落ちる案も明確になる。

ひとつだけ「落ちる」ではなく 未確認 で保留しているのが、プッシュ通知型(ゲート変更の通知、アラート受信など)。AIUI アプリは音声起動が入口なので、バックグラウンドで通知を受け続ける経路があるかどうかを実機で確認していない。ここが空いていれば案の幅がかなり変わるので、優先して調べたい。

まとめ

道案内は、地図をやめて順路のチェックリストにすれば成立する。売り場検索は 4 原則を全部満たし、残る変数は店舗システムに外から叩ける API があるかどうかだけになる。

そして案の良し悪しを分けているのは、AI グラスらしさではなく「答えが 3 行に収まるか」「呼ばれたときだけ動かせるか」という、きわめて散文的な条件のほうだった。

次に試すこと

制約側はだいたい把握できたので、次は「答えを返す API」のほうを調べたい。具体的には、店舗の商品マスタや在庫にどういう外部インターフェースが用意されているのかという話で、ここが空いていると案 2 は実装以前に止まる。

道案内のほうは、まず順路データを静的データとしてアプリに内蔵する形(競馬アプリで開催日程にやったのと同じ手)で、測位なしのチェックリスト型を試してみるつもり。

グラス単体で完結させるか、スマホをハブにして重い処理を逃がすかという分岐もある。ギャップロの記事によれば Android アプリをグラス単体で動かすこと自体は可能とのことだが、同記事の結論はむしろ「重い処理はスマートフォンに逃がすべき」で、単体完結を勧めてはいない。AIUI とは別の選択肢として頭には置きつつ、まずは AIUI で進めるのが素直だろう。

ついでに書いておくと、「ドキュメントにあっても実機に無い」の類は Rokid に限った話ではない。Video Use の「沈黙する失敗」— ffmpeg が成功しても動画が壊れる 5 つの罠と 12 の Hard Rulesでも、ツールが成功を返しているのに実体が壊れている、という同じ形の罠を扱った。実機で確かめる以外に検出手段がないという点で構造が同じだ。

参考



前の記事
Claude Code のサブエージェントは定義しただけでは動かない — ファクトチェックを繋ぎ直した 3 つの穴
次の記事
テストを信じる前に、テストを壊す — mutation harness で「緑」に意味を持たせる