-
Notifications
You must be signed in to change notification settings - Fork 2
/
shelldet.praat
170 lines (149 loc) · 5.97 KB
/
shelldet.praat
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
## shelldet.praat: wrapper script to get Oq values for multiple files in a single directory from command line
#
## James Kirby <[email protected]>
## last update: 17 August 2018
## If something goes wrong, you can stop the script and pick up where you
## left off, by noting the last file in the Strings list that was correctly
## processed. However be sure to rename your output file, or rename it
## something new when you restart, or you will overwrite your previous data.
#########################
## USER-DEFINED VARIABLES
#########################
## - directory: path to EGG files
## - textgrid: path to TextGrids, if applicable (default: same as directory$)
## - outfile: name of output file (saved in directory$)
## - extension: file extension for EGG files (.wav, .egg...)
## - eggChan: channel number of EGG signal
## - intervalTier, intervalLabel, intervalNum: used to specify a specific
## portion of the file to edit/extract from. if intervalNum <> 0, this
## will take precedence over intervalLabel. if intervalLabel == "" and
## intervalNum == 0, entire file will be processed.
## - minF0, maxF0: minimum and maximum pitch values
## - k: used to calculate window size for smoothing.
## k = 0 is same as no smoothing.
## k = 2 > 5-point window; k = 3 > 7-point window; etc.
## - threshold: Howard's method threshold (default: 3/7)
form File info
comment Full path to EGG files
text directory /Users/jkirby/Projects/egg/praatdet/examples/
comment Full path to TextGrids
text textgrids /Users/jkirby/Projects/egg/praatdet/examples/grids/
comment Name of output file (written to same path as EGG files)
word outfile egg_out.txt
comment Extension for audio file (.wav, .egg, etc.)
word extension .wav
comment Channel of audio file containing EGG signal
integer eggChan 1
comment Start from a particular token?
integer startFile 1
comment Tier of interest (if irrelevant, leave as default)
integer intervalTier 3
comment Label of interval of interest (blank for none/all)
word intervalLabel v
comment Number of interval of interest (0 for none/all)
integer intervalNum 0
comment Separator (-, _ ...) when parsing token names
word separator _
comment Minimum and maximum f0 thresholds
integer minF0 75
integer maxF0 600
comment k: Smoothing window size parameter (points on each side)
integer k 10
comment Threshold for Howard's method
real threshold 3/7
comment Filter frequency cutoff
integer passFrequency 40
comment Filter cutoff smoothing
integer smoothHz 20
comment Manually edit points and periods?
boolean manualCheck 0
comment Use existing PointProcess files, if available?
boolean useExistingPP 0
comment Invert signal (if your EGG has closed=down for some reason)
boolean invertSignal 0
endform
## including getoq.praat includes everything else
include getoq.praat
clearinfo
Create Strings as file list... list 'directory$'*'extension$'
## parse token filename into var1, var2...
header$ = "filename"
select Strings list
## NB: assumes all filenames have same structure, so any file will do
sampleFileName$ = Get string... 1
sampleFileName$ = sampleFileName$ - extension$
@splitstring: sampleFileName$, separator$
for i from 1 to splitstring.strLen
header$ = "'header$',var'i'"
endfor
## Create output file, overwriting if present
writeFileLine: "'directory$''outfile$'", "'header$',label,period,start,end,egg_f0,degg_oq,howard_oq"
## If we wanted to allow the user to select different/additional measures, would want to modify this
## so that header was built dynamically
## loop through files in directory$
number_of_files = Get number of strings
for x from startFile to number_of_files
select Strings list
current_file$ = Get string... x
Read from file... 'directory$''current_file$'
filename$ = selected$("Sound")
## invert signal if necessary
if invertSignal
Formula... -self
endif
## default: process entire file if a region of interest is found,
## or if there is no associated TextGrid
found_region = 0
select Sound 'filename$'
start_time = Get start time
end_time = Get end time
## ...but if there is a TextGrid, try to use that instead
gridname$ = current_file$ - extension$
textgrid$ = "'textgrids$''gridname$'.TextGrid"
if fileReadable (textgrid$)
Read from file... 'textgrid$'
## first try to use intervalLabel, if provided
if intervalLabel$ <> ""
## find start and end of interval of interest
number_of_intervals = Get number of intervals... intervalTier
for y from 1 to number_of_intervals
select TextGrid 'gridname$'
tmp$ = Get label of interval... intervalTier y
if tmp$ == intervalLabel$
found_region = 1
start_time = Get start time of interval... intervalTier y
end_time = Get end time of interval... intervalTier y
endif
endfor
## if intervalNum is given, use that instead
elsif intervalNum <> 0
start_time = Get start time of interval... intervalTier intervalNum
end_time = Get end time of interval... intervalTier intervalNum
found_region = 1
## overwrite intervalLabel$ with something more useful
## problem: doing this means that we will not enter this condition next time
#intervalLabel$ = Get label of interval... intervalTier intervalNum
endif
else
## if there is no TextGrid, process the whole file
# beginPause: "No such file"
# comment: "File <'gridname$'.TextGrid> does not exist in directory"
# comment: "'textgrid$'"
# comment: "Using whole file as region of interest."
# endPause: "Continue", 1
found_region = 1
endif
## if a region of interest has been identified, call main getoq function
if found_region == 1
select Sound 'filename$'
@getoq: manualCheck
endif
select all
minus Strings list
Remove
clearinfo
endfor
## clean up
select Strings list
Remove
printline All done.