使用padmalcom/wav2vec2预训练模型实现尖叫检测遇异常求助
问题背景
- 一直有个疑问:智能手机配备了麦克风、摄像头、GPS、陀螺仪等可检测恐慌状态的输入设备,为何仍需要复杂的手动步骤触发SOS功能?
- 找到
padmalcom/wav2vec2-large-nonverbalvocalization-classification模型,该模型宣称可检测尖叫,但使用测试尖叫音频运行时,每次得到的结果都不同。
初始测试脚本
from transformers import Wav2Vec2ForSequenceClassification model_name = "padmalcom/wav2vec2-large-nonverbalvocalization-classification" model = Wav2Vec2ForSequenceClassification.from_pretrained(model_name) import librosa audio_path = "scream_test.wav" audio, sample_rate = librosa.load(audio_path, sr=48000) from scipy.stats import zscore audio = zscore(audio) import torch torch.manual_seed(42) inputs = torch.tensor(audio).unsqueeze(0) outputs = model(inputs) predicted_class_index = torch.argmax(outputs.logits, dim=1).item() labels = model.config.id2label print(labels[predicted_class_index])
运行时警告
Some weights of Wav2Vec2ForSequenceClassification were not initialized from the model checkpoint at padmalcom/wav2vec2-large-nonverbalvocalization-classification and are newly initialized: ['classifier.bias', 'classifier.weight', 'projector.bias', 'projector.weight', 'wav2vec2.encoder.pos_conv_embed.conv.parametrizations.weight.original0', 'wav2vec2.encoder.pos_conv_embed.conv.parametrizations.weight.original1']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
简化测试尝试
from transformers import pipeline model_name = 'padmalcom/wav2vec2-large-nonverbalvocalization-classification' classifier = pipeline('audio-classification', model=model_name) print(classifier("scream_test.wav"))
核心疑问
我哪里操作出错了?
问题分析与解决
- 警告本质:这个模型的 checkpoint 缺失部分关键权重(分类器、投影层以及位置卷积嵌入的参数),这些权重是加载时随机初始化的,并非预训练或微调后的权重。也就是说,该模型没有完成针对非语言发声分类任务的训练,直接拿来推理必然无效。
- 结果不一致原因:未初始化的随机权重导致模型每次推理的输出存在不确定性,即使设置了
torch.manual_seed(42),也可能因为部分操作(如GPU上的并行计算)的随机性无法完全消除,最终结果波动。 - 解决方法:
- 准备包含尖叫在内的非语言发声分类数据集(可寻找公开数据集或自行录制标注)。
- 使用该数据集对模型进行下游任务微调,训练那些未初始化的权重,直到模型在验证集上的分类性能稳定。
- 保存微调后的模型 checkpoint,用这个训练完成的模型做推理,结果会一致且符合预期。
内容的提问来源于stack exchange,提问作者Chakradar Raju
相关产品推荐
相关产品推荐

