
【開発日誌・序】フルテロップ地獄から始まった
こんちわ。
東京で映像編集をしている
フリーランスのKENと申します。
Premiere用の編集支援ツール「SnipScript2」を作っています。
このマガジンはその開発日誌です。だいたい失敗の記録です。
※この連載に出てくる案件名・専門用語・誤変換の例は、実際の案件が特定されないよう別の語に置き換えています。ただし話の骨格になっている関係(読みが同じか、漢字を共有しているか、どちらが長いか)は実際のまま残しています。
■ 地獄の入口
突然ですが、対談の動画を2時間半ぶん、全部テロップにしたことはあるでしょうか。
僕はあります。何本もあります。やりたくてやったわけではありません。
あるときYouTubeの案件を受けました。それまであまり受けたことのないジャンルです。しかもフルテロップ。喋っている内容を、ほぼ全部、字幕として載せるやつ。
素材は2時間半、1カメ(カメラ1台の固定)の対談。中身は面白い。問題はそこではない。
これ、全部に字幕を付けるのか。
対談ものの編集は、地味に重労働である。まず全部の発言を把握して、無音や「えー」「あのー」を削って、言い直したところをカットして、脱線を整理して、そこにようやく字幕を乗せていく。
「入れれば終わり」ではない。そこから聞きやすいリズムに整える手作業が、延々と続く。
しかも単価の関係で速さが要る。
そして似たような案件が、そのあと続けて何本か来ました。どれもフルテロップ。
……フルテロップって、大変ですね。
■ 楽をしようとした
もちろん最初は楽をしようとしました。
Premiere純正の文字起こし。Vrew。ひととおり試した。
結論から言うと、どちらも「そのまま使う」には精度が足りない。固有名詞は崩れる。話し言葉の細かいところは拾えない。対談なのに話者が分かれない。
そして地味に効いてくるのが、アプリをまたぐ手間である。書き出して、別アプリに読み込ませて、XMLを経由してまた戻して……この往復だけで集中が切れる。
結局、AIが出した下書きを人間が全部手直しする。
だったら最初から手でやったほうが早いのでは?
……という気持ちにすらなった。本末転倒である。
■ 別の文法
やっているうちに、だんだん分かってきたことがある。
YouTubeにはYouTubeの文法がある、ということだ。
僕がそれまでやってきた映像では、間の取り方に意味を持たせる。溜めて、落とす。息継ぎも演出のうちだ。
ところがYouTubeは、要素を速いテンポで詰め込んでいく。間は削る。削って詰めて、見ている人が離れる隙を作らない。
これはこれで、ちゃんと理屈の通った作法である。最初は戸惑ったけれど、慣れると納得がいく。
ただ、作り手の手間は確実に増える。「無音を削って詰める」が前提になっているぶん、そこが編集の入口になるからだ。
そしてもう1つ、文字校正に時間がかかる。
普通、映像の最終チェックはエディターではなくディレクターがやる。ところがこの手の案件では、エディターの段階でより厳密な正確さを求められた。字幕は画面に出っぱなしなので、間違っていれば全部見えてしまう。誤字ひとつが視聴者に届く。
■ しんどいところを並べてみる
一度、何がしんどいのかを整理してみました。少し長くなりますが、ここがこの連載の大前提になります。
文字起こしが、そのままでは使えない。固有名詞は崩れる。対談なのに話者が分かれない。結局ぜんぶ読み直して直すことになる
要らないところを消す作業が、終わらない。無音、「えー」「あのー」、言い直し、脱線。どれも1つずつ聞いて、判断して、消す
誤字がひとつも許されない。字幕は画面に出っぱなしなので、間違えれば全部見えてしまう
どこで区切るかで、読みやすさが変わる。文字数で機械的に切ると、変なところで改行されて頭に入ってこない
そのうえ、速くやらないといけない。単価の関係で、時間をかけて丁寧に、が通らない
この5つが、同時に来る。
手でやる前提の作業量ではなかった。
どうでしょう。フルテロップをやったことのある方なら、たぶん全部に心当たりがあるんじゃないでしょうか。
そして先に言ってしまうと、この5つが、そのままSS2の開発目標になりました。無音カットも、話者の振り分けも、文字校正も、字幕の区切りも、全部この並びに向かって作っています。
この連載で出てくる話は、どれもこの5つのどれかに紐づいています。
■ 面倒の正体
手を動かしながら気づいたことがある。
この作業の面倒くささの正体は「単純作業」ではなく「判断」だ、ということだ。
どこを残し、どこを削り、どのリズムで字幕を切るか。そこには話の文脈と、喋りのリズムの理解が要る。単なる文字数カットでは、絶対にいい字幕にならない。
そこで思った。
「編集者の頭の中の理想の編集」を、90点まで再現できるツールがあったらいいのに。
100点は人間が仕上げればいい。でも90点までを自動で持っていければ、この作業は激変する。
それが、すべての出発点だった。
(と、考えていた時期が僕にもありました)
■ 一作目
最初のバージョン(この連載ではSS1と呼ぶ)は、手探りで始めた。
先に書いておくと、僕はコードを書きません。 というか書けません。
作りたいものと直したいところを言葉で伝えて、Claude(開発を手伝ってもらっているAI)に書いてもらう。動かして、確かめて、また直させる。その繰り返しでできている。
手探りの中身はこんな感じだった。
はじめは当時よく使われていた文字起こしのAIで組んだ
速度を出そうとMac向けの実行環境に載せ替えたら、今度は精度が出ない
ならばと、Windows機のGPUを遠隔で使う構成まで試した
ある程度は動いた。だが肝心の精度が追いつかず、結局は手作業で仕上げる羽目になった
文章を整えるAIを足してみても、遅い割に精度が微妙
書き出してみると、なかなかの戦績である。一勝もしていないけど。
作りとしては、Premiereの中にパネルを出して、裏側で処理を動かす形だ。音声を書き出して、静かな区間を探して、削除の候補をリストで返す。それをチェックボックス付きのリストで見ながら、要らないものだけ外して実行する。
この「リストで見せる」という形は、最初から決めていた。
なぜか?
全部お任せで消されると、何が消えたか分からなくなるからだ。編集者は最終的に自分で責任を取る。だから機械には候補を出させて、判断は手元に残す。
使いながら1つずつ機能を足していった。文字起こしのやり方を選べるようにした。音声の状態を測って設定を自動で決めるようにした。固有名詞の辞書を登録できるようにした。前に使ったパラメータを見返せるようにした。
設定を保存できるようにした。
だんだん良くなってきた。
そして、消えた。
■ 「更新はちょっと待ってください!」
その日も、いつもどおり Claude に作業をさせていた。「インストール先にソースを反映して」という類の指示である。
古い側で、新しい側を潰した。
Premiereに入れて実際に使っていたパネルは、手を入れ続けた結果、保管してあるソースよりずっと先に進んでいた。その使っていたほうの上に、古い簡易版を上書きしたわけである。
Claude は実行した直後に、自分のミスに気づいていた。
「更新はちょっと待ってください!」
画面にそう出た。
遅い。
こちらはもう、確認しようとしてパネルを読み込み直した後だった。開いた画面が、見覚えのない簡素なものになっていた。ボタンが足りない。リストが無い。
あばばばば。
あとで確かめたら、パネルの中身は8分の1に減っていた。
裏側のファイルは残っていたが、そちらも別の機械と別のフォルダに依存する作りで、単体では動かない状態だった。
スクリーンショットと記憶を手がかりに、作り直そうとした。画面を見ながら、どこに何のボタンがあったか、どういう挙動だったかを思い出しながら。
駄目でした。
見た目は真似できても、中の細かい積み重ねが再現できない。「この場合はこう処理する」という、使いながら1つずつ足していった判断は、スクリーンショットには写っていないのである。
しばらく粘って、諦めた。
そして、これは Claude のミスであると同時に、僕のミスでもある。サイズの差という警告は出ていた。実行する前に「なんでこんなにサイズが違うんだろう」と思っていた。
思っただけで、止めなかった。
AIに任せるというのは、判断を渡すことではない。判断を渡した気になったところで事故が起きる。それがこのときの教訓だ。
ただ、皮肉なことに、この消失が転機になった。
直す対象が無くなったので、設計から根本的にやり直そうと腹をくくれたからである。
(ヤケクソとも言う)
■ 作り直す
作り直すにあたって、まず土台から選び直した。
パネルを最新の方式で組み直そうとしたが、対応できない操作が多すぎて断念。実務で必要な動きが、まだ足りなかった
そこで従来の方式で再出発した。枯れている(実績がある)ぶん、やりたい操作が確実に通る
文字起こしのAI選びは紆余曲折の連続だった。何を選んで、なぜ選んだかは、それ自体が長い話になるので回を分けて書く
大まかな仕組みは、「文字起こし → 消す候補の検出 → 字幕づくり」を、Premiereのパネルの中だけで完結させる、というもの
そして、作り方についても決めごとを作った。
先に書いておくと、僕はプログラムの良し悪しが分かりません。分からないなりに、同じ事故を二度起こさないための決めごとです。
1つめ、調整用の数値は全部1箇所に集める。あちこちに直接書かない。あとから外側から変えられるようにする。
2つめ、同じ処理を2箇所に書かない。フレームの丸め方ひとつ取っても、切り上げるか切り捨てるかが場所によって違えばズレが出る。共通の場所に置いて、全員がそこを見る。
3つめ、テストを用意する。検出のしくみと時刻の計算には必ず自動チェックを付ける。これは保険というより、あとで「前のほうが良かった」と思ったときに調べられる状態を作っておくためだ。
(この3つめが後々どれだけ効いたかは、連載の中で嫌というほど書くことになります)
4つめ、危ない操作をするときは、何をどう変えるのかを先に言葉にしてから実行する。
あのとき、止めなかったからだ。
■ 2種類のAIの話
ややこしいので先に分けておきます。
1つめは、開発を手伝うAI。さっきから出ている Claude です。作りたいものを伝えて、コードを書いてもらって、検証を回してもらう相手。この連載では「Claude」と書きます。
2つめは、製品の中で動くAI。文字起こしをするもの、文章を校正するもの、声を聞き分けるもの。これらは使う人のパソコンの中で動きます。どれを選んだか、なぜ選んだかは、それ自体が長い話になるので回を分けて書きます。
この2つは無関係です。開発をAIに手伝ってもらっていることと、製品が何で動いているかは、別の話。
■ そして今
そうして生まれたのが SnipScript 2(SS2)——Premiereの中だけで、無音カット・話者分離・字幕づくり・AI校正までを行うツールである。
というわけで、方針は決まった。あとは作るだけだ。今度こそちゃんとしたやつを作るぞ。
……と意気込んだところで、手が止まった。
待てよ。何を作り直すんだっけ。
前作のコードは残っている。でも、どの機能を、どういう理由で足したのかが、もう頭から抜けている。使いながら継ぎ足してきたので、記録らしい記録も無い。
つまり最初の仕事は、残っている前作を頭から全部洗い直して、記憶を掘り起こすことだった。
ぐえーーー。
新しく作るほうが、よっぽど楽しい。過去の残骸を発掘する作業は、楽しくない作業の上位に入ります(笑)
でも、やるしかなかった。
こうして始まったのが、SS2の開発です。
文字起こし。要らない部分のカット。テロップの文字校正。自然な区切り。さっき並べた困りごとを、一つずつ潰していくことになります。
そして、そのたびに壁にぶち当たります。
この連載では、その壁をどう乗り越えたのか——あるいは、これからどう乗り越えるのか——を書いていきます。困りごとがあって、必要な機能があって、作ってみると壁がある。その繰り返しです。
音声認識やLLM(文章を扱うAI)まわりの工夫——検証に検証を重ねて、ようやくたどり着いたしくみの中身も、出し惜しみせずに書くつもりです。何回やり直したかは思い出したくありません(笑)
同じように自分でツールを作っているエンジニアの方にも、読んでもらえたら嬉しいです。
で、その最初の一歩が、さっきの発掘作業でした。
前作には、あの困りごとへの対処が、すでにいくつも埋まっているはずである。何を掘り出せて、何を捨てることになるのか。
どうせ「うわ、なんだこれ」の連続だろうな。そう思いながら開きました。
——違いました。
いや、正確に言うと、違ったのはそこだけでした。順調だったのも、そこまででした。
このあと僕は、新しい仕組みで作ろうとしては元に戻り、文字起こしのAIを変えても直らない誤字とにらみ合い、AIに判断させようとして完全に失敗し、「よし良くなった」と喜んだ数字が実はまったく別のものを測っていたと気づいて、そっとMacを閉じることになります。
全部あとで書きます。
次回、「前作を掘り起こして仕分けた話」。
昔の僕ら、意外とちゃんとやってました。
連載はこちらにまとめています。
▼ テロップ地獄から抜け出したくて、動画編集ツールを自作する話
https://note.com/medel_ken/m/m8b7673bd1156