FX INTRODUCTION / 16
フォルマント母音:「あいうえお」を作る
倍音を含む音の、いくつかの周波数帯を強調すると、母音のような響きになります。liveFxで小さなフォルマントフィルターを作り、5つの母音の間を滑らかにつなぎます。
1. まず聴いてみる
Runすると、130 HzのSega PSG矩形波が鳴り続けます。フィルターは「あ → い → う → え → お」と変わります。音源の音程はそのままで、共鳴の形だけが動きます。
iframe内のRunで再生、Stopで停止します。再生中にコードを編集したら、もう一度Runすると更新が反映されます。同じliveFx名ならフィルターの状態を保持します。最初から比較したい場合はStopしてからRunしてください。ほかのPlaygroundはStopしてから聴き比べます。
2. 声には「音源」と「共鳴の形」がある
声帯の振動が音源になり、声道が特定の周波数帯を強調します。この幅のある共鳴帯域をフォルマントと呼びます。電子音にもフィルターで似た形を与えられます。ただし、人間の声道そのものを再現しているわけではありません。
倍音を含む入力音
↘ バンドパス F1 ↗
→ バンドパス F2 → 重み付き加算 → 原音/加工音のMix → 出力
↗ バンドパス F3 ↘
3つのフィルターは、同じ入力を並列に受け取ります。その出力を加算します。F1、F2、F3の順に直列で通す処理ではありません。
| フォルマント | 最初の理解の目安 |
|---|---|
| F1 | 母音の開きと関係します。開いた母音ほど高くなる傾向があります。 |
| F2 | 舌の前後位置と関係します。前寄りの母音ほど高くなる傾向があります。 |
| F3 | 母音や声の響きをさらに特徴づけます。独立した身体のつまみに対応するわけではありません。 |
実際の値は話者や発声で変わります。以下は実験用の目標値で、日本語の母音に共通する唯一の数値ではありません。背景はOxfordの音響音声学入門資料(音源・フィルターと母音、英語)を参照できます。
| 母音/番号 | F1(Hz) | F2(Hz) | F3(Hz) |
|---|---|---|---|
| あ/0 | 800 | 1200 | 2500 |
| い/1 | 300 | 2300 | 3000 |
| う/2 | 350 | 1200 | 2500 |
| え/3 | 500 | 1900 | 2600 |
| お/4 | 500 | 900 | 2400 |
3. コードの設定を読む
| 設定 | 意味/単位 |
|---|---|
| vowel | 0〜4の母音番号。0.5などの小数で隣の母音との中間も指定可能 |
| autoVowels | trueなら母音の目標を自動で切り替える |
| vowelSeconds | 次の母音へ進む間隔(実時間の秒) |
| transitionMs | パラメーターの変化をならす時間尺度(ミリ秒) |
| lfoHz / lfoDepth | LFOの周期数/秒と、共鳴周波数を動かす幅(オクターブ) |
| gain / mix | 加工音の倍率/加工音を混ぜる割合(0〜1) |
| formants | 母音ごとの[F1, F2, F3](Hz)の表 |
| bandwidths / levels | 3帯域それぞれの幅(Hz)/混ぜる重み |
contextは音声処理へ渡す設定、stateは次回の処理へ残す履歴です。これらの母音設定は今回のサンプルが定義する名前で、組み込みFXの追加APIではありません。liveFxのcontextにある数値と、processで入力を加工する箇所を見比べてください。再生中に同名のコードをRunすると、変更した設定が音声処理へ渡されます。
4. 母音を切り替えて、間をつなぐ
vowelは番号です。0 = あ、1 = い、2 = う、3 = え、4 = お。まずautoVowels: falseにして、番号を1つ選び、編集後にもう一度Runします。vowel: 0とvowel: 1を比べると、音源の音程を変えずにフィルターの目標だけが変わります。
autoVowels: trueに戻すと、vowelSeconds: 1.4秒ごとに次の目標へ進みます。音声ブロックをまたいで位置を保持し、境界でフィルターを初期化する代わりに、共鳴周波数を少しずつ移動します。1区間の前半60%で母音を保ち、後半40%で次の母音へつなぎます。
mix: 0で元の矩形波を聴き、mix: 1に戻して比べます。autoVowels: false、vowel: 0にし、formants先頭行のF1だけを800から600 Hzへ変えます。ほかの数値を固定して、1つの共鳴の効果を聴きます。- 固定した母音と自動切り替えを比較します。
vowelSeconds: 0.7や2.5も試します。 transitionMs: 20、60、200を比べます。長くすると、母音の響きがよりゆっくりつながります。- Spectrumで、倍音の間隔はほぼ同じまま、強くなる帯域が移動することを確認します。
母音らしい響きは、録音された声や音節とは別物です。これらの目標値は口の形を思わせる響きを作りますが、子音や言葉の発音は作りません。
5. フィルターを途切れずに動かす
process(input, output, state, context)はAudioWorkletの音声スレッドで動きます。input[ch]は左右などの音声チャンネルで、YM2612の演奏チャンネル番号ではありません。左右それぞれの3つのフィルター履歴をstateに保持し、制御位置は共通にして同じタイミングで動かします。
この例では台形積分方式の状態変数バンドパスフィルターを使い、AudioWorkletの実際のsampleRateから係数を計算します。同じ周波数設定を44.1 kHzと48 kHzで使えます。方式の詳細はCytomicの線形台形積分SVFの資料(英語)にあります。
音声ブロックや同名FXの更新をまたいで履歴を保ち、目標周波数・Gain・Mixの変更を平滑化します。transitionMsは移動の時間尺度で、単位はミリ秒です。設定範囲を制限し、有限でない計算結果を防ぎ、出力にも上限を設けます。それでもGainを大きくしすぎると音がつぶれるので、まずは初期値で試してください。
この実験には、加工するための倍音が必要です。サイン波は周波数成分が1つなので、母音の共鳴を十分に作れません。Sega PSGの矩形波には奇数次の倍音があります。標準クロックでの最低音は約109 Hzなので、入力音源は110〜260 Hz程度を目安に試してください。これは小さなチップ音源によるキャリアで、声帯振動の完全なモデルではありません。
6. FX Monitorで加工前後を比べる
RunしたらFX Monitorで対象にformant-vowelsを選びます。青が入力、オレンジが出力です。View → Spectrumで強調される周波数帯を、Oscilloscopeで波形の形を比較します。
波形の高さを比較するときはYを固定します。入力と出力は同じ表示スケールです。Spectrumでは倍音ピークの全体の形を見てください。ピークは入力音源の倍音付近に立ち、F1、F2、F3の中心と完全に一致するとは限りません。フィルターは既存の成分を強調するもので、各フォルマントに新しい発振器を追加する処理ではありません。
Monitorは短い時間の観測です。毎フレーム3つの山が独立して見えるとは限らないので、数周期の動きと音を合わせて確認します。音源の後段で動くため、このPlaygroundに追加したほかの音にも同じFXがかかります。
合成した母音の響きを楽しむ実験です。LPCハードウェアの再現、音声認識、子音の生成、自然な話し声の再現を目的にはしていません。聞き取りやすさは音源・音程・再生機器・聴く人でも変わります。無理のない音量で比べてください。