【问题标题】:Loop for recognizing all files in a folder using Dejavu library for audio fingerprinting循环识别文件夹中的所有文件,使用 Dejavu 库进行音频指纹识别
【发布时间】:2014-05-19 19:27:19
【问题描述】:

有没有人有使用 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 模块来完成,但由于我是新手,不知道将它与那个循环放在哪里,所以不会提示我输入确切的文件以进行识别!

【问题讨论】:

    标签: python for-loop glob audio-fingerprinting


    【解决方案1】:

    不只是在与dejavu 文件夹相同的目录中创建另一个.py 文件。不要更改库代码。

    你可能想做这样的事情:

    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)
    

    希望这就是你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多