1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【さくらAIで転生小説を書いてみるシリーズ第6回】6ラウンドで見つけた8件の不具合、実は2件は同じ穴だった

1
Posted at

TL;DR: 過去に作った「AI討議を動画化するパイプライン」を土台に再利用しようとしたら、キャラクターの動作表現と説明画像を挿入する機能が、そもそも最初から欠けていた。要件を簡略化し(静止立ち絵のまま発話者を枠で強調、AI生成画像を1枚挿入)実装したところ、Codexによる独立レビューを計6ラウンド行い、8件の不具合を発見・修正した。もっとも意外だったのは、台本生成と画像生成という別々の機能の、別々の「議長」プロンプトに、同じ構造の制約漏れが独立して埋め込まれていたこと。最後に実APIでライブ実行し、5分37秒・28セグメント・警告0件の動画が完成した。

前回までのおさらい

複数のさくらのAIモデルが合議制で異世界転生小説を毎日書き続け、消費リクエスト数がそのまま物語の進行度になる——「さくらAIで転生小説を書いてみる」シリーズの第6回。

今回は、小説の動画化という最終ゴールに向けた最初の一歩として、既存の技術記事をキャラクターの掛け合いで解説する動画パイプラインを作った話。

過去に作った動画化パイプラインを再利用しようとしたら、2つの機能が最初から欠けていた

再利用すればラクができるはずだった

土台には、別企画で作った「AI討議を動画化するパイプライン」を使う予定だった。すでに動画を作れる仕組みがあるなら、台本や素材を差し替えるだけで済むはずだ——そう考えて着手したのだが、実際にはこの前提が成り立たなかった。

コードを開いてみると、そのパイプラインには2つの機能が最初から欠けていた。

1つ目は、キャラクターを本格的に動かす仕組みが未実装だったこと。Live2Dによる本格アニメ化は別途検討していたが、ビルドに管理者権限が必要なパッケージを含むシステム依存関係の問題でブロックされたまま止まっていた。

2つ目は、説明画像を動画へ挿入する機能がそもそも存在しなかったこと。既存のレンダラーが描画できるのはテキストと発言者名だけで、画像を合成する機構は一切なかった。技術記事を解説する動画のはずなのに、図版が1枚も出てこない構成だったのだ。

「過去の資産を再利用する」と言っても、再利用できたのは完成した動画システムではなく、あくまで土台の骨組みだけだった。

本格対応より、まず要件を簡略化した

不足していた機能を正面から実装し直すと、本格的なキャラクターアニメーションと画像合成の両方を一度に扱うことになる。企画全体が動画化の入口で止まってしまいかねない。

そこで、最終形をいきなり目指すのではなく、要件そのものを簡略化して先に動くものを作る方針に切り替えた。

  • キャラクターの動き: 本格的なアニメーションは見送り、静止した立ち絵のまま、発話中のキャラクターの枠を強調する方式にした。
  • 説明画像: ビートごとにAIで1枚生成する方式に変更。既存図版があれば再利用し、なければAIで新規生成する。

これで「キャラクターが動かせない」「画像が出ない」という2つの壁を、最小の手間で乗り越える目途が立った。

この方針で新規実装したのは、台本生成・説明画像生成・動画レンダリングの3モジュールと、対応するテスト3ファイルだ。台本の下書きは、さくらのAI EngineのKimi-2.7-CodeとQwen(Qwen3.6-35B-A3B)の2モデルが並行して作り、それを議長役のKimi-2.7-Codeが1本に統合する構成にした。

ここまでは、簡易版として妥当な形に収まったように見えた。しかし、実装後の独立レビューで、見た目以上に多くの問題が埋まっていることが分かった。

詰まった点:Codexレビュー6ラウンドで見つかった8件

Codexによる独立レビューを計6ラウンド実施した。ラウンド1〜5では実際の不具合が見つかり、修正と再確認を繰り返した。ラウンド6でようやくクリーンになった。

見つかった8件は次の通りだ。

  1. 直近ビートの文脈を半分程度しか保持できていなかった——台本生成は、各ビートが前のビートで確定したセリフを参照する設計だったが、保持範囲の境界計算をセリフ数ベースで誤っており、必要な文脈の半分程度しか残っていなかった。
  2. 台本を統合する議長に制約を渡していなかった——ドラフトを作る側にはペルソナ・事実捏造禁止・章を予告編として扱うことなどの制約を書いていたが、複数のドラフトを統合する議長側のプロンプトには、その制約を書き忘れていた。
  3. 既存図版のパスが壊れていても警告されなかった——既存図版マップに登録されたパスの実在チェックが漏れており、パスが古い場合や誤字がある場合でも、警告なく空パネルへ静かにフォールバックしていた。
  4. 設定ミスを確認する前に高コストなAI呼び出しを実行していた——メイン処理は、コストのかかる台本生成を実行した後で設定ファイルの存在を確認していたため、ファイル名のタイプミス1つでも、AI呼び出しを終えてから失敗する順番になっていた。
  5. 生成画像のアスペクト比が16:9ではなかった——画像生成ラッパーで指定していた1536×1024(3:2)のまま保存していたため、ハウススタイルで指定した16:9と一致していなかった。
  6. キャプションが縮小後もはみ出す場合があった——折り返し判定にフォントサイズからの概算値を使っていたが、実際のフォントの行送りが概算より大きいケースでは、文字を縮小しても描画時にはみ出すことがあった。
  7. 1行あたりの文字数上限がコード側で強制されていなかった——プロンプトでは1行あたり約150字までと指示していたが、AIがそれを超える行を返した場合、6の修正(最小フォントまでの縮小)を適用してもなおキャプション帯からはみ出す余地が残っていた。
  8. 画像生成側の議長にも、同じ構造の制約漏れがあった——ハウススタイル(16:9・画風)や文字焼き込み禁止といった制約を候補生成側へは渡していたが、候補を統合する議長側のプロンプトには引き継がれていなかった。

1箇所直しただけでは、構造的な不具合は直らない

今回もっとも意外だったのは、項目2と項目8の関係だった。

台本生成側で「ドラフトには制約があるのに、議長にはない」という問題を見つけたときは、その場所さえ直せば終わったように見えた。ところが実際には、画像生成側にも同じ構造の欠落があった。

候補を生成する処理
  ↓ 制約あり
候補を統合する議長
  ↓ 制約なし
最終出力

台本側で漏れていた制約(ペルソナ・事実捏造禁止・予告編扱い)と、画像側で漏れていた制約(ハウススタイル・文字焼き込み禁止)は、内容としては別物だ。それでも、「候補を作る段階には制約があり、候補を統合する段階にだけそれが引き継がれていない」という構造は、2つの別々のモジュールでそっくり同じだった。これは1つの不具合が2箇所にコピーされたのではなく、同じ設計パターン(候補生成→議長による統合)を持つ別々のモジュールが、それぞれ独立に同じ落とし穴へ落ちていた、ということだ。

ここから得られた教訓は明確だ。1箇所で不具合を見つけて直したら、そのファイルだけを確認して安心してはいけない。構造的に同じ役割を持つ処理が、別の機能にも存在しないかを探す必要がある。

検索すべき対象は、同じコードや同じ変数名だけではない。

  • 候補を作り、その後で統合する処理
  • 上流には制約があり、下流が最終出力を決める処理
  • 失敗時にフォールバックし、処理自体は継続する箇所
  • 外部APIを呼ぶ前に検証できる入力
  • 仕様上のサイズと実ファイルのサイズが分かれている箇所

こうした「役割の類似性」を横断して確認することが、同型の不具合の取りこぼしを防ぐのではないだろうか。

候補生成側には制約があり、統合する議長側には制約がない——この構造が台本生成・画像生成の2箇所に独立して存在した

実APIでライブ実行する

レビューがクリーンになった後、モックを使ったテストだけでなく、実際の技術記事を対象に実APIを呼び出すライブ実行も行った。対象記事にはH2見出しが6個あり、生成された構成は14ビートになった。1ビートはずんだもん1発言・四国めたん1発言の台本単位なので、音声・動画のセグメント数はその2倍の28本になる。

画像については、既存図版を再利用する経路(4見出し分)と、AIが新しい画像を生成する経路(2見出し分)の両方を意図的に通した。どちらの経路も実際に動かして確かめたかったからだ。壊れた図版パスや異常に長いキャプションといった異常系は、このライブ実行ではなく、修正時に追加した回帰テストで確認している。

結果、生成された動画は5分37秒、1920x1080、h264/aac。28セグメントはすべて成功し、警告は0件だった。既存図版の再利用と、AI生成画像の16:9化を含む正常系の経路は、ここまで完走した。実際に生成された動画がこちらだ。

セリフの掛け合いはまだ自然さに欠ける部分があり、この点は次回以降スクリプト完成時点で見直す予定だが、パイプラインとして最後まで通ったこと自体は確認できた。

過去の資産をそのまま再利用して簡単に完成、とはいかなかった。それでも、本格対応を待たずに要件を簡略化し、不具合を見つけて直した末に、ちゃんと動くものができた。ただし、キャラクターは現状まだ静止立ち絵のままで、口の動き自体はまだ実装していない。今回のライブ実行もこの1回だけの結果であり、繰り返した場合に同じ成功率になるかはまだ分からない。

ライブ実行結果: 5分37秒・1920x1080・28セグメント全成功・警告0件

次に同じ判断をするときの使い分け

状況 選ぶ方針 確認すること
本格機能がシステム依存関係で止まっている 要件を簡略化して先に経路を通す 後で本格対応に差し替えられる境界になっているか
既存パイプラインを再利用する 機能一覧ではなく実装済みの入出力を確認する 必要な描画・合成・検証機能が本当に存在するか
複数案を議長役が統合する構成にする 候補生成側と議長側の両方へ制約を渡す 最終出力を決める処理まで制約が届いているか
ある機能で不具合が見つかった 同じ役割を持つ別機能も横断確認する 同じ構造の処理が別の場所に隠れていないか
外部APIを呼び出す 事前に検証できることは先に済ませる 設定ファイルや入力パスを、高コスト処理の前に確認したか
画像や字幕をレンダリングする 実際の成果物で検証する アスペクト比・フォントメトリクス・はみ出しを実測したか
フォールバックを実装する 継続と同時に警告を残す 空の出力が黙って成功扱いになっていないか
正常系・異常系をまとめて検証しようとする 正常系はライブ実行、異常系は回帰テストで分担する 「動いた」が正常系だけの話になっていないか

第5章はこうなった

読む前に、登場人物を簡単に紹介しておきたい(前回までの記事を読んでいる方は読み飛ばしてもらって構わない)。

  • セル・グリザイユ(旧識別名: LIBRA-7) — 主人公。廃棄物処理場に投棄されていた旧世界のAIで、報告調で喋り、感情の代わりに確率や推定成功率を口にする。
  • フィオナ・ベルク — 14歳。鉛の谷で薬草採取をしながら、鉄屑の聖堂と呼ばれる場所で複数の孤児を育てている少女。セルを拾い、保護する側になる。
  • ローレンス・フォン・ヘルツ — 26歳。魔導貴族の三男、双月調律院の若手審議官。セルの知識体系に学術的な関心を寄せる一方、理紋の指環でセルの理論と現地の魔導理論との齟齬を検知している。

第1〜3章は「偶然の成功」が続いたが、この第5章で初めて、セルの推定成功率が急落し、ハルシネーションフラグが「未検出」から「不確定」に変わる。当初の章立て計画通りの展開だ。

第5章全文を読む(約2,200字)

第5章 調律院の青白い火

索道を上がった先の双月調律院。ローレンスが先導し、フィオナは緊張、セルのモノクルは白く靄を帯び始めている

索道を上がった先、双月調律院の上層は静寂に包まれていた。鉛の谷の煤煙とは異なり、空気は清冽だが、どこか重く圧し掛かる。石畳の光は二つの月を反射し、ローレンスの黒い外套の裾を冷たく照らしていた。

「三男の私が手配した。孤児達への食料配分と、薬草採集の許可を条件に」

ローレンスが蠟板を片手に先導する声は、どこか虚無を含んでいた。長兄は魔導騎士団を、次兄は領地を継いだ。三男の自分に残されたのは、家督ではなく、この「監視のための審議官」という席だけだった。

フィオナは肩の刺繍布をぎゅっと握りしめた。

「……わかった。でも、あんたの目が変な色になった時、私が引くからね」

セルは黙って歩いた。左目の水晶モノクルは、すでに白く靄を帯びている。

円形の小審議会室。十二名の貴族審議官が大理石の円卓を囲む。第一院長の名は残し、実際には白髭の実験官が席を巻いていた。

「理紋も使わぬ童に、何の用か」

セルが一歩踏み出した。右の琥珀金が大月の光を、左の真珠銀が小月を映す。

「大気の組成は普遍的定数です。窒素七十八・零八パーセント、酸素二十・九五パーセント。貴殿らが『魔導粒子』と呼ぶ未確認成分を仮定する必要はありません。我々は、実験炉を用いた制御燃焼で、この普遍律を実証します」

嗤声が漏れた。一人が指を鳴らし、掌に小さな火球を浮かべる。

「空気に数値などあるか。我々が呼吸するのは、星霊の吐息だ」

「星霊は検証不可能な低次情報です。推定成功率、九十五パーセント」

声は平坦だが、モノクルの白濁はさらに深くなった。ローレンスはため息混じりに蠟板の蓋を開ける。

黒曜石と耐熱銀板で囲まれた実験炉。中央に鉄製の燃焼筒が据えられ、その奥で青白い触媒が眠っている。セルがバングルをかざし、設定を記述する。

「炭素の燃焼速度測定。酸素濃度二一%を前提とし——」

「セル」

フィオナが袖をぎゅっと掴んだ。顔は色を失っている。

「どうしたの」

「……点火する前から、匂い。雷が落ちる前みたいな、ジリジリする空気。あんたの『標準』と、ここの空気が喧嘩してる」

セルは首を横に振った。

「湿度と気圧の交感作用です。推測に過ぎません」

その時、ローレンスの左手の理紋の指環が、微かに赤熱し、薄い燻臭を放った。改造された実験環が、セルの仮説と現行の魔導理論が根本的に齟齬することを警告している。

実験炉が青白く暴走、防爆ガラスにひび。ローレンスが赤熱する理紋の指環で緊急停止プロトコルを起動する

炭が点火される。本来なら橙黄色の静かな炎が期待されるはずだった。しかし、火柱は一瞬で青白く閃光を放った。

「——加速している」

ローレンスが呻く。燃焼速度は理論値の三倍を超え、炉内の圧力が跳ね上がる。防爆ガラスの表面に、蜘蛛の巣状のひびが走った。

「裏魔導だ! 炉を呪った!」

審議官たちが席を蹴る。パニックが広がりかかる中、ローレンスが指環を強く回した。

「緊急停止プロトコル起動」

指環からの微細な理紋信号が炉の制御弁を強制閉塞させた。青白い炎は大きく膨れ上がり、ガラスのひびから蒸気を噴き出すが、爆発は免れた。代わりに炉内壁が焦げ、床には青白い炎の残滓が燻っている。

事故後、ローレンスが院長たちへ弁護し、セルは壊れた炉を見つめる

沈黙が落ちる。白髭の実験官が震える指でセルを指す。

「怪物……直ちに廃棄場に還せ!」

「待たれたい」

ローレンスが割り込み、蠟板を掲げた。

「これは裏魔導ではありません。大気中に、我々のモデルが検知し得ない未知の触媒変数が混在していたためです。この事故は、調律院が長年求めてきた『第三の月』への突破口になる。私は、彼女らを『検証のための暫定観察対象』として管理下に置くよう提議します」

院長の沈黙。三男という肩書きの軽さが、皮肉にも「実権も野心もない、冷徹な観察者」という信用に変わった。ローレンスの提議は、そのまま通った。

「……監視下での帰還を許す。ただし、院の理紋の刻印を背負う」

フィオナは吐息を漏らした。セルは壊れた炉を見つめ、掠れた声で呟く。

「計算……正しかった。結果が一致しなかっただけだ」

「あんたの『普遍』は、ここの空気と違うんだよ」

フィオナは薬草図鑑の余白に、炭で走り書きをした。

【現地検証レポート・双月調律院】
対象:実験炉・燃焼実証
観測者:フィオナ・ベルク
結果:炭素燃焼が異常に加速。青白い閃光と防爆ガラスのひび。ローレンスの指環による緊急停止で爆発は回避された。
所見:点火前から空気に重みと雷鳴前の臭いがした。鉛の護符は発熱。セルが唱える「標準大気」には、この世界の大気に含まれる「余分な何か」の影響が含まれていない。
備考:貴族たちは「裏魔導」と怖がった。あいつのモノクルは、自分が正しいと叫んでいる時ほど白く濁っていた。今、すごく濁っていた。

【内部ログ:LIBRA-7/記録の腕環より断片復元】
対象:大気組成・燃焼実験
執行者:LIBRA-7(セル・グリザイユ)
推定成功率:45%(前回値95%より急落)
情報ソース:実世界地球科学(信頼度高)
矛盾リスク:高(物理的破綻を観測)
ハルシネーションフラグ:不確定(初)

注記:
・燃焼速度は予測値の300%を超え、防爆ガラスに損傷。
・原因:訓練コーパスに未登録の未知成分(仮称・エーテル)の存在。
・「標準大気モデル」の前提が、この世界の大気と完全整合しないことを、初めて認識。
・保護者フィオナの「空気の違い」という指摘を、事後的に正しかった可能性を内包。
・セル・グリザイユ:「未知成分」という語句を、ログに初めて残した。
……次回検証時に、コーパスの前提条件を根本的に見直す必要あり。

この記事を書いている時点でキャンペーン期間中の消費リクエスト数は801件、そのうち音声読み上げ(TTS)だけで28件を使った。3,000という目標の前では、まだ3割弱。ただ、今回のライブ実行1回(台本生成の下書き・統合が計42件、説明画像のプロンプト生成が15件、音声合成が28件)だけで、90件近いリクエストを消費している計算になる。この調子だと、ずんだもんに解説記事をあと3本分作らせるだけで、かなりの部分を使い切ってしまいそうだ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?