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")
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")
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