Bagus/wav2vec2-xlsr-greek-speech-emotion-recognition
~~~
requirement packages
!pip install git+https://github.com/huggingface/datasets.git !pip install git+https://github.com/huggingface/transformers.git !pip install torchaudio !pip install librosa !git clone https://github.com/m3hrdadfi/soxan cd soxan ~~~
prediction
~~~ import torch import torch.nn as nn import torch.nn.functional as F import torchaudio from transformers import AutoConfig, Wav2Vec2FeatureExtractor
import librosa import IPython.display as ipd import numpy as np import pandas as pd ~~~
~~~ device = torch.device("cuda" if torch.cuda.isavailable() else "cpu") modelnameorpath = "Bagus/wav2vec2-xlsr-greek-speech-emotion-recognition" config = AutoConfig.frompretrained(modelnameorpath) featureextractor = Wav2Vec2FeatureExtractor.frompretrained(modelnameorpath) samplingrate = featureextractor.samplingrate model = Wav2Vec2ForSpeechClassification.frompretrained(modelnameorpath).to(device) ~~~
~~~ def speechfiletoarrayfn(path, samplingrate): speecharray, samplingrate = torchaudio.load(path) resampler = torchaudio.transforms.Resample(samplingrate) speech = resampler(speech_array).squeeze().numpy() return speech
def predict(path, samplingrate): speech = speechfiletoarrayfn(path, samplingrate) inputs = featureextractor(speech, samplingrate=samplingrate, returntensors="pt", padding=True) inputs = {key: inputs[key].to(device) for key in inputs}
with torch.no_grad(): logits = model(**inputs).logits
scores = F.softmax(logits, dim=1).detach().cpu().numpy()[0] outputs = [{"Emotion": config.id2label[i], "Score": f"{round(score * 100, 3):.1f}%"} for i, score in enumerate(scores)] return outputs ~~~
prediction
~~~
path for a sample
path = '/data/jtesv1.1/wav/f01/ang/f01ang01.wav' outputs = predict(path, samplingrate) ~~~
~~~ [{'Emotion': 'anger', 'Score': '98.3%'}, {'Emotion': 'disgust', 'Score': '0.0%'}, {'Emotion': 'fear', 'Score': '0.4%'}, {'Emotion': 'happiness', 'Score': '0.7%'}, {'Emotion': 'sadness', 'Score': '0.5%'}] ~~~
