diff --git a/hugvey/story.py b/hugvey/story.py index 7a14b81..57cb1d7 100644 --- a/hugvey/story.py +++ b/hugvey/story.py @@ -22,9 +22,11 @@ class Utterance(object): self.startTime = startTime self.endTime = None self.text = "" + self.lastUpdate = startTime - def setText(self, text): + def setText(self, text, now): self.text = text + self.lastUpdate = now def setFinished(self, endTime): self.endTime = endTime @@ -181,7 +183,21 @@ class Reply(object): def getLastUtterance(self) -> Utterance: if not self.hasUtterances(): return None - return self.utterances[-1] + u = self.utterances[-1] #: :type u: Utterance + + # attempt to fix a glitch that google does not always send is_finished + if u.isFinished(): + return u + + now = self.forMessage.story.timer.getElapsed() + diff = now - u.lastUpdate + if diff > 2: # time in seconds to force silence in utterance + self.forMessage.story.logger.warn( + f"Set finish time for utterance after {diff}s {u.text}" + ) + u.setFinished(now) + + return u def getFirstUtterance(self) -> Utterance: if not self.hasUtterances(): @@ -765,9 +781,10 @@ class Story(object): if self.currentReply is None: self.logger.info("Start speaking") self.currentReply= Reply(self.currentMessage) - - utterance = self.currentReply.getActiveUtterance(self.timer.getElapsed()) - utterance.setText(e['transcript']) + + now = self.timer.getElapsed() + utterance = self.currentReply.getActiveUtterance(now) + utterance.setText(e['transcript'], now) self.hugvey.eventLogger.info("speaking: content {} \"{}\"".format(id(utterance), e['transcript'])) if e['is_final']: