-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathenvironments.py
executable file
·153 lines (109 loc) · 5.18 KB
/
environments.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import gym
import numpy as np
from constants import EMOTIONS, NUM_MFCC, NO_features
from datastore import CombinedDatastore
from datastore_emodb import EmoDBDatastore
from datastore_emodb_kitchen import KitchenEmoDBDatastore
from datastore_esd import ESDDatastore
from datastore_esd_kitchen import KitchenESDDatastore
from datastore_iemocap import IemocapDatastore
from datastore_improv import ImprovDatastore
from datastore_savee import SaveeDatastore
from feature_type import FeatureType
class AbstractEnv(gym.Env):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore) -> None:
super().__init__()
self.itr = 0
self.X = []
self.Y = []
self.num_classes = len(EMOTIONS)
self.data_version = data_version
self.datastore = datastore
self.set_data()
self.action_space = gym.spaces.Discrete(self.num_classes)
self.observation_space = gym.spaces.Box(-1, 1, [NUM_MFCC, NO_features])
def step(self, action):
assert self.action_space.contains(action)
reward = -0.1 + int(action == np.argmax(self.Y[self.itr]))
# reward = 1 if action == self.Y[self.itr] else -1
done = (len(self.X) - 2 <= self.itr)
next_state = self.X[self.itr + 1]
info = {
"ground_truth": np.argmax(self.Y[self.itr]),
"itr": self.itr,
"correct_inference": int(action == np.argmax(self.Y[self.itr]))
}
self.itr += 1
return next_state, reward, done, info
def get_next_state(self):
# TODO: Fix after try-out
# Trying to remove outlier happy utterances
if EMOTIONS[np.argmax(self.Y[self.itr + 1])] == 'hap':
if (-495.6675 < np.mean(self.X[self.itr + 1], axis=1)[0]) or (
np.mean(self.X[self.itr + 1], axis=1)[0] < -262.93038):
return self.X[self.itr + 1]
else:
self.itr += 1
return self.get_next_state()
else:
return self.X[self.itr + 1]
def render(self, mode='human'):
print("Not implemented \t i: {}".format(self.itr))
def reset(self):
self.itr = 0
self.set_data()
return self.X[self.itr]
def set_data(self):
self.X = []
self.Y = []
(x_train, y_train, y_gen_train), (x_test, y_emo_test, y_gen_test) = self.datastore.get_data()
assert len(x_train) == len(y_train)
self.X = x_train
self.Y = y_train
class IemocapEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: IemocapDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = IemocapDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)
class ImprovEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: ImprovDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = ImprovDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)
class SaveeEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version) -> None:
super().__init__(data_version=data_version, datastore=SaveeDatastore(FeatureType.MFCC))
class ESDEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: ESDDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = ESDDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)
class KitchenESDEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: KitchenESDDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = KitchenESDDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)
class EmoDBEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: EmoDBDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = EmoDBDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)
class KitchenEmoDBEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: KitchenEmoDBDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = KitchenEmoDBDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)
class CombinedEnv(AbstractEnv):
metadata = {'render.modes': ['human']}
def __init__(self, data_version, datastore: CombinedDatastore = None, custom_split: float = None) -> None:
if datastore is None:
datastore = CombinedDatastore(FeatureType.MFCC, custom_split)
super().__init__(data_version=data_version, datastore=datastore)