from __future__ import absolute_import import dejavu.fingerprint as fingerprint import dejavu.decoder as decoder import numpy as np import pyaudio import time import sys import os import struct import json if sys.version_info > (3, 0): from itertools import zip_longest as izip_longest else: from itertools import izip_longest class BaseRecognizer(object): def __init__(self, dejavu): self.dejavu = dejavu self.Fs = fingerprint.DEFAULT_FS def _recognize(self, ads_filter, *data): matches = [] for d in data: matches.extend(self.dejavu.find_matches(d, Fs=self.Fs, ads_filter=ads_filter)) return self.dejavu.align_matches(matches) def recognize(self): pass # base class does nothing class FileRecognizer(BaseRecognizer): def __init__(self, dejavu): super(FileRecognizer, self).__init__(dejavu) def recognize_file(self, filename): frames, self.Fs, file_hash, length = decoder.read(filename, self.dejavu.limit) t = time.time() match = self._recognize(*frames) t = time.time() - t if match: match['match_time'] = t match['length'] = length return match def recognize(self, filename): return self.recognize_file(filename) class FilePerSecondRecognizer(BaseRecognizer): def __init__(self, dejavu): super(FilePerSecondRecognizer, self).__init__(dejavu) def recognize(self, file_path, seconds = 1, callback = None, ads_filter = None): for frames, _, _, length in decoder.read_chunks(file_path, chunk_size = seconds): if length == 0: break t0 = time.time() match = self._recognize(ads_filter, *frames) t0 = time.time() - t0 if match: match["match_time"] = match else: match = { 'confidence': 0, 'offset': 0 } match['length'] = length yield match class StdinRecognizer(BaseRecognizer): def __init__(self, dejavu): super(StdinRecognizer, self).__init__(dejavu) def recognize_file(self, filename, fmt, ads_filter): frames, self.Fs, file_hash, length = decoder.read(filename, self.dejavu.limit, fmt) t = time.time() match = self._recognize(ads_filter, *frames) t = time.time() - t if match: match['match_time'] = t else: match = {} match['confidence'] = 0 match['length'] = length return match def recognize(self, seconds = 1, callback = None, ads_filter = None): rnd = struct.unpack("