Irodori-TTSでExcel講座のナレーションを本人の声に:読み替え辞書を削ったら、残ったのはセル番地の数字だけ

開発eurekapu-nuxt4

Irodori-TTSでExcel講座のナレーションを本人の声に:読み替え辞書を削ったら、残ったのはセル番地の数字だけ

Excel講座の動画に、区間ごとのナレーションを付ける作業を一日続けた。 朝は VOICEVOX で作り、途中から自分の声を写した Irodori-TTS に切り替えた。 最後には章1の23区間がすべて自分の声になり、本番に出ている。

合成に渡す台本では、誤読しそうな語を先にひらがなやカタカナへ書き換えていた。 Claude Code が予防のつもりで入れていた書き換えである。 聞いては外していくうちに、最後まで残った書き換えは1種類だけになった。

画面が変わる時刻から拍を割り出す

06:07 のセッションは Fable 5.1 のモデルで動いていた。 前回の引き継ぎに沿って、講座の2本目の区間から入った。

まず対象の動画を落とし、画面が変わる時刻を機械で検出させた。 0.5秒刻みの検出では粗いので、変化点の前後のコマをリボン部分だけ拡大して見てもらった。 その時刻から拍を計算して、区間ごとの語りを VOICEVOX で合成する流れである。 前回の音声は上書きせず(--skip-existing)、今回の5本だけを作らせて、読みをカナで確かめた。

2本目の区間は、コードを1行も直さず、データと台本を足すだけで通った。 前回決めた手順は、そのまま基準として使える。

コミットは Codex のレビューで一度止まった。 指摘を直したあと、Codex が挙げた再現手順(音声オフ→途中まで再生→一時停止→音声オン→再生)のとおりに実機で確かめてもらった。

続いて、動画の無い区間にも語りを付けた。 概要の区間には5拍の台本を入れてもらった。 本文をほぼそのまま口語にして、「三つ」と予告してから説明し、同じ数で締める形である。 1拍目は読みを「ならべて」に直すために作り直させ(25.6秒)、VOICEVOX の解釈が「ナラベテ」になったことをカナで確かめた。 通しで再生すると、時刻表示が「0:50」「1:10」と正確に出るようになり、2行目がオレンジで光った。

自分の声での合成とビート整列

途中から Irodori-TTS を Windows に入れてもらった。 最初のテスト合成は参照音声なし、つまりモデル既定の声で、自分の声ではない。 声を写すには参照音声が要るので、録音用のサーバー(Node の標準機能だけ)と録音ページを作ってもらった。

録った声で「ウィンドウ枠の固定」の区間を作り直してもらうと、通しは2分6秒になった。 ここで、tts-narration スキルを使ったのかを尋ねた。 使っていなかった。 文と文のあいだを固定の0.45秒でつないだだけで、BPM120 のビートグリッドに文頭を合わせる配置(8月に自分の声のクローンで試した方式)は入っていなかった。 Claude Code の説明では、スキルがあることは途中で把握していたのに、「まず変換を」と急いで素通りしたという。

スキルどおりに作り直させると、長さは同じ2分6秒のまま、今度は126.0秒ちょうど、BPM120 の63小節にそろった。 速度の選択肢には1.5倍も入った。

読み替え辞書の試行錯誤

専門用語の発音がおかしいと、それだけで一気に AI っぽく聞こえる。 そう伝えて、読みを聞き比べるページを作ってもらった。

ひらがなで渡した「しさんひょう」

聞き比べると、ひらがなで渡した「しさんひょう」が変だった。 もともと「試算表」は漢字で渡していたので、漢字のほうがいい気がする、と伝えた。

Claude Code によると、誤読しそうな語を先にひらがなへ直していたのは、誤読を確かめたうえでの対処ではない。 予防のつもりの先回りで、それがアクセントを壊していた。 方針は「漢字の語は漢字のままモデルに渡す」に改め、同じ理由でひらがなにしていた「行数」「一行目」「二行目」も漢字に戻してもらった。 読み替えは、モデルが読めない英字や記号(Alt、W、E3、A列など)だけに絞った。 締めの文でも、漢字のまま渡した「月次推移表」が、シードをずらさずに「げつじすいいひょう」と読めた。

次に、同じ文「経理の仕事では、試算表や月次推移表のように、行数の多い表でよく使います。」をシードだけ変えて3本作らせ、Whisper の書き起こしも並べてもらった。 結局、ずらし0(元の音声)に戻した。 音声の良し悪しは自分が聞いて決める。 Claude Code には Whisper での確認に時間をかけさせない。 発音の対策は、講座の用語を読み込んだ参照音声の録り直しでやる。 戻すときも合成し直しはゼロで、残してあった音声をそのまま使えた。

進み具合を尋ねると、台本まで入った区間は3つ、自分の声になった区間は1つだけで、フィルター機能は手つかずだった。

「乗算」「除算」をどう読むか

章1に出てくる用語を入れた録音台本を10本そろえてもらった。 録るのは5〜10本目の6本だけでよかった。 録りながら気になったのが、貼り付けの演算にある「乗算」と「除算」である。 Excel の画面に「除算」と出ているので、今回はそのまま読んで録った。 ただ、除算はふだん口にしない言葉だ。 ナレーションは台本の段階から「掛け算」「割り算」で書き、乗算や除算との言い換えもわざわざ説明しないことにした。 普通の日本人なら、それで分かると思う。 「除算」と読んだ6本目は声を写すための素材で、合成する台本ではないので、録り直しは要らなかった。

10本を確かめてもらうと、5本目が1.2秒の無音で保存されていた。 録音ボタンを押した直後に止めてしまった誤操作らしい。 ほかの9本で合計99.8秒、5本目が入れば約110秒で、参照音声の上限120秒に収まる。 5本目を録り直して10本がそろった。

「W です」の W と、セル番地の E3

10本の参照音声で「ウィンドウ枠の固定」を作り直して聞くと、「W です」の W の発音が変だった。 Claude Code の見立てで最も疑わしいのは、W をカタカナの「ダブリュー」に書き換えてモデルへ渡していたことだった。 ひらがなで崩れたのと同じ構図である。 素の W と聞き比べると、W も F もアルファベットのまま渡すほうが自然に聞こえた。

そこで、章1に出てくる10文字を全部アルファベットのまま合成させた。 同じ章の Alt、Ctrl、Windows、Enter、F5 と、セル番地も同じページに並べてもらい、42本を聞き比べた。 E3 が「E スリー」になっていた。 D4 は「ディーよん」と正しく読めている。

E3 の直し方の候補を並べてもらうと、1-C(「E三」と漢数字で書く案)がいちばん良かった。 B2 も「Bつー」と英語読みになっている。 1桁の数字は英語のまま読まれがちなので、全部そろえることにした。 このとき自分は「全部算用数字にしましょうかね」と言ったが、選んだ 1-C は漢数字の「三」である。 Claude Code はこれを漢数字の意味で受け取って復唱し、ルールは「セル番地の数字は漢数字にして渡す」に決まった。 Excel という語はアルファベットのまま渡す。

試した渡し方聞こえ方決まった渡し方
試算表ひらがな「しさんひょう」不自然漢字のまま
Wカタカナ「ダブリュー」発音が変W のまま
E3そのまま「E スリー」E三
B2そのまま「Bつー」数字を漢数字に

読み替えのルールは、これで1本にまとまった。 台本の文字はそのまま渡し、例外はセル番地の数字を漢数字にすることだけ。 読み替えの関数は純粋関数として直してもらい、合成の前に変換結果を確かめた。 E3 は E三、F10 は F十 になり、英字と漢字、「145パーセント」、年号はそのまま残る。 「万」の対応も足してもらい、境界の値を確かめてから作り直させた。

この日の知見は、Irodori-TTS でナレーションを作る場面ならどのリポジトリでも通じる。 tts-narration スキルの references/ に1本足し、SKILL.md の §9 から導線を張ってもらった。

概要とフィルター機能を本人の声で合成する

09:18 のセッションでは、引き継ぎに沿って、概要(c00-s00)と新しいウィンドウ(c00-s02)を自分の声で合成し直させた。 c00-s00 はグリッド検査が OK で、5拍、通し90.0秒になった。 VOICEVOX 版を退避し、差し替えた音声が dev サーバーから配信される(200)ことを確かめてから、表示側を Chrome DevTools で見てもらった。 音を消して開くと、操作バーの通しは 0:00 / 1:30 で、合成の合計90.0秒と一致した。 もう1区間も 2:38(158.0秒)で一致し、2.5倍速の通し再生で、拍ごとに光る要素が移っていくことも確かめた。

再生を待つあいだに、残り20区間の表示の型を数えさせた。 表示の優先順は「演習 → 動画 → 記事型 → 通常(本文+ステージ)」で、この判定を章1の23区間に当てて一覧にしてもらった。

フィルター機能は、動画の前半(リボンにキーヒントが出るところ)を拡大して確かめてもらい、台本を入れて自分の声で合成させた。 グリッド検査は OK で、通しは3分28秒になった。 動画を止める位置(3.9、6.2、10.0秒)のコマが語りの内容と合っているかを先に照らし合わせてもらい、操作バーの 3:28 も合成の合計208秒と一致した。

3区間ができたところで、W をアルファベットのまま渡しているかを尋ねた。 合成時のログと実際に渡した文字を調べてもらうと、3区間ともアルファベットのままだった。 自分が指摘した締めの1文「Alt、W、N。」は、シード2で作り直してもらい、本番用の音声を差し替えた。

残り19区間の台本と合成

章1の残り19区間(貼り付け7、貼り付けの演習3、検索1、置換3、置換の演習2、カメラ機能1、覚えなくてもよい機能2)は、最後まで通して進めてもらった。 1区間ごとの試聴待ちはしない。 光らせたブロックが地の色を残したまま薄いオレンジに染まるよう CSS を足してから、動画の無い12区間の台本を先に書いてもらった。

合成は1区間に3〜4分かかる。 できた区間から順にブラウザで検査させると、最初の6区間は通しの時間が合成の合計と一致した(2:26、1:40、1:56、1:30、2:24、1:44)。 ゴールシークは、動画が止まる位置が3.5、14.4、15.9、17.4秒と設計どおりで、3:18まで完走した。

演習の中の動画プレイヤーは新しい経路だったが、右上の操作バーにそのままつながった。 動画の元の収録音声も、プレイヤー側で最初から消音されていた(muted=true)。 データを入れるだけで、語りを TTS に統一できたことになる。 置換の演習1本目は、5枚目の字幕の区間が37秒と長いので、語りの長さと釣り合うよう書き足させた。

動画つき7区間はすべて exit=0 で終わり、グリッド検査も OK だった。 台本を直した5区間を作り直し、変わっていない文は使い回した。 これで章1の23区間がすべて自分の声で聞ける状態になり、コミットと push まで済んだ。

本番デプロイと R2 への音声アップロード

ここで、本番デプロイと R2 への音声アップロードをしておくよう指示した。 ドライランの対象は23区間、120本、295.7MB で、生の音声と VOICEVOX の退避分は0件だった。 まず1区間だけ上げて認証と配信を確かめ、そのうえで全体をアップロードさせた。 本番デプロイは3分2秒で終わり、Worker のバンドルは 1.676 MiB(余裕 1,356 KiB)だった。 本番のページでは、章1の読み上げが R2 の音声で動くかを確かめさせた。

振り返り

  • ひらがなにした「試算表」はアクセントを崩し、カタカナにした「W」も素の W より不自然に聞こえた。どちらも、誤読を聞いて確かめる前に入れた書き換えだった。書き換えとして残ったのは、素のまま渡して実際に「E スリー」と聞こえたセル番地の数字だけである。
  • 確かめる役目を分けた。Claude Code は、通しの時間と合成の合計が一致するか、拍ごとに光る要素が移るかを見る。音声の良し悪しは自分が聞いて決め、Whisper の書き起こしで詰めるのはやめた。
  • tts-narration スキルは、存在を把握されていても素通りされた。尋ねて初めて、固定0.45秒のつなぎだと分かった。

19区間を仕上げたときの報告にも、音を出さずに検証したので発音の合否は聞いて決めてほしい、とあった。 本番に出た23区間の発音を決めるのは、自分の耳である。

#Irodori-TTS#VOICEVOX#音声合成#ナレーション#Excel講座#読み替え辞書#Cloudflare R2