Přeskočit na obsah
coden

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.

12 minut Matěj Žalmánek 2026-10-16

Série Základy AI Díl 59 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • 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

  1. 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;
  2. 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;
  3. 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.

Laicky řečeno

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áskaaeiou
F1 (Hz)730530270570300
F2 (Hz)1 0901 8402 290840870

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.

0−20−40−60 úroveň (dB vůči max.) 01000200030004000 a, f₀ = 120 Hz frekvence f (Hz) 0−20−40−60 úroveň (dB vůči max.) 01000200030004000 i, f₀ = 120 Hz frekvence f (Hz)
Spektra samohlásek a a i vyslovených výškou 120 Hz; čárkovaně formanty svisle decibely (60 dB rozsah)

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
S, E, H jsou Fourierovy transformace s, e, h; z s = e * h plyne podle konvoluční věty |S(f)| = |E(f)| · |H(f)|. Logaritmus udělá ze součinu součet, takže zdroj a filtr jdou od sebe oddělit sčítáním a odčítáním — na tom staví MFCC na konci dílu.

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
Rezonátor druhého řádu; samohláska vznikne, když pulzy projdou třemi takovými filtry za sebou.
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.

Laicky řečeno

Ř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
Krátkodobá Fourierova transformace: obyčejná diskrétní Fourierova transformace, jen pro každé okno zvlášť.
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
02000400060008000 00,20,40,60,8 čas t (s) frekvence f (Hz)
Spektrogram syntetického slova „asi“: a – s – i svisle frekvence 0–8 000 Hz, jas = log výkonu

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.

Laicky řečeno

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
Nejrozšířenější tvar (O'Shaughnessy, 1987); měřená data o vnímané výšce z 30. let jím jsou jen přibližně proložena. Inverze: f = 700 · (10m/2595 − 1).
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 = −∞
257 košů → 40 čísel na rámec.
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í.

výška (mel) 0100020003000 040008000 frekvence f (Hz) váha filtru (0–1) 040008000 frekvence f (Hz)
Melová škála (čárkovaně mel = Hz) a banka 40 filtrů do 8 kHz

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.

44676184540057481 00,20,40,60,8 čas t (s) střed melového pásma (Hz)
Totéž slovo jako log-mel spektrogram (40 pásem) svisle střed pásma v Hz, jas = log energie

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í.

Laicky řečeno

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
Diskrétní kosinová transformace DCT-II (bez normalizace, tak jak ji počítá náš kód). Necháme jen k ≤ 12 — tím zahodíme rychlé vlnění, a s ním výšku hlasu.
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, f0c1c2c3c4
a, 100 Hz60,5−17,8−43,2−16,4
a, 200 Hz60,5−25,3−45,0−14,9
i, 100 Hz58,8−1,530,310,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ů)
020004000 frekvence f (Hz) ln výkonu (bez jedn.) c1 c4 c7 c10 koeficient MFCC (index c1–c12) hodnota MFCC (bez jedn.)
Samohláska a výškou 100 Hz a 200 Hz: spektrum se liší, MFCC skoro ne f₀ = 100 Hz f₀ = 200 Hz

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.

Agent na vašem počítači, ovládaný z telefonu