Цикл распознавания всех файлов в папке с использованием библиотеки 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, но, поскольку я новичок, не знаю, куда его поместить с помощью этого цикла, поэтому у меня не запрашивается точный файл для распознавания!
1 ответ
Нет просто создать другую .py
файл в том же каталоге, что и dejavu
папка. Не изменяйте код библиотеки.
Вы, вероятно, хотите сделать что-то вроде этого:
from dejavu import Dejavu
from dejavu.recognize import FileRecognizer
import os, fnmatch
def find_files(directory, pattern):
"""http://stackru.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)
Надеюсь, это то, что вы хотели.