<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>BGM on 思いつきそうで思いつかなくていたときに</title><link>https://blog.fuga.jp/tags/bgm/</link><description>Recent content in BGM on 思いつきそうで思いつかなくていたときに</description><generator>Hugo -- gohugo.io</generator><language>ja</language><copyright>Copyright(c) 2022-2025 SATO Daisuke. All rights reserved.</copyright><lastBuildDate>Thu, 18 Jun 2026 06:00:00 +0900</lastBuildDate><atom:link href="https://blog.fuga.jp/tags/bgm/index.xml" rel="self" type="application/rss+xml"/><item><title>podcast-tool 開発日記 #2 音を整える — 「出る」から「聴ける」へ</title><link>https://blog.fuga.jp/posts/2026-06-18-podcast-tool-devdiary-02-tuning-the-sound/</link><pubDate>Thu, 18 Jun 2026 06:00:00 +0900</pubDate><guid>https://blog.fuga.jp/posts/2026-06-18-podcast-tool-devdiary-02-tuning-the-sound/</guid><description>&lt;h2 id="前回までのあらすじ">&lt;a href="#%e5%89%8d%e5%9b%9e%e3%81%be%e3%81%a7%e3%81%ae%e3%81%82%e3%82%89%e3%81%99%e3%81%98" class="header-anchor">&lt;/a>前回までのあらすじ
&lt;/h2>&lt;p>第1回では、&lt;code>podcast-tool&lt;/code> の &lt;strong>最初のコミットが置かれた日&lt;/strong>——2025年7月11日を追った。朝に &lt;code>pyproject.toml&lt;/code> だけの「箱」を用意し、その日の午後の26分で、CLIの骨格・設定ファイルの読み込み・VOICEVOX での音声合成・&lt;code>m4a&lt;/code> 書き出しまでが一気に立ち上がった。「&lt;strong>音が出た&lt;/strong>」最小形が、たった半時間でできあがっていた。&lt;/p>
&lt;p>ただし「音が出る」と「聴ける」は別の話だ。合成音声をそのまま並べただけでは、速度はちぐはぐ、BGMはぶつ切り、セクションの切れ目もなく、音量ものっぺりしている。第2回は、その「とりあえず出た音」を &lt;strong>聴けるものに整えていく&lt;/strong> 数日間を、同じくコミット履歴から振り返る。&lt;/p>
&lt;p>対象は、誕生当日の夜から翌々日の朝にかけて。コミットでいうと &lt;code>458528f&lt;/code>（話者速度調整）から &lt;code>e8aa46b&lt;/code>（アウトロのフェードアウト改善）までの一塊、その締めとして翌朝の &lt;code>a6aa822&lt;/code> までだ。&lt;/p>
&lt;h2 id="まずは話す速さから">&lt;a href="#%e3%81%be%e3%81%9a%e3%81%af%e8%a9%b1%e3%81%99%e9%80%9f%e3%81%95%e3%81%8b%e3%82%89" class="header-anchor">&lt;/a>まずは「話す速さ」から
&lt;/h2>&lt;p>最初に手が入ったのは、話者ごとの速度だった。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>458528f 2025-07-12 04:46 [feat] 話者の音声速度調整機能を追加
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>差分は &lt;code>speakers.json&lt;/code> と &lt;code>main.py&lt;/code> にまたがっている。話者定義のほうに速度のパラメータを持たせ、合成時にそれを効かせる、という素直な作りだ。前回見たとおり、このツールは初日から「ロジックではなくデータで振る舞いを決める」データ駆動の発想で組まれていた。速度調整も例外ではなく、&lt;strong>話者ファイルにパラメータを足すだけで効く&lt;/strong>形で入っている。&lt;/p>
&lt;p>地味だが、これは「聴きやすさ」の第一歩だ。早口すぎる話者、間延びする話者を、台本を書き換えずに &lt;code>speakers.json&lt;/code> 側で揃えられるようになった。&lt;/p>
&lt;h2 id="bgmをループさせると継ぎ目でブツッとなる">&lt;a href="#bgm%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%95%e3%81%9b%e3%82%8b%e3%81%a8%e7%b6%99%e3%81%8e%e7%9b%ae%e3%81%a7%e3%83%96%e3%83%84%e3%83%83%e3%81%a8%e3%81%aa%e3%82%8b" class="header-anchor">&lt;/a>BGMをループさせると、継ぎ目で「ブツッ」となる
&lt;/h2>&lt;p>その13分後、BGM の悩みに手が入る。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>b70b35e 2025-07-12 04:59 [feat] BGMループ時のクロスフェード処理を追加
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>短いBGMを長い本編に合わせて繰り返すと、ループの継ぎ目で波形が不連続になって「ブツッ」というノイズが乗る。これを避けるのが &lt;strong>クロスフェード&lt;/strong>——前のループの終わりと次のループの頭を重ねて、なめらかに繋ぐ処理だ。&lt;code>main.py&lt;/code> に44行が足され、&lt;code>bgm_config.json&lt;/code> 側にも設定項目が増えている。BGMの扱いが「ただ流す」から「ちゃんと繋ぐ」に一段上がった瞬間だ。&lt;/p>
&lt;h2 id="いったん設定を-configjson-に逃がす">&lt;a href="#%e3%81%84%e3%81%a3%e3%81%9f%e3%82%93%e8%a8%ad%e5%ae%9a%e3%82%92-configjson-%e3%81%ab%e9%80%83%e3%81%8c%e3%81%99" class="header-anchor">&lt;/a>いったん設定を &lt;code>config.json&lt;/code> に逃がす
&lt;/h2>&lt;p>機能が増えてくると、設定があちこちに散らかってくる。30分ほど後、それを一度整理するリファクタリングが入る。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>1f84bc1 2025-07-12 05:32 [refactor] 設定情報をconfig.jsonに分離し、ロジックを改善
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>このコミットは &lt;code>config.json&lt;/code> を新設しつつ、&lt;code>main.py&lt;/code> を &lt;strong>+336 / −441&lt;/strong> という大きめの差分で書き換えている。機能追加というより、増えてきた設定値とロジックをいったん棚卸しして整理する回だ。立ち上げ期の一枚岩に、最初の「片付け」が入ったとも言える。&lt;/p>
&lt;h2 id="音楽は標準で入れるものじゃない">&lt;a href="#%e9%9f%b3%e6%a5%bd%e3%81%af%e6%a8%99%e6%ba%96%e3%81%a7%e5%85%a5%e3%82%8c%e3%82%8b%e3%82%82%e3%81%ae%e3%81%98%e3%82%83%e3%81%aa%e3%81%84" class="header-anchor">&lt;/a>「音楽は標準で入れるものじゃない」
&lt;/h2>&lt;p>このあたりで個人的にいちばん好きなコミットがこれだ。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>7c5d786 2025-07-12 05:33 [fix] 音楽は標準で入れるものじゃない
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>変更されているのは &lt;code>.gitignore&lt;/code> の2行だけ。だがメッセージが効いている。BGMを「デフォルトで必ず混ぜるもの」として扱うのをやめた、という設計判断の表明だ。生成物にうっかりBGM前提のファイルを巻き込まないよう手当てしつつ、思想として「&lt;strong>音楽はオプションであって前提ではない&lt;/strong>」へ舵を切っている。前回の「typer をやめて argparse にした話」と同じ匂いがする——華やかさより、地に足のついた素直さを選ぶ。&lt;/p>
&lt;p>直後には開発まわりの整備も続く。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>6c7071d 2025-07-12 05:41 [chore] ruffを導入し、import順を自動整形
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2784e24 2025-07-12 05:43 [docs] READMEを現状に合わせて更新
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>9778b6c 2025-07-12 06:22 [feat] M4A出力とffmpeg/ffprobeパスチェック機能を追加し、READMEを更新
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>ruff&lt;/code> を入れてコード整形を自動化し、README を現状に追従させ、&lt;code>ffmpeg&lt;/code>/&lt;code>ffprobe&lt;/code> のパス存在チェックを足す。動く機能だけでなく、&lt;strong>動かす前のチェックと開発体験&lt;/strong>にも目が向き始めている。&lt;/p>
&lt;h2 id="無音を足すと急に聴きやすくなる">&lt;a href="#%e7%84%a1%e9%9f%b3%e3%82%92%e8%b6%b3%e3%81%99%e3%81%a8%e6%80%a5%e3%81%ab%e8%81%b4%e3%81%8d%e3%82%84%e3%81%99%e3%81%8f%e3%81%aa%e3%82%8b" class="header-anchor">&lt;/a>「無音」を足すと、急に聴きやすくなる
&lt;/h2>&lt;p>日付が変わって（JST では同じ7月12日の昼）、いよいよ「整音」の本丸に入る。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>7a9d3b7 2025-07-12 09:18 [fix] インデントエラーを修正し、BGMなしの場合に無音トラックを生成
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>55f5b54 2025-07-12 12:24 [feat] 各セクションの切れ目に1秒間の無音を追加
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>7a9d3b7&lt;/code> は、BGMが無いときでも &lt;strong>無音トラックを生成する&lt;/strong> ようにした修正。BGMありき前提だった処理を、「無くても破綻しない」形に直している。前項の「音楽は前提ではない」という思想が、ここで実装として効いてくる。&lt;/p>
&lt;p>そして &lt;code>55f5b54&lt;/code>、&lt;strong>各セクションの切れ目に1秒の無音を入れる&lt;/strong>。差分はたった7行だが、効果は大きい。話題が切り替わるところに息継ぎの間ができ、立て続けに喋り続ける機械音声の窮屈さが一気に和らぐ。「聴ける」に近づく改良の中でも、コスパが抜群に良い一手だ。&lt;/p>
&lt;h2 id="bgmにメリハリをつける">&lt;a href="#bgm%e3%81%ab%e3%83%a1%e3%83%aa%e3%83%8f%e3%83%aa%e3%82%92%e3%81%a4%e3%81%91%e3%82%8b" class="header-anchor">&lt;/a>BGMに「メリハリ」をつける
&lt;/h2>&lt;p>無音の次は、BGMの音量に表情をつけていく。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>c939d1c 2025-07-12 12:32 [feat] BGMのセクション開始・終了時の音量調整機能を追加
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2d3e6ee 2025-07-12 13:22 [refactor] 進捗表示の削除とコードのクリーンアップ
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ac704b8 2025-07-12 14:15 [feat] BGMの動的な音量調整機能を追加
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>e8aa46b 2025-07-12 14:22 [fix] アウトロのフェードアウトを改善
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>c939d1c&lt;/code> は、セクションの開始・終了でBGMの音量を上げ下げできるようにした機能。導入部はBGMをやや前に出し、本編はそっと下げる——そういう演出が &lt;code>bgm_config.json&lt;/code> で指定できるようになった。&lt;/p>
&lt;p>&lt;code>ac704b8&lt;/code> の「&lt;strong>動的な音量調整&lt;/strong>」は、この期間でもっとも実装が膨らんだ回で、&lt;code>main.py&lt;/code> を &lt;strong>+74 / −51&lt;/strong> 書き換えている。固定の音量ではなく、本編の進行に合わせてBGMの音量を動かす仕組みだ。喋りに被りそうなところは自動で下げる、いわゆるダッキングに通じる発想と言っていい。&lt;/p>
&lt;p>締めの &lt;code>e8aa46b&lt;/code> は、&lt;strong>アウトロのフェードアウト&lt;/strong>の改善。曲をブツッと切らず、終わりに向けてすっと音を引いていく。番組の「終わり方」を整える、最後のひと手間だ。&lt;/p>
&lt;p>ここまでの一連の改良で、BGMは「鳴っているだけ」から「&lt;strong>間と音量で番組を支える&lt;/strong>」存在に変わった。&lt;/p>
&lt;h2 id="整えたらもう一度ロジックを整える">&lt;a href="#%e6%95%b4%e3%81%88%e3%81%9f%e3%82%89%e3%82%82%e3%81%86%e4%b8%80%e5%ba%a6%e3%83%ad%e3%82%b8%e3%83%83%e3%82%af%e3%82%92%e6%95%b4%e3%81%88%e3%82%8b" class="header-anchor">&lt;/a>整えたら、もう一度ロジックを整える
&lt;/h2>&lt;p>そして翌朝、この「整音」期間の締めくくりに、もう一度コードそのものを整える回が来る。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>a6aa822 2025-07-13 06:17 [refactor] main.pyの音声処理ロジックを改善し、デバッグメッセージを追加
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>機能追加が一段落したところで、音声処理まわりのロジックを見直し、デバッグメッセージを足す。次に進む前に足元を固める、という呼吸だ。第1回の295行・一枚岩の &lt;code>main.py&lt;/code> は、この数日でだいぶ機能を抱えこんだ。やがて来る本格的なファイル分割（&lt;code>config_utils.py&lt;/code> / &lt;code>voice.py&lt;/code> / &lt;code>mixer.py&lt;/code> への切り出し）は、もう数日先の話になる。&lt;/p>
&lt;h2 id="この期間でできたこと">&lt;a href="#%e3%81%93%e3%81%ae%e6%9c%9f%e9%96%93%e3%81%a7%e3%81%a7%e3%81%8d%e3%81%9f%e3%81%93%e3%81%a8" class="header-anchor">&lt;/a>この期間でできたこと
&lt;/h2>&lt;p>整理すると、この「音を整える」数日間で入ったのはこのあたりだ。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>機能&lt;/th>
&lt;th>コミット&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>話者ごとの速度調整&lt;/td>
&lt;td>&lt;code>458528f&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BGMループのクロスフェード&lt;/td>
&lt;td>&lt;code>b70b35e&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>設定の &lt;code>config.json&lt;/code> 分離&lt;/td>
&lt;td>&lt;code>1f84bc1&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BGMを「前提」から「オプション」へ&lt;/td>
&lt;td>&lt;code>7c5d786&lt;/code> / &lt;code>7a9d3b7&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>セクション間の1秒無音&lt;/td>
&lt;td>&lt;code>55f5b54&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>セクション開始・終了の音量調整&lt;/td>
&lt;td>&lt;code>c939d1c&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BGMの動的音量調整&lt;/td>
&lt;td>&lt;code>ac704b8&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>アウトロのフェードアウト改善&lt;/td>
&lt;td>&lt;code>e8aa46b&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>派手な新機能は無い。だが「機械が喋ってる」感を削り、「番組を聴いている」感を足す改良が、密に積まれた数日だった。&lt;strong>速度・間・音量&lt;/strong>——人が無意識に心地よさを感じる要素を、一つずつ手で詰めていった期間だと言える。&lt;/p>
&lt;h2 id="次回予告">&lt;a href="#%e6%ac%a1%e5%9b%9e%e4%ba%88%e5%91%8a" class="header-anchor">&lt;/a>次回予告
&lt;/h2>&lt;p>第3回は、増えすぎた &lt;code>main.py&lt;/code> に &lt;strong>メスを入れる&lt;/strong>回を予定している。設定読み込みを &lt;code>config_utils.py&lt;/code> へ、VOICEVOX 通信を &lt;code>voice.py&lt;/code> へ、BGM・オーディオ処理を &lt;code>mixer.py&lt;/code> へ——一枚岩を機能ごとに切り分けていく、最初の本格リファクタリングだ。あわせて、&lt;code>pytest&lt;/code> を入れてテストを書き始め、GitHub Actions に載せるまでの「&lt;strong>壊れていないことを確かめる仕組み&lt;/strong>」づくりも追っていく。&lt;/p>
&lt;hr>
&lt;p>&lt;em>この記事は &lt;code>podcast-tool&lt;/code> のコミット履歴を一次資料として書いています。引用したコミットハッシュ・時刻・コード構成は当時のリポジトリ状態に基づきます（時刻は JST 表記）。&lt;/em>&lt;/p></description></item></channel></rss>