自分の声を複製して、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 89BPM 111
×1.35BPM 120BPM 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への倍率は実際に作った音を測って補正する
  • 参照音声のテンポは合成音に転写されない。声質だけが引き継がれる

→ 検証ページ(波形・ビート・ズレの実測)