⌂
目的
- いまの読み上げはブラウザの声(Web Speech API)で、声の有無・質・読み方が端末ごとに違う。スマホでは日本語の声が無いこともある
- 音声合成で、場面の文を前もって音声ファイルにしておき、どの端末でも同じ声・同じ読みで鳴らす
- ブラウザの声は、声の選択欄に残す
根拠は調査資料 p261010-01。実機で確かめたのは VOICEVOX だけ(1 文を合成でき、合成の前に句ごとの時刻が取れた)。
方針
- 音声は前もって作り、作品と一緒に置く(調査資料の型 1)。見る人の操作のたびにサービスへ問い合わせない。鍵も常駐のサーバーも要らず、GitHub Pages に置ける
- 作るのは文ごと。台本は 1 場面に 1〜3 文あり、いまの読み上げは文ごとに読み、文の終わりで次の文へ進み、最後の文のあとで次の場面へ進む。一時停止は止めた文を頭から読み直す。この作りを変えない
- 読みは
story.js の read を使う。字幕と読みを分けるしくみ(「にっぽんいち」等)をそのまま使う
- 生成は手元のスクリプトで行う(
tools/20_build/)。エンジンは作るときだけ起動する。台本を直したら、変わった文だけを作り直す
- 声ごとに、フォルダと表示名を持つ。声を足すときは、声の一覧に 1 件足すだけにする
- 鳴らすのは
<audio>。Web Audio の無いブラウザ(Windows 版の WebKit 等)でも鳴る。BGM を下げる・一時停止は、いまのしくみに合わせる
利用者が決めたこと
使う声
- VOICEVOX の ずんだもんと四国めたんを足す(試した結果で採否を決める)
- AivisSpeech のまおとコハクも声の一覧に足す(同じ文で聞き比べ、OK と判断済み)
- クラウド(Azure 等)は使わない。外部サービスに文を送らず、計画 p261004-01 の「外部サービスを使わない」を保つ
先頭に「費用: 種類: 作り方:」を置き、名前を最後にする。
| 声 | 表示 |
| ブラウザの内蔵の声 | 無料: 内蔵: 動的生成: 声の名前 |
| ブラウザのネットの声 | 無料: ネット: 動的生成: 声の名前 |
| VOICEVOX | 無料: wav 6MB: VOICEVOX: ずんだもん / 無料: wav 5MB: VOICEVOX: 四国めたん(「事前生成」の代わりに、形式とその声の音声の合計の大きさを出す。大きさは make-voice が数える) |
| AivisSpeech | 無料: wav 11MB: AivisSpeech: まお / 無料: wav 11MB: AivisSpeech: コハク |
- 権利表記は、選択欄の右に別のラベルを出さず、選択欄の文言(規約が示す書き方に近い「VOICEVOX: ずんだもん」、AivisSpeech も同じ形の「AivisSpeech: まお」など。コロンの後に空白を入れるのは利用者の指示で、規約の例(空白なし)とは少し違う)で示す(利用者の判断。2026-10-11。はじめは VOICEVOX のときだけ別ラベルを出す案だった)
- まだ何も選んでいないときの声は、事前生成のずんだもん(2026-10-11)。ブラウザの声を選んだ人は、開き直してもそのまま
- 操作は 1 列に並べる: 音(スイッチ形のボタン)・表紙へ・前・ページ・次・一時停止・読み上げ(同じ形のボタン)・声の選択欄。狭い画面では折り返す(2026-10-11)
- AivisSpeech(まお・コハク)は、ACML 1.0 でクレジットは任意。商用利用・公開も、禁止事項に当たらなければ可(2026-10-11 に読んだ)
決めること
決定 2026-10-11 に利用者が 36-A・37-A・38-A を選んだ。以下は選択肢の記録
36. 字幕の色を進める単位
- 36-A(推奨) 句(「、」「。」)ごとに進める。音声を作るときに、句の終わりの時刻を一緒に控え、再生の位置で色を進める。時刻の取り方は声で分ける。VOICEVOX は読みの情報から(合成の前に取れ、0.01〜0.06 秒の差で合った)。AivisSpeech は句ごとに別々に合成してつなぐ(読みの情報の長さが 0 で、WAV の無音からは 27 文中 1〜3 文で句の数が合わなかった。つなぎ目なら確実に分かるが、抑揚が句の境目で途切れるかは聞いて決める)。いまの見え方(15-A)を保てる
- 36-B 文ごとに進める。作りは簡単になるが、長い文では色が動かない時間が長くなる
37. 音声ファイルが読めないとき
- 37-A(推奨) ブラウザの声に替えて読み続ける。音が出ない状態を作らない
- 37-B 字幕だけで進める。声の取り違えは起きないが、無音になる
38. 音声ファイルの形式
- 38-A(推奨) 合成した WAV のまま置く。表示の「wav 6MB」のように、形式と大きさを出せる。道具が増えない。全 15 場面で、VOICEVOX は 1 声 5〜6 MB、AivisSpeech は 1 声 10〜11 MB(4 声で約 32 MB。実測)。選んだ声だけを読み込むので、初回は 5〜11 MB
- 38-B mp3 に変えて置く。およそ 1 割になる見込み(未計測)で、スマホの通信に軽い。変換に ffmpeg を入れる必要があり(PC に無い)、表示は別の声として「wav➡mp3 99MB」の形で足す(wav は置き換えない)。選ばなかった案で、次の計画で扱う
段階
段階ごとに利用者の確認を取ってから次へ進む。
段階 1: 作って聞き、測る(ほぼ済)
- ✅ 声 ID の確認: ずんだもん(ノーマル)3、四国めたん(ノーマル)2、まお(ノーマル)888753760、コハク(ノーマル)1878365376
- ✅ 4 声で全 15 場面を作り、時間(1 声 40〜60 秒)と大きさ(38 の判断)を測った。結果は調査資料
- ✅ 句の区切りの時刻: VOICEVOX は読みの情報から取れる。WAV の無音から取る方法は、全 27 文のうち 1〜6 文で句の数が合わず、当てにならない(結果は調査資料)
- ✅ AivisSpeech は、句ごとに別々に合成してつなぐと境目が確実に分かる(まお・コハクの 2 文で確認)。
tmp/voice-phrasewise/ の音声を聞き、抑揚の途切れが許せるかを決める
- ✅ まお・コハクの規約: AivisHub のモデルのページと ACML 1.0 の本文を読んだ(クレジットは任意、表記は「AivisSpeech: 名前」)。ずんだもん・四国めたんは、VOICEVOX 同梱の規約(policy.md)と zunko.jp の規約ページで確認した。「VOICEVOX:名前」のクレジットを記載すれば商用・非商用で使える。動画なら説明欄、アプリなら紹介画面など、見た人が気づける場所に書く。クレジットを出さない商用利用は有料契約が要る。禁止事項は、公序良俗に反する利用、政治・宗教活動、特定の個人・団体への非難、情報商材、虚偽の拡散など。表示は、規約が示す「VOICEVOX:名前」の書き方に揃え、AivisSpeech も同じ形にした(利用者の指示。2026-10-11)
- 作った音声は
tmp/voice-trial/ に置いてある。聞いて、読み違いがあれば read を直す
段階 2: 生成スクリプト(着手)
tools/20_build/make-voice(同名の cmd ランチャー付き)で、全場面の文を声ごとに WAV にし、src/works/01-momotaro/voice/<声>/ へ置く。エンジンの宛先(ポート)と声 ID は引数で渡す
- 文と音声の対応、句の終わりの時刻、声の表示名(権利表記を兼ねる)を、一覧のファイル(
voice.js)に書き出す。<script src> で読めるようにし、ファイルを直接開いても動く形にする
- 文の中身から名前を決め、変わった文だけを作り直す
- 読み間違いは、全声共通の
read(story.js)で直す。AivisSpeech だけの読み間違いは、tools/20_build/voice-fix.ts の表で、エンジンに渡す句の文字だけを替える(句の数が変わらないので、字幕の色の進みに影響しない)。例: 「荒らしては宝物を」に間(読点)を足す(2026-10-11)
- 読みの確認:
tools/20_build/list-voice-reading.ts が、エンジンが返す「このかなで読む」という情報を、全文の分だけ一覧にする。音声を作る前に、読み間違いを目で見つける(2026-10-11 に全 27 文を見て、誤りは無かった)。音声の聞こえ方そのものは、聞いて確かめる
- 聞こえ方の確認:
tools/20_build/check-voice-asr.ts が、音声を共有ツールの transcribe(whisper.cpp)で書き起こし、台本の読みとかなで比べる。違いが出た分のうち、漢字の読み違い(「宝物」→ホウモツ 等)は書き起こし側の都合として除き、残りを人が聞く。2026-10-11 に全 108 本を確かめ、人が聞いた 19 本のうち 2 本を作り直した
- AivisSpeech は、同じ文でも合成のたびに少し違う音声になる。聞き取りにくい音声は、文字を替えずに作り直すだけで直ることがある(まお 4-2「おじいさん」)。声ごとの直しは
voice-fix.ts の 3 つ目に声の key を書く(コハク 8-1「わたしが、鬼を」)
- テスト(
tests/momotaro.spec.ts)が、一覧・音声ファイル・台本の食い違いを見つける(音声の有無、句の数、長さ、今の読みで作られているか)。read を直して音声を作り直し忘れると落ちる
段階 3: 紙芝居で鳴らし、声の選択欄を直す(実装済み・利用者の確認待ち)
実装: src/engine/recorded.js(音声の再生)、player.js(操作の並び・選択欄・読めないときのブラウザの声への切り替え)、voice.js(一覧)。テストは tests/momotaro.spec.ts に足した。利用者が通しで聞き、4 声が聞こえること・句ごとの色の進みを確かめた(2026-10-11)。ブラウザのネットの声(Google 日本語など)は、読んだ位置の合図が来ないため、字幕の強調が 1 句目で止まった。合図が来ない間は、文字数(1 文字 150 ミリ秒)から句の終わりを見積もって進める。そのあと、操作の並びを 1 列にし、スイッチ形のボタンにし、権利表記の別ラベルをやめ、既定の声をずんだもんにした
src/engine/ に、作った音声を鳴らす読み上げを足す。いまの speech.js と同じ使い方(文を読む・句の位置を知らせる・止める)にそろえ、player.js はどちらの声でも同じに扱う
- 声の選択欄を、決めた表示の形に替える。権利表記は、選択欄の文言で示す
- BGM を下げる・一時停止(i261008-01)・音のオン・オフと合わせる
- テストを足す(作った音声で文が進む・句の色が進む・一時停止で止まる・読めないときの動き・選択欄の文言に権利表記が入る・既定の声はずんだもん・操作の並び)
前提と確かめること
- VOICEVOX は
C:\Tools\VOICEVOX に展開済み(0.25.2)。起動しても試す間だけにする。エディタに足した古いエンジン(VOICEVOX Nemo Engine 0.24.0)は、利用者の指示で削除した(2026-10-11)。エディタの一時フォルダ(約 6 GB)も、不要なため削除した
- AivisSpeech は
C:\Tools\AivisSpeech に展開済み(1.1.0-dev)。初回の合成はモデルの読み込みで約 8 秒かかり、以降は 2〜4 秒(調査資料)
- ffmpeg は PC に入っていない。mp3 にするのは、この計画の次の計画で行う(利用者の方針。2026-10-11)。表示は「wav」(小文字)とする。mp3 は別の声として足し、表示は「無料: wav➡mp3 99MB: 声の名前」の形(wav から変換した mp3 で、大きさは mp3 の合計)にしたい(利用者の希望。2026-10-11)
- 生成した音声を公開ページに置いてよいかは、各声の規約で確かめる。クレジットは声ごとに文言が違う
- 動画(p261004-01 の段階 3)を作るときも、同じ音声ファイルを使える