def _segment_tracks(self, workdir):
"""Call the Aligner to align each unit of a directory.
:param workdir: (str) directory to get units and put alignments.
"""
nb_tracks = len(self._tracksrw.get_units(workdir))
if nb_tracks == 0:
raise EmptyDirectoryError(workdir)
durations = list()
with open(os.path.join(workdir, 'tracks.list'), 'r') as fp:
for line in fp:
v1, v2 = line.split(' ')
durations.append(float(v2) - float(v1))
track_number = 0
while track_number < nb_tracks:
track_number += 1
logging.info(MSG_ALIGN_TRACK.format(number=track_number))
audio, phn, token, align = self._tracksrw.get_filenames(workdir, track_number)
try:
if os.path.exists(audio) is False:
if track_number < len(durations):
msg = self._segmenter.segment(durations[track_number - 1], phn, token, align)
else:
msg = self._segmenter.segment(None, phn, token, align)
else:
msg = self._segmenter.segment(audio, phn, token, align)
if len(msg) > 0:
self.logfile.print_message(MSG_ALIGN_TRACK.format(number=track_number), indent=1)
self.logfile.print_message(msg, indent=2, status=annots.warning)
except Exception as e:
self.logfile.print_message(MSG_ALIGN_TRACK.format(number=track_number), indent=1)
self.logfile.print_message(MSG_ALIGN_FAILED.format(name=self._segmenter.get_aligner_name()), indent=2, status=annots.error)
self.logfile.print_message(str(e), indent=3, status=annots.error)
logging.error(traceback.format_exc())
if self._options['basic'] is True:
self.logfile.print_message('Segment is rescued by assigning the same duration to each phoneme.', indent=2, status=annots.error)
self._segment_track_with_basic(audio, phn, token, align)
else:
self._segmenter.segment(audio, None, None, align)