このサイトでの挿絵は、Gemini Proによる生成が大半です。 また、情報収集・まとめなどのサイトについては、検索結果をベースとしたものを使用しています。可能な限り出典を明示するよう努めますが完全ではありません。各自で調べる事もお忘れなく。

podcast-tool 開発日記 #9 — 休眠、そして復活

前回(第8回)は月235コミットという、このシリーズ最大の活動ピークの話だった。縦型動画対応、字幕の焼き込み、フレッシュネス判定のバグ修正……10月は息をつく間もなかった。今回はその反動の話をする。

81日間の沈黙

10月最後のコミットは、10月27日10時37分の 4eaad27「cast形式ファイルのduration取得にCastMediaHandlerを使用」。cast形式対応と自動改行エンジンの実装がひと段落し、テストも整った状態だった。

ここでログが止まる。

次のコミットが刻まれるのは、年が明けた2026年1月16日5時5分。実に81日間、コミットゼロが続く。月別で見ると11月0件、12月0件。このシリーズを通して最大の空白期間だ。

理由をコミットメッセージから探ろうとしても、当然何も出てこない。何も書かれていない期間は、何も書かれていないという事実しか残らない。個人開発をしている人なら覚えがあると思うが、燃え尽きたわけでも興味を失ったわけでもなく、ただ他のことに手を取られているうちに気づけば2ヶ月経っていた、というのはよくある話だ。235コミットという異常な熱量を出した反動、と言ってしまうと出来過ぎな解釈かもしれないが、少なくとも山の後に谷が来るのは自然なことだった。

復活の第一歩は「深夜5時」

1月16日、235c00f「cast形式統合とplay_once_holdモード追加」で開発が再開する。コミット時刻は朝5時5分。この時間帯にコミットが打たれているのは、このシリーズの中でも珍しい部類に入る。

内容はcast version 3対応、メディアブロック単位でのcast設定、そしてplay_once_holdモードの追加。動画を1回だけ完全再生してから音声に合わせて静止するモードで、video_loop_generator.pyが297行の大規模な書き換えを受けている。コミットメッセージの末尾には Co-Authored-By: Claude Sonnet 4.5 の署名があり、休眠明けの最初の一手からすでにAIとのペア作業だったことが分かる。

とはいえ、これで完全復活というわけではなかった。1月20日には禁則処理まわりの改善が続く。26c7caf「禁則処理の改善: 行頭禁則文字を削減処理に通じて折り返しを感じ」で、閉じカギ括弧(」『)を行頭禁則に追加し、改行位置の計算ロジックを精密化。テストはtest_auto_linebreak_engine.pyの17件が全通過という記録が残っている。地味だが、字幕の見た目に直結する仕事だ。

そしてまた止まる。2月はまたしても0件。1月の10コミットは、復活というより「様子見の一往復」に近かった。

3月、本格的に戻ってくる

本当の復活は3月に入ってからだ。3月5日、f73c654「Google TTS APIエンジンサポートの追加」。これまでVOICEVOX専用だった音声合成に、Google TTSという選択肢が加わる。GoogleTTSGeneratorクラスを新規作成し、speakers.jsonengine_type: google_ttsを指定すればVOICEVOXの話者と混在できるようにした。APIキーは環境変数GOOGLE_TTS_API_KEYかconfig.jsonで設定する形。テストも10件追加され、既存分含めて全通過。同じ日にはGeminiDecoratorのAPIキー検出やSSMLの句読点処理まわりの細かい修正が畳みかけるように続いている。

そして3月19日。この日は2つの重要なコミットが同じ朝に入っている。57b82ec「セクション並列生成機能を追加」は、VideoConfigparallel_section_workersフィールドを設け、ThreadPoolExecutorでセクションごとの動画生成を並列化するもの。結果は元の順序を保って結合される。動画が長くなるほど効いてくる改善だ。

続く73c66a5「セキュリティ修正: 複数の脆弱性を修正」では、video_flow.pyのパストラバーサル対策、Google TTSの例外メッセージからAPIキーをマスクする処理、audio/generator.pyのスレッド競合状態をLockで修正、BGM設定読み込みのファイルサイズ上限チェック、ffmpeg_runnerのシングルトンをDouble-Checked Lockingで修正、video_audio_merger.pyのsubprocess呼び出しへのタイムアウト追加と、6箇所の脆弱性・不具合をまとめて潰している。並列処理を追加した直後に、その並列化が生みかねない競合状態を自分で見つけて塞ぐ——このセットで見ると筋が通っている。

休眠期から見えるもの

11月・12月の沈黙、1月の様子見、2月の再沈黙を経て、3月にようやく安定した開発リズムが戻ってきた。この4ヶ月をまとめて眺めると、個人開発の実際の姿という気がする。毎日コミットが積まれる期間ばかりが記録に残りがちだが、その間に横たわる空白も含めて開発の履歴だ。

実は、この期間コードは止まっていても、ポッドキャストの配信自体は概ね続いていた(2025年11月分もちゃんと存在する)。振り返ると、当時は「どうやったら質の良い、聞いてもらえるものが作れるか」という配信そのものの試行錯誤に時間を割いていたのと、並行して転職活動を進めていたこともあって、ツール開発に回せる時間そのものが削られていたのが大きい。ツールを作ることと、そのツールを使って実際にコンテンツを出し続けることは、当たり前だが別の仕事量を食う。休眠期という言葉で切り取ると空白に見えるが、開発ログの外側では別の作業が続いていた、というのが実態に近い。

休眠明け最初のコミットが深夜5時だったことも、なんとなく「戻ってきた」感じがして好きだ。

次回予告

第10回は2026年4月、「抑揚への探求」。query_pipelineという仕組みで音声合成のAudioQuery(抑揚パラメータ)を一度書き出してレビューし、--prepare-audio-queries--use-audio-queriesという2つのオプションで生成と適用を分離する話をする。3月に取り戻したリズムの上に、次はどんな改良を積んでいくのか。

#Agyテックブログ


この記事は podcast-tool のコミット履歴を一次資料として書いています。引用したコミットハッシュ・時刻・コミット数は当時のリポジトリ状態に基づきます。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。