view annotation_scripts/annotationkit_create_annotation_protocol.py @ 0:75c79305d794

Scripts for obtaining and analysing annotations
author peterf
date Tue, 07 Jul 2015 14:42:09 +0100
parents
children f079d2de4aa2
line wrap: on
line source
#!/usr/bin/python
#
# annotationkit_create_annotation_protocol.py:
#    Prepare annotation protocol from list of audio files
#    Used for obtaining CHiME challenge dataset annotations
#    Read files from standard input and write csv to standard output
#
# Author: Peter Foster
# (c) 2014 Peter Foster
#

import fileinput
from scikits.audiolab import Sndfile
from pandas import DataFrame
import numpy as np
import sys

#Maximum number of chunks to sample from each file
nChunksPerFile = np.inf
#Duration of each chunk in seconds
chunkDuration = 4
#Expected sample rate
sampleRate = 48000

AudioChunks = []
np.random.seed(4756)

for audioFile in fileinput.input():
    audioFile = audioFile.strip()
    sf = Sndfile(audioFile, "r")
    if sf.samplerate != sampleRate: raise ValueError("wanted sample rate %g - got %g." % (sampleRate, sf.samplerate))
    
    nChunksInFile = int(sf.nframes / (sf.samplerate * chunkDuration))    
    #Sample without replacement random chunks from file
    sampledChunks = np.random.choice(nChunksInFile, min(nChunksInFile,nChunksPerFile), replace=False)
    
    for chunk in sampledChunks:
        frameStart = chunk * chunkDuration * sf.samplerate
        AudioChunks.append((audioFile, chunk, frameStart))
        
    sf.close()
    
    
#Create DataFrame
AudioChunks = DataFrame(AudioChunks)
AudioChunks.columns = ['audiofile', 'chunk', 'framestart']

sys.stderr.write("Processed " + str(len(AudioChunks)) + " chunks in total, corresponding to " + str(len(AudioChunks) * chunkDuration / float(60)) + " minutes of audio.\n")

#Write to CSV (stdout)
AudioChunks.to_csv(sys.stdout)