
在 simli,我们最关心的是延迟。毕竟,这就是我们的目标:低延迟视频。另一方面,音频机器学习中一些最常用的算法的实现速度非常慢。需要明确的是,这些实现通常适合创建模型本身或批量推理。但对于 simli 的我们来说,几毫秒就可能意味着视频是断断续续的混乱还是流畅。
对我来说幸运的是(以及作为读者的代理),本指南不需要太多数学知识,更聪明的人已经弄清楚如何获得正确的答案,我们只是让计算更加高效。如果您需要更多信息来了解 melspectrogram 到底是什么,您可以阅读这篇文章。计算频谱图的方法有多种,这在很大程度上取决于您的应用程序。因此,为了方便作者,我们将重点放在运行内部模型所需的梅尔上。
您很可能是在遇到使用 librosa 的存储库后来到这里的。老实说,这是一个非常方便的图书馆。有大量实用程序、读取磁盘上音频的简单方法以及快速访问许多常用功能(例如音频重采样、通道缩混等)。在我们的例子中,我们对一种特定的功能感兴趣:梅尔谱图计算。在 librosa 中,获取梅尔光谱图非常简单。
import librosa
# load in any audio to test
sampleaudio, sr = librosa.load("sample.mp3", sr=none) # sr=none means the original sampling rate
spectrogram = librosa.feature.melspectrogram(
y=sampleaudio,
sr=sr,
n_fft=int(0.05 * sr), # 50ms
hop_length=int(0.0125 * sr), # 12.5ms
win_length=int(0.05 * sr),
)
很简单,在 gcp g2 虚拟机上平均需要 2 毫秒左右。嗯,有两个主要问题:
在尝试了解其他人是如何做到这一点时(幸运的是,这对我们来说不是一个独特的问题),我发现这篇文章解释了梅尔谱图的工作原理,并提供了一个参考实现,由于某种原因,该实现仅花费了 1 毫秒(50 % 改进)。这是一个好的开始,但仍然存在第一个问题,并非所有内容都在 gpu 上。我们正在使用 pytorch,并一直依赖 torch.compile 和 mode=reduce-overhead 来最大程度地提高速度。然而,像这样的数据传输可能会降低性能,因为 pytorch 编译器也无法优化该函数。解决方案有点繁琐但是相对简单,用torch重写一下即可。 pytorch 团队已确保其许多语法和功能尽可能接近 numpy(一些边缘情况通常都有详细记录,除了让我迷失了几天的情况,但这是另一个博客的故事) .
因此,为了成功重写 pytorch 中的所有内容,我们需要执行几个步骤。梅尔谱图可以分为三个步骤:
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,旨在提供便捷的用户体验,无需下载安装即可在微信内使用。本压缩包包含了丰富的源码资源,涵盖了多个领域的应用场景,下面将逐一介绍其中涉及的知识点。1. 图片展示:这部分源码可能涉及了微信小程序中的``组件的使用,用于显示图片,以及`wx.getSystemInfo`接口获取屏幕尺寸,实现图片的适配和响应式布局。可能还包括了图片懒加
0
有好消息也有坏消息。好消息是所有必需的功能都可以在 pytorch 或 torchaudio 中轻松获得。坏消息是默认行为与 librosa 有很大不同,因此需要进行大量配置和反复试验才能使其正确。我经历过这一切,我分享这些信息是因为我什至不希望我最大的敌人遭受这种地狱般的打击。我们需要理解的一件事是,这段代码严重依赖于缓存一些结果以供以后使用。这是在预生成所有静态数组的初始化函数中完成的(例如,梅尔频率库取决于采样率和所需的梅尔数量)。这是我们使用 pytorch 优化的 melspectrogram 函数
import torch
if torch.cuda.is_available
@torch.compile(mode="reduce-overhead")
else:
@torch.compile
def melspecrogram_torch(wav:torch.tensor,sample_rate:int, hann_window: torch.tensor, mel_basis: torch.tensor):
stftwav = torch.stft(
wav,
n_fft=int(sample_rate*0.05),
win_length=int(sample_rate*0.05),
hop_length=int(sample_rate*0.0125),
window=hann_window,
pad_mode="constant",
return_complex=true,
).abs()
stftwav = stftwav.squeeze()
mel_stftwav = torch.mm(mel_basis, stftwav)
return mel_stftwav
device = "cuda" if torch.cuda.is_available() else "cpu"
melspectrogram_torch(
sampleaudio,
sr,
torch.hann_window(int(sample_rate*0.05), device=device, dtype=torch.float32),
torchaudio.functional.melscale_fbanks(
sample_rate=sr,
n_freqs=(int(sample_rate*0.05) // 2 + 1),
norm="slaney", # this is the normalization algorithm used by librosa
# this is an example that's related to our own pipeline, check what you need for yours
n_mels=80,
f_min=55,
f_max=7600,
)
.t.to(device)
)
初始编译运行后,我们使用 nvidia l4 gpu(缓存 hann_window 和 melscale_fbanks)测量该函数需要 350 微秒。调整后的调用将如下所示:
hann=torch.hann_window(int(sample_rate*0.05), device=device, dtype=torch.float32),
melscale=torchaudio.functional.melscale_fbanks(
sample_rate=sr,
n_freqs=(int(sample_rate*0.05) // 2 + 1),
norm="slaney", # this is the normalization algorithm used by librosa
# this is an example that's related to our own pipeline, check what you need for yours
n_mels=80,
f_min=55,
f_max=7600,
)
.T.to(device)
melspectrogram_torch(
sampleAudio,
sr,
hann,
melscale,
)
这是关于我们如何优化部署的预训练模型、优化预处理和后处理步骤的一系列文章的一部分。您可以查看 https://www.simli.com/demo 查看已部署的模型以及我们提供的最低延迟的头像
以上就是适用于您的实时应用程序的 Supersonic GPU MelSpectrogram的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号