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
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))
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)
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')
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)
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()
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')
def wakeword_callback(self): """ Wakeword callback. Puts "wakeup" command in queue """ logger.warning('wakey!') self.queue.put(b'wakeup')