草庐IT

音频向量:VGGish(Pytorch)

M.Jael 2023-04-09 原文

谷歌在 2017 年公开了大规模音频数据集 AudioSet,包含了大约 210 万个长度为 10 秒的声音片段和 527个标签。随即谷歌使用该数据集进行预训练,最终得到 VGGish 模型用于音频的特征提取。Tensorflow 官方 github 收录了 VGGish 的源代码,并且在 Tensorflow Hub 上提供了用于音频向量化的 VGGish 模型接口。 那如何在 Pytorch 框架中实现并使用 VGGish 呢?网上有一些关于 VGGish 在 Pytorch 中的介绍与实现,但我体验下来感觉大部分不是很方便使用,并且得到的向量还是与源码有不小的出入,向量搜索的测试效果不尽人意。如果是为了用向量实现音频识别,Towhee 提供了简单易用的接口,并且经过测试,音频向量的结果与源码特征提取是一样的。

Towhee 音频向量

x2Vec, Towhee is all you needhttps://towhee.io/

Towhee 提供的 pipeline audio-embedding-vggish 默认使用了 torch-vggish,方便得到音频向量,调用方法如下:

from towhee import pipeline 
 
embedding_pipeline = pipeline('towhee/audio-embedding-vggish') 
embeddings = embedding_pipeline('path/to/your/audio') 

如果想使用 Tensorflow VGGish,只需要将 audio_embedding_vggish.yaml 中 'towhee/torch-vggish' 替换成 'towhee/tf-vggish-audioset' 即可。 torch-vggish 与 tf-vggish-audioset 的音频向量结果是相同的,区别只在于框架的使用。

Torch-VGGish

Towhee 使用的算子 torch-vggish 使用了 VGGish 源码中对音频的预处理(vggish_params.pymel_features.pyvggish_input.py),主要通过重新构建模型和加载权重实现 Pytorch 中的 VGGish。

1. 构建模型

通过源代码中的 vggish_slim.py,我们可以得到 VGGish 的分层结构,然后使用 torch.nn 搭建模型:

import torch.nn as nn 
 
class VGG(nn.Module): 
    def __init__(self): 
        super(VGG, self).__init__() 
        self.features = nn.Sequential( 
            nn.Conv2d(1, 64, 3, 1, 1), 
            nn.ReLU(inplace=True), 
            nn.MaxPool2d(2, 2), 
            nn.Conv2d(64, 128, 3, 1, 1), 
            nn.ReLU(inplace=True), 
            nn.MaxPool2d(2, 2), 
            nn.Conv2d(128, 256, 3, 1, 1), 
            nn.ReLU(inplace=True), 
            nn.Conv2d(256, 256, 3, 1, 1), 
            nn.ReLU(inplace=True), 
            nn.MaxPool2d(2, 2), 
            nn.Conv2d(256, 512, 3, 1, 1), 
            nn.ReLU(inplace=True), 
            nn.Conv2d(512, 512, 3, 1, 1), 
            nn.ReLU(inplace=True), 
            nn.MaxPool2d(2, 2)) 
        self.embeddings = nn.Sequential( 
            nn.Linear(512 * 24, 4096), 
            nn.ReLU(inplace=True), 
            nn.Linear(4096, 4096), 
            nn.ReLU(inplace=True), 
            nn.Linear(4096, 128), 
            #nn.ReLU(inplace=True) 
        ) 

经过测试,如果想要使用音频向量进行相似搜索,去掉最后的 ReLU 层效果更好。若是用于分类任务,建议使用原始结构。

2. 加载权重

原始模型文件得到 VGGish 的变量数据后,为了将其对应到每一层 torch layer 中(排除 ReLU 层和 MaxPool 层),我们需要将 variables 中的weights 和 biases 都转换成 torch.Tensor。除了手动操作来实现模型参数在框架中的转换,我们可以在 torch-vggish 中找到转换后的模型参数文件 vggish.pth 。接下来就只需要用搭建好的模型加载权重,就能够使用 Pytorch 版的 VGGish 了。

import torch 
 
model = VGG() 
saved_state_dict = torch.load('path/to/vggish.pth', map_location=torch.device('cpu')) 
model.load_state_dict(saved_state_dict) 
model.eval() 

有关音频向量:VGGish(Pytorch)的更多相关文章

  1. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  2. 解决台式机麦克风不可用问题,只有音频输出,无音频输入 - 2

    解决台式机麦克风不可用问题戴尔灵越3880最近因为需要开线上会议,发现戴尔台式机音频只有输出没有输入,也就是只能听见声音,无法输入声音。先后尝试了各种驱动安装更新之类的调试,无果。之后通过戴尔支持解决~这里多说一句,专业的就是专业,问题描述过去,直接给了解决方案,可能是他们遇到的相似问题比较多了,但也告诉我们,有些时候是可以通过这些官方服务解决问题的,比起自己折腾效率要高很多。那就记录一下吧~问题描述:电脑只能输出声音,不能输入声音。1、前提需要准备一只带麦克风的耳机,将耳机插入面板。2、先确定是否可以听到声音,可以通过播放歌曲或者视频。3、然后确认麦克风是否可用,可以通过调用win自带麦克风

  3. 从零开始系列(1)—— Anaconda + PyCharm + PyTorch(GPU) + 虚拟环境(全步骤,多图警告) - 2

    Anaconda+PyCharm+PyTorch(GPU)+虚拟环境声明一、安装Anaconda二、安装PyCharm三、创建虚拟环境并安装PyTorch四、关联虚拟环境五、致谢声明感谢姜小敏同学对我的支持、鼓励和鞭策!默认你的电脑上已经装有GPU,如果没有GPU,可以正常的进行各种下载安装操作,但是最终结果会有所不同。一、安装Anaconda首先,进入Anaconda官网,单击Download按钮,稍微等待即可下载安装包。下载好之后,双击打开安装包,进行一系列安装操作。建议安装路径全英文,并且一定要记住安装地址。此处不勾选第二项,因此之后需要人为配置环境变量。没啥用,不用勾选,就是跳出两个打

  4. ruby - 我将如何以编程方式与 VST(i) 插件交互以合成音频? - 2

    以VSTiTriforce为例,由Tweakbench提供。当加载到市场上的任何VST主机时,它允许主机向VSTi发送(大概是MIDI)信号。然后VSTi将处理该信号并输出​​由VSTi内的软件乐器创建的合成音频。例如,将A4(我相信是MIDI音符)发送到VSTi会导致它合成高于中央C的A。它将音频数据发送回VST主机,然后它可以在我的扬声器上播放或将其保存为.wav或其他一些音频文件格式。假设我有Triforce,我正在尝试用我选择的语言编写一个程序,它可以通过发送要合成的A4纸条与VSTi交互,并自动将其保存到系统上的文件?最终,我希望能够解析整个单轨MIDI文件(使用已经可用于此

  5. D类音频功放NS4110B电路设计 - 2

    特性工作电压范围:6V-14V输出功率:7W(CLASSD,7.4V/4Ω,THD=10%)10W(CLASSD,9V/4Ω,THD=10%)18W(CLASSD,12V/4Ω,THD=10%)最高可达92%效率(12V/8Ω)电平设置工作模式无需输出滤波器差分输入优异的“上电,掉电”噪声抑制过流保护、过热保护、欠压保护 eSOP-8封装典型应用电路很简单:如下是本人的设计。 输入电阻:输入电阻主要是确定增益,即输出功率,所以一定要确定输入信号的幅度,喇叭的幅度,前后使用有效值计算。此设计搭配的喇叭是8R3W,额定功率3W,额定电压4.89V(有效值),最大功率4W。我们先确定输入信号的赋值,

  6. ruby - 有效地处理数字数组的 "scale"或 "resize"的算法(音频重采样) - 2

    做音频处理(虽然它也可以是图像处理)我有一个一维数字数组。(它们恰好是代表音频样本的16位有符号整数,这个问题同样适用于float或不同大小的整数。)为了匹配不同频率的音频(例如,将44.1kHz样本与22kHz样本混合),我需要拉伸(stretch)或压缩值数组以满足特定长度。将数组减半很简单:每隔一个样本丢弃一次。[231,8143,16341,2000,-9352,...]=>[231,16341,-9352,...]将数组宽度加倍稍微不那么简单:将每个条目加倍(或可选地在相邻的“真实”样本之间执行一些插值)。[231,8143,16341,2000,-9352,...]=>[2

  7. javascript - 如何将两个输入 channel 连接到 ScriptProcessorNode? (网络音频 API,JavaScript) - 2

    我正在尝试实现一个具有两个输入channel和一个输出channel的ScriptProcessorNode。varsource=newArray(2);source[0]=context.createBufferSource();source[0].buffer=buffer[0];source[1]=context.createBufferSource();source[1].buffer=buffer[1];vartest=context.createScriptProcessor(4096,2,1);source[0].connect(test,0,0);source[1].c

  8. Javascript 音频对象 onload 事件 - 2

    我正在尝试在加载Javascriptaudio()对象时调用一个函数,但使用onload时它不起作用。myaud.onload=audioDone;但它正在使用image()对象。我怎样才能让它与audio()对象一起工作?谢谢 最佳答案 安元素有一组特定的事件称为mediaevents,和onload不是其中之一您可以使用canplaythrough检查音频是否已加载并可以播放。事件myaud.addEventListener('canplaythrough',audioDone,false);

  9. javascript - Web 音频 API 获取 <audio> 元素的 AudioBuffer - 2

    我有一个音频元素varaudioSrc='https://mfbx9da4.github.io/assets/audio/dope-drum-loop_C_major.wav'varaudio=document.createElement('audio')audio.src=audioSrc我需要AudioBuffer做beatdetection所以我尝试在加载音频时访问缓冲区:audio.oncanplaythrough=()=>{console.info('loaded');varsource=context.createMediaElementSource(audio);sour

  10. javascript - 在 Javascript 中启动和停止音频 - 2

    我有一个绑定(bind)到onClick事件的函数。它应该播放一首歌。如果有一首歌曲已经在播放,它应该停止当前歌曲并开始播放新歌曲。唯一的问题是,据我所知,只有一个pause方法,这意味着上一首歌曲将从暂停位置而不是开头继续播放。有什么办法解决这个问题(比如.stop()方法)吗?这是我的代码:varcurrSong="";functionplaySong(newSong){alert(newSong);if(newSong!=""){if(currSong!=""){document.getElementById(currSong).pause();}document.getElem

随机推荐