📒

備忘録: Gemini CLI で動画編集ツールを作る

に公開

こんにちは、Naoya です。

先日、Google I/O Extended Tokyo 2025 が大盛況の中、幕を閉じました。オーガナイザーの仕事として、講演動画のアーカイブを YouTube にアップロードする作業が残っています。単にライブ配信をまるまる公開しておくだけでも十分だと思いますが、視聴者の皆さんがそれぞれのセッションをより探しやすく、そして登壇者の皆さんが、各自の実績として使いやすくするために、各セッションごとに切り出して動画をアップロードし直すことにしました。

とはいえ、時間も限られていますし、動画編集は時間のかかる作業なので、少しでも楽をしたいと思い、Gemini CLI にアーカイブ切り出し用のツールを作ってもらいました。自分の備忘録として、Gemini CLI でやったこととその結果をまとめます。

作成した動画編集ツール

https://github.com/getty708/video-tools

このツールを使用して、作成した動画はこちらです。合計で 22 本あります。

https://www.youtube.com/playlist?list=PLWHiKBvrE2uUmQYcY5tbOSRIzm11CV5Dx

https://www.youtube.com/playlist?list=PLWHiKBvrE2uXw02t2XuK3HIqtmF3Qpdp7

実装した機能

動画の切り出し ( trim コマンド)

配信録画全体から、開始・終了時刻を指定し、各セッションごとに動画を切り出して保存するコマンドです。まず、次のような YAML 形式の設定ファイルを用意します。今回は、各セッションの開始終了点は、手作業で動画を見て指定しました。

サムネイル画像の追加コマンド ( add-thumbnail )

動画のクオリティを上げるために、切り出した動画の頭に、講演タイトルと登壇者紹介のスライドを追加しました。再生リストにまとめたときに、全体に統一感を持たせることができます。また、サムネイルから講演動画へスムーズに遷移するために、フェードイン・フェードアウトの効果をつけました。

具体的には、以下の 3 つの編集を行います。

  • 動画の先頭に、指定した画像を追加する。
  • サムネイルの画像と動画をフェードイン・フェードアウトで繋ぐ。
  • 動画の音声も、動画に合わせてフェードインする。

Playlist

transition

作業メモ

作業時間

  • 実質的に手を動かして指示を出した時間
    • ツール作成: 1 時間
    • リファクタリング: 1 時間

下の画像は作業後の Gemini CLI の Stats です。作業時間は、9h48m と 1h49m となっていますが、寝る前に指示を出して翌朝結果を確認してセッションを終了したり、指示を出した後に別の作業で Gemini CLI をアイドリングさせていた時間が含まれているためです。

シンプルなプログラムですが、自分でそれなりのクオリティで作ろうと思うと時間がかかります。チャットだけでここまで作ることができるので、ちょっとした便利ツールを作るハードルは大きく下がるなと感じました。

gemini-cli-stats 1
Gemini CLI の Stats (ツール作成時)

gemini-cli-stats 2
Gemini CLI の Stats (リファクタリング)

README の作成

実装したツールの使い方などを README にまとめますが、個人的にはこの作業が苦手で、かつすぐに outdated になってしまうので、嫌いな作業です。これを Gemini CLI に依頼すると、Usage から Argument の説明まで、簡単に最新状態に更新してくれます。苦痛から解放されるので、非常にありがたいです。

moviepy v2 系 API の破壊的変更が自律的にデバッグできない問題

MoviePy が今年の初めに v2 系 にメジャーバージョンアップしましたが、API に破壊的な変更が大量に加えられており、v1 系のドキュメントやブログが全く参考になりません。バージョンを指定しない場合は v2 系がインストールされてしまいますが、もちろん Gemini は v2 系の書き方を知らないため、かなり細かく指示を出す必要がありました。

具体的には、私が v2 系のドキュメントを探して、サンプルコードを与えることを繰り返し行う必要があり、時間がかかりました。自律的に最新のドキュメントを調べることもできる気がしますが、やり方がわかりませんでした。ドキュメントを MCP として渡せば良いのでしょうか?今後の課題です。

Git のコミット作成

作業の途中でコミットを作って作業を保存するよう指示を出しました。pre-commit hook でフォーマッターなどを走らせています。大体 1 回目はフォーマッターのエラーが出ますが、コミットできるまで自律的に修正を繰り返してくれました。これは眺めていてすごいなと思いました。

しかし、一度コミットを作成するよう指示した後、作業単位ごとに非常に大量のコミットを作成し、pre-commit hook のエラーを修正するために、大量のトークンが消費されているように感じました。pre-commit hook で各ステップでコードの高い品質を維持することは重要ですが、もう少し効率を優先して大きな単位でコミットを作るように指示を追加すべきだったかもしれません。

GitHub にプッシュする前に、手動で不要なコミットを squash しました。

リファクタリング

ツール作成時の自分のスタイルがあり (e.g., パスの変数には str ではなく pathlib.Path を使用)、これを適用する作業をしました。気付いたところを一つずつ指摘して、修正を依頼するというワークフローになりました。イテレーションの回数が多くなり、指示を出すのが大変でしたが、結果として自分のスタイルに沿ったコードに仕上がりました。

事前に独自のスタイルガイドを作成して、いろいろなプロジェクトで使いまわせるようにしておくと、そもそも最初から自分のスタイルに沿ったコードを生成してくれて、リファクタリングの手間が減るのではないかと思います。

振り返り

タイパは良かったのか?

Gemini CLI で実用的なツールを作るのは初めてだったため、ひとつひとつの作業単位は比較的小さくなるような指示を出していました。これは意図的というよりは、より大きな単位での指示の出し方がまだ慣れていないためです。そのため指示を出す回数が増え、結果として成果物に対して圧倒的な時間削減にはなっていないと感じました。ただし、別の作業の合間に指示を出しながらツールをツールを作れることを考慮すると、ツール作成のタイパは十分に良いと思います。

今回の本来のゴールは、イベント動画をセッションごとに切り出して編集することでした。合計で 22 本の動画があり、これをひとつひとつ動画編集ツールでサムネイルの追加などの編集を手作業で行なっていた場合、ファイル書き出しなども含めて確実に 2 時間以上かかっていたと思います。1 本 10 分で終わったとしても 3 時間 40 分かかります。今後も同じツールを使えることを考慮するとこのツール作成は大幅な時間削減になったと思いますし、繰り返し作業という精神的なストレスも軽減できたのではないかと思います。

Gemini CLI が作業している裏で、動画の切り出し時刻を手作業で書き出していました。この作業も動画を文字起こししすれば、自動化できたのではないかと思います。また、Youtube へのアップロード作業も MCP などを活用して効率化できたのかなと思います。まだまだ改善の余地はありそうです。

自律性と品質を高める方法

今回の作業では、ユニットテストの作成の指示と、pre-commit hook の使用をしました。この 2 つは機械的にコードの品質を担保することに活用されますが、同時に Gemini CLI がエラーを読んでデバッグをしてくれるため、自律性を高めるためにも有効なのだと感じました。

また、今回試してはいませんが、独自のスタイルガイドを作成することも有効なのではないかと思います。今回はリファクタリング時に、個別に Chat から指示を出しましたが、Markdown などに網羅的にまとめておくと、コミット作成前に確認して修正するような指示を出すことで、より自律的に自分のスタイルに沿ったコードを生成してくれるのではないかと思います。

まとめ

今回はほぼ初めての Gemini CLI でのツール作成でしたが、実用的なツールを効率的に作成することができました。さらに、効率と品質を高めるために、Gemini CLI をカスタマイズする方法を試していきたいです。Gemini CLI のカスタマイズ方法は、以下のドキュメントが参考になります。

https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/configuration.md

さらに Gemini CLI を効果的に活用するために、まずはこれを読んで、.gemini/settings.jsonを手入れしていきたいと思います。contextFileNameなどに独自のスタイルガイドなどを整備していき、Gemini CLI の自律性とコード品質を高め、効率を高めていきたいと思います。

また、文字起こしからの各セッションの開始点・終了点の抽出など、効率化できそうな作業は残っているので、そちらも改善していきたいと思います!

Discussion