FX INTRODUCTION / 17
フォルマント音声:ボコーダー風の響き
共鳴する帯域をLFOで動かし、鳴り続ける電子音を、しゃべるような、ロボットのような響きにします。分析・合成型ボコーダーではなく、フォルマントフィルターの実験です。
1. まず聴いてみる
Runすると、一定の音程の矩形波に、動く母音フィルターがかかります。LFOが3つのフォルマントを一緒に動かします。旋律を動かさずに、音色が変わる様子を聴いてみましょう。
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. LFOで声の響きを動かす
LFOは、制御信号として使うゆっくりした周期的な発振です。この例ではLFOそのものを音に混ぜません。lfoHz: 0.8は1秒に0.8周期、つまり1周期1.25秒です。実時間の秒を使い、setBpm()には追従しません。
lfoDepth: 0.3の単位はオクターブです。両端では各フォルマントの目標周波数を2 ** 0.3倍、または2 ** -0.3倍します。入力音源の周波数は変えません。F1、F2、F3に同じ倍率をかけ、transitionMsでフィルターの移動を平滑化します。
lfoDepth: 0で、動かない母音を聴きます。比較中はautoVowels: falseにしておくと、自動の母音切り替えが混ざりません。lfoHz: 0.2、0.8、2で、同じ動きの速さを比べます。lfoDepth: 0.1、0.3、0.6を比べます。幅を大きくすると、声のような変化が強調されます。vowelを0から3に変え、mix: 0.5と1も比較します。
一般的なボコーダーとの違い
一般的なチャンネルボコーダーは、マイクなどの変調側の音を複数の帯域に分け、各帯域の音量変化を別のキャリア音へ適用します。この例は入力が1つで、マイクや変調音の分析、帯域ごとのエンベロープ検出はありません。共鳴の位置を数値とLFOで指定しています。
「ボコーダー風」は電子的な声の印象を表す言葉で、処理方式が同じという意味ではありません。LPCチップのエミュレーション、音声認識、言葉を話す音声合成でもありません。
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-voiceを選びます。青が入力、オレンジが出力です。View → Spectrumで強調される周波数帯を、Oscilloscopeで波形の形を比較します。
波形の高さを比較するときはYを固定します。入力と出力は同じ表示スケールです。Spectrumでは倍音ピークの全体の形を見てください。ピークは入力音源の倍音付近に立ち、F1、F2、F3の中心と完全に一致するとは限りません。フィルターは既存の成分を強調するもので、各フォルマントに新しい発振器を追加する処理ではありません。
Monitorは短い時間の観測です。毎フレーム3つの山が独立して見えるとは限らないので、数周期の動きと音を合わせて確認します。音源の後段で動くため、このPlaygroundに追加したほかの音にも同じFXがかかります。
合成した母音の響きを楽しむ実験です。LPCハードウェアの再現、音声認識、子音の生成、自然な話し声の再現を目的にはしていません。聞き取りやすさは音源・音程・再生機器・聴く人でも変わります。無理のない音量で比べてください。