|
Download docs/specification.md from build-small-hackathon/GAHAKU-EXAM: direct link, hf CLI and curl.
- Browser
- Download file 7.88 kB
-
https://huggingface.co/spaces/build-small-hackathon/GAHAKU-EXAM/resolve/main/docs/specification.md
- Command line
-
hf download hf://spaces/build-small-hackathon/GAHAKU-EXAM/docs/specification.md
-
curl -L -o specification.md https://huggingface.co/spaces/build-small-hackathon/GAHAKU-EXAM/resolve/main/docs/specification.md
7.88 kB
| # 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. ゲーム開始時に英単語を1つランダム出題する。 | |
| 2. プレーヤーは24色パレットを使い、マウスまたはタッチでドット絵を描く。 | |
| 3. Pyxel内の `EXPORT` で描画データを `window.__PYXEL_PAYLOAD` に保存する。 | |
| 4. Gradio側の `Sync from Pyxel`(日本語UIでは `Python側へ取り込む`)で受信確認できる。 | |
| 5. `Judge with AI`(日本語UIでは `AIで判定する`)でAI判定を行う。 | |
| 6. AI上位5候補にお題語が含まれる場合は成功。 | |
| 7. 含まれない場合は失敗カウントを1増やす。 | |
| 8. 失敗が3回に達した時点でラウンド失敗(ゲームオーバー)。 | |
| 9. `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へ最近傍拡大) | |
| - 推論フロー(優先順): | |
| 1. VLMチャット補完(候補モデルを順に試行) | |
| 2. Zero-shot image classification(provider live のみ) | |
| 3. 画像分類モデル(`google/vit-base-patch16-224`) | |
| - provider live 判定: | |
| - Hugging Face model info の `inferenceProviderMapping` を参照 | |
| - モデル×タスク結果をキャッシュ | |
| - 出力: | |
| - 上位5候補(`label`, `score`) | |
| - VLM経路では順位ベース擬似スコアを付与 | |
| - 正誤判定: | |
| - ラベルとお題語を正規化(小文字化、記号除去、空白正規化) | |
| - 上位5件内に一致があれば正解 | |
| ### 5.4 スコアリング | |
| - 成功時にラウンドスコアを確定。 | |
| - 計算式: | |
| `score = max(0, BASE_SCORE - DOT_PENALTY * used_dots - MISS_PENALTY * miss_count)` | |
| - 定数: | |
| - `BASE_SCORE = 1000` | |
| - `DOT_PENALTY = 8` | |
| - `MISS_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 Pyxel` | |
| - `Judge with AI` | |
| - `Next Round` | |
| - 情報表示: | |
| - Statusテキスト | |
| - Received JSON(開発表示) | |
| - AI Top 5 | |
| ### 6.2 ボタン活性 | |
| - `Next Round` は常時押下可能。 | |
| - ラウンドが `success` または `fail` のとき、同一ラウンドへの再判定は拒否してメッセージを返す。 | |
| ## 7. 状態管理 | |
| ### 7.1 ラウンド状態(Gradio State) | |
| - `round_id` | |
| - `round_number` | |
| - `target_word` | |
| - `miss_count` | |
| - `round_result`(`ongoing` / `success` / `fail`) | |
| - `used_dots` | |
| - `round_score` | |
| - `total_score` | |
| - `last_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-patch14` | |
| - `openai/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. 受け入れ基準(現行実装) | |
| 1. ラウンド開始時に英単語がランダム表示される。 | |
| 2. 24色・16x16のドット絵編集がマウス/タッチで可能。 | |
| 3. `EXPORT` → `Sync from Pyxel` でJSON受信確認ができる。 | |
| 4. `Judge with AI` 実行でAI上位5ラベルが表示される。 | |
| 5. 上位5にお題語が含まれると成功判定になる。 | |
| 6. 不正解3回で失敗終了になる。 | |
| 7. 成功時スコアがドット数とミス数を反映して算出される。 | |
| 8. 第一候補VLMが利用可能な場合はVLM経路で判定できる。 | |
| 9. 第一候補VLMが利用不能でもフォールバック経路で継続判定できる。 | |
| 10. 日本語/英語UI切替が機能する。 | |
| 11. `Next Round` 押下で判定演出が `idle` にリセットされる。 | |
| ## 11. 既知の制約 | |
| - `Received JSON` は開発向け表示として常時表示される。 | |
| - 演出の成功/失敗遷移は `status_box.change` フックに依存するため、接続経路やUI更新順によって見え方が変わる場合がある。 | |
| ## 12. 今後拡張候補 | |
| - 難易度別お題セット | |
| - 制限時間モード | |
| - ランキング機能 | |
| - お題に対する禁止色/使用色制限 | |
| - 複数ラウンド合計スコア制 | |
| - 開発用表示(Received JSON)の表示切替 | |