AI漫画奮闘記
最近ずっと手を出したいと思っていたAI漫画ですが、どうやら前に書いた記事
のskyreelsが画像生成できなくなっている模様…。ちょいと残念ですが元々課金ユーザでないと商用利用も不可だったみたいなので別の方法を模索します。
準備1~画像生成~
まず準備として画像生成に使うツール。実際にガンガン出力するのはプロットの後くらいですが何を使って出力していくか、くらいは決めておきます。まあこれは個々のお好みでもいいのですが今回キャラクターの出力にはStable Diffusion XLを使おうと思います。モデルは商用利用可能なAnimagineXL v3.0です。私はよわよわPCしか持ってないのでgoogle colaboratoryを使います。あ、webUIは無料版では使えないのでwebUIは使いません!
下記のように使います。
# Google Colab環境向け
!pip install diffusers --upgrade
!pip install transformers accelerate safetensors
from google.colab import drive
import torch
from diffusers import (
StableDiffusionXLPipeline,
EulerAncestralDiscreteScheduler,
AutoencoderKL
)
from PIL import Image
from datetime import datetime
# Google Driveをマウント
drive.mount('/content/drive')
# VAEコンポーネントをロード
vae = AutoencoderKL.from_pretrained(
"madebyollin/sdxl-vae-fp16-fix",
torch_dtype=torch.float16
)
# パイプラインの設定
pipe = StableDiffusionXLPipeline.from_pretrained(
"cagliostrolab/animagine-xl-3.0",
vae=vae,
torch_dtype=torch.float16,
use_safetensors=True,
)
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
pipe.to('cuda')
from datetime import datetime
import os
import hashlib
import csv
# プロンプトリスト(各プロンプトはセミコロンで区切る)
prompt_list = "best quality , monochrome , lineart, 1girl, flat chest , long hair ,black hair, hoodie, black shorts, round eyewear, white background, oldest" #@param {type:"string"}
# 画像の枚数
num_images_per_prompt = 5 #@param {type:"integer"}
# 出力ディレクトリ
output_dir = '/content/drive/My Drive/sample/' #@param {type:"string"}
# プロンプトリストを分割してリストに変換
prompts = [prompt.strip() for prompt in prompt_list.split(';')]
negative_prompt = "nsfw, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name"#@param {type:"string"}
# マッピングファイルのパス
mapping_file_path = os.path.join(output_dir, 'prompt_hash_mapping.csv')
# ファイルが存在しない場合にのみファイルを作成
if not os.path.exists(mapping_file_path):
with open(mapping_file_path, mode='w', newline='') as mapping_file:
writer = csv.writer(mapping_file)
writer.writerow(['Prompt', 'Hash'])
for prompt in prompts:
# プロンプトからハッシュを生成してフォルダ名を短縮
hash_object = hashlib.md5(prompt.encode())
short_prompt_name = hash_object.hexdigest()
prompt_output_dir = os.path.join(output_dir, short_prompt_name)
os.makedirs(prompt_output_dir, exist_ok=True)
# マッピングをCSVに追記
with open(mapping_file_path, mode='a', newline='') as mapping_file:
writer = csv.writer(mapping_file)
writer.writerow([prompt, short_prompt_name])
# プロンプトを記載したテキストファイルを保存
prompt_file_path = os.path.join(prompt_output_dir, 'prompt.txt')
with open(prompt_file_path, 'w') as f:
f.write(prompt)
for i in range(num_images_per_prompt):
image = pipe(
prompt,
negative_prompt=negative_prompt,
width=1024,
height=1024,
guidance_scale=7,
num_inference_steps=28
).images[0]
# タイムスタンプを取得
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
# 画像を保存
image_path = os.path.join(prompt_output_dir, f"generated_image_{timestamp}_{i+1}.png")
image.save(image_path)
print(f"Image {i+1} saved to {image_path}")
はい、実際に打ち込んでみればわかると思いますがprompts はセミコロンで区切ると複数一気に指定できます。num_images_per_prompt は各プロンプトに対して何枚ずつ出すかです。各プロンプトをハッシュにしてGoogleDriveの任意の場所にフォルダを切ってその配下に画像を出力、合わせてプロンプトのテキストファイルを出力します。さらにprompt_hash_mapping.csvに使用したプロンプトとハッシュ名が追記されていきます。あ、タイムスタンプは日本時間じゃないですごめんなさい。あとは適当に画像サイズ等はカスタマイズしてください。
今回のプロンプトは
参考記事
これを元に適宜プロンプトを変更し、GoogleDriveに使いたい画像を保存して組み合わせて漫画にしていくって感じです。
そのほか人物以外や少し凝ったものを描きたい場合には比較的プロンプトに忠実な画像を出せるMicrosoftのCopilot (を経由したDALL·E 3)も使うことにします。こちらは書くまでもないですが「〇〇をしている××を描いて、右に△△で左に□□な感じ」など日本語で細かく指定しても割と(あくまで割と)忠実に描いてくれます。
準備2~プロット~
次にプロット、つまり内容の構成です。これに関しては今まで漫画や小説を描いたことがあるかどうかによって難易度は大きく変化します。私は漫画は読むことはあっても書いたことはほぼ0なのでストーリーを作っての漫画はまず無理と判断しました。AIの力を持ってしても、恐らく初手でストーリー漫画は容易ではないと思います。逆にストーリー作るのが得意な人はもうここは読み飛ばしてください。
さて、ストーリーを作るのが無理ならどうするか。そう、解説系ジャンルの漫画にします。これなら登場人物も一人、多くても二人で済みますし背景もそんなに凝ったものは必要になりません(多分)
で、著作権侵害リスクが比較的低い解説漫画の具体的なテーマの例は?
を面倒くさいのでperplexityに聞きます。回答はこちら
とのことです。
最初オカルト系でアクロバティックサラサラとかの解説にしようかとも思ったんですが、出典元がよくわからなかったので諦めました。まあ、今回はお試しなのでなんでもいいのですがせっかくなので「木星について」の解説漫画にします。Gpt-4oにプロットを書かせます。
木星についての解説漫画のプロットを書いて、登場人物は一人、読み手に解説する風にして
はい、良い感じなんではないでしょうか。
ジョーには美少女になってもらいましょう。
準備3~ネーム~
プロットが出来たら次はコマ割りなどを考えつつネームの作成です。今回はWorld Makerの「脚本から作成」という機能を使っていきます。
一コマにセリフは最大3つ、コマは1ページあたり6つまでという制約がありますが、逆にこれに沿って作ればそんなにおかしなことにはなりません。最初は操作感に癖があるのでめんどくさいかもしれませんが慣れれば便利です(多分)
なんというか1ページ分ずつ一気にコピペして、ある程度改行してセリフボタンをタップしていくのが楽かなぁという感じ。
あ、一応PC版もあります
が、寝転がってできるのでスマホ版のほうがおすすめです。
ざっくり全体のイメージが掴めればOKですが、イメージが沸かない場合はWorld Makerの素材を仮置きして見るのも吉です。
あ、コマ割り自分でサクサクできる人は無理に使わなくてもOKですよ!
仕上げ
本来ならネームから下書きとかの作業が入りますが、今回は基本AIに絵を描かせるのでもうここから仕上げていきます。クリスタPC版を持ってるので迷ったのですが、ipad版とかは持ってないのでごろごろしながらibis使っていきます。ネーム通りにコマ割りや集めた画像配置して、併せて吹き出しや文字入れもしていきます。もっと画像沢山出力して似た絵柄だけ抜粋とかしてもよかったけど、サンプルなので適当なところで妥協しました、すんません。
思ったよりCopilot (DALL·E 3)で出力した画像を使いました。木星とか衛生とか結構凄い。
こうして完成した2ページ漫画なわけですが、せっかくなのでkindleインディーズ漫画(無料)に登録してみました。こちらです。
ただインディーズだと1話完結でもシリーズ作ってから投稿なのかな??
って思いながらシリーズも1話のタイトルも「木星を語るAI」にしてあります。登録自体はめちゃくちゃ簡単でした。審査時間最初72時間と出ましたが2ページだからか次の日には通ってました。ちなみにPNGだとアップロードできなくてJPEGで投稿。
あ、余談ですが今回「天文学者ジョー」役で出演している女の子、絵柄は少々違いますが「リモートワークちゃん」としてLINEスタンプ出してます。良かったら見てみてください。
以上です!!ここまで読んで下さりありがとうございます。
今回は自分なりにやってみましたが、これがすべてではないので皆さんに合う方法を模索してみてはいかがでしょうか。
それでは、皆様よいAIライフを!
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?