背景
歌詞やメロディから動画を生成するSoramimic Videoで、VOICEVOXの歌声合成を使っています。VOICEVOXはライセンス面で利用しやすく、環境構築も簡単で、歌声の品質も気に入っています。
一方、実際にいろいろな曲を歌わせると、音域によって音程が外れたり、苦しそうに聞こえたりします。そこで、まずは曲全体をオクターブ単位で移調し、なるべく歌いやすい音域に収めています。それでも、曲の最高音と最低音の幅が広いと、一部の音符がはみ出します。
これまでは、はみ出した音符のF0(声の基本周波数)を補正していました。しかし、音程を合わせるだけでは、発声のかすれや不自然さが残ることがありました。
そこでPrettyPitchを試してみました。PrettyPitchはwavtechyukkyさんが2026年9月22日に公開した、音程の抑揚やビブラートを生成するモデルです。実際の歌声合成では音響モデルのLeapSingerとボコーダのNHVSingを組み合わせます。以下では、この組み合わせを「PrettyPitch」と呼びます。
PrettyPitchでは、VOICEVOXでも使っている波音リツを選べます。同じ波音リツを由来とする歌声でも、合成モデルと出力される声質は異なります。筆者は基本的にはVOICEVOXの歌声が好みだったため、VOICEVOXを中心に使い、苦手音域を含む部分だけPrettyPitchで補うことにしました。
比較条件
音域の基準とF0補正
今回の実装では、VOICEVOXの歌の先生スタイルについて、MIDIノート番号54〜78(F♯3〜F♯5)を得意音域の目安にしています。これはアプリ側で実測をもとに設けた基準で、VOICEVOXの全キャラクターに共通する公式の推奨音域ではありません。
比較の基準となるF0補正は、次の処理です。
- 音域外の音符について、有声区間のF0の中央値を求める。
- 指定音高とのずれが1半音以上あるとき、中央値が指定音高に合う倍率をF0に掛ける。
- 無声音の0 Hzは維持し、音符の端では補正量をなだらかに変える。
PrettyPitchに任せる範囲
F0補正だけの場合と、PrettyPitchで置き換える範囲を変えた3方式を比べました。
| 方式 | PrettyPitchに任せる範囲 |
|---|---|
| VOICEVOX+F0補正 | 全体をVOICEVOXで合成する |
| 音符単位 | 得意音域をはみ出す音符だけ。連続する対象音はまとめる |
| 前後1音 | 対象音符に前後1音を加える。120 ms以上の休符は越えない |
| フレーズ単位 | 120 ms以上の休符で区切り、音域外の音符を含むフレーズ全体を任せる |
音符単位の場合も、PrettyPitchには前後約0.6秒の音符を渡しています。前後関係を含めて生成する範囲と、完成音声に採用する範囲を分けています。
フレーズ単位では、休符内に切り替え位置を置き、前後の余白を最大150 msまで取ります。
PrettyPitchを使う3方式とも、境界は20 msのクロスフェードで接続し、両エンジンの音量も合わせました。
使用した曲と設定
比較曲はEveの「廻廻奇譚」です。理由は開発中にf0補正の限界を感じたのがこの曲だったからです。高音が続き、オクターブ調整後も音域外の音符が多く残ります。この曲では、音域内に入る音符数を優先した結果、オクターブ移調量は0半音になっています。
| 項目 | 条件 |
|---|---|
| 比較対象の長さ | 約223.9秒 |
| 推定音符の音域 | MIDI 53〜86 |
| 音域外の音符 | 174音、合計約34.3秒 |
| 歌声 | 波音リツ(VOICEVOX:スタイル6000、PrettyPitch:話者2・スタイル0) |
| PrettyPitchの設定 | seed 0、抑揚・ビブラートとも倍率1.0 |
聴き比べ
高音が続く約0:56〜1:11を、歌声だけで切り出しました。同じ音量係数を使い、PrettyPitchの3方式には共通の合成波形を使っています。
VOICEVOX+F0補正
PrettyPitch:音域外の音符だけ
PrettyPitch:前後1音も含める
PrettyPitch:フレーズ単位
筆者の聴感では、PrettyPitchを使った3方式はどれも、F0補正だけの場合より高音の苦しそうな感じが改善しました。その中では、フレーズ単位が最も自然に聞こえました。
曲全体での置き換え範囲は次のとおりです。
| 方式 | 置き換え区間数 | 置き換える長さ |
|---|---|---|
| 音符単位 | 62 | 34.3秒 |
| 前後1音 | 38 | 48.6秒 |
| フレーズ単位 | 13 | 87.0秒 |
フレーズ単位では、得意音域内の音符もPrettyPitchに任せることになります。VOICEVOXの声を残す範囲との交換条件ですが、今回の曲では、切り替えの少なさを優先するほうが筆者の好みに合いました。
低音側:女々しくて
「廻廻奇譚」は高音側の補正が主だったので、低音側の検証として、ゴールデンボンバーの「女々しくて」で、高音側と同じ4条件を比較しました。約0:17〜0:31の歌声を切り出し、同じ音量係数でそろえています。
VOICEVOX+F0補正
PrettyPitch:音域外の音符だけ
PrettyPitch:前後1音も含める
PrettyPitch:フレーズ単位
筆者の聴感では、こちらもフレーズ単位が最もよく聞こえました。
処理時間
約224秒の「廻廻奇譚」で、VOICEVOXとPrettyPitchを併用する3方式の合成時間を比べました。Ryzen 7 5700X・RTX 4060 Ti 16 GBの環境で、VOICEVOXはGPU版、PrettyPitchはCPU・4スレッドです。モデル読み込みと初回ウォームアップを除く各3回の中央値を使い、合計は両エンジンを順番に動かす場合の時間を足しています。
| 方式 | VOICEVOX | PrettyPitch | 合計 |
|---|---|---|---|
| 音符単位 | 7.7秒 | 11.3秒 | 19.0秒 |
| 前後1音 | 6.3秒 | 11.3秒 | 17.6秒 |
| フレーズ単位 | 4.9秒 | 15.1秒 | 20.0秒 |
PrettyPitchに任せる部分では、接続用の余白を残してVOICEVOXの波形生成を省いています。フレーズ単位はPrettyPitchの生成範囲が広がる一方、VOICEVOXの生成範囲を減らせるため、合計時間の増加はほかの2方式に対して最大約2.4秒に収まりました。実アプリケーションで他の時間がかかる処理とも組み合わせることを考えると、聴感の改善を優先できる時間差と判断しました。
2026/10/21追記:開発者の方より、PrettyPitchをGPUで高速化する方法をご教示いただきました。この方法でGPUを使ったところ、合計時間の目安もフレーズ単位が最短となりました。(末尾に詳細追記)
フレーズ単位を採用
今回の比較では、F0補正だけに比べてPrettyPitchを使ったほうが、高音部分の歌唱が好みに近づきました。PrettyPitch同士では、フレーズ単位でまとめる方法が最も自然に聞こえたため、Soramimic Videoに採用しました。
使用モデルとクレジット
歌声:VOICEVOX・PrettyPitch:波音リツ(カノン)
PrettyPitchのコードのMITライセンスと、配布モデル・ボコーダの利用条件は別です。本記事の比較は個人・非商用で行っています。モデル利用時はPrettyPitchの利用条件と第三者の権利・利用条件を確認してください。
比較楽曲:廻廻奇譚(作詞・作曲:Eve)。女々しくて(ゴールデンボンバー)。
追記: prettypitchをGPUで高速化(2026/10/21)
記事執筆当時は、PrettyPitchをGPUで動かしても十分な高速化が得られなかったため、上記の比較ではPrettyPitchをCPUで実行していました。その後、開発者の方から、PyTorch版でGPU実行すると高速化できると情報提供をいただきました。
実際に試したところ、かなり高速化されました。同じ「廻廻奇譚」の入力で、初回ウォームアップを除く3回の中央値を取ると、PrettyPitch担当部分の合成時間は、音符単位・前後1音で約1.6秒、フレーズ単位で約1.7秒でした。
今回は、NHVSingの波形生成をONNX版からPyTorch版に切り替え、GPU上で実行しています。この合成プロセスのVRAM使用量の観測ピークは約0.53 GiBでした。
別計測のVOICEVOXの値と合算した目安では、音符単位が約9.3秒、前後1音が約7.9秒、フレーズ単位が約6.6秒となります。フレーズ単位ではVOICEVOXの生成範囲を減らせるため、この条件では合計時間も最短になる計算です。この程度のVRAM使用量を許容できる環境であれば、聴感に加えて速度の面でも、フレーズ単位を選びやすくなりました。