ボイスとフォルマント
声をうまく変えるには、単純なピッチシフトが一緒に動かしてしまう 2 つのもの、歌っている音と声のキャラクターを切り分ける必要があります。そのキャラクターを担っているのがフォルマントです。このページでは、ボイス編集を libsonare の VoiceChanger と FormantWarp に沿って説明します。用語は 編集の基礎 を参照してください。
フォルマントとは
フォルマントは、声のスペクトルに現れる共鳴のピークです。口・喉・鼻腔といった声道の共鳴から生まれるので、その周波数は発音している母音や話者の声道の大きさによって変わりますが、歌っている音高では変わりません。
フォルマントは主に 2 つを決めます。
| フォルマントが影響するもの | 例 |
|---|---|
| 母音の違い | 「イ」と「オ」の違い |
| 声のキャラクター | 小さい/大きい、明るい/暗いといった印象 |
重要なのは、フォルマントが歌う音に関係なく、おおむね同じ周波数帯に留まることです。ソプラノとバスが同じ母音を歌えば、ピッチは大きく違っても、フォルマントは似た領域に現れます。声道が短いほどフォルマントは高めになりますが、その差は成人の女声と男声でおおむね 15〜20% 程度です。
別の言い方をすると、ピッチは「どの音か」を、フォルマントは「誰の声か・どんな母音か」を担います。鍵盤で違う音を弾いても楽器の音色が変わらないのと同じで、人が違う音高で歌っても、声道の形が生むキャラクターはおおむね保たれます。この 2 つが独立しているからこそ、別々に動かす意味があります。
ピッチシフトだけでは不自然になる理由
単純なピッチシフトは、フォルマントを含めてすべてを上げます。声を数半音上げるとフォルマントも上がり、歌い手の体が縮んだように聞こえます。これが「チップマンク」効果です。下げれば逆に、不自然に巨大な声になります。ピッチとフォルマントは、もともと一緒に動くものではないからです。
ピッチとフォルマントを別コントロールに
良いボイス編集ツールは、2 つを独立したコントロールとして持っています。
- ピッチだけを変える → 同じ人物が高い/低い音を歌っているように聞こえる。
- フォルマントだけを変える → 同じピッチのまま、声が小さく明るく、または大きく暗く聞こえる。
- 両方を変える → 微妙なキャラクター調整から大胆なボイスデザインまで。
たとえば男声を女声らしく聞かせたいときは、ピッチを上げるだけでなくフォルマントも少し上げます。逆に、ピッチはそのままでフォルマントだけ下げると、同じ歌のまま声が太く落ち着いた印象になります。
2 つが別々のコントロールにあるからこそ、自然な移調(移調してからフォルマントを戻す)と、クリエイティブなボイスデザイン(フォルマントを自由に変形する)の両方が 1 つのツールでできます。ここでも、小さな変更は自然に、大きな変更は効果として聞こえます。
formantFactor はピッチシフトの上に積み重なる
voiceChange は先にピッチシフトを実行しますが、ピッチシフトはフォルマントを含めたスペクトル全体を動かします。FormantWarp はその移動済みの信号に対して働くため、formantFactor は移調がすでに生んだフォルマントの移動量にさらに掛かります。つまり formantFactor: 1.0 は「フォルマントを保つ」ではなく「フォルマントを追加で動かさない」という意味です。{ pitchSemitones: 5, formantFactor: 1.0 } は素のチップマンク効果で、フォルマントは 25/12(約 1.33 倍)だけ高いままになります。
フォルマントを元の位置に保ったまま移調したい場合は、ピッチ比の逆数を渡してください。
const pitchSemitones = 5;
const formantFactor = 2 ** (-pitchSemitones / 12); // +5 半音なら 0.749
const natural = voiceChange(vocal, sampleRate, { pitchSemitones, formantFactor });この逆数より大きい値は声を明るく小さく、小さい値は声を暗く大きく聞かせます。
計算を省くには formantMode: 'absolute' を渡します。formantFactor はピッチシフトにかかわらず入力に対するフォルマントの移動量になり、1 ならフォルマントは動きません。リアルタイムボイスチェンジャーにも同じモードがあり、こちらは作成時に固定されます(リアルタイムボイスチェンジャーを参照)。
上のピッチシフトと比べると違いが分かります。あちらでは倍音の櫛(歌った音の上に等間隔で並ぶ倍音の列)がスライドし、フォルマントも一緒に動きます。こちらでは櫛と基音(そのうち最も低く、音程を決める周波数)は止まったまま、包絡(倍音列の上に乗るフォルマントの形)だけが動きます。この 2 つが、voiceChange が持つ独立した 2 本の軸です。
libsonare が声をどう変えるか
voiceChange は pitchSemitones と formantFactor を別々の引数として取り、この順に 2 段階で適用します。ピッチ段は タイムストレッチとピッチシフト のフェーズボコーダ/リサンプリングバックエンドを再利用しますが、そのリサンプリングはスペクトル包絡を含めた全体をスケールします。続くフォルマント段 FormantWarp(FormantWarpConfig)は、シフト済み信号を LPC で分析し、その包絡だけを周波数軸方向に formantFactor でリサンプルするので、倍音構造すなわち音程には手を触れません。係数がちょうど 1.0 のときはこの段自体を飛ばすため、ピッチだけを変える場合に LPC の往復処理は入りません。係数を下げると包絡が下がって声は大きく暗く、上げると包絡が上がって小さく明るくなります。他の編集ヘルパーと同様、デコード済みのモノラルサンプルに作用します。