def fingerprint(samplerate, channels, pcmiter, maxlength=MAX_AUDIO_LENGTH):
    """Fingerprint audio data given its sample rate and number of
    channels.  pcmiter should be an iterable containing blocks of PCM
    data as byte strings. Raises a FingerprintGenerationError if
    anything goes wrong.
    """
    # Maximum number of samples to decode.
    endposition = samplerate * channels * maxlength

    try:
        fper = chromaprint.Fingerprinter()
        fper.start(samplerate, channels)

        position = 0  # Samples of audio fed to the fingerprinter.
        for block in pcmiter:
            fper.feed(block)
            position += len(block) // 2  # 2 bytes/sample.
            if position >= endposition:
                break

        return fper.finish()
    except chromaprint.FingerprintError:
        raise FingerprintGenerationError("fingerprint calculation failed")
Beispiel #2
0
def fingerprint_AudioSegment(audio_segment, maxlength=120000):
    """Fingerprint audio data given a pydub AudioSegment object.

    Raises a FingerprintGenerationError if anything goes wrong.
    Based on acoustid.py's fingerprint function.
    """
    maxlength /= 1000
    endposition = audio_segment.frame_rate * audio_segment.channels * maxlength
    try:
        fper = chromaprint.Fingerprinter()

        fper.start(audio_segment.frame_rate, audio_segment.channels)

        position = 0  # Samples of audio fed to the fingerprinter.
        for start in range(0, len(audio_segment.raw_data), 4096):
            block = audio_segment.raw_data[start:start + 4096]
            fper.feed(block)
            position += len(block) // 2  # 2 bytes/sample.
            if position >= endposition:
                break
        return fper.finish()
    except chromaprint.FingerprintError:
        raise chromaprint.FingerprintGenerationError("fingerprint calculation "
                                                     "failed")
Beispiel #3
0
import wave
import chromaprint
from optparse import OptionParser

parser = OptionParser(usage="usage: %prog [options] filename")
parser.add_option("-l", "--length", dest="length", default=30, type='int',
                  help="fingerprint audio length", metavar="LENGTH")
(options, args) = parser.parse_args()

if not args:
    parser.error("missing filename")

wav = wave.open(args[0], 'r')

fpgen = chromaprint.Fingerprinter()
fpgen.start(wav.getframerate(), wav.getnchannels())
length = 0
while length < options.length:
    frames = wav.readframes(1024 * 4)
    if not frames:
        break
    fpgen.feed(frames)
    length += float(len(frames)) / wav.getsampwidth() / wav.getnchannels() / wav.getframerate()
fp = fpgen.finish()

total_length = wav.getnframes() / wav.getframerate()
print "FILE:", args[0]
print "CHANNELS:", wav.getnchannels()
print "SAMPLE RATE:", wav.getframerate()
print "LENGTH:", total_length