pytorch版本利用vggish预训练网络提取音频特征
视频多模态分类中的音频特征提取,涉及VGGish,预训练网路。
·
-
介绍
最近开始搞多模态,需要提取视频中的音频特征,调研了下,基本都用的vggish,但是官方用的tensorflow版本,且搜索文章没有一篇完整的文章将音频提取特征的,因此在这里简单写下: 首先用的torch版本的预训练网络来自:https://github.com/tcvrick/audioset-vggish-tensorflow-to-pytorch 该链接已经把tensorflow版本的vggish预训练网络转化为pytorch,大家可自行下载。
-
代码
有了上述的预训练网络,我们就可以来提取音频特征,批量提取视频中音频文件代码如下所示:
import os
import subprocess
video_path='videos'
audio_path='audio'
for item in os.listdir(video_path):
v_path=os.path.join(video_path,item)
name=item[:-4]
d_path=os.path.join(audio_path,name)
d_name=d_path+'.wav'
command ="ffmpeg -i {} -ab 160k -ac 2 -ar 44100 -vn {}".format(v_path,d_name)
subprocess.call(command, shell=True)
其中ffmpeg需自行安装。
提取音频特征代码如下:
from torchvggish.vggish import VGGish
from torchvggish.audioset import vggish_input
import torch
import os
import numpy as np
device="cuda:1" if torch.cuda.is_available() else 'cpu'
model=VGGish()
state_dict=torch.load('pretrained/pytorch_vggish.pth',map_location=device)
model.load_state_dict(state_dict)
model.eval().to(device)
audio_path='audio'
for item in os.listdir(audio_path):
print(item)
input_wavfile=os.path.join(audio_path,item)
wav_preprocess=vggish_input.wavfile_to_examples(input_wavfile)
wav_preprocess = torch.from_numpy(wav_preprocess).unsqueeze(dim=1)
input_wav = wav_preprocess.float().to(device)
audio_feature_name=os.path.basename(input_wavfile)
audio_feature_name=audio_feature_name[:-4]
with torch.no_grad():
output=model(input_wav)
output=output.squeeze(0)
output=output.cpu().detach().numpy()
np.save('./audio_feature/'+audio_feature_name+'.npy',output)
也是批量提取的。
完结,大家有哪里不懂得可在评论区评论,希望大家多多点赞,好久没写文章了!!
更多推荐
已为社区贡献1条内容
所有评论(0)