Mel频谱图的前世今生
背景与基本概念
Mel频谱图是音频信号处理中的一种表示形式,用于将音频信号转换为二维图像,这种表示形式在语音识别、语音合成和音频分类等领域中广泛应用。要理解Mel频谱图,首先需要了解以下几个基本概念:
-
频谱图:频谱图(Spectrogram)是显示信号强度(能量或功率)随时间和频率变化的图像。频谱图是通过对信号进行短时傅里叶变换(STFT)得到的。
-
Mel尺度:Mel尺度(Mel Scale)是一种根据人耳感知频率的非线性尺度。Mel尺度试图将频率变换成一种更符合人类听觉感知的表示。Mel频率与实际频率之间的关系可以通过以下公式表示:
m = 2595 log 10 ( 1 + f 700 ) m = 2595 \log_{10} \left(1 + \frac{f}{700}\right) m=2595log10(1+700f)
https://aistudio.baidu.com/projectdetail/8196592
短时傅里叶变换 (STFT)
短时傅里叶变换(STFT)是将信号分割成短时间段,并对每个时间段进行傅里叶变换,从而得到随时间变化的频谱。其数学表达式如下:
S T F T { x ( t ) } ( m , ω ) = X ( m , ω ) = ∑ n = − ∞ ∞ x [ n ] ⋅ w [ n − m ] ⋅ e − j ω n STFT\{x(t)\}(m, \omega) = X(m, \omega) = \sum_{n=-\infty}^{\infty} x[n] \cdot w[n - m] \cdot e^{-j\omega n} STFT{x(t)}(m,ω)=X(m,ω)=n=−∞∑∞x[n]⋅w[n−m]⋅e−jωn
其中:
- x [ n ] x[n] x[n] 表示离散时间信号。
- w [ n ] w[n] w[n] 表示时间窗口函数(如汉宁窗、汉明窗等)。
- m m m 表示时间段的起始位置。
- ω \omega ω 表示频率。
- X ( m , ω ) X(m, \omega) X(m,ω) 表示在时间 m m m和频率 ω \omega ω上的STFT值。
通过对每个时间段的信号进行傅里叶变换,得到不同时间段的频率成分,最终得到的频谱图是频率随时间变化的二维图像。
频谱图
频谱图是STFT的结果,通常表示为信号强度(能量或功率)随时间和频率的变化。频谱图的计算过程如下:
- 对每一帧信号应用STFT,得到每一帧的频谱。
- 将每一帧的频谱值转换为能量或功率谱。
对于第 m m m帧信号,其频谱能量表示为:
P ( m , k ) = ∣ X ( m , ω k ) ∣ 2 P(m, k) = |X(m, \omega_k)|^2 P(m,k)=∣X(m,ωk)∣2
其中:
- P ( m , k ) P(m, k) P(m,k) 表示在时间 m m m和频率 ω k \omega_k ωk上的功率谱。
- ∣ X ( m , ω k ) ∣ |X(m, \omega_k)| ∣X(m,ωk)∣ 表示STFT结果的幅值。
Mel频谱图
在得到频谱图之后,将频谱图中的频率轴转换到Mel尺度上,计算过程如下:
- Mel尺度转换:将线性频率转换到Mel频率。
- Mel滤波器组:对频谱进行Mel滤波,得到每个Mel频率上的能量。
- 对数变换:对Mel频谱取对数,得到Mel频谱图。
以上步骤的公式如下:
- Mel频率变换:
m = 2595 log 10 ( 1 + f 700 ) m = 2595 \log_{10} \left(1 + \frac{f}{700}\right) m=2595log10(1+700f)
- Mel滤波器输出:
E m = ∑ k = 0 N − 1 ∣ X ( m , k ) ∣ 2 ⋅ H m ( k ) E_m = \sum_{k=0}^{N-1} |X(m, k)|^2 \cdot H_m(k) Em=k=0∑N−1∣X(m,k)∣2⋅Hm(k)
其中:
- E m E_m Em 表示第 m m m个Mel滤波器的输出能量。
- H m ( k ) H_m(k) Hm(k) 表示第 m m m个Mel滤波器的频率响应。
- 取对数:
Mel频谱图 = log ( E m ) \text{Mel频谱图} = \log(E_m) Mel频谱图=log(Em)
最终得到的Mel频谱图表示为:
Mel-Spectrogram ( m , ω ) = log ( ∑ k = 0 N − 1 ∣ X ( m , k ) ∣ 2 ⋅ H m ( k ) ) \text{Mel-Spectrogram}(m, \omega) = \log\left(\sum_{k=0}^{N-1} |X(m, k)|^2 \cdot H_m(k)\right) Mel-Spectrogram(m,ω)=log(k=0∑N−1∣X(m,k)∣2⋅Hm(k))
以上公式和步骤描述了从时域信号到Mel频谱图的完整转换过程。
发展历史
早期发展阶段
在20世纪60年代,研究人员开始探索如何更好地处理和分析音频信号。傅里叶变换提供了一种将信号从时域转换到频域的方法,使得研究人员可以分析信号的频率成分。然而,直接使用傅里叶变换得到的频谱图在处理人类语音时存在一些问题,因为人耳对频率的感知是非线性的。
Mel尺度的提出
1975年,Stevens等人在研究人耳对不同频率声音的感知时提出了Mel尺度。他们发现人耳对频率的感知并不是线性的,而是对低频更敏感,对高频的变化不那么敏感。这一发现促使研究人员将音频信号转换到Mel尺度上,以更好地模拟人类的听觉感知。
Mel频谱图的形成
在Mel尺度提出后,研究人员将频谱图与Mel尺度结合,形成了Mel频谱图。具体方法是先对音频信号进行短时傅里叶变换(STFT),得到频谱图,然后将频谱图中的频率轴转换到Mel尺度上。这一过程包括以下步骤:
- 音频信号预处理:通常包括预加重、分帧和加窗。
- 短时傅里叶变换:对每一帧音频信号进行傅里叶变换,得到频谱图。
- 应用Mel滤波器:将频谱图中的频率成分通过一组Mel滤波器进行滤波,这些滤波器的中心频率和带宽按照Mel尺度分布。
- 取对数:对Mel滤波器输出的能量取对数,得到Mel频谱图。
现代应用与未来发展
现代应用
如今,Mel频谱图在很多领域中有着广泛的应用:
-
语音识别:Mel频谱图是许多语音识别系统中的关键特征表示。结合深度学习技术,Mel频谱图可以作为输入特征用于训练模型,提高语音识别的准确性。
-
音乐信息检索:在音乐分类、音乐推荐和音频检索中,Mel频谱图用于提取音频特征,帮助系统理解和分类音乐内容。
-
语音合成:在文本到语音(TTS)系统中,Mel频谱图可以作为中间表示,将文本转换为语音信号。
-
音频分类:在各种音频分类任务中,Mel频谱图提供了有效的特征表示,用于识别和分类不同的音频信号。
未来发展
随着深度学习和人工智能技术的发展,Mel频谱图的应用前景愈发广阔。一些可能的发展方向包括:
-
更高效的特征提取方法:研究新的方法以更高效地提取Mel频谱图特征,提升计算效率和特征表示能力。
-
多模态融合:将Mel频谱图与其他模态的数据(如图像、文本)结合,提升综合分析和处理能力。
-
自监督学习:利用自监督学习方法,在没有大量标注数据的情况下,从大量未标注的音频数据中学习有效的特征表示。
总结
Mel频谱图作为一种有效的音频信号表示方法,从其提出到如今,经历了多年的发展和应用。其在语音识别、语音合成和音频分类等领域中发挥了重要作用。随着技术的进步,Mel频谱图的应用前景将更加广阔,推动音频信号处理领域的发展。
import torch
from vocos import Vocos
import scipy.io.wavfile as wavfile# 加载预训练的Vocos模型
vocos = Vocos.from_pretrained("charactr/vocos-mel-24khz")# 创建随机的Mel频谱图
mel = torch.randn(1, 100, 256) # B, C, T# 使用Vocos模型解码生成音频
audio = vocos.decode(mel)# 将音频数据从tensor转换为numpy数组,并确保数据格式正确
audio_np = audio.squeeze().cpu().numpy()# 保存音频为WAV文件
sample_rate = 24000
wavfile.write("output.wav", sample_rate, audio_np)