logue SDKでは、オシレータ、モジュレーション、ディレイ、リバーブを作ることができます。今回は、昨今のテレワークとWeb会議の流行を反映した(?)モジュレーションユニットとして作ってみた「teleconf」を紹介します。
teleconfは入力音声を「電話を通して聴くような」音に変換するエフェクタです。簡単にそのような効果を得るには音声通話の帯域(300Hz~3400Hz)を通すバンドパスフィルタを作ればいいので、エフェクタにするほどのことはないのですが、このエフェクタは固定電話で使われているG.711コーデックのA-lawを内蔵しているので、量子化ビット数の低減も行います。
デモは以下のビデオをご覧ください。スマホで再生した動画の音声をこのエフェクタを通して変換しています。Depthノブはdry(入力音声)とwet(エフェクト通過後の音声)の比率調整、Timeノブは高域の強調(実際にはLPFのレゾナンス)となっています。
ダウンロードは以下からできます。(NTS-1用、minilogue xd用)
ソースコードは以下に置いてあります。
boochow/teleconf: an effect which generates telephone-like sounds from inputs
先にこのエフェクタでエミュレートしようとしている電話音声について説明しておきます。
ここで電話音声と言っているのは、古くからある固定電話で使われている方式で得られる音声です。
電話音声で使われているコーデックは「G.711」としてITU-Tで標準化されています。このコーデックは、量子化ビット数14ビット、サンプリング周波数8KHzです。データは14ビットを8ビットに圧縮しますので、通信帯域は64Kbpsとなります。古くからのネットユーザの方はご記憶と思いますが、昔ISDNというサービスがあって、1チャネル64Kbpsでした。これはG.711のデータを通せる通信路ということで決まっていたのですね。
14ビットを8ビットに圧縮するアルゴリズムは、μ-lawとA-lawという二つの方式がありますが、基本的には1サンプル単位で入力データの対数を取るという考え方です。詳しくはWikipediaを参照してください。あまり圧縮率は高くないですが、その代わり遅延が無く処理負荷も極小です。(なお現代の携帯電話やIP電話のコーデックは、もちろんこれらよりもはるかに圧縮率が高いです。)
以上がG.711の概要ですが、今回作成したG.711エミュレーションエフェクタの内部をブロック図で書くと、以下のようになります。左右チャンネルで同じ処理を独立にかけています。
入力される音声信号は、8KHzにダウンサンプリングされます。
NTS-1など現行のlogue SDKマシンはサンプリングレートが48KHzですので、6サンプルに1回、データを取り出すだけです。
ただ、いきなりダウンサンプリングするとエイリアスノイズが出てしまいますので、先にローパスフィルタで高域をカットします。電話音声の帯域は前述のとおり300Hz~3.4KHzというスペックですので、低域についてもこの時点でカットしておきます。
なお、LPFのカットオフ周波数は3.4KHzにするとちょっと切れ味が不足する(logue SDKで使えるBiquad Filterは二次なので12dB/oct)ので、カットオフ周波数を3KHzにした上で、トータルでは3段重ねにして使っています。
A-lawの圧縮・伸長部分はコードの104行目からです。実際には、圧縮データを得る必要はなく、圧縮によるデータの欠落(仮数部が4ビットになる)だけをエミュレートしています。
伸長したら、8KHzサンプリングのデータを48KHzにサンプリング周波数変換します。といっても、周波数が整数倍なので、同じデータを6回並べているだけです。ただ、そのままだと波形が階段状になってしまいますので、LPFをかけます。前述のように、LPFの切れ味が十分ではないので、後段のLPFは2段重ねにしました。前段のLPFと合わせて3段、-36dB/octということになります。
実際に聴いてみると、電話特有のキンキンしたノイズっぽさが不足している気がしたので、LPFのレゾナンスを調整できるようにしました。レゾナンスを上げると3KHz近辺が強調されるので、入力信号にBGMが流されている場合などに聞き取りやすくなります。
入力にノイズを流してみた場合の出力の帯域を以下に示します。1番目が入力信号、2番目がレゾナンスなし、3番目がレゾナンスを80%くらいにしたときの帯域です。
なお、minilogue xdやNTS-1では問題ないですが、Prologueシリーズのサブ・ティンバーには対応していません。上述の通り、フィルタを合計4段×左右チャンネルぶん処理しており、サブティンバーを使うとさらに倍の処理が必要になりますが、今のハードウェア(STM32F405)だと性能不足になるようです。
コメント