Python音频处理-频谱图实现

简介: 本教程介绍如何使用 PyTorch 提取音频特征,重点实现频谱图的生成。内容包括使用 torchaudio 进行频谱提取、频谱图维度解析、手动实现频谱计算步骤,并对两种方法的结果进行对比分析,展示其差异与实现细节。

参考 pytorch 音频特征提取教程:

https://docs.pytorch.org/audio/stable/tutorials/audio_feature_extractions_tutorial.html

准备

from IPython.display import Audio
from torchaudio.utils import download_asset
from librosa import power_to_db
import matplotlib.pyplot as plt
import numpy as np
import torchaudio

# 基本参数
n_fft = 512
hop_length = 512

# 示例音频
sample_speech = download_asset(
    "tutorial-assets/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav"
)

# 提取频谱
waveform, sample_rate = torchaudio.load(sample_speech)
print(waveform.shape)
print(sample_rate)

torchaudio实现

spectrogram = torchaudio.transforms.Spectrogram(
    n_fft=n_fft,
    hop_length=hop_length
)
spec = spectrogram(waveform)
spec.shape

torch.Size([1, 257, 107])

频谱有三个维度:

通道域: 单声道即为1,双声道即为2

频率域: n_fft // 2 + 1

时间域: (总采样数 / 窗口长度(win_length)) + 1 (默认每次移动半个窗口)

# 绘制波形和频谱图
_, axs = plt.subplots(2, 1)
axs[0].plot(waveform[0])
axs[1].imshow(
    power_to_db(spec[0]), 
    origin='lower', 
    aspect='auto', 
    interpolation='nearest'
)
plt.tight_layout()
plt.show()

image.png

自实现

实现频谱图计算一般包括一下步骤:

  • 1、计算帧数。时间维度的长度。
  • 2、扩展信号。如果不满足整数帧的长度,需要扩展原始信号满足长度。
  • 3、分帧。
  • 4、快速傅里叶变换。
# 手动实现频谱计算
def my_spectrogram(signal, n_fft=512, hop_length=512):
    # 数组转换
    signal = np.asarray(signal)
    # 计算帧数
    signal_length = len(signal)
    num_frames = int(np.ceil(signal_length / hop_length))
    # 扩展信号
    pad_length = (num_frames - 1) * hop_length + n_fft - signal_length
    signal = np.pad(
        signal,
        (0, pad_length),
        mode='constant'
    )
    # 分帧
    frames = np.lib.stride_tricks.sliding_window_view(
        signal,
        window_shape=n_fft
    )[::hop_length]
    # 加窗
    window = np.hanning(n_fft)
    frames = frames * window
    # 快速傅里叶变换
    fft_result = np.fft.fft(frames, axis=1)
    magnitude_spectrum = np.abs(fft_result) ** 2
    # 对称处理
    magnitude_spectrum = magnitude_spectrum[:, : n_fft//2 + 1]
    return magnitude_spectrum
# 计算频谱
my_spec = my_spectrogram(waveform[0].numpy())
my_spec.shape

(107, 257)

对比两个频谱

# 绘制波形和频谱图
_, axs = plt.subplots(2, 1)
axs[0].imshow(
    power_to_db(spec[0]), 
    origin='lower', 
    aspect='auto', 
    interpolation='nearest'
)
axs[1].imshow(
    power_to_db(my_spec.T), 
    origin='lower', 
    aspect='auto', 
    interpolation='nearest'
)
plt.tight_layout()
plt.show()

image.png

如上图,频谱图,肉眼看不出什么较大差别。

但是mse差异较大:

# 计算两个频谱差距
import torch
mse = torch.square(spec[0] - my_spec.T).mean().item()
mse

604.3883183638077

相关文章
|
语音技术 Python
在语音信号处理中,预加重
在语音信号处理中,预加重
1144 2
|
存储 Java 编译器
Java编程中,包声明(Package Declaration)
Java编程中,包声明(Package Declaration)
733 1
|
机器学习/深度学习 算法 PyTorch
挑战Transformer的新架构Mamba解析以及Pytorch复现
今天我们来详细研究这篇论文“Mamba:具有选择性状态空间的线性时间序列建模”
2957 2
|
应用服务中间件
tomcat修改默认端口详细步骤(包含运行测试)
在tomcat端口被占用或者需要把默认的8080端口换成其他的端口,就可以修改默认端口。
3579 0
tomcat修改默认端口详细步骤(包含运行测试)
|
10月前
|
Python
Python音频特征-梅尔滤波器
梅尔滤波器组是一种基于梅尔刻度的三角滤波器组,常用于音频信号处理。其构建步骤包括:获取梅尔刻度的范围、生成梅尔刻度序列、构建三角滤波器组并进行归一化处理。梅尔刻度反映了人耳对频率的感知特性,能更有效地表示音频特征。
438 0
|
9月前
|
存储 数据采集 人工智能
切块、清洗、烹饪:RAG知识库构建的三步曲
大语言模型明明已经喂了大量文档,为什么还是答非所问?就像米其林厨师需要精心处理食材,RAG系统也需要巧妙处理文档。从文本分块、清洗到结构化索引,这些不起眼的处理步骤决定了AI回答质量的上限。掌握这些技巧,让你的RAG系统从「路边摊」蜕变为「米其林餐厅」。
1741 3
|
机器学习/深度学习 人工智能 自然语言处理
Dolphin:40语种+22方言!清华联合海天瑞声推出的语音识别大模型,识别精度超Whisper两代
Dolphin是清华大学与海天瑞声联合研发的语音识别大模型,支持40种东方语言和22种中文方言,采用CTC-Attention混合架构,词错率显著低于同类模型。
5519 50
Dolphin:40语种+22方言!清华联合海天瑞声推出的语音识别大模型,识别精度超Whisper两代
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
3285 2
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
8622 0
如何绘制PAD图和N-S图(详细步骤)
如何绘制PAD图和N-S图(详细步骤)
4283 0

热门文章

最新文章