Skip to content

オーディオ基礎 ​

音声解析やマスタリングのページを読む前に押さえておく基礎用語をまとめます。いずれも、音がデジタルでどう表現され、計測され、クリップし、遅延し、再生されるかという、1 本の信号経路の話です。

サンプルレート ​

音は連続した空気圧の波です。デジタル音声はそれを数値の列として保存し、その 1 つ 1 つをサンプルと呼びます。ある瞬間に測った波の値です。サンプルレートは、1 秒あたりに保存されるサンプル数です。44.1 kHz と 48 kHz が一般的です。表現できる最高周波数はレートの半分で(ナイキスト周波数)、44.1 kHz なら 22.05 kHz までです。レートが高いほど CPU とメモリの使用量も増えます。

ブラウザでの解析やマスタリングでは、まずファイル本来のサンプルレートのまま扱うのが自然です。ツール側が変換を要求しない限り、不要なリサンプリングは避けます。

ファイル本来のサンプルレートを必ず渡す

sampleRate を省略すると、解析関数は 22050 Hz とみなします。44.1 kHz の音声をそのまま解析するとテンポが半分に読まれ、120 BPM のクリック列が 60 BPM と出ます。エラーは出ません。Python の Audio.from_file はファイルからレートを読みますが、detect_bpm(samples) のような関数に生のサンプルを渡す場合は、同じ 22050 が既定になります。

ビット深度 ​

ビット深度は、サンプル値の量子化分解能です。ビットを増やしても上限は上がらず、フルスケールはどの語長でも 0 dBFS のままです。増えるのは下側で、量子化ノイズフロアが 1 ビットあたりおよそ 6 dB 下がります。その分だけ静かな部分のディテールが埋もれずに残り、フルスケールから離れたレベルでも余裕をもって作業できます。コンシューマー向けの最終ファイルは 16-bit や圧縮形式が多く、制作中は 24-bit や浮動小数点を使うのが一般的です。

サンプリング、量子化、エイリアシング
サンプリングと量子化1 / サンプルレート量子化ステップナイキスト周波数を超える音サンプルレート 44.1 kHz: 30 kHz → 14.1 kHz
  • 連続した波形
  • 入力 30 kHz
  • エイリアス 14.1 kHz
左:波形をサンプル周期ごとに読み取り、それぞれの値を 8 段階(3 ビット)のうち最も近いレベルに丸めます。そのため点は曲線から少しずれます。ビットが 1 つ増えるごとに段の間隔は半分になります。右:30 kHz の音を 44.1 kHz でサンプリングすると、14.1 kHz の音とまったく同じサンプル列になります。サンプリングした後では、2 つを区別する手段はありません。

固定小数点へ落とすときは、丸めの前に極小のノイズを加えるディザを使います。静かな部分で丸め誤差が歪みとして聞こえるのを防ぐためです。浮動小数点のファイルは丸めが起きないので、ディザは要りません。

Web Audio や libsonare の処理内部では、サンプルは浮動小数点として扱われます。浮動小数点はフォーマット自体がフルスケールの上側にも余地を持つ唯一のケースで、途中の処理段で 1.0 を超えてもクリップしません。ただし固定小数点へ書き出す最終段では、やはり True Peak(トゥルーピーク)のセーフティが必要になります。True Peak は、再生や非可逆エンコードで波形が復元されたときにサンプルとサンプルの「あいだ」に現れるピークまで含めた値で、素のサンプルピークより高くなることがあります。

モノラルとステレオ ​

モノラルは 1 チャンネル、ステレオは L/R の 2 チャンネルです。ステレオは音像の広がりや定位を表現できる一方で、モノラルで再生したときに崩れる問題(モノラル互換性)を抱えることがあります。

サンプルフレームは、同じ瞬間の全チャンネルのサンプルをひとまとめにしたものです。ステレオなら L と R の 2 サンプルで 1 フレームです。音声の位置や長さはサンプルフレームで数えるので、48 kHz ステレオの 1 秒は 48,000 フレームで、サンプルは 96,000 個あります。解析の呼び出しの多くは 1 チャンネルを受け取ります。Audio.fromMemory と Audio.from_file は、ステレオの左右を平均してモノラルに畳みます。

ステレオ信号をモノラルに合算したとき、サイド成分が弱くなったり打ち消し合ったりすることがあります(理由は下の位相と極性で説明します)。マスタリングデモが相関値(コリレーション。L/R がどれだけ同位相かを -1〜+1 で表した値)やステレオイメージを表示しているのはこのためです。

周波数、音の高さ、倍音 ​

周波数は、波が 1 秒間に何回繰り返すかで、単位はヘルツ(Hz)です。A4 は 1 秒に 440 回繰り返すので、1 回の繰り返しにかかる時間(周期)は 1/440 秒、約 2.27 ms です。人間の可聴域はおおよそ 20 Hz から 20 kHz です。周波数が 2 倍になるごとに 1 オクターブ上がり、220 Hz、440 Hz、880 Hz はどれも A です。

音の高さ(ピッチ)は耳に聞こえる音楽的な高さです。楽器や歌の音ではたいてい基本周波数(F0)、つまり波形全体が繰り返す速さに従います。

ひとつの音が単一の周波数だけでできていることはまれです。歌や楽器の音には、基本周波数の整数倍に倍音が含まれます。110 Hz の音なら 220、330、440 Hz……にもエネルギーがあります。個々の周波数成分を一般に部分音と呼び、ちょうど整数倍に乗っている部分音が倍音です。鐘やシンバル、ピアノの弦には、整数倍からずれた非整数次倍音もあります。部分音どうしのバランスは、同じ音を弾いた 2 つの楽器が違って聞こえる大きな理由です(音色)。

SIGNAL · HARMONICSIDLE
波形とスペクトル — 倍音はどこから生まれるか

上段は時間波形、下段はそのスペクトル。サイン波は基音だけ、ノコギリ波はすべての倍音、矩形波は奇数倍音だけが立つ。波形を切り替えると倍音の櫛が現れる。

波形
周波数
220 Hz

時間領域と周波数領域 ​

ファイルに並んでいるサンプルは時間領域の表現で、波の値を瞬間ごとに記録したものです。波形表示が描いているのはこれです。同じ音を周波数領域で、つまり各周波数がどれだけ強いかとして表すこともでき、これをスペクトルと呼びます。フーリエ変換が一方の表現をもう一方へ変換します。上のデモでは両方を同時に見られます。

音の高さ、コード、音色は周波数領域に現れるので、解析は周波数領域で行います。音声を短く重なり合うブロックに切り、ブロックごとにスペクトルを求めます。このブロック 1 つが解析フレームで、サンプルフレームとは別物です。よく使う nFft = 2048、hopLength = 512 を 44.1 kHz で使うと、解析フレームは 2048 サンプル(46.4 ms)の長さで、512 サンプル(11.6 ms、毎秒約 86 フレーム)ごとに次が始まり、スペクトルのビンは 44100 / 2048 ≈ 21.5 Hz 間隔になります。窓関数と時間・周波数のトレードオフは スペクトログラムと STFT で説明しています。

ナイキスト周波数とエイリアシング ​

サンプルレートで表せるのは、その半分であるナイキスト周波数より低い周波数だけです。それより高い音は、サンプリングで消えるのではなく折り返し、偽の低い周波数として現れます。これをエイリアシングと呼びます。44.1 kHz で 30 kHz の音を記録すると、44.1 − 30 = 14.1 kHz として読まれます。変換器がサンプリング前にナイキスト周波数より上を取り除き、リサンプリングがレートを下げる前にもう一度フィルターをかけるのはこのためです。

位相と極性 ​

位相は、ある瞬間に波が 1 周期のどこにいるかで、度で表します(360° で 1 周期)。同じ波の 2 つのコピーは、位相差によって強め合ったり打ち消し合ったりします。

同じサイン波の等しいコピー 2 つ合計
同位相(0°)振幅が 2 倍、+6.02 dB
90° ずれ+3.01 dB
180° ずれ無音。完全に打ち消し合う

極性は信号全体の符号です。極性反転はすべてのサンプルに -1 を掛けます。極性反転したコピーはすべての周波数で同時に元の信号を打ち消します。一方、時間の遅れは周波数ごとに違う量だけ位相をずらすので、ある周波数は打ち消し、別の周波数は強めます。どちらもモノラルでの打ち消しを生む仕組みです。

STEREO · MONO FOLDIDLE
モノフォールド — ステレオ幅が打ち消されるとき

左と右に同じサイン波を置き、位相差を 0° から 180° まで動かします。モノフォールドは左右の平均です。90° では左チャンネル比 −3.01 dB、180° では打ち消し、相関は +1、0、−1 と連続して変化します。左の基準音とモノフォールドを切り替えて、レベル差を聴き比べられます。

位相差
90 °
試聴

振幅と dB ​

振幅はある瞬間のサンプル値そのものです。dB はレベルを対数で表す方法で、人間のラウドネス知覚が線形より対数に近いため、オーディオでは dB を使います。

固定小数点 PCM のサンプル値は通常 -1.0 から 1.0 の範囲に正規化されています。このデジタル上限を基準にレベルを測ったものが dBFS(フルスケール基準のデシベル)で、フルスケールのサンプルが 0 dBFS、それより下の固定小数点値が負の値です。浮動小数点の中間バッファは最終書き出し前に 1.0 を超えられるため、信号を制限するまでは dBFS が 0 を上回ることもあります。

レベルサンプル値
0 dBFS1.0
-6.02 dBFS0.5
-20 dBFS0.1
-60 dBFS0.001

換算式は、その数値が何を測っているかで変わります。

量式2 倍にすると
振幅(サンプル値、ピーク、RMS)dB = 20 · log10(振幅)+6.02 dB
パワーやエネルギー(平均二乗。LUFS の内部で使う量)dB = 10 · log10(パワー)+3.01 dB

パワーは振幅の 2 乗なので、同じ信号ならどちらの式でも同じ答えになります。つまり 6 dB ごとに振幅が半分または 2 倍になり、3 dB ごとにパワーが半分または 2 倍になります。LUFS の差は LU で数え、1 LU は 1 dB と同じ幅です。同じ信号でも、何を測るかによってレベルの読みは何通りもあります。

読み値測るもの呼び出し振幅 0.5・1 kHz のサイン波
ピーク最も大きい 1 サンプルmeteringPeakDb-6.02 dBFS
RMS平均エネルギーmeteringRmsDb-9.03 dBFS
ラウドネスゲート付き・周波数重み付きの体感レベルlufs().integratedLufs-9.02 LUFS

サイン波では、ピークから RMS を引いた差が常に 3.01 dB です。この差がクレストファクターで、実際の音楽ではもっと大きくなります。

クリッピングとヘッドルーム ​

クリッピングは、信号がシステムの表現できるレベルを超えたときに発生します。デジタルクリッピングは波形のピークが平らに切られるため、不快な歪みとして聞こえます。

ヘッドルームは、現在のピークレベルと上限との余裕です。マスタリングでは、最終リミッティングに入る前のヘッドルームと、最終書き出し後の True Peak セーフティの両方を確保する必要があります。マスタリングの目標値は LUFS で示しますが、シーリングはそれとは別の、ピークに基づく上限です。

レイテンシ ​

レイテンシは処理による遅延です。ルックアヘッドリミッティングやスペクトルリペアのような処理は、判断のために少し先のサンプルを参照します。オフラインレンダリングではある程度のレイテンシは許容できますが、ライブモニタリングやインタラクティブツールでは低く抑える必要があります。

遅延秒数は、遅延サンプルフレーム数をサンプルレートで割った値です。True Peak リミッターの既定のルックアヘッド 1 ms は、48 kHz で 48 サンプルにあたります。レイテンシが設計の制約になる場面は、リアルタイム安全性と True Peak 安全性を参照してください。

libsonare で測る ​

ピーク、RMS、ラウドネス、クリッピングには、それぞれ直接呼べる関数があります。

typescript
import { init, meteringPeakDb, meteringRmsDb, meteringDetectClipping, lufs } from '@libraz/libsonare';

await init();

// samples: モノラルの Float32Array、sampleRate: ファイル本来のレート
const peak = meteringPeakDb(samples, sampleRate);              // 最も大きいサンプル(dBFS)
const rms = meteringRmsDb(samples, sampleRate);                // 平均エネルギー(dBFS)
const { integratedLufs } = lufs(samples, sampleRate);          // ゲート付き・重み付きのラウドネス
const { clippingRatio } = meteringDetectClipping(samples, sampleRate);
python
import libsonare as sonare

audio = sonare.Audio.from_file("song.wav")
peak = audio.peak_db()
rms = audio.rms_db()
integrated = audio.lufs().integrated_lufs
clipping_ratio = audio.detect_clipping().clipping_ratio
bash
sonare lufs song.wav      # Integrated/Momentary/Short-term の LUFS とラウドネスレンジ
sonare meter song.wav     # ネイティブ CLI のみ: ピーク、RMS、クレスト、True Peak、クリッピング、DC オフセット、無音
sonare clipping song.wav  # ネイティブ CLI のみ: クリップしたサンプルと区間
実装メモ

ブラウザデモは Web Audio でファイルをデコードし、浮動小数点バッファを libsonare の WASM 側に渡して処理し、WAV として書き出します。形式は 16-bit または 24-bit の PCM(既定は 24-bit で、ディザは TPDF が既定。オフにするかノイズシェイピングも選べます)か、ディザをかけない 32-bit float です。マスタリングワーカーが重いレンダリングを UI スレッドから分離しています。ソース・レンダリング結果・レポート・設定の object URL は、入れ替え時に確実に解放(revoke)してブラウザ側のメモリリークを防いでいます。

関連: モノラル互換性、True Peak 安全性、マスタリングメーターの読み方