こんにちは!はちもりと申します。
VOICEVOX歌唱APIが好きなので記事を書きます。
以前こちらの記事で、VOICEVOX歌唱APIの仕様と、C++ライブラリ「Siv3D」で使う方法を書きました。
今回の記事の内容は、音域調整で「上手く」歌わせること です!
他の情報をお求めの方は、上記の記事も参考にしてみてください!👍
VOICEVOX ハミングの仕様
VOICEVOXの歌唱ライブラリには「ソング」と「ハミング」の2つがあります。
- 🎤キャラクターの歌声で歌う「ソング」
- 🎵キャラクターの喋り声で歌う「ハミング」
2025年7月現在、「ソング」が実装されているのは波音リツ(ノーマル)のみで、他の29キャラ(ずんだもん等)は「ハミング」です。
使い分けのイメージは、「歌えるソングキャラの歌い方を、ハミングキャラが真似して喋り声で歌う」 という方式です。
具体的に言うと、ハミングのキャラの歌唱音声合成のAPI利用時は、
はじめに「ソング」機能を持つキャラクターのIDでクエリを生成します。
そして、生成したクエリを歌わせたい「ハミング」キャラに渡して歌唱音声合成します。
詳しくはこちら
音域調整
前項の方式でハミングキャラに歌わせると、とある問題が発生します。
それは、「音域的に、真似して歌うことが難しい」 という場面です。
人間で例えると、「高い音域のソプラノ歌手の歌い方を、低い音域のテノール歌手が真似することは難しい」という話です。
「音域調整」を使うと、この問題を解決できます!
概要を3ステップで説明します👍
- テノール歌手が歌いたい低い音域の楽譜を、高い音域に移調して、ソプラノ歌手に渡す
- ソプラノ歌手が1の楽譜を見て歌い、そこでの歌い方のデータを低い音域に移調して、テノール歌手に渡す
- テノール歌手が2の歌い方のデータを見て、真似して歌う
※移調:ドの音を上にずらすとレになる。楽譜の全部の音符を上下にずらすことを移調(トランスポーズ)と言う
これによって、どちらの歌手も得意な音域で歌うことができ、綺麗な歌声が出力できます 🙌
VOICEVOX歌唱APIの用語を使って説明すると以下のようになります。
- ハミングキャラが歌いたい楽譜を、音域調整の値だけ移調して、ソングキャラに渡す
- ソングキャラが1の楽譜から、クエリを生成。(
sing_frame_audio_query
)
クエリを音域調整の値だけ逆方向に移調して、ハミングキャラに渡す - ハミングキャラが2のクエリを見て、真似して歌う(
frame_synthesis
)
(出典:https://github.com/VOICEVOX/voicevox/issues/1838#issuecomment-1938334133)
ソングキャラに比べて、得意な音域が低いキャラはマイナスの値、得意な音域が高いキャラはプラスの値を「音域調整量」として設定します。
その値をもとに、楽譜とクエリに対してキーシフトを行うということですね🎵
実装
VOICEVOXソフトウェアでは、音域調整の値がマジックナンバーとして埋め込まれていて、自動で入力されます。
歌唱APIを組み込んだアプリケーション開発でも、とりあえずこの値をデフォルトで設定すれば、綺麗な歌声を生成できると思います!
また、音域調整量がn
のときに、移調の実装は以下のようになります。
-
楽譜:各音符の
key
に±n
(半音数)を加える -
クエリ:
f0[]
の各値に2^(±n/12)
をかけてピッチを変換する
まとめ
音域調整は、それぞれのキャラの得意な音域に合わせられる仕組みです。
これを実装しなくても歌声合成自体はできますが、どのキャラにも「上手く」歌わせたい場合は実装が必須ですね😆
以上で終わります!ありがとうございました。