如何在R语言中从WAV文件或提取的信号直接获取Mel Spectrogram?
从WAV文件或提取信号生成梅尔频谱(Mel Spectrogram)
当然可以,结合你已安装的R包,有几种直接生成梅尔频谱的方式,以下是具体实现:
方法1:用seewave包处理(支持WAV文件/已提取信号)
seewave的mel和melfilterbank可配合基础频谱生成步骤,快速得到梅尔频谱。
从WAV文件直接处理
library(seewave) # 读取目标WAV文件 wav <- readWave("your_audio.wav") # 生成线性频谱矩阵(关闭自动绘图) spec <- spectro(wav, plot = FALSE) # 创建梅尔滤波器组 mel_filters <- melfilterbank(nfreq = nrow(spec$amp), f = wav@samp.rate, nmel = 40) # 将线性频谱通过梅尔滤波器,得到梅尔频谱 mel_spec <- mel_filters %*% spec$amp
从已提取的信号处理
如果已经拿到单声道信号向量(比如wav@left):
# 假设sig是已提取的单声道信号,samp_rate为采样率 sig <- wav@left samp_rate <- wav@samp.rate # 计算信号的线性频谱 spec <- spectro(sig, f = samp_rate, plot = FALSE) # 生成梅尔滤波器并转换频谱 mel_filters <- melfilterbank(nfreq = nrow(spec$amp), f = samp_rate, nmel = 40) mel_spec <- mel_filters %*% spec$amp
方法2:用torchaudio包(更简洁的一站式生成)
torchaudio提供了封装好的梅尔频谱转换函数,操作更直接:
library(torchaudio) # 读取WAV文件并生成梅尔频谱 waveform <- torchaudio_load("your_audio.wav")[[1]] sample_rate <- torchaudio_load("your_audio.wav")[[2]] # 定义梅尔频谱转换规则 mel_transform <- torchaudio_transforms_MelSpectrogram( sample_rate = sample_rate, n_mels = 40, n_fft = 1024, hop_length = 256 ) # 生成梅尔频谱 mel_spec <- mel_transform(waveform)
如果是已提取的信号,只需将R向量转为torch张量即可:
# 将R格式信号转为torch张量(添加通道维度) sig_tensor <- torch_tensor(sig, dtype = torch_float32)$unsqueeze(1) # 生成梅尔频谱 mel_spec <- mel_transform(sig_tensor)
注意事项
- 可通过调整
nmel(梅尔滤波器数量)、n_fft(FFT窗口大小)、hop_length(帧移)等参数,控制梅尔频谱的时间/频率分辨率。 - seewave生成的
mel_spec是R矩阵格式,torchaudio生成的是torch张量,可通过as.array()转换为R原生格式用于后续分析。
内容的提问来源于stack exchange,提问作者Murali
相关产品推荐
相关产品推荐

