Mercurial > hg > silvet
diff testdata/evaluation/run-piano.sh @ 222:69ac2d0770b8
Add piano-evaluation script; fix one of the piano groundtruth files (was a variable-tempo file which naive conversion script couldn't handle); fix the conversion script to fail when such a file is encountered
author | Chris Cannam |
---|---|
date | Wed, 16 Jul 2014 12:46:18 +0100 |
parents | |
children | 51c18a17404a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testdata/evaluation/run-piano.sh Wed Jul 16 12:46:18 2014 +0100 @@ -0,0 +1,105 @@ +#!/bin/sh + +# Assumption: instrument parameter value 0 of the Silvet plugin is +# always "multiple or unknown instruments" and 1 is always "piano". + +piano_path="/home/cannam/Music/piano_small_dataset" +yc="/home/cannam/code/may/bin/yc" + +if [ ! -d "$piano_path" ]; then + echo "Piano dataset directory $piano_path not found, giving up" + exit 1 +fi + +if ! "$yc" -v ; then + echo "Failed to run Yeti compiler yc at $yc_path, giving up"; +fi + +if ! sonic-annotator -v ; then + echo "Failed to run sonic-annotator (not in PATH?), giving up" + exit 1 +fi + +rdffile="../../silvet.n3" +if [ ! -f "$rdffile" ] ; then + echo "Failed to find plugin RDF file at $rdffile, giving up" + exit 1 +fi + +case "$piano_path" in +*\ *) echo "Piano dataset path $piano_path has a space in it, this script won't handle that"; exit 1;; +esac + +( cd ../.. ; make -f Makefile.linux ) || exit 1 + +VAMP_PATH=../.. +export VAMP_PATH + +outfile="/tmp/$$" + +tmpwav="/tmp/$$.wav" + +transfile="/tmp/$$transform.ttl" + +trap 'rm -f "$outfile" "$tmpwav" "$instfile" "$transfile" "$outfile.lab"' 0 + +infiles=$(find "$piano_path" -name \*.wav) + +echo +echo "Input files are:" +echo $infiles | fmt -1 + +time for infile in $infiles; do + + echo + echo "Evaluating for file $infile..." + + intended_instrument=1 ## assumption: 1 == piano + + # We run this twice, once using the default instrument + # (i.e. "multiple or unknown") and once using the intended + # instrument preset (piano). + + filename=$(basename "$infile" .wav) + + for instrument in $intended_instrument 0; do + + echo + echo "For file $filename, instrument $instrument..." + + # Don't normalise -- part of the point here is to make it work + # for various different levels + cp "$infile" "$tmpwav" + + # generate the transform by interpolating the instrument parameter + cat transform.ttl | sed "s/INSTRUMENT_PARAMETER/$instrument/" > "$transfile" + + sonic-annotator \ + --writer csv \ + --csv-one-file "$outfile" \ + --csv-force \ + --transform "$transfile" \ + "$tmpwav" + + cat "$outfile" | \ + sed 's/^[^,]*,//' | \ + while IFS=, read start duration frequency level label; do + end=`echo "$start $duration + p" | dc` + echo -e "$start\t$end\t$frequency" + done > "$outfile.lab" + + for ms in 50; do + mark="" + if [ "$instrument" = "0" ]; then + mark=" <-- generic for $filename"; + else + mark=" <-- piano preset for $filename"; + fi; + echo + echo "Validating against ground truth at $ms ms:" + "$yc" ./evaluate_lab.yeti "$ms" "../piano-groundtruth/$filename.lab" "$outfile.lab" | sed 's,$,'"$mark"',' + done; + + echo + done +done