Exemple #1
0
 def get_track_by_number(cls, number):
     """
     Get Artist - Track by number
     """
     tid = 0
     track = ''
     for idx, num in enumerate(sorted(cls.numbers)):
         if num == number:
             tid = idx if idx > 1 else idx + 1
             break
     logger.warning('Getting track: %s - %s', number, tid)
     with open('state.txt', 'rb') as file_handle:
         lines = file_handle.read()
     full_track = ''
     for idx, line in enumerate(lines.splitlines()):
         if idx == tid - 1:
             full_track = line
             break
     if full_track:
         artist = full_track.split(' - ')[0]
         track = full_track.split(' - ')[1]
     else:
         artist = 'unknown'
         track = 'unknown'
     return artist, track
Exemple #2
0
 def get_track_by_number(cls, number):
     """
     Get Artist - Track by number
     """
     tid = 0
     track = ''
     for idx, num in enumerate(sorted(cls.numbers)):
         if num == number:
             tid = idx if idx > 1 else idx + 1
             break
     logger.warning('Getting track: %s - %s', number, tid)
     with open('state.txt', 'rb') as file_handle:
         lines = file_handle.read()
     full_track = ''
     for idx, line in enumerate(lines.splitlines()):
         if idx == tid - 1:
             full_track = line
             break
     if full_track:
         artist = full_track.split(' - ')[0]
         track = full_track.split(' - ')[1]
     else:
         artist = 'unknown'
         track = 'unknown'
     return artist, track
Exemple #3
0
 def process(cls, regexp, message):
     """
     Run task
     """
     cls.logger.debug('Message: %r matches %r, running %r', message, regexp,
                      cls.__name__)
     artist = re.match(regexp, message, re.I).groups()[0]
     if 'albums' in regexp:
         albums = cls.lfm().get_top_albums(artist)
         msg = cls.lfm().numerize(albums[:10])
         logger.warning('Here are top albums by %s - %s', artist, msg)
         cls.say('Here are top albums by %s - %s' % (artist, msg))
     elif 'songs' in regexp or 'tracks' in regexp:
         tracks = cls.lfm().get_top_tracks(artist)[:10]
         numerized = ', '.join(cls.lfm().numerize(tracks))
         reply = re.sub(r'^(.+)\.\s\d\:\s', '1: ', numerized)
         logger.warning('Here are some top tracks by %s: %s', artist, reply)
         cls.say('Here are some top tracks by %s: %s' % (artist, reply))
     elif 'time' in regexp:
         cls.say('It is %s %s right now' %
                 (int(time.strftime('%H')), int(time.strftime('%M'))))
     elif 'date' in regexp or 'day' in regexp:
         weekday = time.strftime('%A')
         month_name = time.strftime('%B')
         daynum = int(time.strftime('%d'))
         cls.say('It is %s %s %s' % (weekday, month_name, daynum))
Exemple #4
0
 def process(cls, regexp, message):
     """
     Run task
     """
     cls.logger.debug('Message: %r matches %r, running %r', message, regexp, cls.__name__)
     msg = re.match(regexp, message, re.I).groups()[0]
     logger.warning(msg)
     cls.say('Shuffling songs based on track history')
     cls.play_track_history(msg)
Exemple #5
0
 def process(cls, regexp, message):
     """
     Run task
     """
     cls.logger.debug('Message: %r matches %r, running %r', message, regexp,
                      cls.__name__)
     msg = re.match(regexp, message, re.I).groups()[0]
     logger.warning(msg)
     cls.say('Shuffling songs based on track history')
     cls.play_track_history(msg)
Exemple #6
0
    def background_listener(self):
        """
        Run loop and wait for commands
        TODO: Localize this
        """
        msg = 'Vicki is listening'
        self.tts.say_put(msg)
        # TODO: Fix this using callback or something so that
        # we do not record ourselves
        time.sleep(3)
        logger.warning(msg)
        self.wake_up = False
        while not self.shutdown:

            if self.wake_up:
                logger.warning('Wake word!')
                run_hooks(None, self.recognition_hooks, 'on_recognition_start')
                self.tts.say_put('Yes')
                self.wake_up = False
            else:
                time.sleep(0.01)
                continue

            volume = self.player.player.get_volume()
            self.player.player.set_volume(0)
            logger.debug('recog start')
            run_hooks(None, self.recognition_hooks, 'on_recognition_progress')
            # command goes next
            try:
                with sr.Microphone() as source:
                    self.rec.adjust_for_ambient_noise(source)
                    audio = self.rec.listen(source, timeout=5)
            except sr.WaitTimeoutError:
                self.player.player.set_volume(volume)
                continue
            try:
                result = self.rec.recognize_google(audio)
            except sr.UnknownValueError:
                msg = 'I could not understand audio'
                self.tts.say_put(msg)
                logger.warning(msg)
                result = None
            except sr.RequestError as e:
                msg = 'Recognition error'
                self.tts.say_put(msg)
                logger.warning('{0}; {1}'.format(msg, e))
                result = None
            logger.debug('recog end')
            run_hooks(None, self.recognition_hooks, 'on_recognition_end')
            self.player.player.set_volume(volume)
            if result:
                result = result.lower()  # pylint:disable=no-member
                logger.debug('Putting %r into processing queue', repr(result))
                # allow commands to be processed by player instance first
                self.player.put(result)
                # process local cmd
                if Command(result).COMMAND == Command.SHUTDOWN:
                    logger.debug('Vicki.Listener.stop() called...')
                    self.stop()
        logger.debug('Vicki.Listener exit')
Exemple #7
0
    def background_listener(self):
        """
        Run loop and wait for commands
        TODO: Localize this
        """
        msg = 'Vicki is listening'
        self.tts.say_put(msg)
        # TODO: Fix this using callback or something so that 
        # we do not record ourselves
        time.sleep(3)
        logger.warning(msg)
        self.wake_up = False
        while not self.shutdown:

            if self.wake_up:
                logger.warning('Wake word!')
                run_hooks(None, self.recognition_hooks, 'on_recognition_start')
                self.tts.say_put('Yes')
                self.wake_up = False
            else:
                time.sleep(0.01)
                continue

            volume = self.player.player.get_volume()
            self.player.player.set_volume(0)
            logger.debug('recog start')
            run_hooks(None, self.recognition_hooks, 'on_recognition_progress')
            # command goes next
            try:
                with sr.Microphone() as source:
                    self.rec.adjust_for_ambient_noise(source)
                    audio = self.rec.listen(source, timeout=5)
            except sr.WaitTimeoutError:
                self.player.player.set_volume(volume)
                continue
            try:
                result = self.rec.recognize_google(audio)
            except sr.UnknownValueError:
                msg = 'I could not understand audio'
                self.tts.say_put(msg)
                logger.warning(msg)
                result = None
            except sr.RequestError as e:
                msg = 'Recognition error'
                self.tts.say_put(msg)
                logger.warning('{0}; {1}'.format(msg, e))
                result = None
            logger.debug('recog end')
            run_hooks(None, self.recognition_hooks, 'on_recognition_end')
            self.player.player.set_volume(volume)
            if result:
                result = result.lower()  # pylint:disable=no-member
                logger.debug('Putting %r into processing queue', repr(result))
                # allow commands to be processed by player instance first
                self.player.put(result)
                # process local cmd
                if Command(result).COMMAND == Command.SHUTDOWN:
                    logger.debug('Vicki.Listener.stop() called...')
                    self.stop()
        logger.debug('Vicki.Listener exit')
Exemple #8
0
 def play_track_by_number(cls, number):
     """
     Play track by number
     """
     tid = 0
     track = ''
     for idx, num in enumerate(sorted(cls.numbers)):
         if num == number:
             tid = idx if idx > 1 else idx + 1
             break
     logger.warning('Playing track: %s - %s', number, tid)
     with open('state.txt', 'rb') as file_handle:
         lines = file_handle.read()
     for idx, line in enumerate(lines.splitlines()):
         if idx == tid - 1:
             track = line
             break
     if track:
         cls.play_full_track(track)
Exemple #9
0
 def play_track_by_number(cls, number):
     """
     Play track by number
     """
     tid = 0
     track = ''
     for idx, num in enumerate(sorted(cls.numbers)):
         if num == number:
             tid = idx if idx > 1 else idx + 1
             break
     logger.warning('Playing track: %s - %s', number, tid)
     with open('state.txt', 'rb') as file_handle:
         lines = file_handle.read()
     for idx, line in enumerate(lines.splitlines()):
         if idx == tid - 1:
             track = line
             break
     if track:
         cls.play_full_track(track)
Exemple #10
0
 def wakeword_listener(self):
     """
     Wakeword listener
     """
     logger.warning('starting detector!')
     threads = ThreadGroup()
     threads.targets = [self.async_worker]
     threads.start_all()
     sensitivity = [0.5, 0.3, 0.3]  #[0.5] * len(self.models)
     self.detector = snowboydecoder.HotwordDetector(
         [os.path.join(self.basedir, model) for model in self.models],
         sensitivity=sensitivity,
         audio_gain=1)
     try:
         self.detector.start(detected_callback=self.wakeword_callback,
                             interrupt_check=self.interrupt_check,
                             sleep_time=0.03)
     except (KeyboardInterrupt, SystemExit):
         self.exit = True
         threads.stop_all()
Exemple #11
0
 def task_loop(self):
     """
     Check periodically for tasks from queue
     """
     while not self.shutdown_flag:
         if not self.p_queue.empty():
             parsed = self.parse(self.p_queue.get())
         else:
             time.sleep(0.01)
             continue
         logger.debug('task_loop got from queue: %r', parsed)
         if not parsed:
             continue
         self.exit_task = False
         ran = self.run_player_tasks(parsed)
         if not ran:
             msg = 'I think you said ' + parsed
             self.tts.say_put(msg)
             logger.warning(msg)
         self.p_queue.task_done()
     logger.debug('VickiPlayer.task_loop exit')
Exemple #12
0
 def task_loop(self):
     """
     Check periodically for tasks from queue
     """
     while not self.shutdown_flag:
         if not self.p_queue.empty():
             parsed = self.parse(self.p_queue.get())
         else:
             time.sleep(0.01)
             continue
         logger.debug('task_loop got from queue: %r', parsed)
         if not parsed:
             continue
         self.exit_task = False
         ran = self.run_player_tasks(parsed)
         if not ran:
             msg = 'I think you said ' + parsed
             self.tts.say_put(msg)
             logger.warning(msg)
         self.p_queue.task_done()
     logger.debug('VickiPlayer.task_loop exit')
Exemple #13
0
 def process(cls, regexp, message):
     """
     Run task
     """
     cls.logger.debug('Message: %r matches %r, running %r', message, regexp, cls.__name__)
     artist = re.match(regexp, message, re.I).groups()[0]
     if 'albums' in regexp:
         albums = cls.lfm().get_top_albums(artist)
         msg = cls.lfm().numerize(albums[:10])
         logger.warning('Here are top albums by %s - %s', artist, msg)
         cls.say('Here are top albums by %s - %s' % (artist, msg))
     elif 'songs' in regexp or 'tracks' in regexp:
         tracks = cls.lfm().get_top_tracks(artist)[:10]
         numerized = ', '.join(cls.lfm().numerize(tracks))
         reply = re.sub(r'^(.+)\.\s\d\:\s', '1: ', numerized)
         logger.warning('Here are some top tracks by %s: %s', artist, reply)
         cls.say('Here are some top tracks by %s: %s' % (artist, reply))
     elif 'time' in regexp:
         cls.say('It is %s %s right now' % (int(time.strftime('%H')), int(time.strftime('%M'))))
     elif 'date' in regexp or 'day' in regexp:
         weekday = time.strftime('%A')
         month_name = time.strftime('%B')
         daynum = int(time.strftime('%d'))
         cls.say('It is %s %s %s' % (weekday, month_name, daynum))
Exemple #14
0
 def wakeword_callback(self):
     """
     Wakeword callback. Puts "wakeup" command in queue
     """
     logger.warning('wakey!')
     self.queue.put(b'wakeup')