|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import pandas as pd |
|
import os |
|
|
|
import json |
|
import numpy as np |
|
import audonnx |
|
import audb |
|
from pathlib import Path |
|
import transformers |
|
import torch |
|
import audmodel |
|
import audinterface |
|
import matplotlib.pyplot as plt |
|
import audiofile |
|
|
|
LABELS = ['arousal', 'dominance', 'valence', |
|
'speech_synthesizer', 'synthetic_singing', |
|
'Angry', |
|
'Sad', |
|
'Happy', |
|
'Surprise', |
|
'Fear', |
|
'Disgust', |
|
'Contempt', |
|
'Neutral' |
|
] |
|
|
|
|
|
args = transformers.Wav2Vec2Config() |
|
args.dev = torch.device('cuda:0') |
|
args.dev2 = torch.device('cuda:0') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _softmax(x): |
|
'''x : (batch, num_class)''' |
|
x -= x.max(1, keepdims=True) |
|
x = np.maximum(-100, x) |
|
x = np.exp(x) |
|
x /= x.sum(1, keepdims=True) |
|
return x |
|
|
|
def _sigmoid(x): |
|
'''x : (batch, num_class)''' |
|
return 1 / (1 + np.exp(-x)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for long_audio in [ |
|
|
|
|
|
'human_770.wav', |
|
'mimic3_770.wav', |
|
'mimic3_speed_770.wav' |
|
]: |
|
file_interface = f'timeseries_{long_audio.replace("/", "")}.pkl' |
|
if not os.path.exists(file_interface): |
|
|
|
|
|
print('_______________________________________\nProcessing\n', file_interface, '\n___________') |
|
|
|
|
|
|
|
|
|
|
|
from transformers import AutoModelForAudioClassification |
|
import types |
|
def _infer(self, x): |
|
'''x: (batch, audio-samples-16KHz)''' |
|
x = (x + self.config.mean) / self.config.std |
|
x = self.ssl_model(x, attention_mask=None).last_hidden_state |
|
|
|
h = self.pool_model.sap_linear(x).tanh() |
|
w = torch.matmul(h, self.pool_model.attention) |
|
w = stylesoftmax(1) |
|
mu = (x * w).sum(1) |
|
x = torch.cat( |
|
[ |
|
mu, |
|
((x * x * w).sum(1) - mu * mu).clamp(min=1e-7).sqrt() |
|
], 1) |
|
return self.ser_model(x) |
|
|
|
teacher_cat = AutoModelForAudioClassification.from_pretrained( |
|
'3loi/SER-Odyssey-Baseline-WavLM-Categorical-Attributes', |
|
trust_remote_code=True |
|
).to(args.dev2).eval() |
|
teacher_cat.forward = types.MethodType(_infer, teacher_cat) |
|
|
|
|
|
|
|
|
|
|
|
audioset_model = audonnx.load(audmodel.load('17c240ec-1.0.0'), device='cuda:0') |
|
adv_model = audonnx.load(audmodel.load('90398682-2.0.0'), device='cuda:0') |
|
|
|
def process_function(x, sampling_rate, idx): |
|
'''run audioset ct, adv |
|
|
|
USE onnx teachers |
|
|
|
return [synth-speech, synth-singing, 7x, 3x adv] = 11 |
|
''' |
|
|
|
|
|
|
|
|
|
|
|
logits_cat = teacher_cat(torch.from_numpy(x).to(args.dev)).cpu().detach().numpy() |
|
|
|
|
|
logits_audioset = audioset_model(x, 16000)['logits_sounds'] |
|
logits_audioset = logits_audioset[:, [7, 35]] |
|
|
|
logits_adv = adv_model(x, 16000)['logits'] |
|
|
|
cat = np.concatenate([logits_adv, |
|
_sigmoid(logits_audioset), |
|
_softmax(logits_cat)], |
|
1) |
|
print(cat) |
|
return cat |
|
|
|
interface = audinterface.Feature( |
|
feature_names=LABELS, |
|
process_func=process_function, |
|
|
|
process_func_applies_sliding_window=False, |
|
win_dur=40.0, |
|
hop_dur=10.0, |
|
sampling_rate=16000, |
|
resample=True, |
|
verbose=True, |
|
) |
|
df_pred = interface.process_file(long_audio) |
|
df_pred.to_pickle(file_interface) |
|
else: |
|
print(file_interface, 'FOUND') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
preds = {} |
|
SHORTEST_PD = 100000 |
|
for long_audio in [ |
|
|
|
|
|
'human_770.wav', |
|
'mimic3_770.wav', |
|
'mimic3_speed_770.wav' |
|
]: |
|
file_interface = f'timeseries_{long_audio.replace("/", "")}.pkl' |
|
y = pd.read_pickle(file_interface) |
|
preds[long_audio] = y |
|
SHORTEST_PD = min(SHORTEST_PD, len(y)) |
|
|
|
|
|
|
|
for k,v in preds.items(): |
|
p = v[:SHORTEST_PD] |
|
|
|
p.reset_index(inplace= True) |
|
p.drop(columns=['file','start'], inplace=True) |
|
p.set_index('end', inplace=True) |
|
|
|
p.index = p.index.map(mapper = (lambda x: x.total_seconds())) |
|
preds[k] = p |
|
|
|
print(p, '\n\n\n\n \n') |
|
|
|
|
|
|
|
|
|
fig, ax = plt.subplots(nrows=10, ncols=2, figsize=(24, 24), gridspec_kw={'hspace': 0, 'wspace': .04}) |
|
|
|
|
|
|
|
|
|
time_stamp = preds['human_770.wav'].index.to_numpy() |
|
for j, dim in enumerate(['arousal', |
|
'dominance', |
|
'valence']): |
|
|
|
|
|
|
|
ax[j, 0].plot(time_stamp, preds['mimic3_770.wav'][dim], |
|
color=(0,104/255,139/255), |
|
label='mean_1', |
|
linewidth=2) |
|
ax[j, 0].fill_between(time_stamp, |
|
|
|
preds['mimic3_770.wav'][dim], |
|
preds['human_770.wav'][dim], |
|
|
|
color=(.2,.2,.2), |
|
alpha=0.244) |
|
if j == 0: |
|
ax[j, 0].legend(['StyleTTS2 style mimic3', |
|
'StyleTTS2 style crema-d'], |
|
prop={'size': 10}, |
|
|
|
) |
|
ax[j, 0].set_ylabel(dim.lower(), color=(.4, .4, .4), fontsize=14) |
|
|
|
|
|
ax[j, 0].set_ylim([1e-7, .9999]) |
|
|
|
|
|
ax[j, 0].set_xticklabels(['' for _ in ax[j, 0].get_xticklabels()]) |
|
ax[j, 0].set_xlim([time_stamp[0], time_stamp[-1]]) |
|
|
|
|
|
|
|
|
|
|
|
ax[j, 1].plot(time_stamp, preds['mimic3_speed_770.wav'][dim], |
|
color=(0,104/255,139/255), |
|
label='mean_1', |
|
linewidth=2) |
|
ax[j, 1].fill_between(time_stamp, |
|
|
|
preds['mimic3_speed_770.wav'][dim], |
|
preds['human_770.wav'][dim], |
|
|
|
color=(.2,.2,.2), |
|
alpha=0.244) |
|
if j == 0: |
|
ax[j, 1].legend(['StyleTTS2 style mimic3 4x speed', |
|
'StyleTTS2 style crema-d'], |
|
prop={'size': 10}, |
|
|
|
) |
|
|
|
|
|
ax[j, 1].set_xlabel('767 Harvard Sentences (seconds)') |
|
|
|
|
|
|
|
|
|
ax[j, 1].set_ylim([1e-7, .9999]) |
|
|
|
ax[j, 1].set_xticklabels(['' for _ in ax[j, 0].get_xticklabels()]) |
|
ax[j, 1].set_xlim([time_stamp[0], time_stamp[-1]]) |
|
|
|
|
|
|
|
|
|
ax[j, 0].grid() |
|
ax[j, 1].grid() |
|
|
|
|
|
|
|
|
|
|
|
|
|
time_stamp = preds['human_770.wav'].index.to_numpy() |
|
for j, dim in enumerate(['Angry', |
|
'Sad', |
|
'Happy', |
|
'Surprise', |
|
'Fear', |
|
'Disgust', |
|
'Contempt', |
|
|
|
]): |
|
j = j + 3 |
|
|
|
|
|
|
|
ax[j, 0].plot(time_stamp, preds['mimic3_770.wav'][dim], |
|
color=(0,104/255,139/255), |
|
label='mean_1', |
|
linewidth=2) |
|
ax[j, 0].fill_between(time_stamp, |
|
|
|
preds['mimic3_770.wav'][dim], |
|
preds['human_770.wav'][dim], |
|
|
|
color=(.2,.2,.2), |
|
alpha=0.244) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ax[j, 0].set_ylabel(dim.lower(), color=(.4, .4, .4), fontsize=14) |
|
|
|
|
|
ax[j, 0].set_ylim([1e-7, .9999]) |
|
ax[j, 0].set_xlim([time_stamp[0], time_stamp[-1]]) |
|
ax[j, 0].set_xticklabels(['' for _ in ax[j, 0].get_xticklabels()]) |
|
ax[j, 0].set_xlabel('767 Harvard Sentences (seconds)', fontsize=16, color=(.4,.4,.4)) |
|
|
|
|
|
|
|
|
|
|
|
ax[j, 1].plot(time_stamp, preds['mimic3_speed_770.wav'][dim], |
|
color=(0,104/255,139/255), |
|
label='mean_1', |
|
linewidth=2) |
|
ax[j, 1].fill_between(time_stamp, |
|
|
|
preds['mimic3_speed_770.wav'][dim], |
|
preds['human_770.wav'][dim], |
|
|
|
color=(.2,.2,.2), |
|
alpha=0.244) |
|
|
|
|
|
|
|
|
|
|
|
ax[j, 1].set_xlabel('767 Harvard Sentences (seconds)', fontsize=16, color=(.4,.4,.4)) |
|
ax[j, 1].set_ylim([1e-7, .999]) |
|
|
|
ax[j, 1].set_xticklabels(['' for _ in ax[j, 1].get_xticklabels()]) |
|
ax[j, 1].set_xlim([time_stamp[0], time_stamp[-1]]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
ax[j, 0].grid() |
|
ax[j, 1].grid() |
|
|
|
|
|
|
|
plt.savefig(f'valence_tts.pdf', bbox_inches='tight') |
|
plt.close() |
|
|
|
|