From d37fea5bbec9a5abc8a4ea07c3d436d51c64e667 Mon Sep 17 00:00:00 2001 From: Michael McAuliffe Date: Thu, 11 Apr 2024 17:59:12 -0700 Subject: [PATCH 1/2] Fix bug involving calculated columns --- .gitignore | 2 + anchor/models.py | 22 +++------- anchor/undo.py | 76 --------------------------------- anchor/widgets.py | 2 +- docs/source/changelog/index.rst | 6 +++ 5 files changed, 16 insertions(+), 92 deletions(-) diff --git a/.gitignore b/.gitignore index f3c4e37..49181e2 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,5 @@ dmypy.json anchor/_version.py *.pclprof + +.qtcreator/ diff --git a/anchor/models.py b/anchor/models.py index a8fc2f0..f242568 100644 --- a/anchor/models.py +++ b/anchor/models.py @@ -1058,27 +1058,19 @@ def switch_utterance(self, new_index, old_index): def model(self) -> CorpusModel: return super(CorpusSelectionModel, self).model() - def checkSelected(self, utterance: Utterance): + def focus_utterance(self, index): m = self.model() - for index in self.selectedRows(1): - if utterance.id == m._indices[index.row()]: - return True - return False - - def focusUtterance(self, index): - m = self.model() - u = m.utteranceAt(index) - if u is None: + row = index.row() + utt_id = m.utterance_id_at(row) + if utt_id is None: self.min_time = 0 self.max_time = 1 self.fileAboutToChange() self.fileChanged.emit() return - begin = u.begin - end = u.end - padding = 1 - self.set_view_times(begin - padding, end + padding) - self.selectionAudioChanged.emit() + self.current_utterance_id = utt_id + self.currentUtteranceChanged.emit() + self.fileViewRequested.emit(self.model().audio_info_for_utterance(row)) class OovModel(TableModel): diff --git a/anchor/undo.py b/anchor/undo.py index 4867479..3bb261f 100644 --- a/anchor/undo.py +++ b/anchor/undo.py @@ -150,26 +150,10 @@ def _redo(self, session) -> None: def _undo(self, session) -> None: for i, utt in enumerate(self.deleted_utterances): - try: - del utt.duration - except AttributeError: - pass - try: - del utt.kaldi_id - except AttributeError: - pass make_transient(utt) for x in utt.phone_intervals: - try: - del x.duration - except AttributeError: - pass make_transient(x) for x in utt.word_intervals: - try: - del x.duration - except AttributeError: - pass make_transient(x) if utt.channel is None: utt.channel = self.channels[i] @@ -212,52 +196,20 @@ def _redo(self, session) -> None: if u.id is not None: make_transient(u) for x in u.phone_intervals: - try: - del x.duration - except AttributeError: - pass make_transient(x) for x in u.word_intervals: - try: - del x.duration - except AttributeError: - pass make_transient(x) if u.channel is None: u.channel = self.merged_utterance.channel - try: - del u.duration - except AttributeError: - pass - try: - del u.kaldi_id - except AttributeError: - pass session.add(u) def _undo(self, session) -> None: if self.merged_utterance.channel is None: self.merged_utterance.channel = self.split_utterances[0].channel - try: - del self.merged_utterance.duration - except AttributeError: - pass - try: - del self.merged_utterance.kaldi_id - except AttributeError: - pass make_transient(self.merged_utterance) for x in self.merged_utterance.phone_intervals: - try: - del x.duration - except AttributeError: - pass make_transient(x) for x in self.merged_utterance.word_intervals: - try: - del x.duration - except AttributeError: - pass make_transient(x) session.add(self.merged_utterance) for u in self.split_utterances: @@ -300,7 +252,6 @@ def _redo(self, session) -> None: make_transient(self.merged_utterance) if self.merged_utterance.channel is None: self.merged_utterance.channel = self.channel - self.merged_utterance.kaldi_id = None session.add(self.merged_utterance) def _undo(self, session) -> None: @@ -309,12 +260,9 @@ def _undo(self, session) -> None: if old_utt.channel is None: old_utt.channel = self.channel for x in old_utt.phone_intervals: - x.duration = None make_transient(x) for x in old_utt.word_intervals: make_transient(x) - old_utt.duration = None - old_utt.kaldi_id = None session.add(old_utt) session.delete(self.merged_utterance) @@ -402,14 +350,6 @@ def _redo(self, session) -> None: make_transient(self.new_utterance) if self.new_utterance.channel is None: self.new_utterance.channel = self.channel - try: - del self.new_utterance.duration - except AttributeError: - pass - try: - del self.new_utterance.kaldi_id - except AttributeError: - pass session.add(self.new_utterance) def _undo(self, session) -> None: @@ -453,10 +393,6 @@ def _redo(self, session) -> None: self.utterance.xvector = None self.utterance.ivector = None self.utterance.features = None - try: - del self.utterance.duration - except AttributeError: - pass session.merge(self.utterance) def _undo(self, session) -> None: @@ -465,10 +401,6 @@ def _undo(self, session) -> None: self.utterance.xvector = None self.utterance.ivector = None self.utterance.features = None - try: - del self.utterance.duration - except AttributeError: - pass session.merge(self.utterance) def update_data(self): @@ -495,10 +427,6 @@ def _redo(self, session) -> None: for w in self.new_text.split(): if not self.corpus_model.dictionary_model.check_word(w, self.speaker_id): oovs.add(w) - try: - del self.utterance.duration - except AttributeError: - pass self.utterance.text = self.new_text self.utterance.normalized_text = self.new_text # FIXME: Update this self.utterance.oovs = " ".join(oovs) @@ -510,10 +438,6 @@ def _undo(self, session) -> None: for w in self.new_text.split(): if not self.corpus_model.dictionary_model.check_word(w, self.speaker_id): oovs.add(w) - try: - del self.utterance.duration - except AttributeError: - pass self.utterance.text = self.old_text self.utterance.normalized_text = self.old_text # FIXME: Update this self.utterance.oovs = " ".join(oovs) diff --git a/anchor/widgets.py b/anchor/widgets.py index a1879de..7756975 100644 --- a/anchor/widgets.py +++ b/anchor/widgets.py @@ -402,7 +402,7 @@ def __init__(self, *args): def set_models(self, model: CorpusModel, selection_model: CorpusSelectionModel): self.setModel(model) self.setSelectionModel(selection_model) - self.doubleClicked.connect(self.selectionModel().focusUtterance) + self.doubleClicked.connect(self.selectionModel().focus_utterance) self.model().utteranceTextUpdated.connect(self.repaint) self.refresh_settings() model.corpusLoaded.connect(self.update_header) diff --git a/docs/source/changelog/index.rst b/docs/source/changelog/index.rst index 2d5591f..419fb12 100644 --- a/docs/source/changelog/index.rst +++ b/docs/source/changelog/index.rst @@ -6,6 +6,12 @@ Changelog Alpha releases +0.2.1 +----- + +- Fixed bug with calculated columns when merging/splitting and then changing time boundaries +- Fixed bug when double clicking on an utterance to focus it + 0.2.0 ----- From f24f35c5bdc47ff500b97287766f90e1c92434dc Mon Sep 17 00:00:00 2001 From: Michael McAuliffe Date: Thu, 11 Apr 2024 18:32:46 -0700 Subject: [PATCH 2/2] Change threshold on interval visibility --- anchor/plot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anchor/plot.py b/anchor/plot.py index 245a34c..bcfb596 100644 --- a/anchor/plot.py +++ b/anchor/plot.py @@ -1616,7 +1616,7 @@ def __init__( def viewRangeChanged(self): if (self.item_max - self.item_min) / ( self.selection_model.max_time - self.selection_model.min_time - ) < 0.01: + ) < 0.001: self.hide() else: self.show()