-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.py
82 lines (67 loc) · 3.35 KB
/
main.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
from utils.intonation import *
from utils.gapbide import Gapbide
from utils.MaximalPatterns import MaximalPatterns, UniquePatterns
from statistics import mean, stdev
import pandas as pd
import argparse
from utils.tools import get_activation_values
import os
def get_patterns(audio_dir, emotion='neutral', data_file =None):
#extract f0 and get the contours for each audio file
fqs, files = get_f0_praat(audio_dir)
if data_file:
activations = get_activation_values(files, data_file, 'wav_file', 'activation')
fq_list = [[f for f in fq if f>0] for fq in fqs]
F0_mean =[mean(fqs) for fqs in fq_list]
F0_range = [max(fqs) - min(fqs) for fqs in fq_list]
contours, inds = get_interval_contour(fq_list)
intervals, inds = extract_contour_slope(contours)
pk_to_pk, val_to_val, pos_slope, neg_slope = peak_to_peak(intervals, inds)
stdv_pk = [stdev(p) for p in pk_to_pk if len(p)>1]
stdv_val = [stdev(v) for v in val_to_val if len(v)>1]
stdv_pos_slope = [stdev(p) for p in pos_slope if len(p)>1]
stdv_neg_slope = [stdev(n) for n in neg_slope if len(n)>1]
pattern_length = 5
intervals_file = 'patterns/'+emotion
Gapbide(intervals, 6, 0, 0, pattern_length, intervals_file).run()
MaximalPatterns(intervals_file+'_intervals.txt', intervals_file+'_maximal.txt').execute()
os.remove(intervals_file+'.txt')
#os.remove(intervals_file+'_intervals.txt')
data0 = pd.DataFrame({'Filename': files})
data1 = pd.DataFrame({'F0_mean': F0_mean})
data2 = pd.DataFrame({'F0_range': F0_range})
data3 = pd.DataFrame({'stdv_pk': stdv_pk})
data4 = pd.DataFrame({'stdv_val': stdv_val})
data5 = pd.DataFrame({'stdv_pos_slope': stdv_pos_slope})
data6 = pd.DataFrame({'stdv_neg_slope': stdv_neg_slope })
if data_file:
data00= pd.DataFrame({'Arousal': activations})
df = pd.concat([data0, data00, data1, data2, data3, data4, data5, data6], axis=1)
df['Macro_Rhythm_Ind'] = df['stdv_pk'] + df['stdv_val'] + df['stdv_pos_slope'] + df['stdv_neg_slope']
df.to_excel('results_' + emotion + '.xlsx')
else:
df = pd.concat([data0, data1, data2, data3, data4, data5, data6], axis=1)
df['Macro_Rhythm_Ind'] = df['stdv_pk'] + df['stdv_val'] + df['stdv_pos_slope'] + df['stdv_neg_slope']
df.to_excel('results_'+emotion+'.xlsx')
def get_unique_patterns(file1, file2):
uni = UniquePatterns(file1, file2)
uni.get_unique_patterns()
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-a', '--audio_dir', type=str, default = None,
help='The audio directory where the files are located')
parser.add_argument('-e', '--emotion', type=str, default = None,
help='Emotion tag')
parser.add_argument('-d', '--data_file', type=str, default=None,
help='Excel spreadsheet with arousal levels per audio file')
parser.add_argument('-r', '--reference_file', type=str, default=None,
help='Text file used as a reference to be compared against')
parser.add_argument('-c', '--compare_file', type=str, default=None,
help='Text file used to compared against the reference to find out unique patterns')
args = parser.parse_args()
if args.reference_file and args.compare_file:
get_unique_patterns(args.reference_file, args.compare_file)
else:
get_patterns(args.audio_dir, args.emotion)
if __name__ == '__main__':
main()