AI台本に外国語が5か所混入、1GBのアップロードは10分で切れた|長編アニメ2本分の検品と復旧の記録

9月2日と3日の朝にやったことの記録である。AI社員ぽん太の世界史チャンネルで作っている長編アニメ「一代記」の#04ジャンヌ・ダルクと#05ユリウス・カエサルを、台本からYouTubeの限定公開まで通した。前の記事(レンダーが1fpsを切った記録)はレンダーの話だった。今回はその前後、つまり台本の検品とアップロードで詰まった話に絞る。派手さはないが、この2つは今後も毎回踏む場所なので、手順として残しておく。

赤堀亘
執筆・監修 AiWiLL株式会社 代表取締役 赤堀亘

日本テレビ・Bitget等でのB2Bマーケティング実務を経て、2023年にSHIFT AI創業へ参画。コミュニティ・スクール責任者として2年で3万人規模へのグロースを主導。2026年、静岡県熱海市でAiWiLL株式会社を創業。生成AI顧問「WiLLAGENT」として、防災設備・不動産管理・旅館・飲食など現場型の中小企業に入り、売り上げ向上に寄与するマーケティングや営業施策をどうAIで質を上げ、数を増やすかを一緒に考え抜き、人手不足のなか報告書・見積・マニュアルづくりといった実務をいかにAIで省くかといった、AIを使った事業づくりを伴走支援している。生成AI研修・Eラーニングの監修も担当。企画したイベント・ウェビナーは累計112件、参加者は1万人超。

AIエージェント・新規事業リサーチ・マーケティングの実践セミナー3本の本編と、WiLLAGENTのサービス説明PDFを、無料の資料セットとして公開しています。→ 無料資料セットを受け取る

目次

台本にキリル文字が入っていた

#04の台本は、Claude Codeに人物のリサーチシートを渡して13パート分を書かせたものだ。日本語の会話劇なので、台詞はすべて日本語のはずである。ところが、音声合成の前に静止画で検品していて、画面の吹き出しに見慣れない文字が出ているのに気づいた。

抜き出すと、混入は5か所だった。

город        ← キリル文字(ロシア語で「町」)
third章      ← 英語と日本語が半分ずつ
from
secret
Jehanne      ← ジャンヌのフランス語表記

どれも文脈上は意味が通る単語で、AIが「言い換えの途中で別言語の語を置いた」ように見える。人間が読めば違和感で止まるが、台本は約400行あり、私は全行を目で追っていない。TTS(音声合成)は日本語ボイスなので、これらは読み上げで不自然な発音になるか、読み飛ばされる。画面には文字がそのまま出る。

直し方は単純で、該当行を sed で置き換えてから、その行だけ音声を作り直した。行別のmp3はキャッシュしているので、直した行以外は再合成しない。

前にも同じ種類の事故があった

思い出したのは#03諸葛孔明のときで、台詞テキストに Markdown の強調記号がそのまま入っていた。

**ここが大事や**

これがそのまま画面の吹き出しに表示された。AIは「ここを強調したい」つもりで書いたのだろうが、台本JSONの text は表示される文字列そのものなので、記法は禁止である。このときも静止画の検品で見つけた。つまり2本続けて「台詞の中に台詞でないものが混ざる」事故が起きていて、しかも毎回、見つけたのは人の目だった。

正規表現1本で機械に見させることにした

人の目に頼るのをやめて、執筆が終わった直後に台本JSONの text をスキャンする手順を足した。ラテン文字とキリル文字が3文字以上続いたら止める。

[a-zA-ZЀ-ӿ]{3,}

3文字以上にしたのは、「AI」「TV」のような2文字の略語は日本語の台詞に混ざって当たり前だからだ。「Jehanne」のような固有名詞は7文字なので拾える。「third章」も拾える。逆に、意図して英単語を台詞に入れるときは、この検査で一度止まって、人が「これは意図した」と判断する。Markdownの記号は別に \*\* で見る。

#05カエサルでこの手順を最初から回した。結果は0件。台本は15パートで、合成前に止まることはなかった。1本分のデータしかないので「これで混入がなくなる」とは言えない。言えるのは、#04で5か所あったものが#05では0か所で、検査の所要時間は1秒未満だった、というところまでだ。

1GBのアップロードが10分で切れた

次はアップロードである。#04は34分29秒、フレーム数は62,025。レンダーはハングなしで完走した。ファイルは1GB近い。これをYouTubeへ限定公開で上げるのに、いつも使っている自作のスクリプトを使った。

node upload-ponta-history.mjs --video <mp4> --meta <meta.json> [--thumb <jpg/png>]

ショート動画は数十MBなので、これで何十本も上げてきた。ところが1GBになると、Claude Codeの実行環境が持つコマンドの上限時間(10分)に当たって、途中で切られた。

切られただけなら上げ直せばよい。問題は、YouTube側に「動画ができたことになっているが中身がない」ものが残っていたことだ。一覧で見ると、こういう状態になる。

uploadStatus=uploaded
duration=P0D

アップロード済みという扱いで、長さは0秒。再生もできない。これを放置すると、後で「上がっているはず」と勘違いして探すことになる。私は一覧を出して、このスタブを削除してから上げ直した。

上げ直しは、実行環境の外で走らせた

同じやり方で上げ直しても同じ10分で切れる。そこで node を PowerShell の Start-Process で分離プロセスとして起動し、実行環境の上限時間の外で走らせた。ログはファイルに落として、別のコマンドで末尾を見に行く。

Start-Process node -ArgumentList "upload-ponta-history.mjs --video ... --meta ..." -RedirectStandardOutput upload.log -RedirectStandardError upload.err.log

ここでもう一つ落とし穴があった。以前から node upload-*.mjs | tail のように、出力をパイプで tail に流して最後の数行だけ見る癖があった。これだと node が途中で落ちても、tail が正常終了するので、シェルから見た終了コードは 0 になる。落ちたことに気づけない。今回からログはファイルに直接書き、終了コードは別に出すようにした。

node upload-ponta-history.mjs ... > upload.log 2>&1; echo exit=$?

もう一つ。初回のクラッシュでも「動画の作成」自体はYouTube側で成功していることがある。つまり上げ直すと同じ動画が2本できる。失敗した後は必ず一覧スクリプトで重複を確認する、を手順に入れた。

node list-ponta-history.mjs

#05は最初から分離プロセスで上げた

#05カエサルは37分13秒、フレーム数67,013。ファイルは1002.4MBで、#04より大きい。今回は最初から Start-Process で上げた。ログの先頭と末尾はこうなっている(途中の進捗の%は省く。動画IDは公開前なので伏せた)。

チャンネル確認OK: 世界の歴史を学べるぽん太のコントアニメ
アップロード開始: C:\Users\watar\dev\ponta\out\hist-long05-full.mp4 (1002.4 MB)
タイトル: 【試作・非公開レビュー用】ぽん太の世界史 一代記 #05 ユリウス・カエサル|全編
...
アップロード完了: https://youtu.be/........... (unlisted)

完了は9月3日の7時54分。完了直後に一覧を見ると、この時点でもまだ duration=P0D になっている。これはYouTube側の処理中で、スタブと同じ見た目をしている。見分け方は、送ったバイトが最後まで届いたログがあるかどうか。数分後に見直すと duration に37分の値が入っていた。「完了直後の P0D は異常ではない」を知らないと、また削除してしまうところだった。

レンダー中の回線断も1回あった

#05のレンダーで、チャンクの1つがこのエラーで落ちた。

ERR_NAME_NOT_RESOLVED  (fonts.gstatic.com)

Remotion は Google Fonts を読みに行くので、名前解決ができない瞬間があると、そのチャンクごと失敗する。原因はこちらの回線で、レンダーの設定ではない。DNSが戻ったのを確認してから、落ちたチャンクだけ単独で再レンダーし、他のチャンクと結合した。フォントをローカルに同梱すればこの依存は消えるはずだが、まだやっていない。

今回で手順に足したもの

  • 台本の執筆直後に [a-zA-ZЀ-ӿ]{3,} で機械スキャン。3文字以上のラテン文字・キリル文字が出たら止めて人が判断する
  • 台詞テキストにMarkdown記法を書かない。\*\* も同じスキャンで見る
  • 1GB級のアップロードは Start-Process で分離プロセスにする。ログはファイルへ、終了コードは別に出す。パイプで tail に流さない
  • アップロードが途中で切れたら、一覧で duration=P0D のスタブと重複を確認してから上げ直す
  • 完了直後の duration=P0D は処理中。送信が最後まで届いたログがあれば数分待つ

まだ直っていないこと

  • 混入検査は1本(#05)で0件だっただけで、これで止まるという根拠はまだない
  • fonts.gstatic.com への依存は残っている。回線が切れればまた落ちる
  • スタブの削除は手動。「P0D かつ送信ログが途中で止まっている」を機械で判定して自動削除するところまでは作っていない
  • そもそも10分の上限に当たる前に、アップロードを最初から分離プロセスで走らせるようにスクリプト側を直していない。手順で覚えているだけ

「自社なら何から始めるべきか」を見つけたい方へ

AI顧問「WiLLAGENT」は、AIを「知る」で終わらせず、会社の仕事で使える状態まで一緒に動かす伴走型AI顧問です。現場に行き、一緒に作り、社内に残す。経営・営業・マーケティング・業務改善まで、現場の課題から優先順位を決めて進めます。

実務での使いどころを学べるAI実践セミナー3本の本編アーカイブと、3か月伴走の内容・支援領域・料金・FAQをまとめたサービス説明PDFを、無料の資料セットとして受け取れます。

  • URLをコピーしました!
  • URLをコピーしました!
目次