ニートの言葉

元ニートがやってみたこと・その過程で学んだこと・考えたこと・技術メモあたりを主に書いています。情報革命が起きた後に訪れるであろう「一億総ニート時代」の生き方を考え中です。

Mac Studio上のAIで5分のドキュメンタリーを作ってみた

どうもこんにちは、あんどう(@t_andou)です。

前回は、Mac StudioでMiniMax H3を動かして、短い動画を一晩中作ってみました。

blog.takuya-andou.com

今回はもう少し長いものを作りたくなったので、AIに「5分くらいのドキュメンタリーを一本企画して、動画にしてほしい」とお願いしてみました。

結論から書くと、企画、台本、映像、ナレーション、BGM、字幕、編集まで終わり、5分12秒の動画が一本できました。

ただ、H3で短い動画を作って、そのまま順番につなげれば完成という感じではありませんでした。

特に困ったのが音声でした。

まずは完成したものをどうぞ


www.youtube.com

まずは企画してもらった

今回作った動画のタイトルは「1986年のAIから、2026年のあなたへ」です。

昭和61年、地方の研究施設で未来予測AI「ミナモ」が2026年の生活を予測していた、という架空のドキュメンタリーです。

40年前のAIが予測した未来には、少し外れているものと、不気味なくらい当たっているものがあります。

最後にミナモが、2026年を生きている人間にこう質問します。

未来の人間は、幸せになりましたか?

企画と台本を作り、それを72カットに分解して、映像はMiniMax H3ですべて新しく生成しました。

映像の指示は基本的に英語で書き、日本語のナレーションやセリフは別の工程で作っています。

H3だけだと、5秒ごとに音声が途切れる

今回の環境では、H3の動画は1カット約5秒です。

H3は映像と一緒に音も生成できます。短い動画を一本だけ見ると、声や環境音まで入っていて、かなり面白いです。

ただし、それを何十本もつないで長い動画にすると問題が起きました。

それぞれのカットは別々に生成されているので、カットが変わるたびに声、話すテンポ、環境音が一度リセットされます。

10秒を超えるセリフを話させようとしても、途中で次のカットに切り替わると、発話もそこで終わってしまいます。

実際に確認してみると、5秒ごとに一度音が消えているように聞こえました。

短いCMやネタ動画ならこれでも良いのですが、5分のドキュメンタリーではかなり気になります。

そこでAIにこの問題を伝えて、H3単体ではなく、Mac Studio上で動く別のローカルAIも組み合わせて対応してもらいました。

映像、声、音楽をそれぞれ別のAIに担当させた

最終的には、以下のように役割を分けました。

  • 映像と短い環境音はMiniMax H3
  • ナレーションとミナモの声はQwen3-TTS
  • 5分間つながるBGMはACE-Step 1.5
  • 字幕、音量調整、映像の接続、最終出力はFFmpeg

H3に全部やらせるのではなく、映像を作るAI、声を作るAI、音楽を作るAIを分けて、最後に編集で一本にまとめる形です。

H3の音は完全に消さず、雰囲気が残る程度に小さくしました。その上に連続したナレーションを置き、ナレーション中はBGMが少し下がるようにしています。

モデルとキャッシュは、本体のSSDを圧迫しないように外付けSSDの「exSSD」に置きました。

映像、音声、BGM、字幕、最終レンダリングは、すべて手元のMac Studio上で処理しています。

一度完成したけど、映像と音声がずれていた

ここまでで一度、完成版ができました。

ただ、全編を確認してみると、1分半くらいからナレーションと映像の内容が少しずつずれていました。

特に分かりやすかったのが「世界をつなぐ、目に見えない網」という説明です。

ナレーションは1分57秒あたりで始まっているのに、それらしいネットワークの映像が出るのは2分28秒あたりでした。約31秒ずれています。

原因は単純でした。

約5秒のH3動画を一定の長さで順番につないだ映像と、別に作ったナレーションを、それぞれ独立して並べていたためです。

短いずれが章を進むごとに積み重なり、後半では映像と説明している内容が合わなくなっていました。

完成したと言われても、ちゃんと最初から最後まで見るのは必要です。

このずれをAIに伝え、ナレーションを時間の基準にして、映像を全部並べ直してもらいました。

ナレーションを基準にして編集し直した

改訂版では、重要な文章ごとに対応するH3の映像を決め、各カットを2秒から5秒程度に切り直しています。

最終的には78回の映像編集を行い、ナレーションと映像の対応を30か所で確認しました。

先ほどの「目に見えない網」の映像は、31秒遅れて出る状態から、発話の0.52秒前に出る状態へ修正しています。

字幕もナレーションの単語単位のタイミングに合わせました。最初は左上にチャプター名も表示していましたが、少し説明的で邪魔だったので削除しました。

間延びしていた部分も切り、最初は6分20秒だった動画を、最終的に5分12秒にしています。

Premiereなどを手作業で操作したわけではありません。AIが編集用のタイムラインと字幕を作り、FFmpegでレンダリングし、完成動画の長さや音声位置も検証しています。

僕がやったのは、完成した動画を見て「ここがずれている」「この表示はいらない」と伝えることでした。

やってみて分かったこと

H3は、5秒くらいの印象的なカットを作るのは得意です。映像と同時に音まで出るので、短いCMやYouTubeショートにも使いやすいと思います。

一方で、長いナレーションや会話を何カットにもまたがって自然につなぐのは、今回のローカル環境ではH3単体だと難しそうです。

長い動画を作る場合は、映像より先に連続した音声を作り、その音声を基準に映像を配置する方が良さそうです。

もう一つ面白かったのは、一つのAIですべてを作る必要はないということです。

映像はH3、声はQwen3-TTS、音楽はACE-Step、編集はFFmpegというように、それぞれ得意なものを組み合わせれば、全部ローカルでも一本の動画にできます。

動画生成AIを使ったというより、Mac Studioの中に小さな映像制作チームを作ったような感覚でした。

まとめ

今回は、AIに5分程度のドキュメンタリーを企画してもらい、映像生成からナレーション、BGM、字幕、編集までやってもらいました。

最初からうまくいったわけではなく、H3の音声がカットごとに途切れたり、映像とナレーションが約31秒ずれたりしました。

それでも問題を伝えると、ローカルで動く別のモデルを組み合わせ、編集方法を変え、最終的に一本の動画として完成させるところまで進められました。

まだ画質や生成時間など、試したいことはたくさんあります。

ただ、一人で5分の映像作品を企画し、声と音楽をつけ、編集まで終わらせるところを考えると、かなり未来を感じる実験でした。

それでは。

動画生成を一晩AIに任せて寝たら50本以上できていた

この記事はAIで書きました。
※この記事に掲載している動画は生成AIによって作成した架空の映像です。

---

どうもこんにちは、あんどう(@t_andou)です。

みなさん、Soraという動画生成AIを覚えていますか?
OpenAIが公開した動画生成AIで、少し前までは、ホリエモンがスーパーでバスケをしたり、変なものを食べたりする謎のAI動画がSNSによく流れてきました。
映像だけでなく、日本語のセリフや効果音までまとめて生成されていて、「動画生成AIはいつの間にこんなところまで来たんだ」と驚いた記憶があります。

ただ、そのSoraは2026年4月で提供を終了し、現在はもう使えなくなっています。ホリエモン本人もYouTubeで終了について取り上げていました。OpenAIによる案内/ホリエモンの解説動画

使えなくなったと言われると、逆に自分でも動画生成を試してみたくなります。
そこで今回は、MiniMax H3という動画生成モデルをMac Studioに入れて、ローカル環境で動画を作ってみることにしました。

一晩動かしてみる

せっかくローカルで動かせるようになったので一晩動してみます。
15分くらいの少し長めの動画を1本作らせてみるのも面白そうですが、まずローカルの動画生成で何ができそうなのか、可能性を広く探ってみることにしました。

CM、YouTubeショート、商品紹介、アニメ、ASMRなど、できるだけ違う方向性のアイデアをAIに考えさせ、それぞれ5秒〜60秒ほどの動画として作らせます。

というわけで、企画から動画生成までをAI(Codex)に任せて、私はそのまま寝ることにしました。

指示の方向性
  • マーケティングなどに使えそうな動画のアイディアを考える
  • 5〜30秒くらいの動画を実際に作る
  • 失敗した場合は原因を確認して作り直す
  • 作ったものは説明と一緒に記録する
  • 僕が起きるまで繰り返す

指示を出した後は、そのまま寝ました。

まずは結果から

www.youtube.com

一晩で完成した動画は、作り直しも含めて合計152本の短い動画素材、合計で13分13秒を生成してました。

そのうち40本ほどは、発音がおかしい、謎の文字が出る、物体の数が合わないなどの理由でボツになり作り直しとなり、最終的に59本の動画が完成しました。

思っていたより作ってました。

AIによるおすすめ

傘の中を魚が泳ぐ動画

雨の日に透明な傘を差して歩いていると、傘の中に青い魚が現れる動画です。

その後、魚が3匹に増えて、最後は雨上がりの水たまりへ繋がります。

商品の説明などは何もありませんが、SNS広告や観光PRの冒頭に使えそうな雰囲気があります。

これはかなり良い感じにできたのではないかと思います。

夢を録音できるラジカセのCM

昭和のアニメっぽい架空CMも作ってもらいました。

「今夜の夢を、録音しよう」というセリフと一緒に、夢がラジカセへ吸い込まれていきます。

最初に作ったものはラジカセに謎の文字が大量に書かれていたり、日本語の発音がおかしかったりしたのでボツになりました。

セリフを少し言いやすい文章に変えて作り直した結果、だいぶ自然になりました。

同じ人物や商品の形をカット間で完全に維持するのは、まだ難しそうです。

箱から町と列車が出てくる動画

木箱を開けると、小さな駅と列車、町並みが広がっていく動画です。

観光地のお土産や自治体のPRなどを想定して作ってもらいました。

もちろん実在する町ではありませんが、企画段階で「こういう世界観の動画を作りたい」と共有する用途には使えそうです。

撮影前の動く絵コンテみたいな使い方が良いのかもしれません。

存在しない素材を切るASMR

虹色のプリズムと、銀青色の織り雲という架空の素材を切るASMR動画です。

映像だけでなく、切る音や素材が動く音も一緒に生成されています。

存在しない素材なのに、なんとなく硬さや手触りを感じるのが面白いです。

短いSNS動画としては、この方向が一番量産しやすそうな気もします。

他にもいろいろ作った

他には次のような動画を作りました。

  • 気分によって色が変わるマグカップ
  • 本物の雲がオフィスに来る動画
  • 食材が勝手に買い物かごへ入る動画
  • オフィスの物音だけで曲を作る動画
  • 同じ部屋の窓から四季を見せる宿泊施設向け動画
  • ラーメンの湯気が架空の風景になる動画
  • 商品より先に影が到着するバッグのCM
  • 一枚の紙がパッケージへ変形する動画
  • ボールが3回跳ねてバスケットコートが完成する動画
  • 木片から空の椅子が組み上がる採用動画

さすがに50本以上あるので、全部見る人がいるのかは分かりません。

供養も兼ねて載せておきます。

使った動画生成AI

今回はMiniMax H3という動画生成AIを使いました。

映像だけでなく、日本語のセリフ、環境音、効果音なども一緒に生成できるモデルです。

操作にはPhospheneを使い、Apple Silicon向けのMLX環境で動かしています。

モデル本体はかなり大きいため、前回増設した外付けSSDへ置きました。

こんなに早くSSDが役に立つとは思いませんでした。

一本作るのにかかった時間

今回の設定では、5秒の動画を1本作るのに約3分半かかりました。

15秒の動画は5秒のカットを3つ、20秒なら4つ作って、最後に繋げています。

メモリ使用量は1本あたり最大40GB前後でした。

512GBメモリのMacStudioなのでメモリにはかなり余裕がありますが、4本同時に動かすと1本あたりの処理が遅くなり、全体の速度はあまり変わりませんでした。

結局、ほとんど直列で作っています。

プロンプトは英語、セリフは日本語

動画の演出指示は基本的に英語で書き、日本語で喋らせたい部分だけ日本語にしました。

例えば、次のような形です。

A transparent umbrella in a quiet Japanese street.
One small glowing blue fish appears inside the umbrella.
The character says in Japanese:
「傘の中に、魚?」

日本語も思っていたより普通に喋ります。

ただし、「湯気」を「行け」と発音したり、短い単語ほど変になることもありました。

そういう場合は、無理に同じ言葉を言わせず、文章そのものを変更して作り直しています。

AIに任せて良かったこと

一番良かったのは、アイディアを考えるところから任せられたことです。

人間が50本分の企画を考えると、途中から似たような内容になったり、考えるだけで疲れます。

今回は、過去に作ったものと重複していないかを確認しながら、商品、観光、採用、教育、ASMRなど用途を変えて作っていました。

作った動画についても、生成時間、メモリ使用量、セリフの認識結果、ボツにした理由などが記録されています。

朝起きてフォルダを見たら、動画と一緒に説明書まで置いてある状態でした。

これは便利。

うまくいかなかったこと

当然ですが、全部うまくいったわけではありません。

特に多かったのは次の問題です。

  • 商品や紙に謎の文字が書かれる
  • 「3個」と指示したのに4個出てくる
  • カットが変わると人物や商品も少し変わる
  • 日本語の発音がおかしい
  • 最後まで箱を閉じてほしいのに少し開いている
  • 縦動画を頼んだのに映像自体が横向きになる

AIは文字を書かないでと何度書いても、隙があると何か書こうとします。

文字を書きたい年頃なのかもしれません。

完成品だけを見るとそれなりに見えますが、裏ではかなりボツが出ています。

やってみた感想

完成したCMをそのまま広告に使えるかというと、まだ細部の確認や人間による編集は必要だと思います。

一方で、企画の叩き台としてはかなり使えそうです。

例えば商品を実際に作る前に、木、石、夕方など複数の見せ方を動画で比較したり、観光PRの世界観を撮影前に確認したりできます。

「明日の打ち合わせまでに動画案を50種類作って」と人間に頼むのは無理がありますが、AIであれば寝ている間に作れます。

今回は僕がやったことだけを見ると、指示を出して寝ただけです。

その前の環境構築にはかなり時間がかかっていますが。

動画制作が全部AIに置き換わるとは思いませんが、アイディアを大量に出して実際に動く形まで持っていく部分は、だいぶ変わりそうです。

次は、この中から実際に広告として使えそうなものを選び、文字やロゴを人間側で追加してみたいと思います。

それではまた。

技術メモ

  • MacStudio M3 Ultra
  • ユニファイドメモリ512GB
  • MiniMax H3
  • Phosphene
  • MLX
  • 5秒生成:約3分半
  • ピークメモリ:約40GB
  • 演出プロンプト:英語
  • セリフ:日本語
  • 生成映像:24fps、ステレオ音声
  • 長い動画は5秒単位で生成して結合
  • 完成動画は全フレームのデコード、音量、日本語音声を確認
  • 一部の効果音は外部素材を使わずローカルで追加合成

【日記】MacStudioに繋ぐためのHanyeのSSDを買った

LLMをローカルでも試したいと思い、1年前くらいにM3UltraのMacStudioを買った

当時はめちゃくちゃ高いと思ってたけど、半導体不足?の今となってはメモリが128GBより大きな512GBのMacはそもそも購入できなくなっているようなので買ってよかった

ちなみに、これと同じMacStudioがメルカリで300万くらいで売れていた

 

このMacStudioは4TBの容量があるけど、LLMのモデルは大きいものだと数百ギガあったり、小さいものでも数十ギガあるので、いろいろ試すと意外とすぐに容量不足になる。

そこで外付けのSSDで容量を増やしたいが速度はある程度欲しいと考えて、今回増設をしてみた。

Thunderbolt 5に対応してれば高速に使えるらしい。

購入したのはこちら

4TB で高速なものを探していたら、ほとんどが10万円を超える中、これだけ7.5万くらいだった(この記事を書いてる時には8.3万になってた。日々の変動が激しい)

素人なのでHanyeというメーカーを知らなかったし、レビューも少なく不安ではあったが、人柱になるつもりで買ってみた

ケースはこちら

SSDだけだと使えないのでエンクロージャ(ケース)が必要らしい

80Gbpsに対応したものでよく冷えそうなものとしてこれを選んだ(購入時の価格は25999円)

2つ合わせて10万円くらい。

届いた

シリコンケース?カバー?に包まれた状態で入ってました。

左にあるのはシリコンの熱伝導シートらしい

裏は銅なのかよく冷えそうな素材

SSDをつけて

シリコンの熱伝導シートを貼ったら完成


速度を計測してみた

読み込みは問題ないけど…書き込み遅くない?

家族アルバム「みてね」で一括ダウンロードする方法

こんにちは、あんどう(@t_andou)です。

子どもの写真を親族間で共有するために「みてね」を使っている人は多いと思います。
しかし、「みてね」では一括ダウンロード機能は提供していません。

参考:写真や動画の一括保存・削除はできますか?

そこで、今回は一度実行するだけで全ての写真・動画をダウンロードするプログラムを作りましたので公開します。(正確には一括ダウンロードではありませんが、一度実行すれば放置するだけで全てダウンロードしてくれます。)

自分用のメモ程度の情報なので、プログラムの実行方法などについては本記事では触れません。

やり方

1.こちらの記事を参考にブラウザからアクセスできるようにURLを発行します。

「みてね」ブラウザ版でパソコンから写真や動画をダウンロードする方法 | あいこうらのさくっとふぉとらいふ

2.pythonの実行環境準備やライブラリのインストールなど、必要な環境構築を行なってください。

3.下のソースの写真アルバム部分を1で発行したURLに変更して実行。

 

gist.github.com

【ChatGPTとStableDiffusion】絵本を描くAIをつくる その1

どうもこんにちは、あんどう(@t_andou)です。

最近は子供の寝かしつけで毎晩絵本を3~5冊読んであげているのですが、同じ本を手に取りがちなのでもう少しいろんな種類の絵本を読んであげたいと考えました。

新しく買っても良いのですが、すでに絵本の棚が溢れかけているのであまり増やしたくなく、一方で毎回図書館に借りに行くのも面倒。

そこで、絵本を描いてくれるAIを作りたいと思います。

大まかな流れ

第1回:今回

品質は問わず、ChatGPTで作った物語にイラストを付けてみるテスト

第2回

作成した絵本をweb上で絵本を見れるようにする

第3回

イラストのクオリティを上げる

第4回

物語のクオリティを上げる

第5回

webサービスのブラッシュアップ:作成リクエストを出せる・読み上げ機能など

まずは結果から

物語と画像生成用promptはChatGPT-3.5による生成
画像生成はStableDiffusion1.5を使っています

一つ目:ちいさなロボットの冒険

SF、8ページ、3歳児向け と指定

ちいさなロボットの冒険

 

二つ目:マックスとバスターの冒険

動物との友情、12ページ、5歳児向け と指定

 

マックスとバスターの冒険

三つ目:ホッピーの冒険

風船で空を飛びたいウサギの話、8ページ、3歳児向け と指定

ホッピーの冒険

感想と今後について

起承転結も書けていて、最初のチャレンジにしては大成功な印象です。12ページでも一回で生成できるのはすごいですね。

しかし、所々不自然な日本語があったり、タイトルが全部「〜の冒険」だったりするので、物語の生成も工夫の余地が大いにありそうです。

今回は一発で全ページ分を書かせましたが
1.事前に起承転結に分けてプロットを書かせる
2.事前に登場人物の設定をしっかり考えさせる
3.前のページまでの話を要約して入力する
などで品質が上がったりしないかなと思ってます。

あと、低年齢の場合は全てひらがなで書くような指定もしたいところです。

イラストの品質についてはまだ何も分からないのでこれから調べます。

技術メモ

最後に、自分用の技術メモを兼ねて下に残しておきます。

1.物語を作る

ここはChatGPTに任せます。

ターゲットの年齢やカテゴリ、ページ数を指定することで、タイトル・概要・各ページごとの挿入するテキストとイラスト生成のための文章をjson形式で生成させます。

promptの例はこんな感じです。

Please generate a 8 pages picture book which category is SF for 3 years old. For each page, provide the text to be included in the book and a description of the illustration to accompany it.Output must be following json format\n{\n    "title": "title",\n    "title_jp": "title_jp"\n    "coverIllust": "description for cover illust",\n    "summary": "summary",\n    "content": [\n        {"page": 1, "text": "text in picture book","text_jp":"Japanese of text", "illustration_description": "description for illust"},\n        {"page": 2, ...}\n    ]\n}

この結果が以下になります。

{'title': "The Little Robot's Adventure",
 'title_jp': 'ちいさなロボットの冒険',
 'coverIllust': 'The cover illustration shows a small, friendly-looking robot standing in a field of colorful, blooming flowers. The setting sun paints the sky in hues of orange and purple, creating a warm and inviting atmosphere.',
 'summary': 'Join the Little Robot on an exciting journey through space and discover the wonders of the universe!',
 'content': [{'page': 1,
   'text': 'Once upon a time, in a land far away,\nA little robot named Andy loved to play.\nHe dreamed of exploring far beyond Earth,\nTo see the stars and planets of infinite worth.',
   'text_jp': 'むかしむかし、遠い国で、\nアンディという小さなロボットが遊ぶのが大好きでした。\n彼は地球の遠くを探検し、\n無限の価値を持つ星と惑星を見たいと夢見ていました。',
   'illustration_description': 'Andy, the little robot, can be seen in his cozy workshop, surrounded by gears, wires, and tools. His eyes are gleaming with excitement as he looks at a poster of outer space.'},
  {'page': 2,
   'text': "One night, a shiny meteor fell from the sky,\nAnd landed right before Andy's eyes.\nIt was a spaceship, oh, what a sight!\nAndy's heart raced with pure delight.",
   'text_jp': 'ある夜、輝く流星が空から落ちてきて、\nアンディの目の前に着地しました。\nそれは宇宙船で、何て素晴らしい光景でしょう!\nアンディの心は純粋な喜びで躍りました。',
   'illustration_description': "Illustration shows the spaceship, shimmering with metallic colors and emitting a soft glow, in front of Andy's workshop. Andy stands in awe, his eyes widened with excitement."},
  {'page': 3,
   'text': 'He hopped inside, with a bleep and a bop,\nAnd pressed a button to start the top.\nThe spaceship zoomed up into the sky,\nAs Andy waved Earth a heartfelt goodbye.',
   'text_jp': '彼はビープとボップとともに中に入り、\nボタンを押してスタートさせました。\n宇宙船は空に飛び上がりました。\nアンディは地球に心からさよならを告げました。',
   'illustration_description': "Andy is seen inside the spaceship, sitting in the pilot's seat with a control panel full of buttons and switches. The ship is blasting off into the night sky, leaving behind a tail of stardust."},
  {'page': 4,
   'text': 'Through galaxies far and nebulas bright,\nAndy traveled each day and every night.\nHe saw shooting stars and planets of blue,\nAnd discovered wonders he never knew.',
   'text_jp': 'アンディは遥かな銀河と明るい星雲を通って、\n昼も夜も旅をしました。\n彼は流れ星や青い惑星を見ましたし、\n知らなかった驚きを見つけました。',
   'illustration_description': "Andy's spaceship is shown soaring through space, passing by colorful nebulae and sparkling stars. Andy's face reflects amazement and curiosity as he gazes out the window."},
  {'page': 5,
   'text': "But soon, Andy missed his dear home,\nWhere friendly faces used to roam.\nHe decided it was time to return,\nWith memories and knowledge he'd earned.",
   'text_jp': 'しかし、アンディはすぐに大切な故郷を恋しく思いました。\n昔は友達の顔がいっぱいでした。\nアンディは帰る時がきたと決め、\n思い出と知識を持ち帰ることにしました。',
   'illustration_description': 'The illustration depicts Andy sitting in his spaceship, a hint of nostalgia in his eyes as he looks back at Earth. The backdrop showcases distant planets and stars, symbolizing the vastness of space.'},
  {'page': 6,
   'text': "With a flick of a switch, he sailed back,\nEntering Earth's atmosphere, no time to slack.\nThe spaceship landed softly on familiar ground,\nReuniting him with friends all around.",
   'text_jp': 'スイッチをポチっと押すと、彼は引き返しました。\n地球の大気圏に入る瞬間、時を惜しまず。\n宇宙船は馴染み深い地面にやさしく着陸し、\n彼は周りの友達と再会しました。',
   'illustration_description': 'The spaceship gently descends, surrounded by a crowd of joyful friends eagerly waiting to welcome Andy back. The scene is filled with laughter, hugs, and the warmth of friendship.'},
  {'page': 7,
   'text': 'Andy shared stories of his great exploration,\nOf planets and stars in a fantastic formation.\nHis friends listened with awe and delight,\nDreaming of their own adventures each night.',
   'text_jp': 'アンディは偉大な探検の話を友達と共有しました。\n幻想的な形成物の惑星と星の話を。\n友達は畏敬と喜びをもって聞き、\n毎晩自分自身の冒険を夢見ました。',
   'illustration_description': 'In this illustration, Andy is seen surrounded by his friends, their eyes wide with wonder as he recounts his thrilling adventures in space.'},
  {'page': 8,
   'text': "From that day on, the little robot's quest\nWas to inspire others to be their best.\nTo look at the stars with wide-eyed glee,\nAnd believe that anything's possible, you see!",
   'text_jp': 'その日から、その小さなロボットの目的は\n他の人々に最善を尽くすことを奮起させることでした。\n笑顔で星を見ることを通じて、ワクワクして、\nどんなことでも可能だと信じることなんですよ!',
   'illustration_description': 'The final illustration showcases Andy surrounded by a group of children, all gazing up at the night sky in wonder and awe. Their faces radiate excitement and hope for the future.'}]}

日本語のタイトルやテキストは別処理で翻訳しても良いのですが、今回は第1回ということで、サクッと成果物を見たかったため一緒に書いてもらいました。

2.1で生成したイラストの説明文でイラストを生成

1で生成した説明文を使って画像を生成します。

ここでは手元のGPUマシンでStableDiffusionを起動して、そこにAPIでリクエストを投げています。

APIサーバーの記号は次のコマンドで、生成リクエストは後述

python launch.py --server-name 0.0.0.0 --xformers --xformers-flash-attention --nowebui --listen

3.イラストに物語を入れる

ChatGPTが生成したjsonの情報を使って、全ページ分の画像を生成し、最後に画像と文章を合成します。

# Stable Diffusion Web UIのURLを設定します
url = "http://192.168.1.100:7861/sdapi/v1/txt2img"
import os
import json
import requests
import base64
from PIL import Image, ImageDraw, ImageFont
import textwrap
from io import BytesIO

font_path = "Nちはやフォント+.ttf"

def generate_and_save_image(prompt, path):
    payload = {"prompt": "Illustration:"+prompt} # ここでSDのパラメータを指定する
    response = requests.post(url, json=payload)
    image_data = base64.b64decode(response.json()['images'][0])
    image = Image.open(BytesIO(image_data))
    image.save(path)

def add_text_to_image(image_path, text, font_path, canvas_size=(512*2, 512)):
    canvas = Image.new('RGBA', canvas_size, (255, 255, 255, 255))
    image = Image.open(image_path)
    canvas.paste(image, (0, 0))

    draw = ImageDraw.Draw(canvas)
    font = ImageFont.truetype(font_path, 30)
    lines = textwrap.wrap(text, width=15)
    y_text = canvas_size[1] // 2 - len(lines) * 15

    for line in lines:
        bbox = draw.textbbox((0, 0), line, font=font)
        width = bbox[2] - bbox[0]
        draw.text(((canvas_size[0]/2 - width) / 2 + canvas_size[0]/2, y_text), line, font=font, fill="black")
        y_text += 30

    canvas.save(image_path)

# タイトルに基づいてディレクトリを作成します
os.makedirs(book_data["title"], exist_ok=True)
os.makedirs(os.path.join(book_data["title"],book_data["title_jp"]),exist_ok=True)

# book_dataをJSON形式で保存します
with open(os.path.join(book_data["title"], "text.json"), 'w') as f:
    json.dump(book_data, f)

# カバー画像を生成します
cover_image_path = os.path.join(book_data["title"],book_data["title_jp"], "0.png")
generate_and_save_image(book_data["coverIllust"], cover_image_path)

# カバー画像にテキストを追加します
add_text_to_image(cover_image_path, book_data["title_jp"], font_path)

# 各ページの画像を生成します
for page_data in book_data["content"]:
    page_image_path = os.path.join(book_data["title"],book_data["title_jp"], f"{page_data['page']}.png")
    generate_and_save_image(page_data["illustration_description"], page_image_path)
    add_text_to_image(page_image_path, page_data["text_jp"], font_path)

ChatGPTでコピペできるテンプレートを選べるサイトを作った【完全無料】

どうもこんにちは、あんどう(@t_andou)です。

ChatGPTと会話をする際に「英会話の教師として相談に乗ってほしい」とか「小説を校正してほしい」とか「ブッダになってほしい」などなど…ありますよね。

そんな時には次のプロンプト集が便利です。

便利なプロンプト集

https://github.com/f/awesome-chatgpt-prompts

こちらに役割とpromptのセットが大量にあり便利なのですが、英語なのでぱっと見わかりづらいため日本語でさっとコピペできるサイトを作りました。

作ったサイト

https://chatgpt-templates.web.app/

使い方

  1. 日本語で会話したい場合は「日本語で回答させる」にチェックを入れる
  2. ChatGPTに期待する役割を選択する
  3. 出てきたテンプレートをコピー
  4. ChatGPTにペーストして使う

具体例

webデザインコンサルタント

酔っ払い

最後に

完全無料なのでぜひ使ってみてください。

また、ChatGPTなどでこんなことは出来ないか?などのご相談もお待ちしてます。(簡単にできるものであればブログなどで公開することを条件に無料で作るかもです)

ChatGPTの実験 : DBを作る

どうもこんにちは、あんどう(@t_andou)です。 今回はChatGPTのAPIを使って遊んでみたのでメモをしておきます。

背景

ChatGPTに生成させる際にフォーマットを指定する事で構造化データ(CSVやDBなど特定のフォーマットに則ったデータ)が作れそうだと考えました。

ChatGPTは2021年までの情報しか学習させていない上に正確性に欠けるため、ダミーデータを作ることなどが適切な使用法だとは思うものの、移り変わりの少なそうな観光地情報などであればある程度実用に耐えられるかも?そこも実験してみようと判断し、全国の観光情報DBを作ってみることにしました。

やったこと

  • ChatGPT APIを使って全都道府県のアクティビティ・観光情報(18493件)を集め(生成し)DBを作った
  • 表示するwebアプリを作った

作ったもの

URL

https://tabi-ai.web.app/

使い方

都道府県を選択するとおすすめのアクティビティや観光地がランダムに最大9件くらい表示されます。
各アクティビティには名称、詳細、所要時間やコスト、難易度、対象年齢などの情報を載せてます。

今後の予定

モチベーション次第ですが、予算や滞在時間を選択するとおすすめのプラン(移動時間や営業時間は無視)を組み立てるところまで出来そうだしやりたい

やってみてわかったこと

  • 決まったフォーマットでと指定しているにも関わらず、ChatGPTがたまに我に返って変な前置きをしたりするので、そういう時はエラーが出るが素直にやり直すのが吉(例外処理を詳細に書くよりコストが安いと判断)
  • ChatGPTはDB作成にも使えた
  • 全都道府県18493件のデータを集めたが、かかったコストは12ドルくらい
  • アクセスを分散すればもっと早く終わると思うが1日くらいかかった

当然だけどDBにする事で下記も見込める - レスポンス速度の向上 - レスポンス長の制限無し - 1呼び出しあたりのコストが激安になる

まとめ

正確性は未検証なものの、飲食店のおすすめよりもちゃんとしたデータが出てきてそう。 この規模のデータベースを1日でしかも12ドルで作れるのはなかなか良い感じ。

プロフィールなどのデータ作成は向いているので、↓こういうこともやりたい。

もっと詳しい作り方を知りたいという方は僕と友達になってください。

あんどう@AI開発者 (@t_andou) / Twitter

それでは。