ボイスとフォルマント
声をうまく変えるとは、素朴なピッチシフトが一緒くたにしてしまう 2 つを分けることです — 歌っている音と、声のキャラクターです。そのキャラクターはフォルマントに宿ります。本ページはボイス編集を libsonare の VoiceChanger と FormantWarp に根拠づけます。用語は 編集の基礎 を読んでください。
フォルマントとは
フォルマントは、固定された周波数帯に現れるエネルギーのピークです。声では、口・喉・鼻腔といった声道の共鳴から生まれます。
フォルマントは主に 2 つを決めます。
| フォルマントが影響するもの | 例 |
|---|---|
| 母音の違い | 「イ」と「オ」の違い |
| 声のキャラクター | 小さい/大きい、明るい/暗いといった印象 |
重要なのは、フォルマントが歌う音に関係なく、およそ同じ周波数帯に位置することです。ソプラノとバスが同じ母音を歌うと、ピッチは大きく違っても、フォルマントは似た領域に置かれます。
別の言い方をすると、ピッチは「どの音か」を、フォルマントは「誰の声か・どんな母音か」を担います。鍵盤で違う音を弾いても楽器の音色が変わらないのと同じで、人が違う音高で歌っても、声道の形が生むキャラクターはおおむね保たれます。この 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 });この逆数より大きい値は声を明るく小さく、小さい値は声を暗く大きく聞かせます。
上のピッチシフトと比べてみてください。あちらでは倍音の櫛(歌った音の上に等間隔で並ぶ倍音の列)がスライドしてフォルマントも一緒に動きますが、こちらでは櫛と基音(そのうち最も低く、音程を決める周波数)は止まったまま、包絡(その倍音列の上に乗るフォルマントの形)だけが動きます。これが voiceChange の公開する 2 つの独立した軸です。
libsonare が声をどう変えるか
voiceChange は pitchSemitones と formantFactor を別々の引数として取り、この順に 2 段階で適用します。ピッチ段は タイムストレッチとピッチシフト のフェーズボコーダ/リサンプリングバックエンドを再利用しますが、そのリサンプリングはスペクトル包絡を含めた全体をスケールします。続くフォルマント段 FormantWarp(FormantWarpConfig)は、シフト済み信号を LPC で分析し、その包絡だけを周波数軸方向に formantFactor でリサンプルするので、倍音構造すなわち音程には手を触れません。係数がちょうど 1.0 のときはこの段自体を飛ばすため、ピッチだけを変える場合に LPC の往復処理は入りません。係数を下げると包絡が下がって声は大きく暗く、上げると包絡が上がって小さく明るくなります。他の編集ヘルパーと同様、デコード済みのモノラルサンプルに作用します。