[{"data":1,"prerenderedAt":373},["ShallowReactive",2],{"content-/voicevox-zundamon-audio-r2":3,"all-pages-for-dir":371,"og-image-/voicevox-zundamon-audio-r2":372},{"id":4,"title":5,"body":6,"category":350,"description":351,"extension":352,"meta":353,"navigation":354,"ogImage":355,"path":356,"project_name":357,"published":358,"publishedAt":359,"seo":360,"stem":361,"tags":362,"todo":369,"unpublished":358,"updatedAt":355,"__hash__":370},"pages/2026-05/2026-05-06/voicevox-zundamon-audio-r2.md","ずんだもん音声解説を財務3表コクピットに組み込む：132ステップ一括生成とR2デプロイ",{"type":7,"value":8,"toc":342},"minimark",[9,13,17,37,41,44,47,50,54,61,68,71,74,208,223,230,234,326,329,332,335,338],[10,11,12],"h2",{"id":12},"財務3表コクピットにずんだもんの声を乗せた",[14,15,16],"p",{},"財務3表コクピット画面の解説カードに、VOICEVOX のずんだもん（speaker_id=3、ノーマル）で音声読み上げを追加した。",[14,18,19,20,24,25,28,29,32,33,36],{},"テスト音声を1本生成して確認したあと、",[21,22,23],"code",{},"showGuideStep"," に音声再生ロジックを差し込み、",[21,26,27],{},"closeGuide"," に停止処理を追加した。音声ファイルは ",[21,30,31],{},"dev-audio.ts"," ミドルウェアが ",[21,34,35],{},"/audio/cockpit/guides/"," パスを自動配信するので、ファイルを置くだけで拾われる。",[10,38,40],{"id":39},"uiを段階的に育てた","UIを段階的に育てた",[14,42,43],{},"最初のリリースはガイドツールチップのフッター左端にクレジット文字を置くだけだった。",[14,45,46],{},"それを「解説ボタンと音声切替ボタンを四角枠でグループ化し、クレジット（VOICEVOX:ずんだもん）をその隣に並べる」形に作り替えた。ボタンが散らばっていたのが、一つの操作ユニットに収まった。",[14,48,49],{},"倍速切替は 1.0× / 1.5× / 1.8× の3段階を実装した。「1.8倍はレビュー時にまとめてザッと聞きたい」という用途がある。デバッグ用のリピート再生ボタンはコメントマーカーで囲んで追加し、後で探して消しやすくした。",[10,51,53],{"id":52},"_132ステップを一括生成した","132ステップを一括生成した",[14,55,56,57,60],{},"no-01〜no-30 の全取引ガイド、合計132ステップの音声を tsx スクリプトで一括生成した。バックグラウンドで回して、",[21,58,59],{},"generated=128 / skipped=4（既存）/ errors=0"," で完走した。",[14,62,63,64,67],{},"スクリプトは進捗マークダウンを ",[21,65,66],{},"memo/2026-05-06/cockpit-guide-audio-progress.md"," に書き出す設計にした。途中で止まっても再開できる。",[14,69,70],{},"音声ファイルを一本再生するたびに読み誤りが見つかり、前処理ルールを追加して該当ファイルを再生成する、という作業を繰り返した。",[10,72,73],{"id":73},"読み誤り修正の記録",[75,76,77,93],"table",{},[78,79,80],"thead",{},[81,82,83,87,90],"tr",{},[84,85,86],"th",{},"問題",[84,88,89],{},"対処",[84,91,92],{},"再生成数",[94,95,96,108,119,130,148,165,183,197],"tbody",{},[81,97,98,102,105],{},[99,100,101],"td",{},"B/S がうまく読まれない",[99,103,104],{},"VOICEVOX辞書に全角「Ｂ／Ｓ」で登録、生成テキストを全角変換",[99,106,107],{},"—",[81,109,110,113,116],{},[99,111,112],{},"「最終行」の誤読",[99,114,115],{},"該当1ファイルを再生成",[99,117,118],{},"1",[81,120,121,124,127],{},[99,122,123],{},"「税引前当期純利益」の誤読",[99,125,126],{},"対象ファイルを削除→再生成",[99,128,129],{},"11",[81,131,132,142,145],{},[99,133,134,137,138,141],{},[21,135,136],{},"+"," → 「プラス」、",[21,139,140],{},"▲"," → 「マイナス」",[99,143,144],{},"スクリプトに前処理を追加",[99,146,147],{},"21",[81,149,150,156,162],{},[99,151,152,155],{},[21,153,154],{},"No(数字)"," が読まれない",[99,157,158,161],{},[21,159,160],{},"No."," に変換ルール追加",[99,163,164],{},"13",[81,166,167,178,181],{},[99,168,169,170,173,174,177],{},"小文字 ",[21,171,172],{},"no(数字)"," → ",[21,175,176],{},"No"," に統一",[99,179,180],{},"ガイド本文を1箇所修正＋再生成",[99,182,118],{},[81,184,185,188,194],{},[99,186,187],{},"「CF」が読まれない",[99,189,190,193],{},[21,191,192],{},"キャッシュフロー"," に前処理追加",[99,195,196],{},"7",[81,198,199,202,205],{},[99,200,201],{},"「均衡を保ちます」が不自然",[99,203,204],{},"ガイド本文を「貸借対照表がバランスします」に修正",[99,206,207],{},"2",[14,209,210,211,213,214,213,216,213,219,222],{},"VOICEVOX は記号・略語の読み下しが弱い。",[21,212,136],{},"、",[21,215,140],{},[21,217,218],{},"CF",[21,220,221],{},"B/S"," など財務用語に頻出する表記が軒並みひっかかった。前処理で文字列を置換してから API に渡す層を育てていく形になった。",[14,224,225,226,229],{},"辞書登録（",[21,227,228],{},"wrangler r2 object put"," ではなく VOICEVOX の辞書 API への登録）は全角表記との組み合わせで一本目から決まった。",[10,231,233],{"id":232},"r2-へ132ファイルをアップロードした","R2 へ132ファイルをアップロードした",[235,236,241],"pre",{"className":237,"code":238,"language":239,"meta":240,"style":240},"language-bash shiki shiki-themes vitesse-light vitesse-light","for file in audio/cockpit/guides/*.wav; do\n  wrangler r2 object put \"bucket-name/${file}\" --file \"${file}\"\ndone\n","bash","",[21,242,243,270,320],{"__ignoreMap":240},[244,245,248,252,256,259,263,267],"span",{"class":246,"line":247},"line",1,[244,249,251],{"class":250},"sHkkW","for",[244,253,255],{"class":254},"s4oTP"," file",[244,257,258],{"class":250}," in",[244,260,262],{"class":261},"sdGka"," audio/cockpit/guides/*.wav",[244,264,266],{"class":265},"shFtX",";",[244,268,269],{"class":250}," do\n",[244,271,273,277,280,283,286,290,293,296,299,302,305,309,311,313,315,317],{"class":246,"line":272},2,[244,274,276],{"class":275},"senZ8","  wrangler",[244,278,279],{"class":261}," r2",[244,281,282],{"class":261}," object",[244,284,285],{"class":261}," put",[244,287,289],{"class":288},"sMJiu"," \"",[244,291,292],{"class":261},"bucket-name/",[244,294,295],{"class":265},"${",[244,297,298],{"class":261},"file",[244,300,301],{"class":265},"}",[244,303,304],{"class":288},"\"",[244,306,308],{"class":307},"snbK4"," --file",[244,310,289],{"class":288},[244,312,295],{"class":265},[244,314,298],{"class":261},[244,316,301],{"class":265},[244,318,319],{"class":288},"\"\n",[244,321,323],{"class":246,"line":322},3,[244,324,325],{"class":250},"done\n",[14,327,328],{},"bash ループで回した。途中、バックグラウンド実行でバッファリングが詰まってプロセスが沈黙した。フォアグラウンドに切り替えて再開したら、ログが流れ始めてそのまま完走した。132ファイル、エラー0。R2 の配信 URL でブラウザから再生して、音が出ることを確認した。",[10,330,331],{"id":331},"今日の感触",[14,333,334],{},"「音声ファイルを一括生成すれば終わり」と思っていたが、生成と再生と修正を8往復した。財務用語と記号が入り混じるテキストを VOICEVOX に渡す前に正規化する前処理層が、今日一番成長した部分だった。",[14,336,337],{},"前処理ルールが増えるたびに影響範囲の再生成が走り、132ファイルの中を何度か行き来した。スクリプトに再生成フラグを持たせておいたので、該当ファイルを削除して回すだけで済んだ。中断耐性の設計が効いた。",[339,340,341],"style",{},"html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":240,"searchDepth":272,"depth":272,"links":343},[344,345,346,347,348,349],{"id":12,"depth":272,"text":12},{"id":39,"depth":272,"text":40},{"id":52,"depth":272,"text":53},{"id":73,"depth":272,"text":73},{"id":232,"depth":272,"text":233},{"id":331,"depth":272,"text":331},"dev","VOICEVOXのずんだもん（speaker_id=3）で財務3表コクピットの全解説音声132ステップを一括生成。読み誤りを繰り返し修正しながらR2にデプロイするまでの記録。","md",{},true,null,"/voicevox-zundamon-audio-r2","eurekapu-nuxt4",false,"2026-05-06T00:00:00.000Z",{"title":5,"description":351},"2026-05/2026-05-06/voicevox-zundamon-audio-r2",[363,364,365,366,367,368],"VOICEVOX","ずんだもん","音声合成","Cloudflare","R2","Nuxt","memo","0i9JbFGt2bNFh9ZKwYzGpK7byal34QR5BWKduNssjBs",[],"https://log.eurekapu.com/og/blog/voicevox-zundamon-audio-r2.png?v=2026-05-06T00%3A00%3A00.000Z&title=%E3%81%9A%E3%82%93%E3%81%A0%E3%82%82%E3%82%93%E9%9F%B3%E5%A3%B0%E8%A7%A3%E8%AA%AC%E3%82%92%E8%B2%A1%E5%8B%993%E8%A1%A8%E3%82%B3%E3%82%AF%E3%83%94%E3%83%83%E3%83%88%E3%81%AB%E7%B5%84%E3%81%BF%E8%BE%BC%E3%82%80%EF%BC%9A132%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E4%B8%80%E6%8B%AC%E7%94%9F%E6%88%90%E3%81%A8R2%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4&author=Kei%20Komatsu&sig=62c87b8a33bac856",1782528833667]