Scenet について
Scenet は、コマの内容を記述して SVG に出力するための意味記述言語と決定論的コンパイラーです。画像モデルを使わず、構造化されたコマのレイアウトを扱う漫画制作者やツール向けで、コマンドライン、ブラウザー、エディター、MCP から利用できます。
主な機能
- 01コマとシーケンスの記述
- 02漫画脚本形式の入力
- 03決定論的な SVG コンパイル
- 04フレーミングと人物配置の自動化
- 05吹き出しとキャプションのレイアウト
- 06VS Code の補完とプレビュー
活用シーン
- 01構造化した漫画のコマを SVG に出力
- 02コマの差分を重ねてシーケンスを作成
- 03VS Code でコマ文書を検証・プレビュー
- 04MCP クライアントからコマを検証・描画
MCP 対応
`scenet mcp` は Scenet 入力の検証、コンパイル、描画を行うツールを提供します。MCP クライアントは返されたエラーを参考に内容を修正できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
5掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| section | any | いいえ | 読み取るパートです。省略すると、要点とパート一覧を読みます |
詳細
Scenet
SVGにコンパイルされる、コミックのコマ向けセマンティックDSLです。
⚠️ このプロジェクトは意図的にAIで生成されています
このプロジェクトは、設計上、ほぼすべてがAIによって生成されています。AIコーディングツールの使い方を学ぶための個人的なトレーニングの場として作られています。アーキテクチャ、コード、テスト、ドキュメントの大部分は、人間の指示とレビューのもとでAIが作成しています。
その前提でご利用ください。まずは実験であり、実用的なツールとしての位置づけはその次です。
プレイグラウンド · ドキュメント · チュートリアル · 変更履歴
これは何か
音楽には楽譜があります。楽譜は、最終的に耳に届く波形を記述することなく、曲の意味、つまり音高、長さ、強弱を表します。レンダリングは、人間または機械のインタープリターに委ねられています。
画像には、そのようなものがありません。SVGが記述するのは描き方であり、何が描かれているかではありません。楽譜よりもWAVファイルに近いものです。Scenetは、欠けているこのレイヤーを補おうとする試みであり、扱いやすいひとつの領域、コミックのコマに対象を絞っています。
コマの中にあるものを記述します。
panel:
size: [1000, 1000]
camera:
shot: medium_shot
angle: eye_level
setting:
place: street
weather: rain
cast:
alice: {reference: alice, pose: pointing, at: left_third, facing: right}
bob: {reference: bob, pose: arms_crossed, at: right_third, facing: left}
staging:
- alice left_of bob
- alice looking_at bob
script:
- say: {by: alice, text: "You forgot your umbrella!", prefer: top_left}
- say: {by: bob, text: "I know."}
シーケンスとして記述することもできます。各コマには、ひとつ前のコマから変わった点だけを記述します。シーン内の連続するコマでは演出の大部分が共通するため、OpenUSDのスパースなオーバーライド方式を取り入れています。
panels:
establishing:
camera: {shot: full_shot}
cast: {alice: {reference: alice}, bob: {reference: bob}}
reaction:
over: establishing # same cast, same staging
camera: {shot: close_up} # move in
あるいは、作家がすでに使っている形式であるコミック脚本でも記述できます。
PANEL 1
@shot: full_shot
Alice and Bob face each other on a rainy street corner.
ALICE
You forgot your umbrella!
BOB (whisper)
I know.
Dark Horseが公開している脚本形式は、記述されたまま読み込まれます。フランス語の脚本も同様です。
どの形式からでも、コンパイラーが残りを導き出します。ミディアムショットにするには各人物をどれくらいの大きさにするか、どこに立たせるか、どちらを向かせるか、テキストに合わせて吹き出しをどれくらいの大きさにするか、顔を覆わずに吹き出しをどこに配置できるか、吹き出しのしっぽを話者の口までどう伸ばすか。これらすべてを、読み順を保ちながら処理します。
生成画像モデルは一切使いません。 これは制約充足と計算幾何学による決定論的なコンパイラーです。同じ入力からは常にバイト単位で同一の出力が生成されます。
ステータス
アルファ版 — コマ、シーケンス、ページは、コマンドライン、ブラウザー、エディターからエンドツーエンドでコンパイルできます。 フレーミング、登場人物の配置、吹き出しとキャプションの配置、読み順、しっぽの経路、描画された顔とその周囲の線、トーンのある背景、段のあるページ、SVGの出力は、2種類のフロントエンドのどちらからでもすべて動作します。また、各コマはスクリーンリーダーで読み上げることができ、説明に続いて、コマ内のすべての発言が読み順に読み上げられます。未実装のものは、印刷用の出力と、コマにスタイルを与える解釈レイヤーです。詳しくはフェーズ計画を参照してください。
uv run scenet build examples/duel.panel.yaml --core --debug
uv run scenet build examples/sequence.scene.yaml --strip
uv run scenet build examples/umbrella.script --strip
--core を指定すると、解決済みの中間段をJSONとして出力します。--debug を指定すると、ソルバーが処理したジオメトリーを示すオーバーレイを出力します。シルエットの外形、顔の除外ゾーン、アンカー、視線ベクトル、しっぽの経路が表示されます。
仕組み
duel.panel.yaml → Panel Core (.core.json) → panel.svg
authored, resolved, fully numeric, rendered
no coordinates still named & inspectable
中間段は、隠れたデータ構造ではなく、実際に編集可能な形式です。そのため、レイアウトを描画方法とは独立して確認、手動調整、差分比較できます。このアプローチは、SVGを出力する前に高水準の文法を低水準の文法へコンパイルするVega-Liteから取り入れています。
ブラウザーで試す
プレイグラウンド では、このコンパイラーを実行できます。WebAssembly を介して Pyodide を使い、同じ Python コードを変更せずにブラウザー上で動かします。再実装ではありません。このページは uv build が生成するものとまったく同じ wheel をインストールするため、ジオメトリの別コピーが生じて動作が食い違うことはありません。
掲載されている実例では、あらゆるショットタイプ、吹き出しの種類、キャプションの種類、表情とマーク、マスの種類と位置、両方のフロントエンド、制約の優先順位を網羅しています。各実例は examples/gallery/ にある実際のファイルで、テストスイートがコンパイルします。そのため、プレイグラウンドに動作しない実例が表示されることはありません。
エディターには Monaco を採用し、VS Code 拡張機能が使うものと同じ JSON Schemaを読み込んでいます。これはコンパイラー自身のモデルから生成されるため、補完やホバー表示のドキュメントが、実際にコンパイルできる内容と食い違うことはありません。すべてを単一オリジンから配信します。CDN も、アナリティクスも、ほかの場所から取得するものもありません。
エディターのサポート
VS Code 拡張機能 は、パネルドキュメントの補完とインライン検証に加えて、並べて表示するプレビューを提供します。JSON Schema は scenet schema によりコンパイラー自身のモデルから生成されるため、エディターで提供される内容は実際にコンパイルできる内容と一致します。配布されるスキーマが古くなると、テストが失敗します。
モデルから利用する
モデルは学習によって Scenet を知っているわけではないため、このプロジェクトでは代わりに言語をモデルに渡します。モデルから Scenet を操作する方法では、クライアントの種類ごとに説明しています。
- コードを実行できないチャットアプリ — NotebookLM、Gemini アプリなど — には、言語、コミック脚本の形式、キャラクター、すべての診断メッセージ、ギャラリー全体を1つのファイルにまとめた仕様パックを渡します。
- スキルを読み込むエージェントには、Agent Skills フォルダーである
skills/scenetを渡します。 - MCP クライアントには
scenet mcpを使います。検証、コンパイル、レンダリングを行うツールを提供するため、モデルは自分のエラーを読み取って修正できます。
pip install 'scenet[mcp]'
scenet mcp
インストール
pip install scenet
Python 3.12 以降が必要です。システムライブラリーやフォントのインストール、設定は不要です。py.typed マーカーが同梱されているため、mypy、pyright、ty、basedpyright はパッケージから型注釈を直接読み取れます。
from scenet import compile_source, render
result = compile_source("cast: {alice: {reference: alice}}")
svg = render(result.core)
開発
uv が必要です。Python のバージョン管理も行うため、セットアップはこれだけです。
uv sync --all-groups
uv run pytest
以下のチェックはすべて CI で実行されます。
uv run ruff check . && uv run ruff format --check .
uv run ty check
uv run pytest
ドキュメント
creatoan.github.io/scenet — または、ビルド手順なしで GitHub がレンダリングする docs/ 以下の Markdown ソースをお読みください。
| チュートリアル | 何もないところから15分でパネルを作成する |
| ハウツーガイド | シーケンス、コミック脚本、独自のキャラクター、ライブラリーとしての利用方法 |
| 言語仕様 | すべての構文要素とその例 |
| ショットタイプ | 規範的なカメラフレーミング表 |
| Panel Core | 解決済みの中間形式 |
| アセットの契約 | キャラクターパペットに宣言が必要な内容 |
| MCP サーバー | scenet mcp がモデルに提供するツール |
| API リファレンス | すべての公開名 |
| 設計上の決定 | この形になった理由 |
| 先行事例 | 既存のものと、そこから取り入れたもの |
ドキュメント内の Python の例はすべてテストスイートで実行されます。インポートが抜けている例や、コードとの整合性が失われた例があると、ビルドは失敗します。
ライセンス
0BSD — LICENSEを参照してください。これは、意図的にMITよりもさらに制約の少ないライセンスです。著作権表示を保持したり、ライセンスを複製したりする義務なく、あらゆる目的でこのソフトウェアを使用、複製、改変、配布できます。帰属表示は不要ですが、歓迎します。
サードパーティ製コンポーネントはTHIRD_PARTY_NOTICES.mdに記載されています。レタリングフォントはSIL Open Font Licenseに基づく通常の依存関係として含まれており、このライセンスではフォントとともに独自の通知を保持する必要があります。
言語仕様は自由に実装できます。 誰でも、商用かどうかを問わず、制限や帰属表示の義務なく、この言語のコンパイラー、エディター、レンダラー、ツールを独自に構築できます。記法に価値があるのは、誰にも所有されていない場合だけです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。