Цикл для распознавания всех файлов в папке с использованием библиотеки Dejavu для снятия звуковых отпечатков

Есть ли у кого-нибудь опыт работы с библиотекой Dejavu для снятия отпечатков пальцев и распознавания звука в Python? Он работает нормально, но меня интересует то, что пока я могу просто распознавать один файл за раз, используя:

print djv.recognize(FileRecognizer, 'path/song_name.mp3')

У кого-нибудь есть идея, как и где создать цикл, который будет выполнять эту команду печати сверху для всех файлов в папке? Я думаю, что цикл должен быть создан где-то здесь:

https://github.com/worldveil/dejavu/blob/master/dejavu/recognize.py

import dejavu.fingerprint as fingerprint
import dejavu.decoder as decoder
import numpy as np
import pyaudio
import time


class BaseRecognizer(object):

    def __init__(self, dejavu):
        self.dejavu = dejavu
        self.Fs = fingerprint.DEFAULT_FS

    def _recognize(self, *data):
        matches = []
        for d in data:
            matches.extend(self.dejavu.find_matches(d, Fs=self.Fs))
        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 = decoder.read(filename, self.dejavu.limit)

        t = time.time()
        match = self._recognize(*frames)
        t = time.time() - t

        if match:
            match['match_time'] = t

        return match

    def recognize(self, filename):
        return self.recognize_file(filename)

Я знаю, что это должно быть сделано с помощью модуля glob, но, поскольку я новичок, я не знаю, куда поместить его с этим циклом, поэтому мне не предлагается указать точный файл для распознавания!


person vanja86    schedule 19.05.2014    source источник


Ответы (1)


Нет, просто создайте еще один файл .py в том же каталоге, что и папка dejavu. Не изменяйте код библиотеки.

Вы, вероятно, хотите сделать что-то вроде этого:

from dejavu import Dejavu
from dejavu.recognize import FileRecognizer
import os, fnmatch

def find_files(directory, pattern):
    """http://stackoverflow.com/a/2186673/712997"""
    for root, dirs, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                filename = os.path.join(root, basename)
                yield filename

config = {
     "database": {
         "host": "127.0.0.1",
         "user": "root",
         "passwd": "Password123", 
         "db": "dejavu_db",
     },
     "database_type" : "mysql",
     "fingerprint_limit" : 10
}

# create a dejavu object
djv = Dejavu(config)

# gather files to fingerprint
UNLABELED_AUDIO_DIR = "/home/me/music/unknown/"
PATTERN = "*.mp3"
audio_paths = find_files(UNLABELED_AUDIO_DIR, PATTERN)

# recognize them one at a time
original_file_to_song = {}
for path in audio_paths:
    print "Attempting to recognize %s..." % path
    song = djv.recognize(FileRecognizer, path)
    original_file_to_song[path] = song

# see the songs you've recognized
for path, song in original_file_to_song.iteritems():
    print "Audio file at: %s was recognized as %s" % (path, song)

Надеюсь, это то, что вы хотели.

person lollercoaster    schedule 27.05.2014