🆕 Smalruby 独自 — upstream に存在しない、Smalruby のために新規追加された拡張機能(champierre/tm2scratch を参考に、TensorFlow.js を直接使う形で再実装。AGPL-3.0)
- Smalruby ランタイム対応: ❌(smalruby3 gem は未対応。TensorFlow.js とブラウザ Camera API を使うためブラウザ専用)
- デフォルト表示: ✅(拡張機能ライブラリにデフォルトで表示される)
Google の Teachable Machine で訓練した機械学習モデル(画像分類・音声分類)を Smalruby から使えるようにする拡張機能。Web カメラやマイクからの入力を AI モデルに通し、検出されたラベルに応じてブロックで反応できる。
機械学習を実装ではなく利用する側として体験させることで、子供たちが AI の仕組みを学ぶ入口になる。
- AI に興味を持った小学生として、Teachable Machine で「自分の顔」「猫の画像」などを学習させたモデルを Scratch ブロックで使いたい
- 教師として、機械学習を「ボタンを押したら反応する」レベルから体験させたい
- 保護者として、子どもが AI / ML に最初に触れる教材として安全に使えるものが欲しい
- 発表会出展者として、画像認識を組み込んだインタラクティブな作品を作りたい
- Teachable Machine にアクセス
- 画像プロジェクトまたは音声プロジェクトを作成
- 各クラスにサンプル画像/音声を追加して訓練
- モデルをエクスポート("Tensorflow.js" 形式)→ 共有 URL を取得
- ブロックパレットの「拡張機能を追加」から TM2Scratch を選ぶ
setImageClassificationModelURLブロックでモデル URL を設定classifyVideoImageBlockで Web カメラ画像を分類whenReceived [ラベル]Hat ブロックで特定ラベル検出時に処理開始getImageLabel,imageLabelConfidenceで詳細取得
packages/scratch-gui/src/lib/libraries/extensions/tm2scratch/— 拡張機能登録(アイコン)packages/scratch-gui/src/lib/ruby-generator/tm2scratch.js— TM2Scratch ブロック → Ruby 変換
packages/scratch-vm/src/extensions/scratch3_tm2scratch/index.js— 拡張機能本体(TensorFlow.js モデル読込、推論実行、ラベル検出イベント発火)
なし(モデル URL は Teachable Machine の Google Cloud Storage 等から直接ロード)。
| opcode | 説明 |
|---|---|
setImageClassificationModelURL |
画像分類モデルの URL を設定 |
classifyVideoImageBlock |
Web カメラ画像を分類 |
whenReceived |
指定ラベル検出時の Hat ブロック |
isImageLabelDetected |
ラベル検出中かどうか |
getImageLabel |
最後に検出したラベル |
imageLabelConfidence |
ラベルの信頼度 (0.0〜1.0) |
| opcode | 説明 |
|---|---|
setSoundClassificationModelURL |
音声分類モデルの URL を設定 |
whenReceivedSoundLabel |
音声ラベル検出時 |
isSoundLabelDetected |
音声ラベル検出中か |
soundLabelConfidence |
音声ラベルの信頼度 |
各ブロックの Ruby 表現は
docs/smalruby-language-spec-extensions.ja.mdを参照。
なし(モデル URL は実行中のメモリにのみ保持)。
- 対応ブラウザ: Chrome / Edge / Firefox / Safari(TensorFlow.js + getUserMedia サポート)
- 必須権限: Web カメラ・マイクの利用許可
- 本実装は AGPL-3.0(champierre/tm2scratch の派生)
- ブロック定義・翻訳・アイコンは tm2scratch 由来
- 実装は TensorFlow.js を直接使う形で Smalruby 用に書き直されている
主要 PR は履歴を参照(feat:.*tm2scratch で grep)。
