Zvuk a řeč: spektrogram, melová škála a MFCC
Jak vzniká hlas (zdroj a filtr, formanty), spektrogram a krátkodobá Fourierova transformace, melová škála a banka filtrů, log-mel spektrogram modelu Whisper a proč MFCC poznají samohlásku nezávisle na výšce hlasu.
Série Základy AI Díl 59 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Proč samohlásku určují formanty, a ne výška hlasu.
- Jak se zvuk mění na spektrogram a proč na melové škále.
- Co jsou MFCC a jak se zvuk připravuje pro dnešní modely řeči.
Co se hodí znát předem: Fourierova transformace: rozklad signálu na frekvence, Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
Řekněte „a“ hlubokým hlasem a pak vysokým. Křivka tlaku vzduchu je pokaždé úplně jiná — a přesto každý pozná, že jde o stejnou samohlásku. Model pro rozpoznávání řeči musí umět totéž: přehlížet, jak vysoko kdo mluví, a všímat si, co říká. V tomhle dílu uvidíme, jak se zvuk krok za krokem připravuje, aby se z něj dobře učilo: spektrogram, melová škála a MFCC. Všechny zvuky jsou syntetické — samohlásky si vyrobíme stejným modelem, jakým fonetici popisují lidský hlas.
Navazuje na díly Fourierova transformace a Filtry a konvoluce.
1. Jak vzniká hlas: zdroj a filtr
Definice — model zdroj–filtr a formanty
Nechť fs > 0 je vzorkovací frekvence a f0 > 0 základní frekvence hlasu (perioda T0 = 1/f0). Model zdroj–filtr popisuje znělou hlásku jako signál
s = e * h,
kde
- zdroj e : ℤ → ℝ je řada pulzů hlasivek, e[n] = 1 v okamžicích n1 < n2 < … vzdálených od sebe přibližně fs/f0 vzorků (jeden pulz za periodu T0) a e[n] = 0 jinde;
- filtr s impulzní odezvou h je lineární a na posunu nezávislý (konvoluce z dílu Filtry a konvoluce, zde obecně s nekonečně dlouhou odezvou) a představuje hlasové ústrojí — hrdlo, ústa, jazyk, rty;
- formanty F1 < F2 < F3 < … jsou rezonanční frekvence filtru, tj. frekvence, na kterých má jeho zesílení |H(f)| lokální maxima.
Výšku hlasu tedy určuje zdroj (přes f0) a to, kterou frekvenci hlasové ústrojí zesílí, určuje filtr.
Hlasivky bzučí jako jazýček harmoniky — výška bzučení je výška hlasu. Ústa a hrdlo jsou jako dutina kytary: některé tóny zesílí víc než jiné. Když změníte polohu jazyka a rtů, změníte tvar dutiny a s ní formanty — a z „a“ se stane „i“. Výška hlasu patří zdroji, samohláska filtru.
| Samohláska | a | e | i | o | u |
|---|---|---|---|---|---|
| F1 (Hz) | 730 | 530 | 270 | 570 | 300 |
| F2 (Hz) | 1 090 | 1 840 | 2 290 | 840 | 870 |
Formanty mužského hlasu podle klasického měření Gordona Petersona a Harolda Barneyho z roku 1952 (zaokrouhleno). F1 souvisí s otevřením úst (otevřené „a“ má vysoké F1), F2 s polohou jazyka vpředu či vzadu („i“ vpředu, „u“ vzadu). Z těchto čísel si samohlásky syntetizujeme: řada pulzů projde třemi rezonančními filtry.
Spektrum je hřebínek: čárky po 120 Hz jsou harmonické hlasivek, jejich výšku určuje filtr. U „a“ jsou nejsilnější harmonické kolem 730 a 1 090 Hz, u „i“ kolem 270 Hz a pak až kolem 2 300 Hz. Rozpoznat samohlásku tedy znamená rozpoznat obálku hřebínku, ne hřebínek samotný.
Definice — harmonické
Nechť f0 > 0 a T0 = 1/f0. Frekvence k · f0, k = 1, 2, 3, …, se nazývají harmonické frekvence f0 (k-tá harmonická); první z nich je sama základní frekvence f0.
Jejich význam: nechť s : ℝ → ℝ je periodická s periodou T0, tj. s(t + T0) = s(t) pro všechna t ∈ ℝ (a dost pravidelná, aby ji vyjádřila Fourierova řada). Pak existují a0 ∈ ℝ, Ak ≥ 0 a φk ∈ ℝ takové, že
s(t) = a0 + ∑k=1∞ Ak cos(2π k f0 t + φk),
tedy signál se dá složit jen z kosinusovek na harmonických frekvencích (Fourierova řada). Spektrum periodického signálu proto není nikde jinde než na násobcích f0 — odtud hřebínek.
Pro f0 = 120 Hz leží harmonické na 120, 240, 360, … Hz. Formantu F1 = 730 Hz samohlásky „a“ je nejblíž 6. harmonická (6 · 120 = 720 Hz), formantu F2 = 1 090 Hz 9. harmonická (1 080 Hz). U „i“ je to 2. harmonická (240 Hz) a 19. harmonická (2 280 Hz). Samotný formant tedy v obrázku čárkou není — filtr jen zesílí harmonické, které padnou k němu.
Model zdroj–filtr se nejlíp čte ve spektru. Konvoluce v čase je ve spektru násobení, a po zlogaritmování součet:
log |S(f)| = log |E(f)| + log |H(f)|
- log |S(f)|
- logaritmické spektrum hlásky — zelená křivka v obrázku výše; jediné, co mikrofon zachytí
- log |E(f)|
- zdroj: hřebínek harmonických po f0; nese výšku hlasu, která pro rozpoznání slov nehraje roli
- log |H(f)|
- filtr: hladká obálka s vrcholy na formantech; nese samohlásku — to, co chceme vytáhnout
Jak si samohlásku vyrobíme
Každý formant v naší syntéze obstará jeden rezonátor: číslicový filtr, který na každý pulz odpoví tlumeným zvoněním na frekvenci F. Nový vzorek výstupu spočítá ze vstupu a ze dvou svých předchozích výstupů:
y[n] = x[n] + 2r cos(2π F/fs) · y[n − 1] − r2 · y[n − 2], r = exp(−π B/fs)
- y[n]
- výstup rezonátoru v n-tém vzorku (při fs = 16 000 vzorků za sekundu)
- x[n]
- vstup — pulzy hlasivek (nebo výstup předchozího rezonátoru); bez něj by filtr neměl co rozeznít
- 2r cos(2π F/fs)
- koeficient, se kterým se dva předchozí výstupy skládají do kmitu přesně s frekvencí F — tím filtr zesílí právě okolí formantu
- r, r2
- tlumení, o něco menší než 1: každý vzorek zmenší zvonění r-krát, takže po pulzu dozní a filtr zůstane stabilní
- B
- šířka pásma formantu v Hz (u nás 90, 110 a 170 Hz pro F1–F3): širší formant = rychlejší doznění = širší kopec ve spektru
Příklad — rezonátor pro F₁ samohlásky „a“
F = 730 Hz, B = 90 Hz, fs = 16 000 Hz:
Barvy podle vzorce výše:
r = exp(−π · 90/16 000) = e−0,01767 ≈ 0,98248, r2 ≈ 0,96527
2r cos(2π F/fs) = 2 · 0,98248 · cos(2π · 730/16 000) = 2 · 0,98248 · cos(0,28667) ≈ 1,88478
y[n] = x[n] + 1,88478 · y[n − 1] − 0,96527 · y[n − 2]
Za 10 ms (160 vzorků) zvonění zeslábne na r160 ≈ 6 % — dřív, než přijde další pulz hlasivek při 120 Hz (za 8,3 ms), je ho ještě dost, a tak se zvonění od sousedních pulzů překrývá.
def samohlaska(formanty, sirky, f0, delka, fs=16000):
x = nuly(delka · fs); faze = 0
for n in 0 … len(x) − 1: # zdroj: pulz jednou za periodu 1/f0
faze += f0 · (1 + 0,01 · šum()) / fs
if faze ≥ 1: faze −= 1; x[n] = 1
for F, B in zip(formanty, sirky): # filtr: tři rezonátory za sebou
r = exp(−π·B/fs); c = 2·r·cos(2π·F/fs)
y[n] = x[n] + c·y[n−1] − r²·y[n−2] pro všechna n
x = y
return x / max|x| + 0,01 · šum() # normalizace a slabý šum
2. Spektrogram: spektrum, které se mění v čase
Definice — krátkodobá Fourierova transformace a spektrogram
Nechť x : ℤ → ℝ je signál vzorkovaný frekvencí fs (mimo nahrávku doplněný nulami), N ∈ ℕ délka okna, H ∈ ℕ posun oken, w[0], …, w[N − 1] ∈ ℝ okenní funkce (definice níže) a K ≥ N délka diskrétní Fourierovy transformace. Krátkodobá Fourierova transformace (STFT) signálu x je pro každé okno m ∈ {0, 1, 2, …} a frekvenční koš k ∈ {0, …, K − 1} číslo
X[m, k] = ∑n=0N−1 x[mH + n] · w[n] · exp(−2πi kn/K).
Pro pevné m je to diskrétní Fourierova transformace Xk = ∑n xn exp(−2πi kn/K) z dílu Fourierova transformace (tam s délkou N, zde K) použitá na posloupnost xn = x[mH + n] · w[n] pro n < N, doplněnou K − N nulami. Koš k odpovídá frekvenci k · fs/K. Spektrogram je tabulka výkonů
P[m, k] = |X[m, k]|2, k = 0, …, K/2
(pro reálný signál nesou koše nad K/2 tutéž informaci). Kreslí se jako obrázek: vodorovně čas (okno m), svisle frekvence (koš k), jas je výkon. Pro řeč se typicky používají okna 25 ms posunutá o 10 ms.
Řeč se mění desetkrát až dvacetkrát za sekundu, takže jedno spektrum celé věty by smíchalo všechny hlásky dohromady. Spektrogram je místo toho film: každých 10 ms jeden snímek spektra, posledních 25 ms zvuku. Zkušení fonetici z něj umějí číst slova jako z notového zápisu.
Definice — Hannovo okno
Nechť N ∈ ℕ, N ≥ 2. Okenní funkce délky N je posloupnost čísel w[0], …, w[N − 1] ∈ [0, 1], kterou se násobí vzorky okna, aby signál na jeho krajích plynule klesl k nule. Hannovo okno délky N je okenní funkce
w[n] = 1/2 − 1/2 cos(2π n/N), n = 0, …, N − 1.
Na začátku (n = 0) je 0, uprostřed (n = N/2) 1. Bez okna by okno useklo signál uprostřed kmitu a Fourierova transformace by ten skok rozmazala do všech frekvencí (tzv. prosakování spektra).
Spektrogram je pak tabulka čísel P[m, k] — řádek pro každé okno, sloupec pro každou frekvenci:
P[m, k] = | ∑n=0N−1 x[mH + n] · w[n] · exp(−2πi kn/K) |2
- P[m, k]
- výkon k-té frekvence v m-tém okně — jas jednoho políčka ve spektrogramu (proto je obrázek jantarový); druhá mocnina absolutní hodnoty zahodí fázi, která pro rozpoznání hlásky nehraje roli
- x[mH + n]
- vzorky m-tého okna: začíná na vzorku mH, kde posun H = 160 (10 ms), a je dlouhé N = 400 (25 ms) — okna se tedy překrývají
- w[n]
- Hannovo okno — ztlumí okraje, aby useknutí signálu nevyrobilo falešné frekvence
- exp(−2πi kn/K)
- vzorová kmitavá vlna z Fourierovy transformace; součet s ní měří, kolik je v okně frekvence k · fs/K. K = 512 je délka FFT — okno se doplní nulami
Příklad — kolik rámců a jak jemná frekvence
délka okna: 0,025 s · 16 000 Hz = 400 vzorků, posun 0,010 s · 16 000 Hz = 160 vzorků
krok frekvenční osy: fs/K = 16 000/512 = 31,25 Hz; koše k = 0, …, 256, tedy 257 košů od 0 do 8 000 Hz
skutečné rozlišení okna: fs/N = 16 000/400 = 40 Hz — doplnění nulami jen zahustí body, nové informace nepřidá
počet rámců slova (0,85 s = 13 600 vzorků): ⌊13 600 − 400/160⌋ + 1 = ⌊82,5⌋ + 1 = 83
Harmonické hlasu po 120 Hz jsou od sebe tři kroky rozlišení, a tak jsou ve spektrogramu „a“ vidět jako samostatné vodorovné pruhy.
def spektrogram(x, N=400, H=160, K=512):
w = [½ − ½·cos(2π·n/N) for n in 0 … N−1] # Hannovo okno
P = []
for start in 0, H, 2H, … dokud start + N ≤ len(x):
okno = [x[start + n] · w[n] for n in 0 … N−1] + nuly(K − N)
X = FFT(okno)
P.append([|X[k]|² for k in 0 … K/2]) # 257 čísel na rámec
return P
Slovo trvá 0,85 s, a tak má 83 rámců po 25 ms (400 vzorků při 16 kHz, doplněných na 512 pro FFT). Jsou v něm vidět tři různé zvuky: „a“ s vodorovnými pruhy harmonických a silnými formanty pod 1 100 Hz, sykavka „s“ jako šum bez harmonických přes celé pásmo, nejsilnější nahoře, a „i“ s nízkým prvním a vysokým druhým formantem.
3. Melová škála: jak slyší člověk
Definice — melová škála a banka filtrů
Melová škála je funkce mel : [0, ∞) → [0, ∞), která frekvenci f v Hz přiřadí vnímanou výšku v jednotkách mel,
mel(f) = 2595 · log10(1 + f/700).
Je spojitá a rostoucí, mel(0) = 0, a má inverzi mel−1(m) = 700 · (10m/2595 − 1). Do 1 kHz je skoro lineární, nad ním logaritmická.
Melová banka filtrů je sada J ∈ ℕ trojúhelníkových filtrů H1, …, HJ (definice níže), jejichž středy f1 < … < fJ mají v melech stejné rozestupy, mel(fj+1) − mel(fj) = konst.; filtr Hj sečte výkon spektra ve svém pásmu.
Rozdíl mezi 200 a 300 Hz uslyšíte okamžitě, rozdíl mezi 7 000 a 7 100 Hz skoro vůbec. Ucho rozlišuje nízké frekvence jemně a vysoké hrubě — stejně jako klavír, kde je oktáva vždy zdvojnásobení frekvence. Melová banka to napodobí: dole úzká pásma, nahoře široká. Místo 257 košů FFT dostaneme 40 čísel, a ta nesou informaci tam, kde na ní uchu záleží.
mel(f) = 2595 · log10(1 + f/700)
- mel(f)
- vnímaná výška tónu o frekvenci f (Hz) — zelená křivka v obrázku níže
- 2595
- měřítko zvolené tak, aby 1 000 Hz vyšlo 1 000 mel; na hodnotě nezáleží, jen kalibruje jednotku
- log10
- logaritmus — stejný poměr frekvencí dá vysoko stejný rozdíl výšek, jako na klavíru oktáva
- 700
- zlom škály v Hz: pro f ≪ 700 je ln(1 + f/700) ≈ f/700, takže škála je dole skoro lineární; pro f ≫ 700 převládne logaritmus
Příklad — mely pro pár frekvencí
mel(1 000) = 2595 · log10(1 + 1 000/700) = 2595 · log10 2,4286 = 2595 · 0,38535 ≈ 1 000
mel(4 000) = 2595 · log10(1 + 4 000/700) = 2595 · log10 6,7143 = 2595 · 0,82700 ≈ 2 146
mel(300) − mel(200) ≈ 119 mel, ale mel(7 100) − mel(7 000) ≈ 15 mel
Stejný krok 100 Hz je dole osmkrát „větší“ než nahoře — přesně to, co popisuje laické vysvětlení výše.
Definice — trojúhelníkové filtry
Nechť J ∈ ℕ je počet filtrů, fs vzorkovací frekvence a fmax = fs/2. Hraniční body f0 < f1 < … < fJ+1 rozdělí melový rozsah [0, mel(fmax)] na J + 1 stejných dílků:
fi = mel−1(i/J + 1 · mel(fmax)), i = 0, 1, …, J + 1.
Trojúhelníkový filtr j ∈ {1, …, J} je funkce Hj : [0, fmax] → [0, 1],
Hj(f) = f − fj−1/fj − fj−1 pro fj−1 ≤ f ≤ fj,
Hj(f) = fj+1 − f/fj+1 − fj pro fj ≤ f ≤ fj+1,
Hj(f) = 0 jinak.
Na koši k spektrogramu (frekvence k · fs/K) má filtr váhu Hj[k] = Hj(k · fs/K), k = 0, …, K/2. Filtr je tedy trojúhelník s vrcholem 1 ve středu fj, který končí ve středech sousedů.
U nás J = 40 a fmax = 8 000 Hz: melový rozsah 0 až mel(8 000) = 2 840 se rozdělí na 41 dílků po 2 840/41 = 69,27 mel, takže f0 = 0 a f41 = 8 000 Hz.
První filtr: f0 = 0, f1 ≈ 44,4 Hz, f2 ≈ 91,6 Hz — široký 92 Hz, tedy necelé tři koše FFT po 31,25 Hz. Poslední: f39 ≈ 6 994, f40 ≈ 7 481, f41 = 8 000 Hz — široký 1 006 Hz, přes 32 košů.
Každý filtr udělá z jednoho rámce spektrogramu jedno číslo:
Lj = ln( ∑k Hj[k] · P[k] + ε )
- Lj
- log-mel energie j-tého pásma — jedno políčko log-mel spektrogramu
- ln
- logaritmus: hlasitost vnímáme logaritmicky a zesílení mikrofonu g se změní na pouhé přičtení ln g
- Hj[k]
- váha trojúhelníku j na koši k (modré a zelené trojúhelníky v obrázku níže) — vybere pásmo a jeho kraje bere slaběji
- P[k]
- výkon k-tého koše jednoho rámce spektrogramu (jantarový jas)
- ε
- maličké číslo (u nás 10−10), aby v tichu nevyšel ln 0 = −∞
Příklad — zesílení mikrofonu v log-mel spektru
Zesílíme-li signál dvakrát, výkon se zvětší čtyřikrát v každém koši: P′[k] = 4P[k]. Pak (barvy podle vzorce výše)
L′j = ln(∑k Hj[k] · 4P[k]) = ln 4 + ln(∑k Hj[k] · P[k]) = ln 4 + Lj ≈ Lj + 1,386
(až na zanedbatelné ε). Všech 40 pásem se posune o stejné číslo — tvar log-mel spektra, a tedy samohláska, se nezmění.
1 000 Hz odpovídá 1 000 melům, 4 000 Hz jen 2 146 melům a 8 000 Hz 2 840 melům. Polovina melové škály tak pokrývá pásmo do 1 768 Hz a zbylá polovina celých 1 768–8 000 Hz. Nejnižší filtr je široký 92 Hz, nejvyšší 1 006 Hz.
Log-mel spektrogram je obraz, se kterým dnes pracuje většina modelů řeči. Model Whisper (OpenAI, 2022) dostává 30 s zvuku jako 80 melových pásem × 3 000 rámců po 10 ms = 240 000 čísel místo 480 000 vzorků — a hlavně čísel, na kterých je řeč dobře vidět. Logaritmus se bere proto, že hlasitost vnímáme logaritmicky a že násobení (zesílení mikrofonu) se v logaritmu změní na přičtení.
4. MFCC: obálka bez výšky hlasu
Definice — kepstrum a MFCC
Nechť M ∈ ℕ je počet melových pásem (u nás M = 40) a L0, …, LM−1 ∈ ℝ log-mel energie jednoho rámce (pásma tu číslujeme od nuly, Lm je energie filtru j = m + 1). Jejich diskrétní kosinová transformace (DCT-II, bez normalizace) jsou čísla
ck = ∑m=0M−1 Lm · cos(πk(2m + 1)/2M), k = 0, 1, …, M − 1.
Melové kepstrální koeficienty (MFCC) rámce jsou prvních 13 z nich, c0, c1, …, c12; ostatní se zahodí. Kepstrum obecně je (inverzní) Fourierova transformace logaritmu spektra — MFCC je jeho varianta na melových pásmech. Koeficient c0 nese celkovou hlasitost, nízké koeficienty hrubý tvar obálky spektra, vysoké jemné detaily (včetně harmonických), které se zahodí.
Na log-mel spektrum se podíváme ještě jednou Fourierovou optikou: pomalé vlnění v něm je obálka (formanty, tedy samohláska), rychlé vlnění je hřebínek harmonických (výška hlasu). Když necháme jen prvních dvanáct „pomalých“ koeficientů, výška hlasu se odfiltruje a zbude to, co se říká. Slovo kepstrum je přesmyčka slova spektrum — spektrum spektra.
ck = ∑m=0M−1 Lm · cos(πk(2m + 1)/2M)
- ck
- k-tý MFCC koeficient rámce, k = 0, 1, …, 12
- Lm
- log-mel energie pásma m z předchozího kroku — „signál“, jehož spektrum počítáme
- cos(πk(2m + 1)/2M)
- kosinusovka přes pásma, která udělá k půlvln: ck měří, jak moc log-mel spektrum vypadá jako tahle vlna. Dělení dvojnásobkem počtu pásem M = 40 natáhne vlnu přes celé spektrum (m + 1/2 je střed m-tého pásma). Malé k = pomalé vlnění = obálka a formanty; velké k = rychlé vlnění = hřebínek harmonických
Věta — hlasitost nese jen c₀
Nechť M ≥ 1, L0, …, LM−1 ∈ ℝ jsou log-mel energie s koeficienty ck (definice výše), a ∈ ℝ a c′k jsou koeficienty energií Lm + a (ke všem pásmům přičtená stejná konstanta — zesílení mikrofonu, viz příklad výše). Pak
c′0 = c0 + M · a a c′k = ck pro všechna k = 1, …, M − 1.
Důkaz. c′k = ∑m (Lm + a) cos(πk(2m + 1)/2M) = ck + a · ∑m=0M−1 cos(πk(2m + 1)/2M). Pro k = 0 je každý kosinus 1 a součet je M. Pro 1 ≤ k < 2M se kosiny vyruší: jejich součet je reálná část součtu geometrické řady
∑m=0M−1 exp(iπk(2m + 1)/2M) = exp(iπk/2M) · 1 − eiπk/1 − exp(iπk/M),
která je ryze imaginární (pro sudé k je dokonce nulová). ∎
Na rámci samohlásky „a“: dvojnásobná amplituda dá a = ln 4, takže c0 vzroste o 40 · ln 4 ≈ 55,45 a c1 až c12 se nezmění ani na šestém desetinném místě. Proto se c0 při porovnání samohlásek vynechává.
Definice — vzdálenost dvou popisů
Nechť samohláska má R ≥ 1 rámců (bez prvních tří) a c(r) = (c1(r), …, c12(r)) ∈ ℝ12 jsou MFCC jejího r-tého rámce bez c0. Její popis je vektor průměrných MFCC
c = 1/R ∑r=1R c(r) ∈ ℝ12.
Vzdálenost dvou popisů c, c′ ∈ ℝ12 je euklidovská:
d(c, c′) = √∑k=112 (ck − c′k)2.
Pro surové log-spektrum totéž, jen popisem je průměr vektorů (ln(P[m, k] + 10−10))k=0, …, 256 ∈ ℝ257 přes rámce m a součet jde přes všech 257 košů.
| samohláska, f0 | c1 | c2 | c3 | c4 |
|---|---|---|---|---|
| a, 100 Hz | 60,5 | −17,8 | −43,2 | −16,4 |
| a, 200 Hz | 60,5 | −25,3 | −45,0 | −14,9 |
| i, 100 Hz | 58,8 | −1,5 | 30,3 | 10,8 |
„A“ ve dvou výškách se v prvních čtyřech koeficientech liší nejvýš o 7,5 (v c2), kdežto „i“ se od „a“ stejné výšky liší jen v c3 o víc než 70. Přes všech dvanáct koeficientů vyjde vzdálenost „a“ při 100 Hz a 200 Hz 9,4, kdežto v surovém log-spektru 25,0.
def mfcc_ramce(x, start):
P = |FFT(Hann · x[start … start+399], 512)|² # 257 košů
L_j = ln(∑_k H_j[k] · P[k] + 1e−10) pro j = 1 … 40 # log-mel
c_k = ∑_m L_m · cos(π·k·(m + ½) / 40) pro k = 0 … 12 # DCT-II
return c_1 … c_12 # c_0 = hlasitost, pryč
popis(samohlaska) = průměr mfcc_ramce přes rámce (bez prvních tří rámců)
Ověříme to na všech pěti samohláskách, každou vyslovenou výškou 100 a 200 Hz. V prostoru MFCC je vzdálenost mezi dvěma verzemi téže samohlásky nejvýš 13,0, kdežto dvě různé samohlásky vyslovené stejně vysoko jsou od sebe nejméně 40,3. V surovém log-spektru je to naopak: tatáž samohláska jinou výškou je vzdálená až 28,8, ale „o“ a „u“ stejnou výškou jen 14,9. Surové spektrum tedy víc vypovídá o tom, jak vysoko kdo mluví, než co říká — MFCC to otočí.
5. Co s tím dělají modely
- Klasické systémy (do 2010) braly MFCC po 10 ms, k nim jejich změny v čase, a posílaly je do skrytých Markovových modelů z dílu Skryté Markovovy modely: skrytý stav je hláska, pozorování jsou MFCC.
- Neuronové sítě dnes berou log-mel spektrogram jako obrázek a samy se naučí, co v něm hledat; DCT na MFCC už nepotřebují, protože si korelace mezi pásmy poradí samy.
- Učení ze surových vzorků. Modely jako wav2vec 2.0 (2020) dostávají přímo vzorky a první konvoluční vrstvy se naučí filtry, které se podobají melové bance — síť znovu objeví, jak slyší ucho.
- Mluvčí a emoce. Pro rozpoznání kdo mluví nebo s jakou náladou je naopak výška hlasu důležitá a zahazovat se nesmí — výběr příznaků vždy závisí na otázce.
Definice — delta koeficienty
„Změna MFCC v čase“ se u klasických systémů počítala regresí přes 2N + 1 sousedních rámců (tvar z příručky HTK Book, Young a kol.; typicky N = 2). Nechť N ∈ ℕ, N ≥ 1, a ct ∈ ℝ je hodnota jednoho koeficientu MFCC v rámci t ∈ ℤ. Delta koeficient v rámci t je číslo
Δct = ∑n=1N n · (ct+n − ct−n)/2 ∑n=1N n2.
Je to sklon přímky proložené metodou nejmenších čtverců body (t + n, ct+n), n = −N, …, N. Pro N = 2 je jmenovatel 2 · (1 + 4) = 10. Příklad: jeden koeficient má v pěti po sobě jdoucích rámcích hodnoty 1, 2, 4, 7, 11; v prostředním rámci je Δ = 1 · (7 − 2) + 2 · (11 − 1)/10 = 25/10 = 2,5 za rámec. Stejný vzorec použitý na Δ dá zrychlení ΔΔ; 13 MFCC + 13 Δ + 13 ΔΔ = 39 čísel na rámec byl desítky let standardní vstup skrytých Markovových modelů.
6. Shrnutí
- Hlas = zdroj (hlasivky, výška hlasu) * filtr (ústa, formanty); samohláska je dána formanty, ne výškou.
- Spektrogram ukazuje spektrum po krátkých oknech (25 ms, posun 10 ms); slovo dlouhé 0,85 s má 83 rámců.
- Melová škála napodobí ucho: 1 000 Hz = 1 000 mel, 8 000 Hz = 2 840 mel; 40 filtrů nahradí 257 košů FFT.
- Log-mel spektrogram je dnešní standard; Whisper dostává 80 pásem × 3 000 rámců na 30 s zvuku.
- MFCC zahodí výšku hlasu: tatáž samohláska v jiné výšce je od sebe nejvýš 13,0, různé samohlásky nejméně 40,3.
Chcete si to osahat? Nahrajte telefonem samohlásky a, e, i, o, u a nechte AI agenta vykreslit jejich spektrogramy a najít první dva formanty — sedí na tabulku z tohoto dílu?
Máte na to jiný názor? Napište na support@coden-app.com.