ConfPass.sh 8.09 KB
#!/bin/bash

#####################################################
# File :    ConfPass.sh                             #
# Brief :   Process the ASR Confidence pass         #
# Author :  Jean-François Rey                       #
#	        (base on Emmanuel Ferreira              #
#	        and hugo Mauchrétien works)             #
# Version : 1.0                                     #
# Date :    17/06/13                                #
#####################################################

echo "### ConfPass.sh ###"

#Check OTMEDIA_HOME env var
if [ -z ${OTMEDIA_HOME} ]
then
    OTMEDIA_HOME=$(dirname $(dirname $(readlink -e $0)))
    export OTMEDIA_HOME=$OTMEDIA_HOME
fi


# where is ConfPath.sh
MAIN_SCRIPT_PATH=$(dirname $(readlink -e $0))

# Scripts Path
SCRIPT_PATH=$OTMEDIA_HOME/tools/scripts

# Include scripts
. $SCRIPT_PATH"/Tools.sh"
. $SCRIPT_PATH"/CheckConfPass.sh"

# where is FirstPass.cfg
CONFPASS_CONFIG_FILE="$OTMEDIA_HOME/cfg/ConfPass.cfg"
if [ -e $CONFPASS_CONFIG_FILE ]
then
	. $CONFPASS_CONFIG_FILE
else
	echo "ERROR : Can't find configuration file $CONFPASS_CONFIG_FILE" > /dev/stderr
	exit 1
fi

#---------------#
# Parse Options #
#---------------#
while getopts ":hDv:cr" opt
do
	case $opt in
		h)
			echo -e "$0 [OPTIONS] <INPUT_DIRECTORY> <TREIL_DIRECTORY_NAME>\n"
            echo -e "\t Options:"
            echo -e "\t\t-h :\tprint this message"
            echo -e "\t\t-D :\tDEBUG mode on"
            echo -e "\t\t-v l :\tVerbose mode, l=(1|2|3) level mode"
            echo -e "\t\t-c :\t Check process, stop if error detected"
            echo -e "\t\t-r :\tForce to rerun confpas without deleting existing files"
			exit 1
			;;
		D)
			DEBUG=1
			;;
        v)
            VERBOSE=$OPTARG
            ;;
        c)
            CHECK=1
            ;;
        r)
            RERUN=1
            ;;
		:)
			echo "Option -$OPTARG requires an argument." > /dev/stderr
			exit 1
			;;
		\?)
			echo "BAD USAGE : unknow opton -$OPTARG"
			#exit 1
			;;
	esac
done

# mode debug enable
if [ $DEBUG -eq 1 ]
then
       set -x
       echo -e "## Mode DEBUG ON ##"
       REDIRECTION_OUTPUT=""
   else
       REDIRECTION_OUTPUT=" 2> /dev/null"
fi

# mode verbose enable
if [ $VERBOSE -gt 0 ]; then echo -e "## Verbose level : $VERBOSE ##" ;fi
 
# Check USAGE by arguments number
if [ $(($#-($OPTIND-1))) -ne 2 ]
then
    echo "BAD USAGE : ConfPass.sh [OPTIONS] <INPUT_DIR> <TREIL_DIRECTORY_NAME>"
    echo "$0 -h for more info"
    exit 1
fi

shift $((OPTIND-1))
# check input directory - first argument
if [ ! -e $1 ]
then
    print_error "can't open $1"
    exit 1
fi
# check treil input directory - second argument
if [ ! -e $1/$2 ]
then
    print_error "can't open $1/$2"
    exit 1
fi

#-------------#
# GLOBAL VARS #
#-------------#
INPUT_DIR=$(readlink -e $1)
OUTPUT_DIR=$INPUT_DIR 
BASENAME=$(basename $OUTPUT_DIR)
RES_NAME=$2
RES_P="${INPUT_DIR}/${RES_NAME}"
USF_FILE=${INPUT_DIR}/${BASENAME}.${RES_NAME}.usf
CONF_DIR="$OUTPUT_DIR/conf/$RES_NAME"
RES_CONF_DIR="$OUTPUT_DIR/conf/$RES_NAME/scored_ctm"
LOGFILE="${OUTPUT_DIR_BASENAME}/info_conf.log"
ERRORFILE="${OUTPUT_DIR_BASENAME}/error_conf.log"

#------------------#
# Create Workspace #
#------------------#
# Lock directory
if [ -e "$OUTPUT_DIR/CONFPASS.lock" ] && [ $RERUN -eq 0 ]
then
    print_warn "[${BASENAME}] Confpass is locked -> exit" 2
    exit 1
fi
rm "$OUTPUT_DIR/CONFPASS.unlock" > /dev/null 2>&1
touch "$OUTPUT_DIR/CONFPASS.lock" > /dev/null 2>&1
if [ $RERUN -eq 0 ]; then rm -r $CONF_DIR > /dev/null 2>&1; fi
if [ $RERUN -eq 1 ]; then rm $USF_FILE > /dev/null 2>&1; fi
mkdir -p $CONF_DIR > /dev/null 2>&1
mkdir -p $RES_CONF_DIR > /dev/null 2>&1
rm $LOGFILE $ERRORFILE > /dev/null 2>&1

#---------------#
# Check Pass    #
#---------------#
print_info "[${BASENAME}] Check Conf Pass directory ${RES_NAME}" 1
# if usf contains more than 49% of 0.600 confidence -> usf error
if [ -s $USF_FILE ]
then
    conftozerosix=$(grep -c -E 'confidence="0.600"' "${USF_FILE}")
    confall=$(grep -c -E 'confidence=' "${USF_FILE}")
    if [ $confall -gt 0 ]
    then
        pourcentageofzerosix=$((($conftozerosix*100)/$confall))
        if [ $pourcentageofzerosix -gt 49 ]
        then
            print_warn "[${BASENAME}] ${BASENAME}.${RES_NAME}.usf got $pourcentageofzerosix% of 0.600 confidence" 2
            print_info "[${BASENAME}] bad usf ${RES_NAME}, will do it again" 1
            mv "${USF_FILE}" "${USF_FILE}.back"
            rm -r $CONF_DIR > /dev/null 2>&1
        else
            print_warn "[${BASENAME}] ${USF_FILE} already done, skipping it" 1
            exit 0
        fi
    fi
else
    print_info "[${BASENAME}] No USF file already done, continue..." 1
fi

# Check if treil are here
nbres_p1=$(cat ${INPUT_DIR}/plp.lst | wc -l)
nbtreil_p=$(ls $RES_P/*.treil 2> /dev/null | wc -l)
if [ $nbtreil_p -eq 0 ]
then
    print_error "[${BASENAME}] No ${RES_NAME} Pass, No .treil -> exit ConfPass"
    if [ $CHECK -eq 1 ]; then print_log_file $ERRORFILE "No ${RES_NAME} Pass, No .treil -> exit ConfPass" ;fi
    exit 1
else
    #Check if more then 89% of treil are done
    if [ $nbres_p1 -gt 0 ]
    then
        pourcentage=$((($nbtreil_p*100)/$nbres_p1))
        if [ $pourcentage -gt 89 ]
        then
            print_info "[${BASENAME}] ${RES_NAME}/*.treil are here" 1
        else
            print_warn "[${BASENAME}] not enough ${RES_NAME} treil" 2
            if [ $CHECK -eq 1 ]; then print_log_file $ERRORFILE "Not enough ${RES_NAME} treil "
        fi
    fi
fi

#------#
# Save #
#------#
cp $CONFPASS_CONFIG_FILE $OUTPUT_DIR/ConfPass.cfg
echo "RES_CONF_DIR=$RES_CONF_DIR" >> $OUTPUT_DIR/ConfPass.cfg
echo "CONF_DIR=$CONF_DIR" >> $OUTPUT_DIR/ConfPass.cfg
print_info "[${BASENAME}] Save config in $OUTPUT_DIR_BASENAME/ConfPass.cfg" 1

#--------------------#
# CONFIDENCE MEASURE #
#--------------------#

# Check pourcentage of scored_ctm already done, if < 85% do confidence measure
nbres_p=$(ls ${RES_P}/*.treil | wc -l)
nbconf=$(ls ${RES_CONF_DIR}/*.res | wc -l)
if [ $nbres_p -gt 0 ]
then
    pourcentageres=$((($nbconf*100)/$nbres_p))
    if [ $pourcentageres -lt 85 ]
    then
        print_info "[${BASENAME}] Calcul Confidence $INPUT_DIR $RES_NAME" 1
        $MAIN_SCRIPT_PATH/ConfidenceMeasure.sh $INPUT_DIR $RES_NAME $REDIRECTION_OUTPUT

    else
        print_info "[${BASENAME}] Skipping Confidence Calcul $INPUT_DIR/$RES_NAME" 1
    fi
fi

### Check scored_ctm number res files !
if [ $CHECK -eq 1 ]
then
    nbconf=$(ls ${RES_CONF_DIR}/*.res | wc -l)
    if [ $nbres_p -ne $nbconf ]
    then
        print_warn "WARN : ConfPass $INPUT_DIR/$RES_NAME number of res files differ" 2
        print_log_file $LOGFILE "WARN : ConfPass $INPUT_DIR/$RES_NAME number of res files differ"
    fi
fi

#---------------------------#
# FROM RES WITH CONF => USF #
#---------------------------#
print_info "[${BASENAME}] Create USF file for $RES_P" 1
for f in `ls ${RES_CONF_DIR}`; do $SCRIPT_PATH/formatRES.pl $RES_CONF_DIR/$f; done
# create USF configuration file
echo -e "name $AUTHOR\nfileName $BASENAME\nfileExt wav\nsegFile $OUTPUT_DIR/$BASENAME.seg" > $OUTPUT_DIR/$BASENAME.usf_cfg
# create USF file
print_info "$SCRIPT_PATH/res2out.pl --dir $RES_CONF_DIR --format USF --ignore $RULES/asupp --out $USF_FILE.tmp --usf_config $OUTPUT_DIR/$BASENAME.usf_cfg $REDIRECTION_OUTPUT" 3
$SCRIPT_PATH/res2out.pl --dir $RES_CONF_DIR --format USF --ignore $RULES/asupp --out $USF_FILE.tmp --usf_config $OUTPUT_DIR/$BASENAME.usf_cfg $REDIRECTION_OUTPUT
rm $OUTPUT_DIR/$BASENAME.usf_cfg > /dev/null 2>&1
cat $USF_FILE.tmp | $SCRIPT_PATH/BdlexUC.pl $RULES/basic -f > $USF_FILE
cp $USF_FILE ${OUTPUT_DIR}/${BASENAME}.usf
rm $USF_FILE.tmp > /dev/null 2>&1

#----------------#
# Check USF file #
#----------------#
if [ $CHECK -eq 1 ]
then
    check_conf_pass_usf "$OUTPUT_DIR/$BASENAME.usf"
    if [ $? -eq 1 ]
    then
        print_error "[${BASENAME}] Wrong confidence measures in USF file : $OUTPUT_DIR/$BASENAME.usf"
        print_log_file $ERRORFILE "ERROR : Wrong confidence measures in USF file : $OUTPUT_DIR/$BASENAME.usf"
        exit 1
    fi
fi

#-------#
# CLOSE #
#-------#
# Seem OK 
print_info "[${BASENAME}] <= ConfPass End | $(date +'%d/%m/%y %H:%M:%S')" 1
 
# unlock directory
mv "$OUTPUT_DIR/CONFPASS.lock" "$OUTPUT_DIR/CONFPASS.unlock"