セーブポイント

特にジャンルの決まってない雑記です。

読み上げ白上フブキが欲しいので作った - 技術日記 2月8日号

前々から声質変換とか音声合成に興味があって「やりたいな~」と思っていたのですが、Diff-SVCという手法(?)がすごいのでやってみた、という記事です。

日本語どころか、英語でもあんまりドキュメントっぽいのが無いな~って感じなのでざっくり解説。

  作成したモデルは良識を持って使いましょう。

基本的な訓練の流れは公式のドキュメントを参照。
ここ→ training_and_inference_EN.markdown


必要なもの:

  • VRAM24GB以上GPU(訓練時)

24GBもねえよって人でもクラウドで借りればできるので、安心。今回自分はColaboratoryでやったので適当に参考にしてください。

ちなみに私はRTX 3070ユーザーです。

1. 学習データの収集

まず学習に使うデータ集め。1つの音声ファイルは5秒から15秒程度にするとよく、今はwav形式かogg形式がサポートされているようです。

音声データは目的となる話者の声のみが含まれていて、他の人の声やBGMなどが含まれていないものである必要があります。

学習データはトータルで3時間分程度(あるいはそれ以上)が推奨されています。

今回は適当な最近の雑談配信を3つくらい選んで(総データ量としては4.25時間分くらい、うち8割くらいを訓練に使用)使いました。

背景雑音の除去

配信の音声を学習データに用いるわけですが、当然そのままだと一般的にはBGMなどが含まれていると思うので、除去します。

今回はMetaからリリースされているDemucsというモデルを使いました。

github.com

音声分離をしたいだけならpip installするだけで使えるようになるので非常に便利です。

普通は歌の音源からボーカルや楽器などの音などの音を分離するために使う想定だと思いますが、BGMの除去にも使えます。しかも、結構高品質に声を抜き出せます。いい時代になりました。

音声分離に用いるモデルはいくつか選べるのですが、今回は標準の設定のまま(htdemucs)にしました。ローカルでは音声1秒あたり1秒ちょっとで処理できるくらいのスピードで、学習データ全体の処理には4~5時間程度かかりました。まあ、ゲームとかして待ってればいいですね。

2. 学習済みモデルを準備する

Diff-SVCリポジトリには必要なモデルは含まれてないので、自分で追加でダウンロードしてきます。

github.com

ここから0102_xiaoma_pe.zip0109_hifigan_bigpopcs_hop128.zipをダウンロードします。Diff-SVCディレクトリの中にcheckpointsというディレクトリを作成して、解凍したモデルをそれぞれ入れておきます。

また、以下のリポジトリからHuBERT-Softのモデルをダウンロードしてこれもcheckpoints/hubert/に保存しておきます。

github.com

3. 学習用の設定を変更する

公式のドキュメントを参考に、trainingディレクトリの中にあるconfig.yamlを編集します。

今回はlearning rateなどはサンプルからパクりました。本当にそれでいいのか?

学習データやHuBERTなどのパスが正しいかちゃんと確認しておきましょう。

4. 学習データのプリプロセス

先程集めた生の学習データがそのまま訓練に用いられるわけではなく、前処理があります。何をしているのかは知りません。(?)

自分の環境では1時間弱くらいでした。飯食ったり風呂入ったりしてれば終わります。

5. 訓練(本編)

「VRAM8GBでもいけるかな~」と思っていたら、普通にOut of Memoryでダメでした。

Colabの無料枠のTesla T4(VRAM16GB)で耐えるかなあと思ったらこいつでも普通にOut of Memoryになったので、諦めて普通に課金。まあグラボ新しく買うよりは安いので……。

なんかGCPのCompute Engineの方が安上がり?みたいな説も聞いたのですが、訓練のコマンド1つ叩くためだけにVMのセットアップを1からやるのがめんどうで、普通にColabにしてしまいました。

初めてColab Proを使ったのですが、1ヶ月GPU使い放題なのかと思ったら流石にそんなことはなく、現在はコンピューティングユニットと呼ばれるポイントで使用量が管理されているようです。

note.com

A100を初めて使いました

ところで、GPUクラスをプレミアムに設定したとき割り当てられるGPUA100V100の2択らしいんですが、V100ってVRAMが16GBのものと32GBのものがあるらしいんですよね。もしV100の16GBモデルが割り当てられてしまった場合、一回ランタイムを切断してガチャをする必要があるかもしれません。

訓練するのに先程前処理した学習データと2.でダウンロードしたモデルが必要ですが、自分はこんな感じでCloud Storage上に置いてそれを取ってくるようにしました。

一時的にデータを置く

訓練時にはチェックポイントが一定のstepsごとにcheckpoints内に保存されていきますが、この状態だとランタイムを切断すると消えてしまうのでちゃんとダウンロードしておきましょう。

Colabはもともと色々なPythonのパッケージがインストールされていますが、一部足りないパッケージがあるので訓練前に!pip install -r requirements_short.txtでパッケージのインストールをしておきます。

また、これだけだとtorchtext.legacyが存在しないみたいなエラーで怒られたのでpytorch-lightningをアプデしておくといいです。自分は今回1.8.5を使いました。

あとは訓練を回すのみ。

訓練の様子

右のパネルを見れば分かる通り、訓練中はVRAMを23.3GB食ってました。もしかすると、VRAM24GBぴったりのGPU(RTX 3090など)だと絶妙にできないかも……?

今回訓練に使用したのは15秒間の音声データ804個分でしたが、64000stepsくらいまでやって所要時間8時間半くらい。A100使ってなかったら、めちゃくちゃ時間かかってそうです。使ってよかったかも。

A100を使うためにColab Proで付いてくるコンピューティングユニット100と追加で100買ったのですが、115くらい使いました。まあ、A100を買おうとしたら普通に100万円じゃ済みませんから、2200円くらいで簡単にこのレベルのGPUを借りれるのは、非常に便利ですね……。GCEだったらいくらになるんでしょうね。

最近はModalっていうGPUを比較的安く借りられるサービスもあるみたいですね。

modal.com

使い方がちょっと複雑っぽいですが、こちらでもA100は借りれるみたいなので選択肢としてありかも?

6. 推論

で、やりたかったことはここから。モデルができたのはいいですが、Diff-SVCは声質変換をしてくれるもので、text-to-speechができるモデルではありません。

でもまあ、じゃあVOICEVOXとかCOEIROINKで適当に音声を生成してそれを声質変換にかければそれっぽいのができますよね。

COEIROINKのつくよみちゃんを使って作ったサンプル。(音量の調節をしてないので出力が小さいです)

声質変換する前の音声データ:

変換した音声データ:

音質が荒く聴こえるのは、サンプリングレートが低いせい?
画像のsuper-resolutionみたいに、音声の品質を上げてくれるみたいなソフトウェアがあると嬉しいんだけど、あるのかな。

入力側のアクセントとかを直してあげれば、もっといい感じにできるはず。

ちなみに、推論は普通にRTX 3070でもできます。しかも結構高速。いいですね。

Diff-SVCの本領である歌声とかもやってみたい。うまくできるかなあ。

(もっとサンプル追加できたらする)

その他の似たサービスとか

MicrosoftVALL-Eが完全にDiff-SVCの上位互換ですが、まあどうせそんなに簡単に一般公開されるはずがないので、今回声質変換モデルを自作してみました。

もっとお手軽な音声合成サービスとしてElevenLabsが公開しているPrime Voice AIというのもあります。英語限定ですが、こちらも面白いです。

beta.elevenlabs.io

まあDiff-SVCも訓練自体は時間がかかるとはいえ、逆に言えばほとんど待つだけで今回くらいの品質を出せるということで、かなり簡単ではあると思います。

簡単になりすぎても、Deepfakeやらなんやらでよくないですが……。

追記

後継っぽい別の手法でやった続編出ました。こちらの方がより簡単です。

new-file.hatenablog.com

2023.01版 画像生成ガイド (for AUTOMATIC1111 web UI)

※記事タイトルに2023.01版とある通り、一部情報が古かったりします。ご注意ください。

2022年の半ばごろから画像生成モデルが流行りに流行っていますが、その影響で一ヶ月前くらいの情報もこの界隈では「古い」情報となっていっています。

特にAUTOMATIC1111氏を中心に数多くのcontributorsにより開発されているStable Diffusion web UIは非常にコミュニティが活発であり、頻繁に機能追加や仕様変更が行われています。そのため、現時点*1での知見をここにまとめてみます。

画像生成にこれから触れてみたい人向けっぽく書いてみますが、既に画像生成に慣れ親しんでいる人にも役に立つ情報もいくつかあると思います。

txt2imgについて

txt2imgタブ(公式リポジトリより引用)

画像生成といっても実写系イラスト系のざっくり二種類あると思いますが、自分の興味はイラストの方なので以降はこっちを念頭にして話します。

どのモデルを使えばいいか

画像生成を始めるには、まずは使うモデルを選ぶところからです。

3ヶ月ほど前はイラストと言えばNovelAI Diffusion一強時代でしたが、今は様々なイラストに特化したモデルが存在しています。
思いつくだけ書いてみます。(モデルが一般公開されているもののみ)

最近よく名前を聞くものだと、だいたいこの辺りでしょうか?モデルが公開されていないものだと、HolaraやNijijourneyとかもありますね。

とまあ、これだけ色々なモデルがあるので本当に好きに選んでいいです。それぞれのモデルが公開されているリポジトリに行くとサンプル画像などがあるので分かると思いますが、どれも品質は高く元祖イラスト生成のNovelAIに劣らずといった状況です。

モデルの探し方ですが、最近のモデルはほとんどHugging FaceCivitaiで公開されているものがほとんどだと思います。

huggingface.co

civitai.com

本当に様々なモデルがあるので、ここから新しいモデルを探してみるのも一興でしょう。
Hugging Faceは機械学習全般を取り扱っているサービスですが、Civitaiは画像生成に特化したサービスなので使いやすいです。

また、現在は更新されていないみたいですが、以下のようなモデル一覧ページがあったりしました。こういうのが今でもあるといいんですけどね。

rentry.co

VAEについて

少し専門的な話になりますが、Stable DiffusionのモデルはざっくりText Encoder、VAE、U-Netという3要素から構成されており、web UIではこのうちのVAEを簡単に交換して画像生成をすることができます。技術的な話をもっと知りたい方は、以下のような記事を参照するとよいと思います。

qiita.com

NovelAI以来、イラスト向けのモデルを使う際はイラスト用のVAEを使うことが一般的になっています。イラスト向けに訓練されたVAEはいくつか存在するのですが、通常使われているのは以下の3択のうちどれかでしょう。

3つ目のVAEはStable Diffusion用のもので特にイラスト用というわけではないのですが、イラスト用途にも普通に使うことができます。

VAEを変えると何が変わるの?という話ですが、比較してみます。

VAEの比較

3つの中だと、animevaeが柔らかい色になり自然なイラストっぽい印象を受けます。後者2つの違いは、パッと見あんま分からないですね。気になったら自分でも実験してみてください。

ちなみに、VAEをNoneに設定したまま生成してしまうと以下のような色あせたっぽい出力が得られます。

VAEの設定に失敗しているときの出力

このような出力になってしまっているときはVAEの設定をどこかで間違えてしまっていると思うので、設定を確認してみてください。(過去にweb UIのバグでVAEが上手く設定されない時期がありましたが、今は直っていると思います)

モデルのマージについて

先程色々なイラスト向けのモデルを紹介しましたが、最近はモデルをそのまま使うだけでなく、マージ(ブレンド)して使うということも多くなっています。

モデル同士をブレンドしてあげることで、平たく言えば両者のいいとこ取りのような新しいモデルを自分で作成することができます。
以下のような先行研究を参照していただけると、より理解が得られると思います。

note.com

こちらの記事はだいぶ古いものですが、現在のモデルにおいても同様のことができます。

また応用的な話になりますが、単純なマージだけでなく最近ではU-Netのブロックごとに異なる比率でモデルをマージするという手法も提案されています。

note.com

この技術は先程紹介したOrangeMixのうちAbyssOrangeMix2に実用されていたりします。

モデルのサイズがデカすぎるんだけど?

注意: この節の内容は現在非推奨です。代わりに以下の拡張機能などを利用してください。

github.com

画像生成モデルのチェックポイントは平均5GBくらいあるので、いくつかモデルを使うくらいならいいのですが色々なモデルを試そうとするとストレージをかなり大きく占有してしまいます。

単純な解決策として、モデルを公開している人がファイル名の末尾に-halfとか-fp16がついたモデルを同時に公開してくれている場合、これを使うというのがあります。
これは推論の精度を落とした(半精度)モデルです。

精度を落として大丈夫なの?と思うかもしれませんが、実はこれほとんど影響がありません。もちろんオリジナル(単精度)のモデルと全く同じ出力が得られるわけではありませんが、気にならない程度のはずです(要検証)*3。気になる方は、2種類のモデルをダウンロードしてみて比較してみてもよいでしょう。

追記:
web UIはそもそもロードしたモデルを(デフォルト設定では)fp16にして扱っているので、単精度のモデルを使っても半精度のモデルを使っても理論上ほとんど差は無いはずです。構図が変わってしまうときは、多分何かがおかしい。

しかしながら、複数バージョンのモデルが公開されていないことも多々あると思います。でも、そういう場合でも大丈夫です。モデルのサイズカット、実は自分ですることができます。

github.com

こちらのスクリプトを利用することで自分で半精度版のモデルを作成することが可能です。

ですが本題はここからで、実はもっとモデルのサイズを削減できます

先程Stable DiffusionはText Encoder、VAE、U-Netの3要素からできているという話をちらっとしましたが、このうちU-Net以外の部分を削ぎ落としてしまっても実はweb UI上で問題なく画像生成ができます。
VAEは外から別途読み込みますし、Text Encoderもおそらくそういう仕組みになっているんでしょう(動くのだからそうなっていないとおかしい、よね?)。

以上の最適化をまとめて行うには、以下のようなオプションでスクリプトを実行すればよいです。

$ python prune.py -pca [サイズ削減したいモデルのパス] [出力先のパス]

実際にこのスクリプトBloodNightOrangeMixのチェックポイントを圧縮してみたところ、以下のような結果になりました。

ダウンロードしたチェックポイント

最適化したチェックポイント

容量が29%ほどに。こんな感じでかなりのストレージの節約が可能です。

このスクリプト、safetensorsに対応してないので対応させようとしてforkしたはいいもののまだ何も手をつけてません。
時間が空いたときにやりたいですね(願望)。

2023/01/14追記:

safetensorsに対応させました。

github.com

プロンプトの書き方

Stable Diffusionでの効果的なプロンプトの書き方は、モデルが一般公開されて以来ずっと研究が続いている分野となっています。

写実系のモデルだと自然言語風にプロンプトを書いたりしますが、アニメ調のモデルの場合大抵Danbooruのタグを利用して学習がされていることが多く、Danbooruのタグをたくさん知っていると得です。

danbooru.donmai.us

例えば特定のキャラクターを生成してみたい場合、そのキャラクターの投稿に付けられているDanbooruタグを参考にプロンプトを書くとよりそれっぽい再現ができます。

以下、プロンプト作成の参考になるものなどを紹介します。

まず、生成モデルにより生成された画像専門の投稿サイトである、AIBooruMajinAIなどを参考にするのがおすすめです。Danbooruよろしく、AIBooruもNSFW系の画像が特にフィルタされていないので閲覧する際はご注意ください。

aibooru.online

majinai.art

どちらもサービスも投稿された画像のメタデータを閲覧することができ、どのモデルが使われているか、どんなプロンプトが用いられているかなどを知ることができます。
気になるものがあったらいくつか参考にしてみるといいでしょう。

また、今となってはプロンプトの書き方などが若干古臭くはありますが、元素法典も良い教科書だと思います。

note.com

docs.qq.com

docs.qq.com

docs.qq.com

あと、以下は体のパーツごとなどに分けられたプロンプトのデータベースです。非常に有用。

lunarmimi.net

p1atdev.notion.site

プロンプトはより短いほうが好ましい?

特にNegativeの方のプロンプトについての話です。

元素法典が出た頃などは生成される画像の品質向上のため、長大なNegative promptが用いられていました。こういうやつです。

multiple breasts, (mutated hands and fingers:1.5), (long body:1.3), (mutation, poorly drawn:1.2) , black-white, bad anatomy, liquid body, liquid tongue, disfigured, malformed, mutated, anatomical nonsense, text, font, ui, error, malformed hands, long neck, blurred, lowres, bad proportions, bad shadow, uncoordinated body, unnatural body, fused breasts, bad breasts, huge breasts, poorly drawn breasts, extra breasts, liquid breasts, heavy breasts, missing breasts, huge haunch, huge thighs, huge calf, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, fused ears, bad ears, poorly drawn ears, extra ears, liquid ears, heavy ears, missing ears, fused animal ears, bad animal ears, poorly drawn animal ears, extra animal ears, liquid animal ears, heavy animal ears, missing animal ears, missing fingers, missing limb, fused fingers, one hand with more than 5 fingers, one hand with less than 5 fingers, one hand with more than 5 digit, one hand with less than 5 digit, extra digit, fewer digits, fused digit, missing digit, bad digit, liquid digit, colorful tongue, black tongue, cropped, watermark, username, blurry, jpeg artifacts, signature, 3D, 3D game, 3D game scene, 3D character, malformed feet, extra feet, bad feet, poorly drawn feet, fused feet, missing feet, extra shoes, bad shoes, fused shoes, ...

まあ、長い。

ところが、現在ではこういうことはしないのが普通です。代わりに、以下のembeddingが用いられていることが多いと思います。

huggingface.co

embeddingってtextual inversionで使うやつじゃないの?と思うのですが、どうやら概念学習にも使えるようです。

こういうこと(7th Layerのリポジトリから引用)

ざっくり言えば、bad_promptは上のような大量のNegative promptを数トークンにまとめてくれるみたいなものです。これが非常に便利なため、現在ではこれが主流のように思います。

これが要因かは分かりませんが、最近はNegative promptはシンプルに、みたいな流行りを感じます。

bad_promptと同様に、以下のnegative用のembeddingもおすすめです。

huggingface.co

プロンプトの「汚染」について

少しディープな別に知らなくても良い感じの話です。

画像生成で少し遊んでいると、色指定したはずの服や髪などが違う色になったり、そういう場面に出くわすことがあります。これは「色汚染」と言われたりする現象です。

まずStable Diffusionが画像生成をするとき、CLIPが与えられたプロンプトをトークンと呼ばれる単位に分割します。プロンプトを入力しているとき、入力欄の右下に出ているx/75みたいなやつが現在の使用トークン数になっています。

ここで、各トークンは先頭に近いほど生成される画像に対する影響力が強く、逆に末尾に近いほど相対的に影響力が弱くなります(Transformerの仕様らしい)。これが基本的な仕組みです。

ここからがweb UIに特有の話で、Stable Diffusionは通常75トークンまでの長さのプロンプトにしか対応していない(それを超えた部分は無視される)のですが、web UIではその上限がなく(225トークンまで?真偽不明)より詳細な指定をモデルに与えることができます。
この機能は75トークンごとに入力を区切ることで実現されているらしく(75トークンのまとまりを一般的に文節と呼ぶっぽいです)、この影響で76トークン目は再び1トークン目と同じ影響力を持つようになります。

この仕様のため、長いプロンプトの真ん中あたりに単語を新しく挿入したりすると意図せずガラッと出力が変わってしまったりします。この文節の区切りを意識できるようになると上手い生成ができるようになるかも。

で、ここまで話すと「汚染」の話ができます。と思ったのですが、自分もまだ完全には理解できていないので偉大な先行研究を紹介するにとどめておこうと思います。

mag-caps.hatenablog.com

人間的に正しい形容詞 名詞を使うのではなく、名詞 形容詞 名詞とすると「色移り」が多少軽減できるらしいです。自分もこれから使ってみようかなと。

カンマはトークンを消費するので付けなくてもいいのではみたいな話もあるみたいです。深い。

プロンプトの入力補助ツール

NovelAIみたいにweb UI上でもDanbooruタグが補完できたらなあ、と思ったあなた。なんと、拡張機能があります。

github.com

マジでプロンプトの入力の効率が上がる(+typo軽減になる)ので、Danbooruタグを使うモデルを普段使っている場合は入れて損はないです。

Sampling methodについて

プロンプトが決まったら、次に決めるのはSampling methodでしょうか。

web UIで使えるサンプラーは最初は10個も無かったのですが、今ではアプデされて20個くらいになりました。さて、どれを使ったらいいものか。微分方程式の数値解法なんて知らんし。

最初期はみんなEulerEuler a (ancestral)を使ってた気がしますが、最近はDPM++ 2M Karrasを使ってる人が多い気がします。自分も普段これです。

あとはたまにDPM++ SDE KarrasDDIMをみかけたりするかな、くらい。

全く適当に選んでいるわけではなくて、ここのサイトに書かれているようにサンプラーはそれぞれ特徴があります。

dskjal.com

自分はDPM++ 2MPLMSを試したりしていた時期がありましたが最終的にDPM++ 2M Karrasに落ち着きました。

Hires. fixについて

正月くらいに仕様が変わったので書いておきます。

txt2imgタブ拡大図

Hires. fixは、高解像度の画像を生成したいときに使う機能です。高解像度にすると、イラストの書き込みが自然に増えてちょっと良い感じになります。

「いや、でかい画像生成したいなら最初からWidthとHeightをデカくすればいいじゃん」と思うのですが、これをすると人体などが破綻します……。

具体例みたいなのは、web UIのWikiのFeatures/Hires. fixの項を見ていただけると良いと思います。

github.com

これはおそらく学習した画像のサイズ(SDv1時代ならおそらく512x512)とかけ離れたサイズの出力はできないという特性なのだと思うのですが、これを間接的に解決してくれるのがHires. fixです。

(現行の)Hires. fixではまず通常のWidth/Heightで設定されたサイズで画像を生成し、これを指定されたUpscalerでUpscale byの値倍に拡大しさらにそれをimg2imgにかけます。このように直接大きな解像度の画像を生成するのを避けることで先程の問題を回避しています。(断定で話していますが100%の確証はないです、多分こんな処理のフローだと思います)

Hires. fixの際に使うUpscalerをLatent系にすると、さっき言ったように高解像度になった分だけイラストの細部が描かれるようになり嬉しいです。

で、Latentが名前についてるUpscalerいっぱいあるやんという感じなのですが、正直現時点では自分もどれがいいのかよく分かりません。そもそもLatentとしか書いてないやつはなんなん?って感じですし。

普通の画像補間アルゴリズムっぽく、まあnearestよりはbicubicの方が品質が良いんだろうなということで今の設定になっているのですが、そもそも潜在空間上で何を補間しているのかもよく分からん。解説がほしいですね。

Latent (nearest-exact)Latent (bicubic antialiased)で計算コスト違うのかな、と思いましたが特に生成時のイテレーションの速度に影響があるようには見えませんでした。本当によく分かりません。

そんなわけで、現時点での私のおすすめUpscalerはLatent (bicubic antialiased)です。

Denoising strengthは初期値0.7ですが、高すぎる気がするので0.6くらいがいいような。0.5未満にすると出力がノイズっぽくなってしまうので、0.5-0.7くらいで調節すると良いと思います。

追記:
Hires Stepsについては以下の記事が分かりやすいです。

aioe.fanbox.cc

生成画像のファイル名をカスタムする

txt2imgで生成した画像はデフォルト設定のままだとoutputs/txt2img-imagesディレクトリ内に[連番id]-[seed].pngという形式でどんどん保存されていきますが、これだと管理がめんどくさいです。web UIの設定をいくつか変更してあげることで、もう少し良い感じの管理ができます。

Settings/Saving to a directory

私の場合、まず日付ごとにサブディレクトリに分けたかったので、上のような設定にしました。Directory name patternの部分にマウスオーバーすると日付以外の使用可能なタグを見れます。複数組み合わせられるので、日付とモデルのハッシュ値によってフォルダ分け、みたいなのも可能です。お好みでどうぞ。

Saving images/grids

ファイル名の設定は一番上のタブでできます。

web UIはデフォルトだとファイル名の先頭に連番で番号を付けてくれますが、私は番号より日時にしてくれたほうが嬉しかったのでこの設定にしました。末尾のseedの部分を除くと、Minecraftスクリーンショットと同じ命名規則になっています。日時にしておくと、違う日に生成した画像を混ぜたときに順番になってくれて嬉しいです。

seedは「一応書いておくと便利かな」と思って残してありますが、正直要らないかも。

同一時刻(秒まで同じ)に複数の画像が生成される可能性がある場合には、datetimeのフォーマット指定の部分を%Y-%m-%d_%H.%M.%S_%fのようにしておくといいです。(同名のファイルは上書きされてしまうため)
%fは現在時刻のマイクロ秒部分(6桁、leading zerosあり)です。

Additional Networks

便利な拡張機能の紹介です。

github.com

追加学習した分のデータをどのモデルでも使えるようにしてくれる拡張機能です。

生成した画像がたまに真っ黒になってしまうときは

(生成した画像が全て真っ黒になってしまうときは別の問題です)

コマンドライン引数に--no-half-vaeを追加してweb UIを起動してあげると直ると思います。

別の節でも話した通りweb UIはデフォルトでモデルを半精度にして読み込んでいますが、VAEをfp16にしてしまうとバグってしまう(?)みたいです。

生成の高速化とVRAM消費削減

web UIはxFormersによる推論の高速化に対応しており、とても便利です。

github.com

github.com

特にPascal以降のGeForceのグラボ(GT/GTX 10xx以降)を利用している人なら自動でインストールができるので導入しておくべきだと思います。

また、xFromersが利用できる環境でない人向けの軽量化の手段はまだあって、例えばこちらのプルリクエストで導入されたSub-quadratic Cross Attention layer optimizationというのがあります。

github.com

こちらはコマンドライン引数に--opt-sub-quad-attentionを追加することで利用できます。(まだ公式のWikiには記載されていないので知らない人も多そう?)

xFormersと同時に有効にすると、xFormersが優先されます。

一枚の絵に複数のキャラを描画するには

例えば2人のキャラクターを描きたいと思ったとき、素のStable Diffusionではプロンプトがどちらのキャラクターに対する指定なのか制御できないため、望み通りにキャラクターを生成するのはかなり難しい作業です。

しかしながら、以下の拡張機能を用いることで複数人のキャラクターの生成がかなりの精度で実現できるようになります。

github.com

note.com

2人だけでなく、3人なども可能です。

img2imgについて

inpaintingについて書こうと思ってたんですが、いつか追記します。

別の記事にするかも。

リンク集

本文では紹介しなかったものなど。

*1:commit hash: a176d89487d92f5a5b152401e5c424b34ff43b96

*2:Anything V3のチームが開発したモデルではなく、名前を借りただけのモデルです。AbyssOrangeMix2とCocoaなどのマージモデルであると言われています。

*3:これ嘘かもしれません。自分がxformersを使っているせいかもしれませんが、結構構図変わるやつもあるっぽいです。

好きなボカロPの話と、少しだけ音ゲーの布教。

この記事は、みす56代 Advent Calendar 2022の12日目の記事です。

たまには技術的な話をやめて普通の話をしたいなあと思ったので、今回はそんな感じです。

ボカロを聴いて育ったんだ

みなさん、ボカロって普段聴いたりしますか?

同じくらいの年齢の人だと、昔聴いてたけど最近はあんまりかなぁ、って人が多そうな気がします。かくいう私もそんな一人です。

小学生高学年とかのときがピークで一番聴いてたかな、という記憶です。カゲプロ(中二病生産コンテンツ)とかあったし、そんな時期でした。(今Google検索でカゲロウプロジェクトって画像検索したら嫌な記憶のせいなのか変な顔になりました、最悪です)月間ボカロランキングみたいなのも見てた。

自分は小学2年とか3年あたりの頃にうごメモでネットのコンテンツに触れるようになって、そのあとすぐニコニコ動画廃人になりました(原宿くらいからの世代)ニコ厨とかいう言葉も最近は聞かなくなりましたが。

そんな時期から、曲を聴いているアーティストで今でも好きな人がいます。ピノキオピーです。

『ザ・スーパーマリオブラザーズ・ムービー』2023年4月28日(金)公開

いやそれはキノピオやないかい。自分でもたまに言い間違えるけど。

twitter.com

そうそう、この方です。

わざわざこういう記事書くんだからもっとマイナーな人を紹介するのかと思った、と思われてそう?な気がしますが、まあこうやって紹介したくなるくらい好きなんですよ。

紹介する曲もだいたい時代ごとの代表作みたいな感じになりますが、知らない曲があったら聴いていってみてください。好きなものは好きだと言ったほうが長く続きますからね。

ざっくり思い出を振り返ってみる

ありふれたせかいせいふく

自分が初めてピノキオピーのことを認識したのは、うごメモで「ありふれたせかいせいふく」のPVを見たときでした。
本人のMVは下より。

open.spotify.com

小学生当時の自分は一目惚れならぬ一聴き惚れみたいな感じで、3DSのSDカードの中に入れていた曲のうちの一つになっていました。
この記事を書くにあたって今久しぶりに曲を聴いたのですが、今でも全然色褪せないですね。全然思い出補正じゃなくて安心します。

当時から今に至るまで、ピノキオピーの曲がなんで好きなのかってあまり自分でも言語化できていないしよく分かっていないんですが、どうしてなんでしょうね。不思議です。

こうやって紹介しておきながら、ピノキオピーの曲全部が自分の好みに刺さるかというとちょっと違くて、例えば「ありふれたせかいせいふく」(2012)と同時期くらいの有名曲で「腐れ外道とチョコレゐト」(2011)がありますが、こっちは当時の自分には比較的刺さらずって感じでした。もちろん別に、だからといって=「嫌い」ではないんですけどね(むしろ全然好き寄りではある)。
当時からなんとなく自分の感性に刺さる曲の特徴みたいなのがぼんやりあるんだろうなあ、って感じです。

推しの歌みたをこっそり紹介


www.youtube.com

ところで、みなさんはなんらかの曲を好きになる時、どの要素から入りますか?
歌モノだと、歌詞から入る人と曲から入る人の二大派閥がありそうですが、自分は歌詞より曲で好きになるタイプです。曲ってなんだよ、って感じですが、なんて言えばいいんでしょうね。旋律とか、フレーズとか?リズムとか?よく分かりません。

ただ、曲から入るタイプとはいえ、ピノキオピーの曲は歌詞も含めて好きなものが多いです。
ピノキオピーの曲の特徴なのか分からないんですけど、ボカロの曲の中ではMVを見たりしなくても歌詞が聞き取りやすい方な気がしていて、そういうのが理由の一つなのかなと思ったり。

あと普通に歌詞が「良い」って感じがします。いや、別に自分でも歌詞の中身を理解しているわけではないし、そもそも結構抽象的だしで、深くは語れないんですけど、なんか個人的に好みです。こんな感想しか言えない。

ありふれたせかいせいふく、曲調結構明るめですがちゃんと歌詞まで聴いてみると意外と寂しい歌詞で、小学生当時よりなんか今のほうが刺さる気がします。ボカロらしい曲。

すきなことだけでいいです

結構時間が飛びます。2016年リリースの曲らしいですね。

open.spotify.com

もうこの時期になるとあまり自分はボカロ聴かなくなってたんですけど、じゃあどうやってこの曲に出会ったのかというと、チュウニズムのおかげでした。

チュウニズム、みなさんご存知でしょうか?
そもそもゲーセンで音ゲーをやるっていう人間が、全人類の中でどれほどいるのかという話なんですが。

初プレイから1年以上かかってAJしてる

自分も中学2年くらいまではゲーセンにある音ゲー太鼓の達人しか無いと思ってたので、そんな感じの人も多いと思います。ゲーセン行く習慣ある人がそもそもあんまりいないと思うし、音ゲーコーナーなんてわざわざ知ってないと行かないですよね?

このあたりの詳しい話は、後で別でしたいと思います。(「音楽」が好きな人は、音ゲーをやってみて欲しいという話)

まあともかく、チュウニズムにこの曲が収録されているんですよね。これが、自分とピノキオピーの再会のきっかけでした。

で、この曲もまた今聴き直してるんですが。曲はもちろん良いんですけど、歌詞がピノキオピーっぽさ全開で今の自分に刺さり過ぎで、すごい。

初音ミク Wikiより抜粋

嬉しいわけでも悲しいわけでもないのに、なぜか泣けてくるんですよね。すきなことだけでいいです、ほんとうに。

ウソラセラ

先ほどチュウニズムの話が出たので、関連した曲です。
こちら、実はチュウニズム向けにピノキオピーが書き下ろした曲です(チュウニズムオリジナル曲)。そういうわけで、知らない人も多そうなので紹介。

これは公式の動画が無いので、Spotifyのリンクだけ貼っておきます。アルバム「HUMAN」に収録されています。「すきなことだけでいいです」の1つ前のトラックの曲。

open.spotify.com

これはいわゆる「ボカロ曲」、ではなくて本人が歌唱しています。珍しい?(最近コスモスパイスでも歌ってましたね)
コーラスにはVOCALOIDが使用されています。

チュウニズムのオリジナル曲には、基本1曲ずつ担当キャラクターがそれぞれいて、この曲は「少年A」というキャラクターのキャラソンのような曲になっています。だからといって別にキャラクターを知らないと曲が楽しめないというわけではないので、聴いてみてほしいです。

完全にボカロと関係のない余談ですが、チュウニズム古参(AIR時代)のプレイヤーにとっては結構思い入れがある人が多い曲かも。(昔はこの曲の譜面が難易度に対して比較的簡単な逆詐称譜面だったためレーティングを稼ぐことができた)

すろぉもぉしょん

曲の年代が前後してしまいました。すいません。
この曲は直接たくさん聴いていた、とかいうわけではなかったので飛ばそうと思っていたのですが、これもチュウニズムに収録されているので紹介します。

open.spotify.com

曲に対して「良い」くらいしかコメントできないのやめたいですね。この曲も、かなり好きです。ピノキオピー的。

恥の多い生涯なんて、珍しいもんじゃないし。

神っぽいな

また時代が飛びます。

言わずもがな。

www.youtube.com

open.spotify.com

これまで紹介した曲ともう比にならないくらい有名になって色んな人にカバーされて、なんかもう凄いですね。
当然ピノキオピーは元々有名ボカロPなんですが、にわかながら後方腕組みしそうになってしまいます。

最近の曲になるとピノキオピーっぽさが、だんだん濃縮・洗練されてきてるなあ~って感じますね。
逆に「神っぽいな」でピノキオピー知った、みたいな人がいたらこれまで紹介した曲もぜひ聴いて欲しいです。

最近はめっきりボカロ追ってないので、神っぽいなもVの歌ってみたで初めて聴きました。これ。

youtu.be

最近のボカロ事情は、ほとんど歌みたかプロセカ(をはじめとする音ゲー各種)から仕入れている老人です。

ノンブレス・オブリージュ

最近一番好きな曲。ていうか、この曲を聴いた影響でこの記事書きました。

www.youtube.com

open.spotify.com

曲名だけ聴いたことあったのですが、最近プロセカに収録されて、それでプロセカで遊んで初めて曲を聴きました。
で、プレイ中にこの曲めちゃくちゃ良くないか?となって今に至ります。

この曲を初めて聴いた翌日、脳内でずっと流れてた(←本当に誇張ではない)くらいには自分に衝撃を与えてくれた曲です。
ここまで何曲かピノキオピーの曲を紹介してきたわけなんですが、自分にとってはこの曲が一番のマスターピースに感じます。
この曲、ピノキオピーの(ニコニコ動画にある作品としては)100作目らしいです。「神っぽいな」は102作目らしいんですが、「ノンブレス・オブリージュ」のほうがかなり個人的に好み。もちろん、「神っぽいな」の方も「頓珍漢の宴」とかみたいな雰囲気があってピノキオピーらしいんですけどもね。

頓珍漢の宴もチュウニズムに収録されてます!(宣伝)

また推しの歌みた紹介


www.youtube.com

音楽が好きな人こそ、音ゲーをやると良い

タイトルの通り、ここからちょっと音ゲーの話をします。

みなさん、音ゲーって普段プレイしますか?
ボカロ関係だと、最近はプロセカがソシャゲ界の中でも影響力が頭一つ抜けてヤバくて、それでプレイしている人もちらほらいるんじゃないでしょうか。

まずは音ゲーをプレイするメリットの話をしたいです。
大きなメリットのうち一つは、自分の知らない良い曲に出会える機会ができることです。

先ほど自分もチュウニズムで久しぶりにボカロの曲を聴いたりした、みたいな話をしましたが、そういうことです。

今はボカロ特化の音ゲーのプロセカがあるので、ボカロの曲好きという人にはまずプロセカをおすすめします。
プロセカはちゃんと1曲に難易度上から下まで5つの譜面を用意してくれてるので、自分に合うやつでプレイすればいいです。EXPERTとかMASTERは別にやらなくていいです。音ゲーが得意になってきたらやりましょう。マルチも好きな難易度で遊べますからね。

プロセカに特有の話ですが、プロセカ収録曲って既存曲だけじゃなくて書き下ろし曲(公募など)もかなり多いんですよね。これが理由で、プロセカやってないと知れない曲も割とある気がしています。

ちょっとだけ好きな曲を紹介すると、こんなのとか。

www.youtube.com

www.youtube.com

www.youtube.com

「Iなんです」なんかは、つい最近の曲ですね。
ちなみに今回の記事ではピノキオピーの紹介をしたんですけど、ナナホシ管弦楽団も結構好きです。(シルプレ大好きおじさんより)

ただ、曲ももちろん良いんですけど、譜面も良かったりするんですよね。音ゲーの体験って、曲と譜面を一緒に合わせて成り立つものなので、あわよくばプロセカの譜面も一緒に楽しんで欲しいなと思います。
上で紹介した3曲のMASTER譜面は、全部個人的に気に入ってます。できると楽しい。(Iなんです以外はAP済み)

プロセカのオリジナル曲以外だと、ジェヘナとかフィクサーとかが好きかな。

youtu.be

www.youtube.com

www.youtube.com

で、ここからがある種本題(?)なのですが、プロセカでなんとなく音ゲー面白いなあと思ったらぜひゲームセンターにも寄ってみて欲しい、という話です。

アーケード音ゲーって結構色々あるんですよ。自分はチュウニズムの話をしましたが、別に入り口はなんでもいいと思います。
チュウニズムよりもポップンミュージックとかの方が刺さる人もいるだろうし、グルーヴコースターから入る人もいるはず。

ただ、アニソンとか今回紹介したボカロ楽曲とか、そういうのが多く収録されているのはセガの3機種(maimai、チュウニズム、オンゲキ)です。音ゲーを初めて最初のうちは知ってる曲で遊ぶのが一番楽しいと思うので、知ってる曲が多そうな音ゲーをやるといいと思います。

で、チュウニズムでボカロ曲とか結構遊んだら、次はウソラセラみたいなその機種オリジナル楽曲とかをプレイしてみてほしいです。歌もの、インスト色々ありますが、良い曲揃いです。知っているアーティストの曲なんかも、もしかしたらあるかも。

www.youtube.com

ボカロPとして知っている人が、違う作風で曲を出していたりとか。

open.spotify.com

とまあ、長くなってきてしまったので今回の記事はこんなところで締めたいと思います。

ピノキオピー以外の曲もたくさん紹介してしまいました。記事書いてて、自分実はまだ結構ボカロ好きなのかもという気持ちになっています。

昔よく聴いてたけど紹介してないみたいな曲はいくらでもあるので、またいつか話せたらいいかなと。

明日は文月さんの記事です!自分では海外行ったことないので楽しみです。

もし機械がみすちゃんを描いたら

この記事は、みす56代 Advent Calendar 2022の4日目の記事です。

2回目です。おはようございます。

暇だったのでアドカレの枠とってたんですが、土日急用ができてしまい遅れました……。でもちゃんと書きますよ~。

流行り(?)(もう過ぎた気がするけど)の画像生成モデルでみすちゃんを描いてみたらどうなるか。やってみましょう。

資料探し

特定のキャラクターを生成したい場合、三面図とかそういうのがあるととても良いです。

しかしながら、そもそもみすちゃんって詳細な設定資料が無さそう。実はどこかにあるんですかね?

髪の色が青くらいは共通してそうですが、目の色も固定ではなさげな感じです。意外とふんわりしてるんですね。

モデル選び

今回はイラスト生成なので、その分野に特化してるモデルを使います。
有名なのはNovelAIのモデルだと思いますが、それ以外にも最近はたくさんモデルが乱立している状況です。

元祖二次元系のWaifu Diffusionをはじめ、Anything V3、Nijijourney、EimisAnimeDiffusion、TrinArt系列などなど…。

これらのモデルはミックスして使うこともできて、今回はBerryMixと呼ばれるモデル(レシピ?)をもとに私が改造したやつを使うことにしました。(特に深い意味はなく、本当になんとなくです)

とりあえず生成してみる

プロンプトのベースは元素法典とかから拝借して適当にやってみます。

プロンプトなどの詳細

((illustration)), ((floating hair)), ((chromatic aberration)), ((caustic)), lens flare, dynamic angle, ((portrait)), (1 girl), ((solo)), cute face, ((hidden hands)), asymmetrical bangs, (beautiful detailed eyes), eye shadow, blue eyes, ((huge clocks)), ((glass strips)), (floating glass fragments), ((colorful refraction)), (beautiful detailed sky), ((dark intense shadows)), ((cinematic lighting)), ((overexposure)), (expressionless), (blue hair), (school cap:1.05), big top sleeves, ((frills)), blonde hair, hair_ornament, ribbons, bowties, buttons, (small breast), pleated skirt, ((sharp focus)), ((masterpiece)), (((best quality))), ((extremely detailed)), colorful, hdr,
Negative prompt: lowres, (bad_prompt_v2:0.8), bad anatomy, (inaccurate limb and hands), bad hands, text, error, missing fingers, extra digits, fewer digits, cropped, worst quality, low quality, standard quality, jpeg artifacts, signature, watermark, username, blurry, mature, censored, (large breasts:0.8),
Steps: 32, Sampler: DPM++ 2M, CFG scale: 5, Seed: 3460127155, Size: 768x512, Model hash: 6d343353, Clip skip: 2, ENSD: 31337

良い感じ?

違う作風のやつも描いてもらいましょう。

プロンプトなどの詳細

(((masterpiece))), (((best quality))), ((ultra-detailed)), (illustration), (dynamic angle), ((floating)), (paint), ((disheveled hair)), (solo), (1girl), loli, ((small breasts)), (((detailed anima face))), ((beautiful detailed face)), choker, bare shoulders, ((school uniform)), (school cap:1.12), blue hair, ((colorful hair)), ((streaked hair)), beautiful detailed eyes, (Gradient color eyes), (((colorful eyes))), (((colorful background))), (((high saturation))), (((surrounded by colorful splashes))), (((surrounded by colorful dot))), colorful bubble, ((shining)), (looking at viewer), light smile,
Negative prompt: lowres, (bad_prompt_v2:0.8), bad anatomy, (inaccurate limb and hands), bad hands, text, error, missing fingers, extra digits, fewer digits, cropped, worst quality, low quality, standard quality, jpeg artifacts, signature, watermark, username, blurry, mature, censored, (large breasts:0.8),
Steps: 36, Sampler: DPM++ 2M, CFG scale: 6, Seed: 608067692, Size: 512x768, Model hash: 6d343353, Clip skip: 2, ENSD: 31337

機械が描いたものらしく、どっちも細部までちゃんと見ると変なんだけど、パッと見結構良い感じに。

細部をざっくり修正しよう

今載せた2つのイラストはtxt2imgのみを使用していますが、普通は手とか細部が破綻してるとやっぱり気になるのでinpaintingと呼ばれる機能を利用して修正したりします。

2枚目のみすちゃんの左肩の部分を見てみると、肩が2つあるみたいになってしまっているので実際に直してみましょう。

修正後

最初より違和感が減らせました。まだ気になる部分があれば、この工程を繰り返すだけです。

生成モデルと協力してイラストを作るワークフローはだいたいこんな感じ。絵が描ける人からすれば当然一貫性の無い変なイラストに見えると思いますが、でも悪くないんじゃないかな~と思っています。

おわりに

明日はまた次期幹事長のたまかけの記事らしいです!

アドカレ埋まらなそうなので、ネタがあれば普通にあと2回くらい書くかも。

ちょっとだけえっちなおまけ

無駄にサイズのデカい動画を圧縮するだけ

この記事は、みす56代 Advent Calendar 2022の2日目の記事です。

無駄にサイズのでかい動画にストレージの容量が圧迫されること、ありますよね。

自分はGeForce Experienceのインスタントリプレイをよく使っているので、ゲームの録画にHDDが圧迫されています……。

HDDの中身

インスタントリプレイ、確かデフォルトだと50Mbpsとかいうアホ設定で録画してくれるので5分の動画が1.7GBくらいになります。えっと、

「デカ過ぎんだろ……(動画サイズが)」

根本的解決のために最近追加でHDDを買ったりしたのですが、もっと単純に動画をエンコードし直せばよくないか、ということでFFmpegでサクッとやります。

必要なものを準備

CPUでエンコードしてもいいですが流石に遅すぎるので、今回はハードウェアエンコーダであるNVENCを利用します。なのでNVIDIA製のグラフィックカードが必要です。保管用途のエンコードなので精度は求めてませんし、速いほうがいいですよね。

Radeonにも似た機能あったりするんですかね? 自分はRadeon使ってないのでよく分からず……。

NVENCが利用できる環境が用意できたら、FFmpegのインストールをしましょう。既にインストール済の方は飛ばしてください。
こちらの公式サイトからどうぞ。

バージョンは適当に最新のmasterブランチのビルドとか。

ダウンロードしたら適当な場所に解凍して、中にあるbinディレクトリにパスを通してください。これでFFmpegの準備はOKです!

ぴぃちょん

FFmpegを直接呼び出してもいいんですが、不便なので今回もPythonのsubprocessを使います。
ということで、適当なバージョンのPython 3をインストールしてください。最近は既にインストール済の人が多そうですが。標準モジュールしか使わないので3.10でも3.11でも動くはず。

www.python.org

タレ

今回作成したパッケージのソースコードは以下で公開しています。煮るなり焼くなり好きにしてください。

github.com

READMEのInstallationの項に従ってpip installするとパッケージがインストールできます。

インストールすると、compvというコマンドが利用できるようになります。compv.pyの中身を見てもらえば分かりますが、本当にFFmpegを呼び出して動画をエンコードさせてるだけです。
まあ一応削減できた容量がすぐに確認できたり、個人的に便利な機能が付いています。

エンコードの設定ですが、YouTubeに投稿するのにちょうどいいくらいの品質になっています。(1080p60fpsの動画をこのツールでエンコードすると12Mbps弱くらいになる)
本当に投稿するならもっと細かく設定をしてエンコードしたほうが良いですが(こことかここを参照)、ローカルに保存しておくだけなら十分満足できるレベルです。

HEVCじゃなくてH.264にしたいよ~とか、ソフトウェアエンコードにしたいよ~という場合には適当にソースを書き換えれば勝手に反映されます。便利ね。

以上!

画像生成モデルに手を描かせたりとか - 技術日記 11月22日号

あんま大したことない内容のメモ。

最近めちゃくちゃイラストの上手いモデルがたくさん出てきたとはいえ、細部まで正確に描くのは苦手なままです。まあ人間もそうだよね。
機械が描くのが苦手なものとして一番最初に例にあがるのがでしょう。ただ、やっぱり手は重要だしちゃんと描かせたい。ということで色々テクニックがあります。

※当然100%当たりしかでなくなるわけではない。txt2imgだけに頼らずinpaintingも使いましょう。

手を描くのが上手いモデルを使う

そもそも論。

手を描くのが上手いモデルを使えば、破綻は最小限に抑えられます。例えば、ちょっと前に話題になったAnything v3とか。

huggingface.co

ただしAnything v3は限りなく黒に近いモデルということで、使うときは自分の責任で。

Negative promptを活用する

これは二次元のイラストに限らず何のモデルを使っているときでも通用すると思います。

以下がNovelAIのLow Quality + Bad Anatomyのプリセットに使われているもの。

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

特にこだわりなければ、これを使っていればそんなに困らない気がします。自分も普段これをベースにして使っています。

もっとNegative promptを練りたいという場合には、元素法典を読んだりすると良さそう。

また、bad XXXっていう指示が有効なのはなぜ?みたいなのを知りたい人は以下の記事を参照。

https://note.com/imagen_dev/n/n9af54848b203note.com

inaccurate XXXというNegative promptも便利なのでよく使っています。

Embeddingを活用する

数日前に以下のような便利なものが公開されました。

huggingface.co

Embeddingって普通はTextual Inversionの目的で利用すると思うのですが、このモデルはいくつかのNegative promptをまとめて学習させたもの、らしいです。(和訳合ってる?)

Version 1ではこの埋め込みを利用すると絵柄に変化が生じてしまう不具合があったのですが、Version 2でかなり改善されたように感じます。

0.7とか0.8くらいの強さで使ってあげると良い感じです。

プロンプト以外のパラメータも弄る(要検証)

手に特有の話というより画像生成全体に関する話ですが、プロンプト以外も練ってあげると生成されるものの質が変わります。

StepsとCFG Scaleは触れたことある人も多いかと思いますが、Sampling methodも色々試してみると世界が広がると思います。

Samling methodって何、という話は私も詳しくはないので以下のような記事を読むといいかも。

qiita.com

dskjal.com

私は最近までDPM++ 2Mをよく使っていたのですが、アニメ調の絵にPLMS良いよみたいな話も聞いたのでどっちも使ってます。(PLMSはimg2imgに使えないのでちょっと困る)

よくある勘違い?

Stepsは基本数字を大きくすると書き込みが増えるものと認識していていいと思いますが、Euler aのように末尾にaが付いているサンプラーだと話が変わります。
このようなサンプラーではStepsの値を大きくしても書き込みが増えるわけではなく絵が変わってしまうため注意です。

img2imgやinpaintingを活用する

上述のような方法でも上手くいかなかったときは、ちまちま修正します。そんなもんです。

手などの細部以外は良い感じのイラストを生成できたらinpaintで普段は修正をやっているのですが、多分自分でざっくり手をかいてその上でinpaintingに投げるのが最速だと思います、多分。

作業の一例はこんな感じ。

Inpaintingによる修正の流れ

同じ色の○で囲んでいる部分が、それぞれの段階で変化させた部分です。

私もまだ慣れてないので修正した部分に歪みのようなものが残ってしまっていたりしますが……それでも左下の修正後のものとオリジナルを見比べると大きくパッと見たときの違和感が抑えられているかな、と。

画像生成モデルに手を描かせる手法については、自分の理解はこんなところです。
以下余談になります。

近況

一週間前くらいに以下のような記事を書いたのですが。

new-file.hatenablog.com

この記事を書いたときpixivのフォロワー200人だったんですけど、今この記事を書いている時点で551人になりました。

……え、551人?300人以上増えたの?……って感じです。

まあ実際のところ二次創作効果なのは感じますが、凄いですね。なんか凄すぎて、他人事になっちゃいます。

みんなえっちなの好きね。えっち星人め。

最近の画像生成技術について思うこと

※この記事はnoteに公開していたものを引っ越ししたものです。(公開停止になっちゃったので……)

技術的な話というより、ポエムです。まあnoteだし
最近の画像生成モデルを色々触ってみたりした感想とか。

※自分は非イラストレーターでかつ科学技術推進派なので、そういう感じのバイアスが含まれます。予めご了承ください。

誰でもイラストレーターになれる時代?

8月末あたりにStable Diffusionが一般公開されてからというもの、ちょくちょく画像生成モデルに触れる生活をしています。
Stable Diffusionはリアルな写真のようなものの生成に強い気がしますが、自分の興味は専ら二次元イラストの生成にあります。Waifu DiffusionやERNIE-ViLGといった、二次元イラストに特化したモデルも出たりしていましたが、品質が個人的にはいまいちだったので、9月に入ってしばらくしてからは少し画像生成モデルから離れていたりもしました。

ところが、10月3日。NovelAIが画像生成機能の提供を開始し、生成されるイラストの品質の高さに多くの人が衝撃を受けました。自分もそのうちの一人で、リリース初日から課金して遊んだりしてました。

new-file.hatenablog.com

あまりに衝撃だったので、思わず上の記事を書いていたくらい。
Stable Diffusionなどを触っていたときには、顔の生成が上手くできるようになるにはもうしばらくかかるのかなあとか思っていたのに、一ヶ月もしないうちに克服どころか斜め上のパワーアップを遂げて帰ってきてしまいました。(もちろんまだまだ改善点はありますけどね!)

NovelAI Diffusionに関しては、学習データセットDanbooru由来のデータを使っていて良くないとか色々議論はありましたが、もう聞き飽きた話だと思うのでここではあえてそういうところには目を瞑って話をしようと思います。

NovelAI Diffusionの技術は、素直に凄いです。上のように負のニュースばかりインターネット上では流れていたので、褒めたいと思います。
こんなに急速に人間が描いたイラストと見間違えるような品質の画像を機械学習モデルが生成できる時代になるとは、本当に驚きです。

Diffusion ModelとかLatent Diffusion Modelについてはあまり詳しくはないのですが、思っていたよりも早く未来がやってきたという感じがします。

イラストが描けない人間でも、NovelAI Diffusionのようなサービスの力を借りることで簡単に脳内のイメージをアウトプットできるようになりました。
しかも、512x512くらいのサイズの画像であれば5秒もかからずに出力できてしまいます。この速度でイラストを描くのは人間には物理的に不可能ですし、まさに産業革命といったところでしょうか。

また、つい数日前にAnything v3.0というモデルが公開されました。NovelAIのモデルをファインチューニングしたものらしいのですが、こちらも非常に品質の高いイラストを生成することができます。

Anything v3.0で生成した初音ミク

ただ、NovelAI DiffusionやAnythingが凄いとはいえ当然まだ課題もたくさんあります。

これらの画像生成モデルが出力するイラストは非常に「それっぽい」のですが、やはり細部が気になります。高い確率で手などが破綻していたり、しばしば腕が3本になったりなど。文字の生成も苦手です(上の例では偶然"01"がうまく出力できていますが)。

文字の生成が苦手なのはStable Diffusion系列のモデルが潜在空間に情報を圧縮しているから、という説があるようですが、手の破綻なども同じ理屈になるんでしょうか。

画像生成モデルは画像のみから全ての概念を学習していますから、人間のイラストレーターのように3次元のデータとして人体構造を理解しているわけではありません。画像生成モデルにこのようなメタ的な知識を与えることができればもっと現実に則った画像生成が可能になると思いますが、今のところはこの点は人間のイラストレーターの方が何倍も優れていると言えるでしょう。

なんにせよ、以上のような理由から個人的には誰でもイラストレーターになれるような時代はまだ数年こないのかなと思っています。なにより、「AI絵師」は自分の「絵柄」を持てませんからね。これは寂しいことです。(作風を持つことは今でも不可能ではないかもしれませんが……)

こういう思いもあって、自分としてはむしろ最近自らの手でイラストを描いている人への尊敬が深まっています。

非人間産のイラストの需要

少し話は変わり。

NovelAI Diffusionがリリースされて以来、「これいいな~」と思った生成物を稀にインターネット上で公開したりしてみています。

初めはAIBooruという画像生成モデルにより生成された画像のみを扱うDanbooruのフォークサイトに投げていました。(※本家Danbooruと同様にR-18も普通にあるので注意)

aibooru.online

画像生成モデルの生成物は人間が手で描いたものとは別カテゴリのものだろうと思っているのでこういう風にゾーニングができると嬉しいのですが、10月末にpixivが公式にAI生成作品のラベル付けとフィルタリング機能を実装してくれたので、それ以来pixivを利用しています。

特に宣伝したりすることもなくひっそりと生成したイラストを共有していたのですが、驚くことに(ありがたいことに?)11月14日の今日、フォロワーが200人を超えました。

昔は文字書きをしていたのでそのときのフォロワーが元々数十人いると思うのですが、それでもイラストの共有を始めてから100人以上フォロワーが増えたことになります。

これはかなり意外でした。そもそも、AI生成作品を投稿する人でもフォローする層がいるということが個人的に驚きです。まあ、これでこそインターネット上に公開している意味があるということなんですが。

こういうことがあり、別に人間のイラストレーターが描いたイラストでなくとも需要は存在するんだと思ったりしました。

ただ実際、画像生成モデルが生成したイラストと人間が描いたイラストが本格的に見分けがつかなくなってきたらこれらを区別する必要も無くなると思いますし、今後どうなっていくのかが気になります。

余談

最近img2imgとinpaintingの使い方が分かってきて、txt2imgの運ゲー以外でもイラスト生成ができるようになってきました。ネットに公開しているものは結構細部の修正に気を遣っていたりします。

ただ、それでも結局上手くいかないことのほうが多いですね。良い感じの雰囲気だしこのイラストは完成させたいなあと思うやつも割とあるのですが……。

未公開没テイク集

これは多分絵が描ける人でも結局レイヤーが分かれてないので修正に困るやつなんだろうなと思います。

画像生成モデルの進化に期待しつつも、そもそも現時点でもNovelAI DiffusionやAnythingよりも高品質な画像生成が期待できるモデルがあります。そのうちの一つが、Googleにより発表されているImagenです。

Imagen自体まだ限られた用途でしか公開されておらず、内部の詳細な仕様も不明なのですが、このモデルはLatent Diffusion Modelsを用いた手法と根本的にアーキテクチャが異なるらしく、文字の生成などもこなすことができるとされています。

こういったモデルが一般公開されると、また世界が変わるのではと想像してしまいます。

以上余談でした。