Beispiel #1
0
class Nest:
    """
        - convert all mp3 sounds to wav sounds -> store in wavs folder
        - go to db get birdID & wavFile & fingerprint the wavfile
        - store birdID & hash in db
    """

    SOUNDS_DIR = 'BirdSounds/'
    WAV_SOUNDS_DIR = 'BirdSounds/wavSounds/'
    MAX_PROCS = 10

    def __init__(self, **kwargs):
        if kwargs.get('cd'):
            print os.getcwd()
            os.chdir('../')

        self.fingerprinter = Fingerprinter()
        self.logger = Logging()
        self.fetcher = Fetcher()
        self.parser = Parsers()
        self.config = Configs()
        creds = self.config.get_db_creds()
        self.recognizer = Recognizer()
        self.database = self.database = MySQLDatabases(hostname=creds['hostname'], username=creds['username'],
                                                       password=creds['passwd'], database=creds['db_name'])

    def mp3_to_wav(self, src_dir, extension_list=('*.mp4', '*.flv', '*.mp3')):
        os.chdir(src_dir)
        logs = ""
        for extension in extension_list:
            for media_file in glob.glob(extension):
                wav_file = "../" + Nest.WAV_SOUNDS_DIR + os.path.splitext(os.path.basename(media_file))[0] + '.wav'
                logs += "converting %s to %s\n" % (os.path.basename(media_file), wav_file)
                AudioSegment.from_file(media_file).export(wav_file, format='wav')
        os.chdir('../')
        print logs
        self.logger.write_log(log_file='fingerprint', log_tag='i', log_msg=logs)

    def reload_creds(self):
        self.database = None

        creds = self.config.get_db_creds()
        self.database = self.database = MySQLDatabases(hostname=creds['hostname'], username=creds['username'],
                                                       password=creds['passwd'], database=creds['db_name'])

    def fetch_stuff(self):
        pass
        #self.parser.parse()
        #self.parser.threading_ops()

    def chunkify(self, lst, n):
        """
        split a list into n no of parts
        """
        return [lst[i::n] for i in xrange(n)]

    def fetch_images(self):
        """
        get all birds from db
            - get birdID & birdName
            - get image URLS from GAPI & store in DB
        """
        cursor = self.parser.database.get_all_birds()
        for row in cursor:
            self.parser.parse_GAPI(birdName=row['englishName'], birdID=row['birdID'])

    def fingerprint_sounds(self):
        """
            - go to db get birdID & wavFile & fingerprint the wavfile
            - store birdID & hash in db
        """
        cursor = self.database.get_sounds()
        threads = []
        sound_details = []

        count = 0
        print len(cursor)
        for row in cursor:
            birdID = row['birdID']
            wavFile = "%s%s.wav" % (Nest.WAV_SOUNDS_DIR, row['wavFile'])
            sound_details.append((birdID, wavFile))

        shuffle(sound_details)
        split_details = self.chunkify(sound_details, Nest.MAX_PROCS)

        #split procs
        procs = []
        #for i in range(Nest.MAX_PROCS):
        #    #create separate/non-shared connections to db
        #    creds = Configs().get_db_creds()
        #    self.database = self.database = MySQLDatabases(hostname=creds['hostname'], username=creds['username'],
        #                                                   password=creds['passwd'], database=creds['db_name'])
        #
        #    #create procs & start
        #    proc = Process(target=self.fingerprint_worker, args=([split_details[i]]))
        #    proc.start()
        #    procs.append(proc)
        #
        ##wait for all procs to finish
        #for proc in procs:
        #    proc.join()

        self.fingerprint_worker(sound_details)

    def fingerprint_worker(self, sound_details):
        """
            fingerprint each song & store hash in db
        """

        for birdID, wavFile in sound_details:
            print "birdID: ", birdID, "wavFile: ", wavFile

            channels = self.fingerprinter.extract_channels(wavFile)
            for c in range(len(channels)):
                channel = channels[c]
                t_start = time()
                logs = "now fingerprinting channel %d of song %s. BirdID: %s" % (c + 1, wavFile, birdID)
                self.logger.write_log(log_file='fingerprint', log_tag='i', log_msg=logs)
                print logs
                self.fingerprinter.fingerprint(channel, birdID)
                logs = "time taken: %d seconds" % (time() - t_start)
                self.logger.write_log(log_file='fingerprint', log_tag='i', log_msg=logs)
                print logs

            #update song as fingerprinted
            self.database.update_fingerprinted_songs(birdID=birdID)

    def process_requests(self, request_id):
        """
            get wavfile from inbound request, match &
        """
        cursor = self.database.get_inbound_request(request_id)
        if cursor is None:
            print "cursor is None!"
            self.reload_creds()
            cursor = self.database.get_inbound_request(request_id)
        else:
            print "cursor is not None!"

        wavfile = cursor['wavFile']

        bird_details = self.recognizer.recognize_file(filename=wavfile, verbose=False)
        self.database.update_processed_requests(request_id)

        match_result = 0 if bird_details['bird_id'] == 0 else 1
        outbound_id = self.database.insert_outbound_match(request_id=request_id, birdID=bird_details['bird_id'],
                                                          matchResults=match_result)
        # print "outboundID: %s" % outbound_id
        return outbound_id

    def get_outbound_birdID(self, outboundID):
        """
            return outboundId from outbound_matches tbl
        """
        cursor = self.database.get_outbound_bird_id(outboundID)
        return cursor['birdID']

    def get_match_results(self, outboundID):
        """
            return matchResults from outbound_matches tbl
        """
        cursor = self.database.get_match_results(outboundID)
        return cursor['matchResults']

    def add_request(self, wavfile, deviceID):
        """
            add new unmatched request in db
        """
        request_id = self.database.insert_inbound_request(wavfile, deviceID)
        return request_id

    def get_bird_details(self, birdID):
        """
            get bird details from db
        """
        cursor = self.database.get_bird_by_id(birdID)
        return cursor

    def get_sound_details(self, birdID):
        """
            get sounds from db for a given birdID
            birdID, soundType, wavFile, soundURL
        """
        cursor = self.database.get_sound_by_id(birdID)
        return {"soundType": cursor['soundType'], "soundURL": cursor['soundURL']}

    def get_thumbnail_pic(self, birdID):
        """
            get thumbnail img from db for a given birdID
        """
        cursor = self.database.get_thumbnail_pic(birdID)
        return cursor['imageURL']

    def get_images(self, birdID):
        """
            return a list of images from db for a given birdID
        """
        cursors = self.database.get_images(birdID)
        pics = []
        for cursor in cursors:
            img = {"imageURL": cursor['imageURL'], "siteURL": cursor['siteURL']}
            pics.append(img)
        return pics