自分の声を複製して、BPM120のビートに乗せる — TTSで講義音声を作る実験
動画のナレーションを自分で録ると、毎回テンポが違う。「えー」「あー」が入る。言い間違えて録り直す。切り貼りの手間もかかる。話す内容は撮影前から決まっているのだから、読み上げは機械にやらせたほうが早いのではないか。
そう考えて、自分の声を複製し、文と文の間をBPM120のビートグリッドに揃えるところまでやってみた。触って確かめられるページも作ってある。
なぜ BPM 120 なのか
きっかけは、お笑い芸人が「BPM120でやるといい」と話していたという又聞きだった。その発言の出典は探したが見つからなかったので、ここでは確認できた事実だけを並べる。
BPM 120 は「人が歩くテンポ」である。 行進曲の標準速度がここに置かれていて、マーチテンポ(音楽用語)によれば、軍隊の行進は1分間におよそ120歩を基準としてきた。ウォーキングとテンポの関係でも、心地よく歩けるのは110〜120あたりとされる。人間の身体が持っているテンポということになる。
一方、日本語の読み上げの目安は「1分間300字」が広く使われている。話し方教室の解説によれば、NHKのアナウンサーが1分間300文字を基準にしていて、番組制作の共通認識になっているという。
この2つを同じ物差しに乗せると、こうなる。日本語の話速をBPMに換算するときは「1モーラ=16分音符」とするのが通例で、BPM = モーラ毎分 ÷ 4 で計算できる。
| 話速 | 相当BPM | |
|---|---|---|
| NHKのニュース読み(300字/分) | 382モーラ/分 | 95 |
| BPM120 に合わせた場合 | 480モーラ/分 | 120 |
BPM120 はニュース読みより26%速い。 ゆっくり噛んで含めるテンポではなく、教育系の動画やショート動画で使われる速さに近い。芸人の話が本当だとすれば、「間を持たせない、聞き手を待たせない速さ」という意味だったのだろうと思う。
実験したこと
自分の声を4本・約38秒録音し、それを参照音声にして日本語特化の音声合成モデル(Irodori-TTS)で12文のナレーションを作った。合成そのものは手元のMacで完結していて、インターネットには出ていない。
そのうえで、文の配置を音楽のグリッドに乗せた。句点のあとは1小節(BPM120で2.0秒)のグリッドに置き、文の頭が必ず小節の頭から始まるようにする。こうすると、4つ打ちのキックと文頭が毎回一致する。
検証ページでは、話速(BPM120/130/140)とグリッド(1小節・2拍・1拍)を切り替えながら、ビートを重ねて聴き比べられる。波形の上に小節線と拍線を引いてあり、文の立ち上がりがどれだけズレているかをミリ秒で表示する。
見つかった落とし穴
配置の計算は最初から合っていた。にもかかわらず、耳では毎回わずかに遅れて聞こえる。原因は3つあった。いずれも「合成音の無音」が犯人だった。
1. 先頭の無音で、全文が遅れる
合成音の頭には0.28秒ほどの無音が入る。グリッド線にファイルの先頭を合わせると、声が出るのはその0.28秒後になる。実測すると平均451ms・最大784msの遅れがあった。8分音符1つぶんに相当するので、音楽に重ねれば確実に聞こえる。
先頭の無音ぶんだけクリップを前へずらすと、平均0ms・最大0msになった。
2. 末尾の無音で、間が2秒伸びる
こちらのほうが厄介だった。ある文の直後だけ、明らかに間延びして聞こえる箇所があった。調べると、その文はグリッド線をわずか10ミリ秒だけ超えて終わっていた。グリッド配置は「次の線から始める」ので、次の線まで丸ごと2秒待つことになる。
そして10ミリ秒の超過を作っていたのは、その文の末尾についていた0.39秒の無音だった。声そのものは線の手前で終わっていたのに、無音まで長さに数えていたために線を越えてしまっていた。
前後どちらの無音も除いて配置するよう直すと、この箇所の間は1.99秒から0.65秒になり、全体も55.0秒から47.0秒に縮んだ。
3. 話速の測り方を間違えると、2割ずれる
これが一番の間違いだった。 話速を「ファイル全体の秒数」で割って計算していたため、1文あたり0.6秒の無音(12文で約11秒)が分母に混ざり、実態より2割遅く見えていた。
その結果「BPM120にするには×1.35が必要」と判断したのだが、正しく声だけで測ると×1.35はBPM149だった。速すぎて当然である。
| 誤(無音込み) | 正(声だけ) | |
|---|---|---|
| 素のまま | BPM 89 | BPM 111 |
| ×1.35 | BPM 120 | BPM 149 |
正しく測ると、素のままで既にBPM111あった。BPM120に必要な倍率は、×1.089 にすぎない。
なお倍率は一度の計算では合わない。速度変換とmp3化を通すと無音の境目がわずかに動くため、480 ÷ 実測 で出した倍率でも0.4%ずれた。実際に作った音を測って倍率を補正する処理を入れて、実測BPM120.2まで追い込んでいる。
参照音声のテンポは、合成音に転写されない
「クリックを聞きながら参照音声を録れば、リズムがそのまま合成音に乗るのではないか」という発想が出たので、これも測った。
| 話速 | BPM | |
|---|---|---|
| 録音した参照音声 | 485モーラ/分 | 121.2 |
| そこから作った合成音 | 443モーラ/分 | 110.7 |
偶然ほぼBPM120で読んでいたのに、合成音は約9%遅くなっている。 このモデルは文の長さを自分で予測する仕組みを持っていて、参照音声から受け取るのは主に声質、テンポはモデル側の判断が優先されるらしい。
つまり参照音声をメトロノームに合わせて録っても、狙ったテンポでは出てこない。ただし出発点が近いほど、後段の速度調整が小さくて済むという意味はある。速度変換は倍率が大きいほど不自然になるので、そこは効く。
拍にきっちり乗せたいなら、合成を挟まず自分でクリックを聞きながら録るほうが確実になる。その場合はイヤホン必須で、スピーカーで流すとクリックがマイクに回り込む。
この方式が実務で楽な理由
動画で話す内容は撮影前に決まっていることが多い。決めてから喋るなら、次の手間がまるごと消える。
- 言い間違えても、テキストを直して作り直すだけ。録り直しがいらない
- 「えー」「あー」が入らない。フィラーの除去が不要になる
- 文の切れ目が最初からビートに乗っている。編集で詰めたり伸ばしたりする作業がいらない
- BGMを重ねるだけで成立する。文頭とキックが揃っているので、合わせ込みが要らない
最後の点が思ったより大きい。間の設計を先に数値で決めてしまえば、音楽との同期は後工程ではなく前提条件になる。切り貼りで合わせるのではなく、最初から合っているものが出てくる。
まとめ
- BPM120 は人が歩くテンポで、行進曲の標準。日本語の読み上げに当てるとニュース読みより26%速い
- 文の間をグリッドに乗せると、文頭が毎回キックの1拍目に一致する
- 合成音の前後の無音を配置計算から除くこと。これを外すと、遅れと間延びの両方が起きる
- 話速は声だけの秒数で測ること。ファイル長で測ると2割ずれる
- 目標BPMへの倍率は実際に作った音を測って補正する
- 参照音声のテンポは合成音に転写されない。声質だけが引き継がれる