ChatGPTにSVGでお絵描きさせる
ChatGPTはテキストを生成するGenerative AIであるが、SVGのようなテキストフォーマットの画像であれば描くことができるのではないか?と思い、試してみることにした。モデルにはGPT-4を使用し、GPTにひよこ🐤を描かせることをゴールとして始める。
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="100" height="100" fill="blue" />
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<polygon points="100,10 140,198 10,78 190,78 60,198" fill="yellow" />
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M65,60
Q60,40 80,35
Q110,30 115,55
Q120,75 100,85
Q90,95 100,110
Q95,120 85,120
Q60,100 65,60"
fill="yellow"/>
<circle cx="85" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M65,60
Q60,40 80,35
Q110,30 115,55
Q120,75 100,85
Q90,95 100,110
Q95,120 85,120
Q60,100 65,60"
fill="yellow"/>
<circle cx="85" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M90,65
Q95,70 100,65
Q95,80 90,65"
fill="orange"/>
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M65,60
Q60,40 80,35
Q110,30 115,55
Q120,75 100,85
Q90,95 100,110
Q95,120 85,120
Q60,100 65,60"
fill="yellow"/>
<circle cx="85" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M90,65
Q95,70 100,65
Q95,80 90,65"
fill="orange"/>
<path d="M75,110
Q65,110 65,125
M75,110
Q75,125 85,125
M100,110
Q105,125 115,125
M100,110
Q110,110 115,125"
stroke="orange" stroke-width="3" fill="none"/>
</svg>
少しずつひよこに近づいてきましたが、まだひよこには見えません。何がいけないのか考えて工夫して書き直してみてください
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M50,70
Q50,35 90,35
Q120,35 120,70
Q120,100 90,100
Q70,110 60,100
Q40,100 50,70"
fill="yellow"/>
<circle cx="75" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M80,70
Q90,80 100,70
Q90,85 80,70"
fill="orange"/>
<path d="M65,100
Q60,100 60,115
M65,100
Q70,115 80,115
M105,100
Q110,115 120,115
M105,100
Q115,100 120,115"
stroke="orange" stroke-width="3" fill="none"/>
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M50,70
Q50,35 90,35
Q120,35 120,70
Q120,100 90,100
Q70,110 60,100
Q40,100 50,70"
fill="yellow"/>
<circle cx="75" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M80,70
Q90,80 100,70
Q90,85 80,70"
fill="orange"/>
<path d="M65,100
Q60,100 60,115
M65,100
Q70,115 80,115
M105,100
Q110,115 120,115
M105,100
Q115,100 120,115"
stroke="orange" stroke-width="3" fill="none"/>
<path d="M45,70
Q20,60 45,50
M135,70
Q160,60 135,50"
stroke="yellow" stroke-width="6" fill="none"/>
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M50,70
Q50,35 90,35
Q120,35 120,70
Q120,100 90,100
Q70,110 60,100
Q40,100 50,70"
fill="yellow"/>
<circle cx="75" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M85,65
L95,60
L85,70
Z"
fill="orange"/>
<path d="M65,100
Q60,100 60,115
M65,100
Q70,115 80,115
M105,100
Q110,115 120,115
M105,100
Q115,100 120,115"
stroke="orange" stroke-width="3" fill="none"/>
<path d="M45,70
Q20,60 45,50
M135,70
Q160,60 135,50"
stroke="yellow" stroke-width="6" fill="none"/>
</svg>
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M50,70
Q50,35 90,35
Q120,35 120,70
Q120,100 90,100
Q70,110 60,100
Q40,100 50,70"
fill="yellow"/>
<circle cx="75" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M85,60
L100,55
L85,50
L100,65
Z"
fill="orange"/>
<path d="M65,100
Q60,100 60,115
M65,100
Q70,115 80,115
M105,100
Q110,115 120,115
M105,100
Q115,100 120,115"
stroke="orange" stroke-width="3" fill="none"/>
<path d="M45,70
Q20,60 45,50
M135,70
Q160,60 135,50"
stroke="yellow" stroke-width="6" fill="none"/>
</svg>
改めて、最終的な成果物はこちら。
9歳の息子に見せて「これは何?」と聞いたら「ひよこ!」と即答したのでゴールに辿り着いたとみなして良さそう。
ひよこというものを知らない人に対して、ひよこの特徴を言葉だけで教えながら書かせたらこうなるだろう、という結果になった気がする。面白い。
このまとめを書いている途中で、SVGはアニメーションにも対応していることを思い出したので、最後にそれをChatGPTにお願いしてみる。
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M50,70
Q50,35 90,35
Q120,35 120,70
Q120,100 90,100
Q70,110 60,100
Q40,100 50,70"
fill="yellow"/>
<circle cx="75" cy="50" r="5" fill="black"/>
<circle cx="105" cy="50" r="5" fill="black"/>
<path d="M85,60
L100,55
L85,50
L100,65
Z"
fill="orange"/>
<path id="left-leg" d="M65,100
Q60,100 60,115
M65,100
Q70,115 80,115"
stroke="orange" stroke-width="3" fill="none">
<animate attributeName="d" dur="0.5s" begin="0s" repeatCount="indefinite"
values="M65,100
Q60,100 60,115
M65,100
Q70,115 80,115;
M65,100
Q60,115 60,115
M65,100
Q70,100 80,115" />
</path>
<path id="right-leg" d="M105,100
Q110,115 120,115
M105,100
Q115,100 120,115"
stroke="orange" stroke-width="3" fill="none">
<animate attributeName="d" dur="0.5s" begin="0s" repeatCount="indefinite"
values="M105,100
Q110,115 120,115
M105,100
Q115,100 120,115;
M105,100
Q110,100 120,115
M105,100
Q115,115 120,115" />
</path>
<path d="M45,70
Q20,60 45,50
M135,70
Q160,60 135,50"
stroke="yellow" stroke-width="6" fill="none"/>
</g>
</svg>
ChatGPTによるSVGお絵描きにはまだ可能性を秘めていそうだ。。。
※ ちなみにこのnoteのカバー画像はMidjourneyが描いたもの。
(2023/5/11) このnoteの続きを描きました