RMS(Root Mean Square:二乗平均平方根)
RMSは振幅の指標。二乗和Eとの関係は E=N × RMS²。
rms = librosa.feature.rms(y=y, frame_length=2048,
hop_length=512)[0]
rms_db = librosa.amplitude_to_db(rms, ref=1.0, top_db=None)基準振幅Aref=1。dB SPLではない。小さいRMSにも弱い発話が含まれ得る。
| 候補 | RMS | ZCR |
|---|---|---|
| 低振幅 | 低 | どちらでも |
| 有声らしい | 閾値以上 | 低 |
| 無声らしい | 閾値以上 | 高 |
def rule_based_candidates(zcr, rms_db,
zcr_threshold=0.1, rms_threshold=-30):
labels = []
for z, r in zip(zcr, rms_db):
if r < rms_threshold:
labels.append("low_level")
elif z < zcr_threshold:
labels.append("voiced_like")
else:
labels.append("unvoiced_like")
return labels閾値は演習用の設定例。正解ラベルと比較する。無声・非発話・無音は別の概念で、囁き声も発話である。
ピッチは知覚される音の高さ。通常の有声音ではF0が主な手がかりになる。
T0は秒単位の周期。例えば100 Hzなら10 ms、200 Hzなら5 ms。
| 基本周波数F0 | フォルマントF1・F2など | |
|---|---|---|
| 物理量 | 音源の繰り返しの周波数 | 声道の共鳴周波数 |
| 変化する要因 | 声帯の状態・イントネーション等 | 舌・唇の形、声道長等 |
| 手がかり | 韻律・話者の声域など | 母音・声道形状など |
演習では50〜500 Hzを探索する。人間の声の普遍的な範囲や属性の判定基準ではない。
有限長の自己相関は、重なり部分の積を足す:
τはサンプル単位。周期候補τ0から F0 ≈ fs/τ0。
librosa.yin()はF0候補を返す。fmaxは無声フラグではないf0, voiced_flag, voiced_prob = librosa.pyin(
y, fmin=50, fmax=500, sr=sr,
frame_length=2048, hop_length=512)
f0_voiced = np.where(voiced_flag, f0, np.nan)pYIN公式:NaNは無声と推定した区間。非発話の判定とは異なる。
import librosa, librosa.display
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# LibriSpeechの英語発話サンプル(最初の10秒)
y, sr = librosa.load(librosa.example("libri1"),
sr=22050, duration=10.0)
hop_length, frame_length = 512, 2048
zcr = librosa.feature.zero_crossing_rate(
y, frame_length=frame_length, hop_length=hop_length)[0]
rms = librosa.feature.rms(
y=y, frame_length=frame_length, hop_length=hop_length)[0]
rms_db = librosa.amplitude_to_db(rms, ref=1.0, top_db=None)
f0, voiced_flag, voiced_prob = librosa.pyin(
y, fmin=50, fmax=500, sr=sr,
frame_length=frame_length, hop_length=hop_length)
f0_voiced = np.where(voiced_flag, f0, np.nan)
times = librosa.frames_to_time(
np.arange(len(zcr)), sr=sr, hop_length=hop_length)
VAD:発話区間と非発話区間を推定する。声帯振動の有無を判定する課題とは異なる。
| アプローチ | 特徴・例 |
|---|---|
| 単純な規則 | エネルギー等の閾値。本日の分類は原理を試す簡略例 |
| 統計的 | 周波数帯の特徴をGMMで比較するWebRTC VADなど |
| 深層学習 | 学習した区間判別モデル。Silero VAD、pyannoteなど |
VADだけで、データ収集や保存が自動的に制御されるわけではない。
WebRTC VADの入力条件とAPI:16-bit PCM、対応サンプリング周波数、10/20/30 msフレームを確認。
22,050 Hzでの模式例。dBの基準振幅は1、NaNはpYINの無声推定。
| ケース | ZCR | RMS | F0 |
|---|---|---|---|
| A | 低、時々上昇 | 高低が交互 | 130〜180 Hz |
| B | 高い | −50 dB以下 | ほとんど未検出 |
| C | 低い区間と高い区間 | −10〜−15 dB | 200〜280 HzとNaN |
F0だけで性別・年齢・言語を決めない。未検出でも発話がないとは限らない。
チャットまたは共有ドキュメントで回答。
| 特徴量 | 定義・推定 | 意味 |
|---|---|---|
| ZCR | 符号変化の回数÷サンプル数 | 符号反転の頻度 |
| RMS | 二乗平均平方根 | 録音信号の振幅 |
| F0 | 周期の逆数。pYIN等で推定 | 有声区間の周期性 |
区間候補の分類・有声性推定・VADは目的が異なる。
モデルや閾値の出力を正解ラベルと照合する。
librosa.feature.zero_crossing_rate() # ZCR
librosa.feature.rms() # RMS
librosa.pyin() # F0・有声フラグ・有声確率
librosa.amplitude_to_db() # 基準振幅に対するdB次回(第7回・動画回):HMM・GMMと自己教師あり表現学習。
予習:「状態」「遷移確率」「出力確率(密度)」を調べる。
前回のMFCCはスペクトルベースの特徴量だった。今回は時間領域の特徴量を扱う。
閾値は録音レベル・サンプリング周波数・雑音条件に依存する。教材の0.1・−30 dBは設定例。正解ラベルと比較して有用性を確認する。 通常の囁き声には安定した周期振動がない場合があるが、発話ではある。有声性とVADの発話/非発話は別の課題。
このコードの後、GridSpecで4段のグラフを描く(第6回本文のセル6参照)。F0未検出をfmax値で判定しない。
解答例:A/Cは周期的・非周期的区間を含む発話など、Bは小さな雑音や弱い無声子音など。性別・言語や、発話の有無はこの特徴量だけでは確定しない。元の音声・スペクトログラム等を照合する。 提出締め切り:翌週末23:59