世界崩壊少女『初希アイ』 開発備忘録:その5 動画生成と全モジュール削除、他

世界崩壊少女『初希アイ』 開発備忘録:その4 画像を1024x1024へ 他
前回の続きです。 今週なにしてたっけなぁ、と思うくらいには忙しかった。logging処理実装 やってませんでした。知らなかった! 逆になぜ実装できたかというと、chatgptに関数を1つずつ貼り付けて気になることを聞いてみたわけです。その中...

 オープンテスト期間中の開発記としては今回最後です、たぶん。

 

動画生成に挑戦

 24日の月曜の朝、何の気なしにXを見ていると、初希アイのイメージにかなり似ているキャラクターの動画を見つけました。

 世界崩壊少女の開発は、自宅と就労継続支援B型事業所アフターネオさんの作業時間、両方で進めています。3月からは職業訓練校へ行くのでアフネオさんは2月いっぱいまでです。

 最後の一週間はコードの整形作業を中心にやっていくつもりだったのですが、この動画を見て、自分も動画生成AIに挑戦してみることにしました!

 

Minimax APIで動画生成AIに挑戦

 現在はWEB上で気軽に動画生成を楽しむことができますね。

 ただ、世界崩壊少女は動的に生成して投稿することがコンセプトです。手作業で生成してアップするんじゃダメなのです。

 手始めに、画像を基にAPIからの動画生成が可能で、指定できるパラメータが充実している動画生成AIサービスを探しました。

 そして目をつけたのがHailuo AI: Transform Idea to Visual with AIMinimax APIでした。こちらはカメラ移動命令を指示できます。

1. カメラ移動制御の命令挿入をサポートします。
カメラ移動命令は、[ ] 形式を使用してプロンプトに挿入する必要があります。カメラ移動命令の標準形式は [C1、C2、C3] です。ここで、「C」はさまざまなタイプのカメラ移動を表します。合計 15 個の列挙されたカメラ移動方法がサポートされています。詳細については、以下のセクションを参照してください。(注: 最適な結果を得るには、組み合わせたカメラ移動命令を 3 つ以下にすることをお勧めします。)
1.1 サポートされている 15 個のカメラ移動命令 (列挙値)
-トラック: [トラック左]、[トラック右]
-パン: [パン左]、[パン右]
-プッシュ: [プッシュイン]、[プルアウト]
-ペデスタル: [ペデスタル上]、[ペデスタル下]
-チルト: [チルトアップ]、[チルトダウン]
-ズーム: [ズームイン]、[ズームアウト]
-シェイク: [シェイク]
-フォロー: [トラッキングショット]
-スタティック: [スタティックショット]

 こうしてできたのがこちら!

 ……変なロボットが登場したのは、ネットで拾ったサンプルコードに記述されてたサンプルテキストが入ったまま生成しちゃったせいですね。

 このクオリティなら全然あり!っということで、動画生成の実装に本腰を入れてみることにしたわけです。

無料枠でやったのに課金発生……

 で、いきなり問題発生!

 テスト生成は無料枠でやったはずなのに、課金が発生してしまいました。英文を読み間違えたようで、3本生成まで無料と解釈しましたが全然違う意味でした……。バウチャータイプの無料枠で、生成のたびに無料分クレジットが減っていくタイプ。

 当然、オーバーしたら当然支払い義務が発生します。これを読んだ人もお気をつけて。

動画生成についてその他

 いろいろ苦難があったので話のネタにしたいのですがサクッとお話しします。

 最終的にMinimaxを本採用としたのですが、上記のテストのあと他の2つのサービスでも試しています。

 1つはDream Machine(Luma AI)です。こちらはコードがあっているのになぜか画像が渡せず、動画生成まで辿り着けませんでした。
 公式DQNを読み込んでみると、どうやら「Content Delivery Network(CDN)」というタイプのサーバーにアップされている画像しか受け付けてくれないようでした。私が使っているlolipopはApacheだからダメなのかな?と。

 もう1つは「Stable Diffusion」のstability.aiです! StableDifusionは以前から特にイラスト生成界隈で話題で、これも動画生成できたのか、と盲点を突かれた気持ちになりました。しかも1枚0.2$! MinimaxとLumaAIの半分です。

 こいつは試さないわけにはいかないぜ、とやってみたわけですが……

盲点だったけど「Stable Diffusion」でも動画生成AIできる。しかも1枚0.2$というわけでやってみたけどパラメータ少なすぎなのと出来上がるものがしょぼすぎて金を無駄にしただけだった。動画はこれでマシなほうなやつ。 もう少しいじってみるけどほぼ諦めモード。

[image or embed]

— 平極ルミ📚世界崩壊少女オープンテスト中 (@rumihyogoku.bsky.social) 2025年2月26日 15:40

 まぁ、ひどい。これでマシなほうです。基本的には寄生獣になったり、ぐちゃっとなります。写真は相性悪いのかもしれません。設定できるパラメータも少なく、見込みがないので却下となりました。

 こうしてMinimaxで本採用となったわけです。最低チャージが25$からというのがネックですが、生成される動画の質は申し分ないのです。

 あと、最終的には画像からの生成ではなく、画像生成用プロンプトテキストをそのまま使った方が具合がいいので、世界崩壊少女のプロセス実行時に、画像生成用プロンプトテキスト単体で別のディレクトリに保存することにしました。

 

サウンドエフェクトの生成に挑戦

 2月27日……、これ書いてる昨日ですね。実装にたる動画生成ができるようになった、ということでB型事業所の職員さんと盛り上がっていたところ、「これ、音つける方法ないんですかね?」と。もちろん動的にという意味です。

 世界崩壊少女の開発をはじめてまだ一ヶ月少々とはいえ、今日までネットの生成AI事情を調べまくってきたつもりです。そんな方法は聞いたことないなぁ、でもあってもおかしくないよなぁ、というわけで調べてみたところ、ありました! しかも結構、いろいろ……。

 調べながら、なぜ気づけなかったのかを考えたのですが、サウンド生成AIを紹介している記事のほとんどが、ここ数ヶ月以内のものばかりだったのです。対して、世界崩壊少女はChatgpt3.5TurboとDALL-E-2がメインで、ネットで調べても目を通すことになる記事は数年前のものばかり

 ここでようやく、出遅れ感以上に、AI生成の先頭が見えてきた実感が得られました。

 ひとまずWEB版で試してみると、どれも想像以上にいい音質で、しかもプロンプトの世界観に十分マッチしたものを作ってくれました。ここでいうプロンプトとは画像生成用プロンプトテキストです。

select_elements: In a deserted underground shopping street, a flashlight cuts through darkness, revealing closed shops, forgotten storefronts, deserted benches, and empty corridors. The beam creates a stark contrast between light and shadows in the subterranean world.

(人気のない地下商店街で、懐中電灯が闇を切り裂き、閉ざされた店、忘れ去られた店先、誰もいないベンチ、空っぽの通路を照らし出す。その光の束は、地下世界において光と影の鮮烈な対比を生み出している。)

 このプロンプトなら、無音の空間音に、足音だけだけが響いている感じがいいですよね。まさにそういうサウンドを生成してくれたのです!

 

Elevenlabsでサウンドエフェクト生成AIに挑戦

 APIがあって無料利用枠もあるやつ!、で、調べて辿り着いたのがこちら、elevenlabs.ioのAPIでした。無料利用枠が多いので従分なテスト生成ができます。

 生成した音声を商用利用するなら有料サブスクを利用する必要がありますが、最低月5$とフレンドリー価格!

 生成する音声は時間指定もできるので、動画の再生時間と同じピッタリなサウンドをつくれます。

 しかしこれの実装が、動画生成よりも手こずりました。

 

Python3.8以上が必要である

 このサウンド生成の時に限らず今までにも何度かあったんですが、Python3.8以上が必要なために使えないライブラリやモジュールがありました。lolipopのサーバーはPython3.7固定なので、バージョンダウンなどで解決できない場合は諦めるしかないのです。

 最終的にはChatgptの提案で、Requestsモジュールで直接APIを叩いてサウンド生成を実現できたのですが、この方法に気付けなければ詰んでました。

 しかし本当の苦難はこの次、動画とサウンドの合体にあったのです。

 

無音動画とサウンドの合体に挑戦

 プログラムを使えば動画と音声ファイルを簡単に合体させることができます。やったことがなくても、それくらいできるでしょって感じですよね。

 ローカル環境では想像通りサクッと成功。

 あとはlolipopのSSHで試し、それでも成功したらCronで最終テストです。

ローカル環境だけど 1.画像生成用プロンプトからの動画生成(無音) 2.画像生成用プロンプトからの効果音生成(elevenlabs.io) 3.1と2を合体 まで動的に実現できたぞ! あとはこれがlolipopでも実現できれば。。。!

[image or embed]

— 平極ルミ📚世界崩壊少女オープンテスト中 (@rumihyogoku.bsky.social) 2025年2月27日 17:24

 SSHとは平たくいうと「レンタルしているサーバーを、コマンドプロンプト(cmd)やターミナルを通じて操作できる機能」 です。ユーザーに与えられた権限に限りはありますけどね。

 ここからの話で大事なことは、プロセスを実行する環境がローカル環境ではなくレンタルサーバーであるということ。ローカルで実現できても、SSHではメモリ不足などで実現できないことがあります。

 作業を進めてみると、やはり! 動画エンコードでメジャーなFFmpegモジュールは容量がでかすぎてそもそもLolipopのSSHに入らない!

 Chatgptに代案で教えてもらいながら、トライアンドエラーを繰り返しましたが、なかなか解決しません。そのうち最初の方で失敗した方法をまた提案するようになったので、1つのコードに現状から考えられるコンバートの方法を一気に書き出して一度に試せるようにしてくれと指示。

 これで見つけたあたりの方法が、moviepyモジュールを使う方法でした。

 ここまでくれば、あとはパラメータとプロンプトを詰めるだけです!

 しかし、このあと私は、この開発プロジェクト最大のエラーと戦うことになるのでした……。

 

開発最大のエラーとの格闘

 B型事業所から、でーきたできた!とウキウキで帰宅。

 しかし、いつもの時間に初葉が投稿していないことに気づき、メールボックスを見てみると、見慣れないエラーを吐いていました。

 Tracebackをchatgptに聞いてみると、OpennSSLのバージョン違いということでした。 
 たしかに動画生成とサウンド生成の実装中にいろんなモジュールやライブラリを入れたりバージョンダウンしたりと、いじくりたおした中でOpenSSLをいじった記憶がありました。

 Chatgptの過去のやり取りを確認した上で、バージョンを戻し、試しに動かしてみると無事に投稿までいけました。

 しかし……、何も解決していなかったのです!

苦難の始まり

 これで一件落着かと思いきや、今度は世界崩壊少女がエラーを出しました。しかもGooglVisionのラベル解析のところでです。

 メモリエラーやスレッドの生成エラーは記憶に新しい。以前のエラーは from bs4 import BeautifulSoup というクソ重モジュールが原因で、その一件をきかっけにメモリ使用量の削減をできるだけやったつもりでした。画像だってChatgptがディフォで吐き出すpngをわざわざjpegにかえてやってるんです。

 それ以来メモリオーバーやスレッドの作成エラーは一度も起きていませんでした。

 どう考えても、動画とサウンド生成時に環境をいじりまくったことが原因でした。

OpenSSLを入れ直してみる

 最初にやったことは、改めてOpenSSLを入れ直してみることでした。
 しかし再インストール後、実行してみるとエラー。ダメです。

ユーザーディレクトリに入れたPythonを消してみる

 Chatgptに言われるがままPython3.8をインストールしようとしたことがありました。結局却下となったわけですがデータは放置していました。まさかこれが悪さしているのでは、と思い、消してみましたが効果なし。というかフォルダが消せない汗

ホームディレクトリの中を整理する

 ホームディレクトリとはSSH接続直後のディレクトリです。インストールしたモジュールやライブラリのディレクトリや、PATH指定ミスって保存したいつのかのファイルなどが散らかっています。わかる範囲でゴミデータを消したけど効果なし。 

 このあたりから、最悪、ロリポップを解約して別のレンタルサーバーに引っ越す可能性を考え始めました。

動画生成と音声生成用のモジュールが原因?

 Chatgptに原因の考察を依頼。どうやら新規でインストールした何かのモジュールが別のモジュールと依存関係にあり、そのせいで今までよりもメモリ使用が増えたのではないか、と。

 動画生成と音声生成用の実装の最中に手当たり次第にモジュールやライブラリを入れたので、十分に考えられることだと思いました。

 世界崩壊少女で使用するモジュールは専用のpythonファイルにまとめてimportで使っています。それとは切り離した動画生成プロセスも同じImportファイルをつかっていたので、そこに動画生成に関するモジュールも書き足していたのです。

 世界崩壊少女のメインプロセスから見れば、使わないモジュールが増え、そのぶんメモリ使用も増えることになります。

 原因はこれに違いない!と思い早速モジュールの記述を分けました。

 その後テストをしてみましたが……ダメ! 3回連続エラーなしかと思いきや、気のせいでした。

バックアップからファイルを差し替え

 Dropboxでバックアップを実現していたので、数日前のファイルと差し替えてみました。もしかしたら気づけなかっただけでもっと前から起きていた不具合なのかもしれません。しかし結果は変わらず。

今日インストールしたモジュールを全削除

 もうどれが原因かわからないので、Chatgptに今日インストールしたモジュールを全部削除する方法を教えてくれと聞き、historyから該当するモジュールを全てピックアップしてもらいました。

 しかしこれも効果なし。しかも別に今日の分を教えてくれたわけじゃなくてヒストリー内にあったインストールの履歴を教えてくれただけだった……。

全てのモジュールを全削除からの再インストール

 こうなったらもう全部消して、プロセスを実行して無いと言われたモジュールだけを入れ直す作戦しかありません。これでダメなら本当にもうレンタルサーバーを引っ越すしか無い。

 Chatgptに手順を確認しながら、pip list(後で知ったけど本当はpip list –userでやるべき)で出てきたモジュールをまとめてアンインストール。

 その後、世界崩壊少女や他のbot、バックアップのプロセスを実行しながら、足りないと言われたモジュールを1つずつインストールする地獄の作業が始まりました。

 これで解決できるという保証がない中での作業は本当に地獄でした。

 およそ一時間後、ようやく実行できる状態になり、テスト実行します。

 SSHで5回、Cronで連続10回エラーがなく、完全復旧を確信できたのは日付が変わった深夜でした。

 本気で泣きそうでした。

 

動画生成用プロセスを実装用に整形

 エラーの対応でへとへとでしたが、なんかテンション上がっちゃってそのまま作業続行。動画生成用、サウンド生成用、動画とサウンド合体用と、ばらばらだった処理を繋げていきます。

 今日までに覚えたPythonのコーディングスキルを全て注ぐつもりで打ち込み、特に迷わず組み込んでいきました。

 

結局やってしまった。 ↓画像生成用プロンプトテキストからの動画生成 ↓同テキストからのサウンドエフェクト生成 ↓動画とサウンドエフェクトの合体 ↓Xへの投稿 cronで実行確認OK クオリティは全く問題なし。 何度か生成してると人間が現れるのでそれだけ対処すればいい。 しかしテストに伴う使用料が……でもあとはそこだけ!

— 平極ルミ📚世界崩壊少女オープンテスト中 (@rumihyogoku.bsky.social) 2025年2月28日 3:14

現在

 現在、というかこれ書いてる今日のことですね。

 あとはプロンプトの見直しをしてテストをするだけの段階まできました。全体的なコードの整形も終わっています。

 画像の時と同様、これもやはり人間の姿を描写してしまうことがあります。人は存在しないとプロンプトに明示していてもです。ただこれは基本指示のプロンプトを先に伝え、ストーリープロンプトをその後という順番で渡すことで解決できると思われます。

 テストはAPI環境を使うと使用量がかかるので、WEB版の無料の方で試しながらやる感じですね。minimaxは毎日無料分がもらえるので助かります。

 

今後のこと

 今日が予定していた世界崩壊少女のオープンテスト最終日です。開発に手こずったら延長するつもりでしたが、現状考えられる実装にたる処理は全て組み込んだので、予定通り一旦ここでお休みをいただくつもりです。

 オープンテスト中の開発記もこれが最後となります。今まで読んでくださったかたありがとうございました。

 本番サービス開始は4月からの予定です。3月中は動画生成の特にプロンプトの見直しをメインに作業していきたいと思います。

コメント

タイトルとURLをコピーしました