見出し画像

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に使用したプロンプトとハッシュ名が追記されていきます。あ、タイムスタンプは日本時間じゃないですごめんなさい。あとは適当に画像サイズ等はカスタマイズしてください。

今回のプロンプトは

best quality , monochrome , lineart, 1girl, flat chest , long hair ,black hair, hoodie, black shorts, round eyewear, white background, oldest

oldestってやると若干絵柄が古くなるらしいけどanimagine-xl-3.0はあんまり変わらないかも

参考記事


出力はこんな感じ


これを元に適宜プロンプトを変更し、GoogleDriveに使いたい画像を保存して組み合わせて漫画にしていくって感じです。
そのほか人物以外や少し凝ったものを描きたい場合には比較的プロンプトに忠実な画像を出せるMicrosoftのCopilot (を経由したDALL·E 3)も使うことにします。こちらは書くまでもないですが「〇〇をしている××を描いて、右に△△で左に□□な感じ」など日本語で細かく指定しても割と(あくまで割と)忠実に描いてくれます。

準備2~プロット~

次にプロット、つまり内容の構成です。これに関しては今まで漫画や小説を描いたことがあるかどうかによって難易度は大きく変化します。私は漫画は読むことはあっても書いたことはほぼ0なのでストーリーを作っての漫画はまず無理と判断しました。AIの力を持ってしても、恐らく初手でストーリー漫画は容易ではないと思います。逆にストーリー作るのが得意な人はもうここは読み飛ばしてください。
さて、ストーリーを作るのが無理ならどうするか。そう、解説系ジャンルの漫画にします。これなら登場人物も一人、多くても二人で済みますし背景もそんなに凝ったものは必要になりません(多分)

で、著作権侵害リスクが比較的低い解説漫画の具体的なテーマの例は?
を面倒くさいのでperplexityに聞きます。回答はこちら

著作権侵害リスクが比較的低い解説漫画のテーマとしては、以下のような例が考えられます:
一般的な知識や情報を扱うテーマ
歴史的事実
歴史上の出来事や人物についての解説漫画は、事実に基づいている限り著作権侵害のリスクが低くなります。
科学的概念
物理学の法則や化学反応のメカニズムなど、科学的な事実や理論を説明する漫画も比較的安全です。
日常生活のヒント
料理のコツや掃除の方法など、一般的な生活の知恵を紹介する漫画は、著作権の問題が生じにくいでしょう。
オリジナルの解釈や表現を重視するテーマ
法律や制度の解説
法律や社会制度について、独自の視点で分かりやすく説明する漫画は、著作権侵害のリスクが低くなります。
健康・医療情報
一般的な健康知識や医療情報を、オリジナルのキャラクターや設定を用いて解説する漫画も安全性が高いでしょう。
言語学習
語学学習のための文法解説や会話例を、独自のストーリーやイラストで表現する漫画も考えられます。
注意点
これらのテーマであっても、他の著作物から直接的に内容や表現を借用することは避けるべきです。また、引用を行う場合は、著作権法上の引用の要件を満たすよう注意が必要です[1]。さらに、たとえ著作権侵害に該当しない場合でも、他者の著作物を過度に参考にすることは倫理的な問題を引き起こす可能性があるため、できる限りオリジナルの表現を心がけることが重要です。

perplexity

とのことです。
最初オカルト系でアクロバティックサラサラとかの解説にしようかとも思ったんですが、出典元がよくわからなかったので諦めました。まあ、今回はお試しなのでなんでもいいのですがせっかくなので「木星について」の解説漫画にします。Gpt-4oにプロットを書かせます。

木星についての解説漫画のプロットを書いて、登場人物は一人、読み手に解説する風にして

もちろんです!以下は、木星についての解説漫画のプロットです。

タイトル: 「木星の秘密」
登場人物:
ジョー: 天文学者であり、木星について読み手に解説する役割を持つ。
ページ1:
(背景:星空の下、天体望遠鏡をのぞくジョー)
ジョー: 「やあ、みんな!今日は太陽系で一番大きな惑星、木星について話そう。」
ページ2:
(背景:宇宙空間に浮かぶ木星の美しい姿)
ジョー: 「木星はガス惑星で、主に水素とヘリウムでできているんだ。直径は地球の約11倍もあるんだよ。」
ページ3:
(背景:木星の大赤斑のクローズアップ)
ジョー: 「ここに見えるのは『大赤斑』。これは巨大な嵐で、地球がすっぽり入るくらいの大きさなんだ。300年以上も続いているんだよ!」
ページ4:
(背景:木星の衛星、イオ、エウロパ、ガニメデ、カリストのイラスト)
ジョー: 「木星にはたくさんの衛星があるけど、その中でもガリレオ衛星と呼ばれる4つが特に有名だ。イオ、エウロパ、ガニメデ、カリストだね。」
ページ5:
(背景:イオの火山活動のシーン)
ジョー: 「イオは火山活動がとても活発で、太陽系で最も火山が多い天体なんだ。すごいよね!」
ページ6:
(背景:エウロパの氷に覆われた表面とその下に広がる海の想像図)
ジョー: 「エウロパの表面は氷で覆われていて、その下には広大な海が広がっていると考えられている。もしかしたら、そこに生命がいるかもしれないんだ。」
ページ7:
(背景:ガニメデの詳細な地形図とカリストのクレーター)
ジョー: 「ガニメデは太陽系で最も大きな衛星で、カリストはクレーターがたくさんある古い表面を持っているよ。」
ページ8:
(背景:木星の磁場のイメージ図)
ジョー: 「木星の磁場はとても強力で、地球の約20,000倍も強いんだ。この磁場が、木星の周りに巨大な放射線帯を作り出しているんだよ。」
ページ9:
(背景:木星探査機ジュノーのイラスト)
ジョー: 「そして、木星を詳しく調べるために、NASAの探査機ジュノーが現在も木星の周りを飛んでいるんだ。ジュノーのおかげで、木星について新しい発見がどんどん増えているよ。」
ページ10:
(背景:再び星空の下のジョー)
ジョー: 「どうだったかな?木星にはまだまだたくさんの謎があるんだ。これからも一緒に宇宙の秘密を探っていこう!」
(ジョーが星空に手を伸ばしているシーンでエンディング)
このプロットを基に、漫画を描いていけば、読み手に興味深い木星の知識を楽しく伝えることができるでしょう。

GPT-4o

はい、良い感じなんではないでしょうか。
ジョーには美少女になってもらいましょう。

準備3~ネーム~

プロットが出来たら次はコマ割りなどを考えつつネームの作成です。今回はWorld Makerの「脚本から作成」という機能を使っていきます。

プロットの内容をコピペ

一コマにセリフは最大3つ、コマは1ページあたり6つまでという制約がありますが、逆にこれに沿って作ればそんなにおかしなことにはなりません。最初は操作感に癖があるのでめんどくさいかもしれませんが慣れれば便利です(多分)
なんというか1ページ分ずつ一気にコピペして、ある程度改行してセリフボタンをタップしていくのが楽かなぁという感じ。
あ、一応PC版もあります

が、寝転がってできるのでスマホ版のほうがおすすめです。

ひとまず吹き出しも消して文字だけ、今回は見開き2ページの漫画です

ざっくり全体のイメージが掴めればOKですが、イメージが沸かない場合はWorld Makerの素材を仮置きして見るのも吉です。
あ、コマ割り自分でサクサクできる人は無理に使わなくてもOKですよ!

仕上げ

本来ならネームから下書きとかの作業が入りますが、今回は基本AIに絵を描かせるのでもうここから仕上げていきます。クリスタPC版を持ってるので迷ったのですが、ipad版とかは持ってないのでごろごろしながらibis使っていきます。ネーム通りにコマ割りや集めた画像配置して、併せて吹き出しや文字入れもしていきます。もっと画像沢山出力して似た絵柄だけ抜粋とかしてもよかったけど、サンプルなので適当なところで妥協しました、すんません。

World Maker(ピンクにしてます)を参考に配置

思ったよりCopilot (DALL·E 3)で出力した画像を使いました。木星とか衛生とか結構凄い。
こうして完成した2ページ漫画なわけですが、せっかくなのでkindleインディーズ漫画(無料)に登録してみました。こちらです。

ただインディーズだと1話完結でもシリーズ作ってから投稿なのかな??
って思いながらシリーズも1話のタイトルも「木星を語るAI」にしてあります。登録自体はめちゃくちゃ簡単でした。審査時間最初72時間と出ましたが2ページだからか次の日には通ってました。ちなみにPNGだとアップロードできなくてJPEGで投稿。

あ、余談ですが今回「天文学者ジョー」役で出演している女の子、絵柄は少々違いますが「リモートワークちゃん」としてLINEスタンプ出してます。良かったら見てみてください。

以上です!!ここまで読んで下さりありがとうございます。
今回は自分なりにやってみましたが、これがすべてではないので皆さんに合う方法を模索してみてはいかがでしょうか。

それでは、皆様よいAIライフを!

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?