首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用wav2vec实现音频嵌入的问题

使用wav2vec实现音频嵌入的问题
EN

Data Science用户
提问于 2023-01-28 07:21:58
回答 1查看 181关注 0票数 1

我在使用wav2vec库进行音频嵌入时遇到问题,同时试图使用来自EMODB数据集(德语中的情感数据集)的音频信号对情感进行分类。我使用以下代码提取嵌入:

代码语言:javascript
运行
AI代码解释
复制
feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained('facebook/wav2vec2-large-xlsr-53') #XLSR is for SR, not specifically Emotion Rec. 
input_audio, sample_rate = librosa.load(emodb + file,  sr=16000)
extraction = feature_extractor(input_audio, sampling_rate=16000,  return_tensors="np", padding="max_length", max_length=max_len).input_values

向量的嵌入和形状如下:

  • 用于(1, 143652)特性的wav2vec
  • 用于(3, 162)特性的mfcc

请注意,我已将其填充到最高值。音频文件的长度约为1至2秒。

我的任务是检测情绪。我计划使用音频文件和文本中的这些嵌入作为情绪分类的下游模型,为此,我计划使用多模式方法,使用音频和文本嵌入。

因此,我在这些嵌入上训练了一个LSTM模型,但是它总是对训练数据过度拟合(~100%的准确率和~20%的测试)。

然后,我决定使用wav2vec嵌入和MFCC嵌入来完成一个简单的分类任务。当我在一个简单的支持向量机分类器中使用结果嵌入时,我得到了wav2vec嵌入的随机结果(15%-30%)。作为比较,当我使用MFCC提取特征并在同一分类器中使用时,我的准确率约为70%。

当然,我使用TSNE可视化了嵌入,以检查输入的质量,我发现得到了奇怪的结果。具体来说,当我绘制7种情绪时,所产生的情节就形成了螺旋形。当我只绘制2种情绪时,产生的情节是不同的,也是奇怪的。当我添加更多特性(3+)时,映射又是循环的。

我无法理解为什么我要得到这些结果,以及为什么嵌入如此糟糕。我想知道这是否是因为我使用了一个通用的XLSR模型,而没有对它进行微调来识别情感。

对于如何更好地使用wav2vec提取特性,或者任何可能有帮助的文章或实现,我将不胜感激。

EN

回答 1

Data Science用户

回答已采纳

发布于 2023-02-05 05:05:06

我想知道这是否是因为我使用了一个通用的XLSR模型,而没有对它进行微调来识别情感。

这可能仍然是正确的,但是您的方法包含了一个您应该首先消除的基本错误。您正在使用类Wav2Vec2FeatureExtractor从音频文件中提取特征,但这个类不是神经网络。它是一种预处理器,它将浮点时间序列从librosa中提取出来并进行规范化。正如文档所述,规范化确保数组具有:

零均值和单位方差

因此,这些特性只对使用它进行培训的模型有意义。当你用它训练一个支持向量机时,你实际上比较了一个支持向量机是否能打败wav2vec2,而不是wav2vec2是否比它更好!

要从wav2vec2模型获得实际的嵌入,可以使用以下代码:

代码语言:javascript
运行
AI代码解释
复制
import librosa
import torch
from transformers import Wav2Vec2FeatureExtractor, Wav2Vec2Model

input_audio, sample_rate = librosa.load("/content/bla.wav",  sr=16000)

model_name = "facebook/wav2vec2-large-xlsr-53"
feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(model_name)
model = Wav2Vec2Model.from_pretrained(model_name)

i= feature_extractor(input_audio, return_tensors="pt", sampling_rate=sample_rate)
with torch.no_grad():
  o= model(i.input_values)
print(o.keys())
print(o.last_hidden_state.shape)
print(o.extract_features.shape)

输出:

代码语言:javascript
运行
AI代码解释
复制
odict_keys(['last_hidden_state', 'extract_features'])
torch.Size([1, 1676, 1024])
torch.Size([1, 1676, 512])

有关last_hidden_stateextract_features之间的区别,请参阅此D10。正如您所看到的,这些特性对于我的file ()来说是多维的,这意味着您可能希望应用一些池(例如平均值)。

P.S.:当我看到你的问题时,我想到的另一点是,这些嵌入本身是否真的有意义。对于纯伯特,我们知道的句子嵌入:

我不知道这些向量是什么,因为伯特不生成有意义的句子向量。

我想您可能需要对wav2vec2进行一点微调。为此,可以使用huggingfaces Wav2Vec2ForSequenceClassification类。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/118121

复制
相关文章
python 内存泄漏
程序运行时都需要在内存中申请资源用于存放变量,python 在处理内存中的变量时会调用垃圾回收机制,会留心那些永远不会被引用的变量并及时回收变量,删除并释放相关资源。
为为为什么
2022/08/09
2.8K0
python 内存泄漏
内存泄漏
这个笔记是记录一下,关于内存泄漏的知识,之前我们就知道了,如果要用堆必须要释放堆的内存,如果不释放会产生很多的内存垃圾和碎片,影响系统运行效率,甚至出错。
用户7272142
2023/10/11
3400
内存泄漏
leakCanary 内存泄漏
当jvm进行垃圾回收时,无论内存是否充足,如果该对象只有弱引用存在,那么该对象会被垃圾回收器回收,同时该引用会被加入到关联的ReferenceQueue。因此程序通过判断引用队列中是否已经包含指定的引用,来了解被引用的对象是否被GC回收(引用队列存在指定的弱引用,说明对象被回收)
花落花相惜
2021/12/15
1.6K0
内存泄漏测试方法及其python实现
  本文提供了一种轻巧的内存泄漏测试方法及其python实现,该方法在Lenovo Bamboo系统的验收测试活动中得到过诸多检验,是一种易用有效的内存泄漏测试方法。
顾翔
2019/12/12
1.8K0
内存泄漏测试方法及其python实现
jvm内存泄漏
Runtime.getRuntime().freeMemory()表示当前还有多少空闲内存
全栈程序员站长
2022/08/23
1.6K0
jvm内存泄漏
内存泄漏漫谈
对于C/C++来说,内存泄漏问题一直是个很让人头痛的问题,因为对于没有GC的语言,内存泄漏的概率要比有GC的语言大得多,同时,一旦发生问题,也严重的多,而且,内存泄漏的排查往往十分困难。对于内存泄漏,维基百科的定义是:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。内存泄漏的原因通常情况下只能由程序源代码分析出来。如果一个程序存在内存泄
腾讯移动品质中心TMQ
2018/02/06
2.6K0
内存泄漏漫谈
Android 内存泄漏
内存泄漏(Memory Leak):是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
Yif
2019/12/26
1.9K0
内存泄漏分析
在内存映像文件导出中详细的介绍了当应用程序出现内存泄露的时候自动导出内存映像文件。在实际的生产环境中主要是使用jamp通过命令行的模式来导出内存镜像文件,下面详细的阐述下这个过程。
无涯WuYa
2022/12/03
1.9K0
内存泄漏分析
java内存泄漏
一般来说,内存泄漏有两种情况,一种情况如在C/C++语言中的,在堆中分配的内存在没有将其释放掉的时候,就将其所有能访问这块内存的方式都删除掉(如,指针重新赋值)。这种情况就像,占着地儿,别人还没办法引用,又没释放空间,内存泄漏。
MickyInvQ
2020/09/27
1.5K0
NSURLSession内存泄漏
检查代码是否有leak的时候,发现NSURLSession存在leak,最后发现必须session请求完成后,立即释放,代码如下: - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ [session finishTasksAndInvalidate]; }
czjwarrior
2018/05/28
2.2K0
JavaScript内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
张炳
2019/08/02
1.4K0
JavaScript内存泄漏
golang 内存分析/内存泄漏
进入交互式模式之后,比较常用的有 top、list、traces、web 等命令。
ppxai
2020/09/23
9.2K0
内存泄漏和内存溢出
b)创建匿名内部类的静态对象 c)未关闭资源 d)长时间存在的集合容器中创建生命周期短的对象
名字是乱打的
2022/05/13
3.3K0
内存溢出和内存泄漏
通俗的讲就是设备内存不够了。就好比我们的手机,运行内存是4G的,当我们运行了太多的程序时,在运行其他的软件时就会很卡或者提示xx运行停止。
兔云小新LM
2019/07/22
3.2K0
内存溢出和内存泄漏
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费
在水一方
2022/06/14
3.1K0
内存泄漏定位
编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。
muntainyang
2020/09/28
1.7K0
内存泄漏定位
CMFCButton内存泄漏
VS10未打补丁的版本,CMFCButton绑定控件存在内存泄漏,查看MSDN手册
sofu456
2019/07/09
1.2K0
CMFCButton内存泄漏
JAVA NIO内存泄漏
前言 写NIO程序时,经常使用ByteBuffer来读取写入数据,那使用ByteBuffer.allocate()还是ByteBuffer.allocateDirect分配呢? allocate()分配的是jvm堆内存,属于GC管理范畴,需要堆内拷贝,速度较慢。 allocateDireact()直接分配堆外内存,属于OS范畴,没有GC管理,速度较快。 我们希望使用速度更快的方式,但是没有GC管理会产生OOM的问题。 好在OS内存在java中有个DirectByteBuffer与之对应,当GC发生时,这个类
春哥大魔王
2018/04/16
1.8K0
剑指内存泄漏
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,失去了对该段内存的控制,因而造成了内存的浪费。一般我们常说的内存泄漏是指堆内存的泄漏,堆内存使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,必须负责调用free或delete释放相应的内存。
audy
2019/02/13
1.3K0
剑指内存泄漏
浅谈Golang内存泄漏
内存泄漏并不是指物理上的内存消失,而是在写程序的过程中,由于程序的设计不合理导致对之前使用的内存失去控制,无法再利用这块内存区域;短期内的内存泄漏可能看不出什么影响,但是当时间长了之后,日积月累,浪费的内存越来越多,导致可用的内存空间减少,轻则影响程序性能,严重可导致正在运行的程序突然崩溃。
素履coder
2022/10/05
2.6K0
浅谈Golang内存泄漏

相似问题

追踪cocoa内存泄漏

22

Android如何追踪内存泄漏?

10

如何追踪COM内存泄漏

21

无法追踪的AFNetworking内存泄漏

110

追踪JavaScript内存泄漏的工具

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文