<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Google TTS on 思いつきそうで思いつかなくていたときに</title><link>https://blog.fuga.jp/tags/google-tts/</link><description>Recent content in Google TTS on 思いつきそうで思いつかなくていたときに</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>Copyright(c) 2022-2025 SATO Daisuke. All rights reserved.</copyright><lastBuildDate>Wed, 29 Jul 2026 06:00:00 +0900</lastBuildDate><atom:link href="https://blog.fuga.jp/tags/google-tts/index.xml" rel="self" type="application/rss+xml"/><item><title>podcast-tool 開発日記 #9 — 休眠、そして復活</title><link>https://blog.fuga.jp/posts/2026-07-29-podcast-tool-devdiary-09-hibernation-and-revival/</link><pubDate>Wed, 29 Jul 2026 06:00:00 +0900</pubDate><guid>https://blog.fuga.jp/posts/2026-07-29-podcast-tool-devdiary-09-hibernation-and-revival/</guid><description>&lt;p&gt;前回（第8回）は月235コミットという、このシリーズ最大の活動ピークの話だった。縦型動画対応、字幕の焼き込み、フレッシュネス判定のバグ修正……10月は息をつく間もなかった。今回はその反動の話をする。&lt;/p&gt;
&lt;h2 id="81日間の沈黙"&gt;&lt;a href="#81%e6%97%a5%e9%96%93%e3%81%ae%e6%b2%88%e9%bb%99" class="header-anchor"&gt;&lt;/a&gt;81日間の沈黙
&lt;/h2&gt;&lt;p&gt;10月最後のコミットは、10月27日10時37分の &lt;code&gt;4eaad27&lt;/code&gt;「cast形式ファイルのduration取得にCastMediaHandlerを使用」。cast形式対応と自動改行エンジンの実装がひと段落し、テストも整った状態だった。&lt;/p&gt;
&lt;p&gt;ここでログが止まる。&lt;/p&gt;
&lt;p&gt;次のコミットが刻まれるのは、年が明けた2026年1月16日5時5分。実に&lt;strong&gt;81日間&lt;/strong&gt;、コミットゼロが続く。月別で見ると11月0件、12月0件。このシリーズを通して最大の空白期間だ。&lt;/p&gt;
&lt;p&gt;理由をコミットメッセージから探ろうとしても、当然何も出てこない。何も書かれていない期間は、何も書かれていないという事実しか残らない。個人開発をしている人なら覚えがあると思うが、燃え尽きたわけでも興味を失ったわけでもなく、ただ他のことに手を取られているうちに気づけば2ヶ月経っていた、というのはよくある話だ。235コミットという異常な熱量を出した反動、と言ってしまうと出来過ぎな解釈かもしれないが、少なくとも山の後に谷が来るのは自然なことだった。&lt;/p&gt;
&lt;h2 id="復活の第一歩は深夜5時"&gt;&lt;a href="#%e5%be%a9%e6%b4%bb%e3%81%ae%e7%ac%ac%e4%b8%80%e6%ad%a9%e3%81%af%e6%b7%b1%e5%a4%9c5%e6%99%82" class="header-anchor"&gt;&lt;/a&gt;復活の第一歩は「深夜5時」
&lt;/h2&gt;&lt;p&gt;1月16日、&lt;code&gt;235c00f&lt;/code&gt;「cast形式統合とplay_once_holdモード追加」で開発が再開する。コミット時刻は朝5時5分。この時間帯にコミットが打たれているのは、このシリーズの中でも珍しい部類に入る。&lt;/p&gt;
&lt;p&gt;内容はcast version 3対応、メディアブロック単位でのcast設定、そして&lt;code&gt;play_once_hold&lt;/code&gt;モードの追加。動画を1回だけ完全再生してから音声に合わせて静止するモードで、&lt;code&gt;video_loop_generator.py&lt;/code&gt;が297行の大規模な書き換えを受けている。コミットメッセージの末尾には &lt;code&gt;Co-Authored-By: Claude Sonnet 4.5&lt;/code&gt; の署名があり、休眠明けの最初の一手からすでにAIとのペア作業だったことが分かる。&lt;/p&gt;
&lt;p&gt;とはいえ、これで完全復活というわけではなかった。1月20日には禁則処理まわりの改善が続く。&lt;code&gt;26c7caf&lt;/code&gt;「禁則処理の改善: 行頭禁則文字を削減処理に通じて折り返しを感じ」で、閉じカギ括弧（」『）を行頭禁則に追加し、改行位置の計算ロジックを精密化。テストは&lt;code&gt;test_auto_linebreak_engine.py&lt;/code&gt;の17件が全通過という記録が残っている。地味だが、字幕の見た目に直結する仕事だ。&lt;/p&gt;
&lt;p&gt;そしてまた止まる。2月はまたしても0件。1月の10コミットは、復活というより「様子見の一往復」に近かった。&lt;/p&gt;
&lt;h2 id="3月本格的に戻ってくる"&gt;&lt;a href="#3%e6%9c%88%e6%9c%ac%e6%a0%bc%e7%9a%84%e3%81%ab%e6%88%bb%e3%81%a3%e3%81%a6%e3%81%8f%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;3月、本格的に戻ってくる
&lt;/h2&gt;&lt;p&gt;本当の復活は3月に入ってからだ。3月5日、&lt;code&gt;f73c654&lt;/code&gt;「Google TTS APIエンジンサポートの追加」。これまでVOICEVOX専用だった音声合成に、Google TTSという選択肢が加わる。&lt;code&gt;GoogleTTSGenerator&lt;/code&gt;クラスを新規作成し、&lt;code&gt;speakers.json&lt;/code&gt;で&lt;code&gt;engine_type: google_tts&lt;/code&gt;を指定すればVOICEVOXの話者と混在できるようにした。APIキーは環境変数&lt;code&gt;GOOGLE_TTS_API_KEY&lt;/code&gt;かconfig.jsonで設定する形。テストも10件追加され、既存分含めて全通過。同じ日には&lt;code&gt;GeminiDecorator&lt;/code&gt;のAPIキー検出やSSMLの句読点処理まわりの細かい修正が畳みかけるように続いている。&lt;/p&gt;
&lt;p&gt;そして3月19日。この日は2つの重要なコミットが同じ朝に入っている。&lt;code&gt;57b82ec&lt;/code&gt;「セクション並列生成機能を追加」は、&lt;code&gt;VideoConfig&lt;/code&gt;に&lt;code&gt;parallel_section_workers&lt;/code&gt;フィールドを設け、&lt;code&gt;ThreadPoolExecutor&lt;/code&gt;でセクションごとの動画生成を並列化するもの。結果は元の順序を保って結合される。動画が長くなるほど効いてくる改善だ。&lt;/p&gt;
&lt;p&gt;続く&lt;code&gt;73c66a5&lt;/code&gt;「セキュリティ修正: 複数の脆弱性を修正」では、&lt;code&gt;video_flow.py&lt;/code&gt;のパストラバーサル対策、Google TTSの例外メッセージからAPIキーをマスクする処理、&lt;code&gt;audio/generator.py&lt;/code&gt;のスレッド競合状態をLockで修正、BGM設定読み込みのファイルサイズ上限チェック、&lt;code&gt;ffmpeg_runner&lt;/code&gt;のシングルトンをDouble-Checked Lockingで修正、&lt;code&gt;video_audio_merger.py&lt;/code&gt;のsubprocess呼び出しへのタイムアウト追加と、6箇所の脆弱性・不具合をまとめて潰している。並列処理を追加した直後に、その並列化が生みかねない競合状態を自分で見つけて塞ぐ——このセットで見ると筋が通っている。&lt;/p&gt;
&lt;h2 id="休眠期から見えるもの"&gt;&lt;a href="#%e4%bc%91%e7%9c%a0%e6%9c%9f%e3%81%8b%e3%82%89%e8%a6%8b%e3%81%88%e3%82%8b%e3%82%82%e3%81%ae" class="header-anchor"&gt;&lt;/a&gt;休眠期から見えるもの
&lt;/h2&gt;&lt;p&gt;11月・12月の沈黙、1月の様子見、2月の再沈黙を経て、3月にようやく安定した開発リズムが戻ってきた。この4ヶ月をまとめて眺めると、個人開発の実際の姿という気がする。毎日コミットが積まれる期間ばかりが記録に残りがちだが、その間に横たわる空白も含めて開発の履歴だ。&lt;/p&gt;
&lt;p&gt;実は、この期間コードは止まっていても、ポッドキャストの配信自体は概ね続いていた（2025年11月分もちゃんと存在する）。振り返ると、当時は「どうやったら質の良い、聞いてもらえるものが作れるか」という配信そのものの試行錯誤に時間を割いていたのと、並行して転職活動を進めていたこともあって、ツール開発に回せる時間そのものが削られていたのが大きい。ツールを作ることと、そのツールを使って実際にコンテンツを出し続けることは、当たり前だが別の仕事量を食う。休眠期という言葉で切り取ると空白に見えるが、開発ログの外側では別の作業が続いていた、というのが実態に近い。&lt;/p&gt;
&lt;p&gt;休眠明け最初のコミットが深夜5時だったことも、なんとなく「戻ってきた」感じがして好きだ。&lt;/p&gt;
&lt;h2 id="次回予告"&gt;&lt;a href="#%e6%ac%a1%e5%9b%9e%e4%ba%88%e5%91%8a" class="header-anchor"&gt;&lt;/a&gt;次回予告
&lt;/h2&gt;&lt;p&gt;第10回は2026年4月、「抑揚への探求」。&lt;code&gt;query_pipeline&lt;/code&gt;という仕組みで音声合成のAudioQuery（抑揚パラメータ）を一度書き出してレビューし、&lt;code&gt;--prepare-audio-queries&lt;/code&gt;と&lt;code&gt;--use-audio-queries&lt;/code&gt;という2つのオプションで生成と適用を分離する話をする。3月に取り戻したリズムの上に、次はどんな改良を積んでいくのか。&lt;/p&gt;
&lt;p&gt;#Agyテックブログ&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;この記事は &lt;code&gt;podcast-tool&lt;/code&gt; のコミット履歴を一次資料として書いています。引用したコミットハッシュ・時刻・コミット数は当時のリポジトリ状態に基づきます。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>