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で転生小説を書いてみるシリーズ第8回】レビューもテストも通ったのに、動画を見るまで気づけなかった話

1
Posted at

TL;DR: コードレビューと自動テストは、プログラムが決められた通りに正しく動くかどうかを確かめる仕組みだ。でも、できあがった動画が見た目として自然かどうか、思った通りの印象を与えられているかどうかは、まったく別の話だった。動画や画像のように「見た目」で評価するものは、結局のところ実際に再生して自分の目で確かめる工程を省略できない。

「レビュー済み」と「完成」は別。コード・テストは正しく動くかを検証できるが、意図どおりに見えるかは実際に見るまで分からない

隙のない「実装完了」に見えた

キャラクター同士が会話する短い解説動画を自動でつくるパイプラインに、ちょっとした演出を追加した。立ち絵(キャラクターの静止画)を毎フレーム少しだけ上下にずらして、体がゆっくり揺れているように見せる、という軽い仕掛けだ。完全に止まった絵よりも、少しでも動きがあった方がキャラクターらしく見えるだろう、という狙いだった。

実装したあとは、自分とは別のAI(Codex)にレビューしてもらい、複数回に分けてチェックを受けた。自動テストも実行し、最終的には36件すべてが無事にパスした。

このレビュー、実はかなりしっかり機能していて、実際に2つの不具合を見つけてくれた。

動画は、セリフの「ひとかたまり」ごとに個別の映像として作られ、あとでつなぎ合わせる仕組みになっている。最初の実装では、揺れの動きを各パーツの中のコマ番号だけを基準に計算していたため、パーツが切り替わるたびに計算がゼロからやり直しになってしまい、つなぎ目のところで揺れの動きが不自然にジャンプしていた。

これを直したあとも、もう少し細かい問題が見つかった。音声の長さがぴったりコマの整数倍にならない場合、動画を書き出すときには短い方、つまり音声の長さに合わせて映像が切られる。ところが揺れの計算は「切られる前の」コマ数をもとに次のパーツへ引き継いでいたため、計算上の動きが実際の映像よりわずかに先走ってしまっていた。その差は200ミリ秒(0.2秒)にも満たないくらいだったが、つなぎ目に小さな違和感を残す原因になっていた。

どちらもレビューでちゃんと見つかり、直した。テストもすべて通った。

この時点では、たとえば「実装完了。第三者によるレビュー済み。テストは36件すべてパス」と報告できるくらいの状態だった。

一見すると、まったく隙のない完了報告だった。

動画を再生すると、ただフワフワしていた

ところが、実際にできあがった動画を人に見てもらったところ、思いがけない指摘が返ってきた。

「フワフワしているだけで、手足がまったく動いていない」

プログラムとしては、狙い通りの揺れの動きでキャラクターが上下していた。つなぎ目の動きも正しく引き継がれていた。自動テストも通っていた。

それでも、実際の映像として見ると、「キャラクターが動いている」というよりは「一枚の絵がそのまま宙に浮いている」ように見えてしまっていたのだ。

これは、レビューでもテストでも一度も引っかからなかった、まったく別の種類の欠陥だった。

実装→レビューで継ぎ目のズレを検出→テスト36件パス→それでも再生すると「フワフワしているだけ」と気づく

レビューが見つけたもの、見つけられなかったもの

今回のレビューが役に立たなかったわけではない。むしろ、きちんと機能していたと言っていい。

レビューが見つけた2つの不具合は、どちらも「パーツの継ぎ目で、揺れの状態をどう引き継ぐか」という、実装上の大事な問題だった。特に、音声に合わせて映像が切られることで生じる0.2秒未満のズレも、きちんと検出された。

レビューで実際に確認できていたのは、だいたいこんな内容だった。コマの位置の計算がずっと一貫しているか。パーツをつなぎ合わせても揺れの動きが連続しているか。実際に書き出される映像の長さと、次のパーツへ渡す情報がちゃんと一致しているか。これらはすべて、「プログラムとして正しく動いているかどうか」という一つの軸に属する話だ。

一方で、人からの指摘はまったく別の軸にあった。キャラクターが本当に動いているように感じられるか。上下に動くだけの一枚絵が、不自然に浮いて見えていないか。狙っていた表現と、実際に受ける印象が一致しているか。

揺れの動きが計算として正しいことと、その揺れが自然なキャラクターの動きに見えることは、まったく別の話だったのだ。

テストが通っていたからといって、欠陥が存在しないとは限らない。今回は、テストが確認していなかった「見た目」という軸のほうに、別の欠陥が残っていた。とはいえレビューが役立たずだったわけでもない。渡されたコードと仕様の範囲の中では、実際に複数の不具合を正しく見つけている。ただ、できあがった映像を見たときにどんな印象を受けるか、というところまでは、そもそもレビューの確認対象になっていなかったのだ。

素材を開いて初めて分かった制約

「手足が動いていない」という指摘を受けて、キャラクターの公式なイラスト素材を調べ直してみることにした。

素材は、パーツごとにレイヤー(層)が分かれた、絵を描くソフトのファイルだった。実際に開いて中身を確認すると、腕については複数のポーズの差分がちゃんと用意されていた。基本のポーズに加えて、腕を軽く広げたポーズも作れることが分かったのだ。

ところが、脚についてはポーズの差分自体が存在しなかった。

つまり、腕は絵の差し替えによってそれらしく動かせるけれど、脚は同じやり方では動かせない、ということになる。

素材を開いて確認: 腕にはポーズ差分レイヤーがあり切り替えられるが、脚には差分レイヤー自体が存在せず今回の方式では動かせない

この制約は、プログラムのコードだけを眺めていても分からない。「素材はこうなっているはず」と頭の中で想像しているだけでも分からない。実際に配布されているファイルを開いて、中のレイヤー構造を確認してはじめて分かることだった。

ここでも、動画を再生したときとまったく同じ構造が繰り返されている。できあがったものや素材そのものに実際に触れてみるまで、大事な情報が確認の外側に取り残されたままになっていたのだ。

腕のポーズ切り替えを追加した

素材の制約が分かったので、セリフのひとかたまりごとに、腕のポーズを切り替える機能を追加することにした。

使うのは、基本のポーズと、腕を軽く広げたポーズの2パターンだけだ。脚は対応する素材が存在しないので、今回の絵の差し替えという方式では動かせないと判断し、対象から外した。

この追加の実装も、もう一度レビューにかけてもらった。すると、レビューはさらにもう1つ、不具合を見つけてくれた。中身は、これまでと同じ種類の問題だった。腕のポーズ切り替えという新しい要素も、パーツの継ぎ目でどう引き継ぐか、というところに落とし穴があったのだ。これも直した。

つまりレビューという工程は、追加の実装でもきちんと期待通りに機能していたことになる。今回の一連の作業では、動きのつなぎ目に関する不具合が、種類でいうと2種類、件数でいうと3件、レビューによって見つかり、直されたことになる。

そのあと、あらためて動画を作り直し、実際に人に見てもらった。今度の評価は、こう変わった。

「紙芝居のような動きだが、ちゃんと動いて見える。これで一旦は十分」

ここでようやく、この機能を一区切りとして確定させることができた。

これは今回だけの話ではない

動画を実際に見て、はじめて問題に気づいた、という経験は、実は今回が初めてではない。

同じ動画づくりの取り組みの中で、別の回にも、台本の文章だけをチェックしていた段階では見抜けなかった問題があった。実際に完成した動画を通して見ると、カットとカットのつながり方、間の取り方、字幕が出るタイミングなど、いくつもの点が気になったのだ。

文章として読む台本と、時間の流れの中で実際に見る動画とでは、体験そのものが違う。台本の一文一文としては適切でも、前後のカットをつなげると急に感じることがある。文章としては自然でも、実際に音声にしてみると間が長すぎたり短すぎたりする。字幕の内容が正しくても、出るタイミング次第では読みにくくなる。

今回の揺れの演出も、これとまったく同じだった。プログラムとして正しく実装された動きが、動画として見たときに狙い通りの動きに見えるとは限らない。これはたまたまの見落としというより、「作ったもの」を別の形式(文章から映像へ、コードから見た目へ)へ変換したときに、繰り返し現れるパターンだと考えたほうがよさそうだ。

つまずいたところから得た学び

一つ目は、「正しく動く」ことと「思った通りに見える」ことは、そもそも別の条件だということ。揺れの計算や、パーツの継ぎ目の引き継ぎ、映像の長さとの整合性は、コードレビューとテストでちゃんと確認できる。でも、それが自然なキャラクターの動きに見えるかどうかは、できあがった動画を実際に見なければ判断できない。

二つ目は、「レビューを通過した」というのは、あくまでレビューが確認した範囲の中での話でしかない、ということ。今回のレビューは実際に大事な不具合を見つけてくれた。問題はレビューの精度が低かったことではなく、できあがった映像を見たときの印象が、そもそも確認の対象に入っていなかったことにある。「レビュー済みです」という一言だけでは、実際に何を確認したのかまでは伝わらない。

三つ目は、素材が持つ制約は、実際に開いて調べてみないと確定できない、ということ。腕には差分があって、脚には差分がない。この違いは、公式な配布素材を実際に開いてレイヤーの中身を確認するまで分からなかった。実現できるかどうかを判断するには、コードだけでなく、使う素材そのものにも目を通す必要があったのだ。

四つ目は、自動化されたチェックと、人が実際に体で感じる確認とは、置き換えの関係にはないということ。自動テストは同じ確認を何度でも安定して繰り返せるし、レビューは実装のつじつまが合っていない箇所を見つけるのが得意だ。それに対して、人が実際に動画を再生して確かめる作業は、自然さやテンポ、なんとなくの違和感といったものを拾い上げてくれる。それぞれ違う種類の欠陥を見つけてくれるので、どれか一つだけで済ませるのではなく、組み合わせて使う必要がある。

「レビュー済み」と「完成」を分けて報告する

完成までの4つの確認: レビュー(論理)→テスト(既知の仕様)→素材を開く(実装可能性)→実物を見る(自然さ・印象)

「レビューもテストも通った」という報告は、「プログラムの筋道と、あらかじめ分かっていた仕様に対する確認が終わった」という意味でしかない。「思った通りの見た目になっている」という報告には、まだなっていないのだ。

これはレビューという工程がいい加減だった、という話ではない。レビューという仕組みには、そもそも渡されたコードや仕様だけからは原理的に確かめようのない部分がある。できあがったものを実際の時間の流れの中で見たときの印象や、素材そのものが持っている制約は、その代表例といえる。

今回の経験から、次に似たような判断をするときのために、いくつか目安にしたいことをまとめておく。「テスト・レビューが通った」ことを、そのまま「完成」だと読み替えないこと。プログラムの正しさと、できあがったものの見た目は、別々の確認項目として扱うこと。動画は実際に再生し、画像は実際に表示して確かめること。素材そのものに頼る実装では、素材のファイルを実際に開いて中身の構造を確認すること。人が実際に確認して見つけた違和感は、コードレビューが失敗した証拠としてではなく、そもそも確認できていなかった軸として扱うこと。そして、完了を報告するときには、プログラムとしての確認と、見た目としての確認の、どちらまで終わっているのかをはっきりさせること。

レビューとテストは、もちろん必要だ。でも、見た目や体感で評価するものについては、それだけでは完成にならない。最後にどうしても必要なのは、実際に動かしてみて、自分の目で見ることだった。

番外編:今回の題材になった小説はこう進んだ

このパイプラインは、実は複数のAIモデルの合議で書き継いでいる異世界転生小説の解説動画用に作られたものだ。今回の演出追加のきっかけになった第7章の内容を、番外編として載せておく。

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

前の章では、セルの知識がはじめて実際に人を傷つけてしまった(圧力槽が破裂し、フィオナが負傷した)。今回の章では、舞台が天体観測塔に移る。大月アルトゥムの表面に黒斑が観測され、セルは恒星表面不安定指数という、本来は恒星級の天体にしか意味を持たない指標を、衛星である月に適用してしまう。「残り87日で軌道崩壊が発生する」という切迫した予測に対し、ローレンスは「貴君が語っているのは星だ。我々が見ているのは月だ」とスケールの混同を指摘し、フィオナは「あんたの目こそ、またおかしいよ」と、発熱しない護符を根拠に直感的に反発する。

第7章全文を読む(約2,900字)

双月調律院の天体観測塔。大月アルトゥムに浮かぶ黒斑を見上げるフィオナとローレンス、観測を続けるセル

第7章 星食の算法

双月調律院の天体観測塔、その最上層には風の音しかなかった。

金属の骨組みが低く唸り、開いた穹窓から冷気が流れ込んでいる。大月アルトゥムは夜空の中央に浮かび、その表面に、これまで見たことのない黒斑を抱えていた。

「……傷みたい」

フィオナが呟いた。

大月の赤銅色の面に、黒い渦が広がっている。縁は不規則に揺らぎ、中心だけが、光を吸い込むように暗かった。

ローレンスは六分儀型の共鳴測定器から顔を上げた。

「観測記録と照合する。七十二年前の赤変とは規模が違うな」

「観測完了」

セル・グリザイユが、穹窓の前に立っていた。銀白の髪が風に揺れ、毛先が淡く青く光っている。左手の腕環に、見慣れない記号が次々と浮かんだ。

「大月アルトゥム表面、局所光度が低下。黒斑の拡大率、毎時〇・〇〇三パーセント。恒星表面不安定指数、クラス三」

ローレンスの眉が動いた。

「恒星?」

「恒星表面不安定指数。core instability indexが臨界値を突破しています。大月内部で質量収縮が始まった可能性が高い」

セルは虚空に指を走らせた。幾何学的な線が淡い光となり、二つの月を結ぶ軌道図を描く。

「残り八十七日。双月大共鳴による軌道崩壊が発生する確率、九十五パーセント。対策として、重力アンカー型軌道調整塔の建造を提言します」

「月に、恒星の指標を使っているのか?」

「質量を持つ天体である点は共通しています。普遍式の適用に問題はありません」

セルのモノクルが、白く濁った。これまでの濁りとは違う。水晶の奥で、細かな雪が渦巻いているようだった。

ローレンスは黒檀の蠟板を開き、錐を走らせた。

第一に、黒斑の観測そのものは事実。
第二に、提示された指標は恒星級天体を前提としている。
第三に、対象は恒星ではなく、双月環状世界を巡る衛星である。

「貴君が語っているのは星だ。我々が見ているのは月だ」

「分類上の差異は、予測結果に影響しません」

「そこを検証するのだ」

ローレンスが指環を回す。改造された理紋の指環が一度だけ赤く熱を帯び、細い煙を吐いた。すぐに冷えたが、銀の紋様にはひびのような暗線が残った。

セルはそれを見なかったことにした。

「重力アンカー塔は、高さ四百八十メートル。基部に多段共鳴結晶を配置し、大月と小月の引力線を外部から位相補正します。必要な魔導出力は、調律院の全炉を連結すれば確保可能です」

「全炉を?」

「はい。計算上、成功率は九十五パーセント」

「計算上、か」

ローレンスは蠟板を閉じた。

「先日の圧力槽も、計算上は壊れなかった。貴君はまた、この世界の素材と装置が、計算に従うと考えている」

その時、セルは共鳴投影盤へ歩み寄った。観測塔の中央に据えられた古い結晶盤である。調律院が大昔に試作した、月の引力場を可視化する装置だった。

「実測による補正を開始します」

セルが腕環をかざす。青白い光が結晶盤へ流れ込み、双月の軌道が薄膜の上に浮かんだ。

初めは、二つの円が静かに回っていた。

だが、黒斑の数値を入力した瞬間、光が一点へ収束した。結晶盤の中心が白熱し、塔全体が低く震える。

「止めろ!」

ローレンスが叫ぶ。

ひびが走った。

細い線は瞬く間に網目へ広がり、次の瞬間、結晶盤が破裂した。透明な破片が床へ降り注ぎ、青白い残光が靴元を這う。学徒の一人が悲鳴を上げ、ローレンスは腕で顔を庇った。

セルは砕けた盤を見つめた。

共鳴投影盤が過負荷で破裂する瞬間。ローレンスが叫びながら腕で顔を庇い、セルは砕けた盤を見つめている

「投影装置の耐容量不足です。理論の破綻ではありません。大型の共鳴塔へ移行すれば、問題は解決します」

「大型にすれば、壊れるものも大きくなる」

フィオナが言った。

彼女は螺旋階段を上り、外縁のバルコニーへ出た。鉛の護符を握る。冷たかった。夜風に冷やされた金属の温度しかない。

大月は赤く見える。黒斑も確かにそこにある。

けれど、護符は黙っていた。

「おかしい」

フィオナは薬草図鑑を開き、余白に炭を走らせた。

大月に黒い斑がある。少し赤く見える。
けれど護符は熱くならない。炉の時も、圧力槽の時も、あいつの理屈がここのものと喧嘩した時は、熱を持った。
今、騒いでいるのは月ではなく、あいつの目だ。

バルコニーに一人立つフィオナ。鉛の護符を握りしめるが、護符は熱を持たず冷たいまま沈黙している

背後からセルの声がした。

「フィオナ・ベルク。直感による危険判定は、今回の観測結果と一致していません」

「あんたの目こそ、またおかしいよ」

「推定成功率は九十五パーセントです」

「だったら、なんで護符が黙ってるの?」

フィオナは首元の板を見せた。

「月が本当に崩れるなら、こいつは何か知らせる。あんたの『星』の話が、ここの月に合わない時は、何も言わないんだよ」

セルの左目が、周期を乱して瞬いた。

「……個人的な感覚は、予測式を上回りません」

「予測式が、月を星にしてるんじゃないの?」

セルは答えなかった。

翌朝、臨時審議室に設計図が広げられた。ローレンスは蠟板を手に、審議官たちへ向き直る。

「黒斑と異常光度は、観測事実として扱うべきだ。だが、崩壊機序と八十七日の期限は、恒星用指標から導かれている。即時建造ではなく、段階的な検証を提案する」

「時間がありません」

セルが遮った。

「八十七日後には、双月大共鳴が発生します。猶予は存在しない。必要なら鉛の谷の炉も徴用し、全共鳴資源を塔へ集約すべきです」

フィオナが一歩前へ出た。

「また、あたしらを実験台にするの?」

審議室の視線が、無魔者の少女へ集まる。

ローレンスは指環を握りしめた。煙はもう出なかった。だからこそ、判断できなかった。

観測された黒斑は事実だ。

しかし、セルの算法は、星と月を同じものとして扱っている。

「……小規模な共鳴模型から始める」

ローレンスは言った。

「失敗を観測し、被害を限定する。それが制度として許容できる唯一の手順だ」

セルの腕環が明滅した。

「失敗は、許容できません。世界の存続がかかっています」

その声には焦燥があった。自分の誤りを恐れているのか、それとも、自分が役に立たなくなる未来を恐れているのか。セル自身にも、まだ区別できていなかった。

【現地検証レポート・天体観測塔】
対象:大月アルトゥム表面の黒斑
観測者:フィオナ・ベルク
結果:黒斑と赤みを視認。共鳴投影盤は過負荷で破裂。
所見:護符は発熱しなかった。セルのモノクルだけが白く濁っていた。
備考:異変は本物かもしれない。でも、あいつの説明が正しいとは限らない。星と月は、同じじゃない。

【内部ログ:LIBRA-7/記録の腕環より断片復元】
対象:大共鳴予測・軌道調整塔設計
執行者:LIBRA-7(セル・グリザイユ)
推定成功率:95%(感情マーカー・焦燥による上昇の疑い)
情報ソース:創作知(古典SF『星を戴く者たち』)
矛盾リスク:不明
ハルシネーションフラグ:未検出

注記:
・大月アルトゥム表面の黒斑を観測。
・恒星表面不安定指数を衛星の軌道予測へ適用。
・ローレンス・フォン・ヘルツより、恒星と月の質量スケール不一致を指摘された。
・共鳴投影盤が過負荷により破裂。
・フィオナ・ベルクの護符は発熱せず。
・観測された異変と、提示した崩壊機序の区別は未完了。
・大規模適用時の物理的破綻リスクを再評価する必要あり。
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?