A newer version of the Gradio SDK is available: 6.20.0
GAHAKU EXAM 仕様書(実装準拠 v1.2)
1. 概要
プレーヤーにランダムで1つの英単語(お題)を与え、プレーヤーはPyxelベースのドット絵エディタでその単語を表現する。
描いたドット絵をAIへ入力し、推論結果の上位5件にお題語が含まれていれば成功とする。
ゲームの目的は「できるだけ少ないドット数でAIに正解させること」。
2. 対象プラットフォーム
- デプロイ先: Hugging Face Spaces
- SDK: Gradio
- 描画エンジン: Pyxel(pyxel.js経由でWeb実行)
- 推論: Hugging Face Inference API(VLM優先 + フォールバック)
3. 用語定義
- お題: プレーヤーに提示される英単語
- キャンバス: ドット絵を描く領域(16x16)
- ドット数: 背景色以外で塗られたセル数
- 試行: 1回のAI判定リクエスト
- ラウンド: 1つのお題に対する挑戦単位
4. ゲームルール
- ゲーム開始時に英単語を1つランダム出題する。
- プレーヤーは24色パレットを使い、マウスまたはタッチでドット絵を描く。
- Pyxel内の
EXPORTで描画データをwindow.__PYXEL_PAYLOADに保存する。 - Gradio側の
Sync from Pyxel(日本語UIではPython側へ取り込む)で受信確認できる。 Judge with AI(日本語UIではAIで判定する)でAI判定を行う。- AI上位5候補にお題語が含まれる場合は成功。
- 含まれない場合は失敗カウントを1増やす。
- 失敗が3回に達した時点でラウンド失敗(ゲームオーバー)。
Next Round(日本語UIでは次のラウンド)で次ラウンドへ進む。
5. 機能要件
5.1 お題出題
- お題辞書(英単語リスト)からランダムに1語を選択。
- 同一ラウンド中はお題を固定。
- 前ラウンドと同じ単語は可能な限り連続しないよう回避(候補数が2語以上の場合)。
5.2 ドット絵エディタ
- キャンバスサイズ: 16x16セル(固定)
- 画面サイズ:
pyxel.init(310, 220) - パレット: 論理24色
- 実行環境が16色のみ対応の場合:
- 17〜24色相当はディザリングで近似表示
- 入力方式:
- マウス: クリック/ドラッグ
- タッチ: タップ/スワイプ
- 基本ツール:
- ペン
- 消しゴム
- 全消去
- EXPORT
- 画面表示:
- 使用ドット数(リアルタイム)
- 操作ガイド(
TOUCH/DRAG TO DRAW)
5.3 AI判定
- 入力: キャンバス画像(PNG, 224x224へ最近傍拡大)
- 推論フロー(優先順):
- VLMチャット補完(候補モデルを順に試行)
- Zero-shot image classification(provider live のみ)
- 画像分類モデル(
google/vit-base-patch16-224)
- provider live 判定:
- Hugging Face model info の
inferenceProviderMappingを参照 - モデル×タスク結果をキャッシュ
- Hugging Face model info の
- 出力:
- 上位5候補(
label,score) - VLM経路では順位ベース擬似スコアを付与
- 上位5候補(
- 正誤判定:
- ラベルとお題語を正規化(小文字化、記号除去、空白正規化)
- 上位5件内に一致があれば正解
5.4 スコアリング
成功時にラウンドスコアを確定。
計算式:
score = max(0, BASE_SCORE - DOT_PENALTY * used_dots - MISS_PENALTY * miss_count)定数:
BASE_SCORE = 1000DOT_PENALTY = 8MISS_PENALTY = 120
5.5 失敗条件
- 不正解が3回でラウンド失敗。
- 失敗時もAI上位5結果は表示される(取得できた場合)。
5.6 多言語対応(実装済み)
- UI言語: 日本語 / 英語
- 言語切替: Gradioのラジオボタン
- 切替対象:
- イントロ文
- ボタンラベル
- テキスト/JSONのラベル
- ラウンド情報表示
- ステータスメッセージ
- 既定言語: 英語
5.7 判定演出(実装済み)
- Pyxel側に演出状態を保持(
idle / judging / success / fail)。 Judge with AI押下時にjudgingへ遷移。Next Round押下時にidleへリセット。- Pyxel上に簡易アニメーションと文言を表示:
AI JUDGING...CORRECT!NOT YET/TRY AGAIN
6. 画面仕様(現行)
6.1 メイン画面
- サイドバー(Spaces時のみ):
- Loginボタン
- ヘッダ行:
- 左: タイトルと手順
- 右: 言語トグル(日本語/English)
- エディタ表示:
- Pyxelキャンバス埋め込み
- ヘルプ文
- ラウンド情報:
- Round / お題(Target) / 状態 / ミス / 使用ドット / ラウンドスコア / 合計スコア
- 操作行:
Sync from PyxelJudge with AINext Round
- 情報表示:
- Statusテキスト
- Received JSON(開発表示)
- AI Top 5
6.2 ボタン活性
Next Roundは常時押下可能。- ラウンドが
successまたはfailのとき、同一ラウンドへの再判定は拒否してメッセージを返す。
7. 状態管理
7.1 ラウンド状態(Gradio State)
round_idround_numbertarget_wordmiss_countround_result(ongoing/success/fail)used_dotsround_scoretotal_scorelast_top5_predictions
7.2 UI補助状態
lang_state(ja/en)window.__PYXEL_PAYLOAD(Pyxel→Gradio受け渡し)window.__AI_JUDGE_STATE(演出状態連携)
8. 外部連携仕様
8.1 Inference API
- 認証:
- Spaces: OAuthトークン優先
- ローカル:
HF_TOKEN環境変数
- 主な利用API:
- Chat Completions(VLM)
- Zero-shot image classification
- Image classification
- タイムアウト:
- provider確認: 10秒
- リトライ:
- 同一モデルへの自動リトライはなし
- モデル切替フォールバックで継続
8.2 モデル選定
- 第一候補VLM:
Qwen/Qwen3-VL-8B-Instruct - 代替VLM候補あり(provider liveのみ実行)
- Zero-shot候補:
openai/clip-vit-large-patch14openai/clip-vit-base-patch32
- 最終フォールバック:
google/vit-base-patch16-224
9. 非機能要件
- 操作性:
- PC/スマートフォン対応
- Pyxel表示領域は
31:22の比率で表示
- セキュリティ:
- トークンはクライアントへ露出しない
- ロギング:
- 判定フローをコンテナログへ出力
- 例:
judge_start,vlm_try,vlm_success,fallback_to_image_classification
10. 受け入れ基準(現行実装)
- ラウンド開始時に英単語がランダム表示される。
- 24色・16x16のドット絵編集がマウス/タッチで可能。
EXPORT→Sync from PyxelでJSON受信確認ができる。Judge with AI実行でAI上位5ラベルが表示される。- 上位5にお題語が含まれると成功判定になる。
- 不正解3回で失敗終了になる。
- 成功時スコアがドット数とミス数を反映して算出される。
- 第一候補VLMが利用可能な場合はVLM経路で判定できる。
- 第一候補VLMが利用不能でもフォールバック経路で継続判定できる。
- 日本語/英語UI切替が機能する。
Next Round押下で判定演出がidleにリセットされる。
11. 既知の制約
Received JSONは開発向け表示として常時表示される。- 演出の成功/失敗遷移は
status_box.changeフックに依存するため、接続経路やUI更新順によって見え方が変わる場合がある。
12. 今後拡張候補
- 難易度別お題セット
- 制限時間モード
- ランキング機能
- お題に対する禁止色/使用色制限
- 複数ラウンド合計スコア制
- 開発用表示(Received JSON)の表示切替