annotate 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
rev   line source
Chris@222 1 #!/bin/sh
Chris@222 2
Chris@222 3 # Assumption: instrument parameter value 0 of the Silvet plugin is
Chris@222 4 # always "multiple or unknown instruments" and 1 is always "piano".
Chris@222 5
Chris@222 6 piano_path="/home/cannam/Music/piano_small_dataset"
Chris@222 7 yc="/home/cannam/code/may/bin/yc"
Chris@222 8
Chris@222 9 if [ ! -d "$piano_path" ]; then
Chris@222 10 echo "Piano dataset directory $piano_path not found, giving up"
Chris@222 11 exit 1
Chris@222 12 fi
Chris@222 13
Chris@222 14 if ! "$yc" -v ; then
Chris@222 15 echo "Failed to run Yeti compiler yc at $yc_path, giving up";
Chris@222 16 fi
Chris@222 17
Chris@222 18 if ! sonic-annotator -v ; then
Chris@222 19 echo "Failed to run sonic-annotator (not in PATH?), giving up"
Chris@222 20 exit 1
Chris@222 21 fi
Chris@222 22
Chris@222 23 rdffile="../../silvet.n3"
Chris@222 24 if [ ! -f "$rdffile" ] ; then
Chris@222 25 echo "Failed to find plugin RDF file at $rdffile, giving up"
Chris@222 26 exit 1
Chris@222 27 fi
Chris@222 28
Chris@222 29 case "$piano_path" in
Chris@222 30 *\ *) echo "Piano dataset path $piano_path has a space in it, this script won't handle that"; exit 1;;
Chris@222 31 esac
Chris@222 32
Chris@222 33 ( cd ../.. ; make -f Makefile.linux ) || exit 1
Chris@222 34
Chris@222 35 VAMP_PATH=../..
Chris@222 36 export VAMP_PATH
Chris@222 37
Chris@222 38 outfile="/tmp/$$"
Chris@222 39
Chris@222 40 tmpwav="/tmp/$$.wav"
Chris@222 41
Chris@222 42 transfile="/tmp/$$transform.ttl"
Chris@222 43
Chris@222 44 trap 'rm -f "$outfile" "$tmpwav" "$instfile" "$transfile" "$outfile.lab"' 0
Chris@222 45
Chris@222 46 infiles=$(find "$piano_path" -name \*.wav)
Chris@222 47
Chris@222 48 echo
Chris@222 49 echo "Input files are:"
Chris@222 50 echo $infiles | fmt -1
Chris@222 51
Chris@222 52 time for infile in $infiles; do
Chris@222 53
Chris@222 54 echo
Chris@222 55 echo "Evaluating for file $infile..."
Chris@222 56
Chris@222 57 intended_instrument=1 ## assumption: 1 == piano
Chris@222 58
Chris@222 59 # We run this twice, once using the default instrument
Chris@222 60 # (i.e. "multiple or unknown") and once using the intended
Chris@222 61 # instrument preset (piano).
Chris@222 62
Chris@222 63 filename=$(basename "$infile" .wav)
Chris@222 64
Chris@222 65 for instrument in $intended_instrument 0; do
Chris@222 66
Chris@222 67 echo
Chris@222 68 echo "For file $filename, instrument $instrument..."
Chris@222 69
Chris@222 70 # Don't normalise -- part of the point here is to make it work
Chris@222 71 # for various different levels
Chris@222 72 cp "$infile" "$tmpwav"
Chris@222 73
Chris@222 74 # generate the transform by interpolating the instrument parameter
Chris@222 75 cat transform.ttl | sed "s/INSTRUMENT_PARAMETER/$instrument/" > "$transfile"
Chris@222 76
Chris@222 77 sonic-annotator \
Chris@222 78 --writer csv \
Chris@222 79 --csv-one-file "$outfile" \
Chris@222 80 --csv-force \
Chris@222 81 --transform "$transfile" \
Chris@222 82 "$tmpwav"
Chris@222 83
Chris@222 84 cat "$outfile" | \
Chris@222 85 sed 's/^[^,]*,//' | \
Chris@222 86 while IFS=, read start duration frequency level label; do
Chris@222 87 end=`echo "$start $duration + p" | dc`
Chris@222 88 echo -e "$start\t$end\t$frequency"
Chris@222 89 done > "$outfile.lab"
Chris@222 90
Chris@222 91 for ms in 50; do
Chris@222 92 mark=""
Chris@222 93 if [ "$instrument" = "0" ]; then
Chris@222 94 mark=" <-- generic for $filename";
Chris@222 95 else
Chris@222 96 mark=" <-- piano preset for $filename";
Chris@222 97 fi;
Chris@222 98 echo
Chris@222 99 echo "Validating against ground truth at $ms ms:"
Chris@222 100 "$yc" ./evaluate_lab.yeti "$ms" "../piano-groundtruth/$filename.lab" "$outfile.lab" | sed 's,$,'"$mark"','
Chris@222 101 done;
Chris@222 102
Chris@222 103 echo
Chris@222 104 done
Chris@222 105 done