Merge pull request #2621 from MycroftAI/bugfix/audio-after-stop

prevent audio playing between mic record and utt handling
pull/2626/head
Kris Gesling 2020-06-29 15:56:49 +09:30 committed by GitHub
commit 37a47915f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 45 additions and 2 deletions

View File

@ -190,7 +190,8 @@ class AudioService:
self.bus.on('recognizer_loop:audio_output_start', self._lower_volume)
self.bus.on('recognizer_loop:record_begin', self._lower_volume)
self.bus.on('recognizer_loop:audio_output_end', self._restore_volume)
self.bus.on('recognizer_loop:record_end', self._restore_volume)
self.bus.on('recognizer_loop:record_end',
self._restore_volume_after_record)
def track_start(self, track):
"""Callback method called from the services to indicate start of
@ -294,6 +295,47 @@ class AudioService:
if not self.volume_is_low:
self.current.restore_volume()
def _restore_volume_after_record(self, message=None):
"""
Restores the volume when Mycroft is done recording.
If no utterance detected, restore immediately.
If no response is made in reasonable time, then also restore.
Args:
message: message bus message, not used but required
"""
def restore_volume():
LOG.debug('restoring volume')
self.current.restore_volume()
def wait_for_speak(timeout=8):
"""Wait for a speak Message on the bus.
Arguments:
bus (Mycroft MessageBus): Bus instance to listen on
timeout (int): how long to wait, defaults to 8 sec
"""
speak_msg_detected = False
def detected_speak(message=None):
nonlocal speak_msg_detected
speak_msg_detected = True
self.bus.on('speak', detected_speak)
time.sleep(timeout)
self.bus.remove('speak', detected_speak)
return speak_msg_detected
if self.current:
self.bus.on('recognizer_loop:speech.recognition.unknown',
restore_volume)
speak_msg_detected = wait_for_speak(self.bus)
if not speak_msg_detected:
restore_volume()
self.bus.remove('recognizer_loop:speech.recognition.unknown',
restore_volume)
else:
LOG.debug("No audio service to restore volume of")
def play(self, tracks, prefered_service, repeat=False):
"""
play starts playing the audio on the prefered service if it
@ -440,4 +482,5 @@ class AudioService:
self.bus.remove('recognizer_loop:record_begin', self._lower_volume)
self.bus.remove('recognizer_loop:audio_output_end',
self._restore_volume)
self.bus.remove('recognizer_loop:record_end', self._restore_volume)
self.bus.remove('recognizer_loop:record_end',
self._restore_volume_after_record)