ThirdPass.sh 9.96 KB
#!/bin/bash

#####################################################
# File :    ThirdPass.sh                            #
# Brief :   ASR third pass using trigg files        #
# Author :  Jean-François Rey                       #
# Version : 1.0                                     #
# Date :    18/07/13                                #
#####################################################

echo "### ThirdPass.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 SecondPass.sh
MAIN_SCRIPT_PATH=$(dirname $(readlink -e $0))

# Scripts Path
SCRIPT_PATH=$OTMEDIA_HOME/tools/scripts

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

# where is ThirdPass.cfg
THIRDPASS_CONFIG_FILE=$OTMEDIA_HOME"/cfg/ThirdPass.cfg"
if [ -e $THIRDPASS_CONFIG_FILE ]
then
	. $THIRDPASS_CONFIG_FILE
else
	echo "ERROR : Can't find configuration file $THIRDPASS_CONFIG_FILE" >&2
	exit 1
fi

#---------------#
# Parse Options #
#---------------#
while getopts ":hDv:crf:" opt
do
	case $opt in
		h)
			echo -e "$0 [OPTIONS] <PASS_DIRECTORY>\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-f n :\tSpecify speeral forks number (default 1)"
            echo -e "\t\t-r n :\tforce rerun the show, without deleting works already done"
			exit 1
			;;
		D)
			DEBUG=1
			;;
        v)
            VERBOSE=$OPTARG
            ;;
        c)
            CHECK=1
            ;;
        f)
            FORKS="--forks $OPTARG"
            ;;
        r)
            RERUN=1
            ;;
		:)
			echo "Option -$OPTARG requires an argument." >&2
			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 ##"
fi

# mode verbose enable
if [ $VERBOSE -gt 0 ]; then echo -e "## Verbose level : $VERBOSE ##" ; fi

# Check USAGE by arguments number
if [ $(($#-($OPTIND-1))) -ne 1 ]
then
	echo "BAD USAGE : ThirdPass.sh [OPTIONS] <PASS_DIR>"
	echo "$0 -h for more info"
    exit 1
fi

shift $((OPTIND-1))
# check Pass directory - First argument
if [ -e $1 ] && [ -d $1 ]
then
    PASS_DIR=$(readlink -e $1)
    BASENAME=$(basename $PASS_DIR)
else
	print_error "can't find $1 directory"
	exit 1
fi

print_info "[${BASENAME}] => P3 start | $(date +'%d/%m/%y %H:%M:%S')" 1

#-------------#
# GLOBAL VARS #
#-------------#
EXPLOITCONFPASS_CONFIG_FILE="$PASS_DIR/ExploitConfPass.cfg"
if [ -e $EXPLOITCONFPASS_CONFIG_FILE ]
then
    TRIGGER_SPEERAL=$(cat $EXPLOITCONFPASS_CONFIG_FILE | grep "TRIGGER_SPEERAL=" | cut -f2 -d"=")
    LEX_SPEERAL=$(cat $EXPLOITCONFPASS_CONFIG_FILE | grep "LEX_SPEERAL=" | cut -f2 -d"=")
    LEX_BINODE_SPEERAL=$(cat $EXPLOITCONFPASS_CONFIG_FILE | grep "LEX_BINODE_SPEERAL=" | cut -f2 -d"=")
    LST=""
    PLP_DIR_P1=""
    HMM=""
else
    print_error "[${BASENAME}] Can't find $EXPLOITCONFPASS_CONFIG_FILE file"
    print_warn "[${BASENAME}] Will use default directories and files" 2
    #exit 1
    TRIGGER_SPEERAL=$PASS_DIR/trigg/speeral/
    LEX_SPEERAL=$PASS_DIR/LEX/speeral/LEXIQUE_V6_ext
    LEX_BINODE_SPEERAL=$PASS_DIR/LEX/speeral/LEXIQUE_V6_ext.bin
fi

SECONDPASS_CONFIG_FILE="$PASS_DIR/SecondPass.cfg"
if [ -e $SECONDPASS_CONFIG_FILE ]
then
    LST=$(cat $SECONDPASS_CONFIG_FILE | grep "^LST=" | cut -f2 -d"=")
    HMM=$(cat $SECONDPASS_CONFIG_FILE | grep "^HMM=" | cut -f2 -d"=")
    PLP_DIR_P1=$(cat $SECONDPASS_CONFIG_FILE | grep "^PLP_DIR_P1=" | cut -f2 -d"=")
    PLP_LIST_P1=$(cat $SECONDPASS_CONFIG_FILE | grep "^PLP_LIST_P1=" | cut -f2 -d"=")
else
    print_error "[${BASENAME}] Can't find $SECONDPASS_CONFIG_FILE file"
    print_warn "[${BASENAME}] Will use default directories and files" 2
    #exit 1
    LST=$PASS_DIR/lists
    HMM=$PASS_DIR/hmm
    PLP_DIR_P1=$PASS_DIR/PLP
    PLP_LIST_P1=$PASS_DIR/plp.lst
fi

OUTPUT_DIR_BASENAME=$PASS_DIR
RES_DIR="$PASS_DIR/res_p3"
LOGFILE=$PASS_DIR"/info_p3.log"
ERRORFILE=$PASS_DIR"/error_p3.log"

#------------------#
# Create WORKSPACE #
#------------------#

# Lock directory
if [ -e $OUTPUT_DIR_BASENAME/THIRDPASS.lock ] && [ $RERUN -eq 0 ]; then print_warn "[${BASENAME}] THIRDPASS is locked -> exit" 2; exit 1; fi
rm "$OUTPUT_DIR_BASENAME/THIRDPASS.unlock" > /dev/null 2>&1
touch "$OUTPUT_DIR_BASENAME/THIRDPASS.lock" > /dev/null 2>&1

if [ $RERUN -eq 0 ]; then rm -r $RES_DIR > /dev/null 2>&1; fi
mkdir -p $RES_DIR
print_info "[${BASENAME}] Make directory $RES_DIR" 3 

rm $LOGFILE $ERRORFILE 2>/dev/null
#--------------------#
# Save configuration #
#--------------------#
cp $THIRDPASS_CONFIG_FILE $OUTPUT_DIR_BASENAME/ThirdPass.cfg
echo "RES_DIR=$RES_DIR" >> $OUTPUT_DIR_BASENAME/ThirdPass.cfg
print_info "[${BASENAME}] Save config in $OUTPUT_DIR_BASENAME/ThirdPass.cfg" 1

#--------------------------------------------------#
# Third Pass using trigger file (DECODING)         #
#--------------------------------------------------#
print_info "[${BASENAME}] Launch Third Pass" 1

## Generate speeral config file adding trigger rep
cat $SPEERAL_CFG_PATH/$SPEERAL_CFG_FILE | sed -e "s|<nom>[^<]*</nom>|<nom>$OUTPUT_DIR_BASENAME/LEX/speeral/LEXIQUE_V6_ext</nom>|g" \
    | sed -e "s|<binode>[^<]*</binode>|<binode>$OUTPUT_DIR_BASENAME/LEX/speeral/LEXIQUE_V6_ext.bin</binode>|g" \
    | sed -e "s|<trigger><dir>[^<]*</dir></trigger>|<trigger><dir>$TRIGGER_SPEERAL</dir></trigger>|g" > $OUTPUT_DIR_BASENAME/SpeeralThirdPass.xml
SPEERAL_THIRD_CFG=$OUTPUT_DIR_BASENAME/SpeeralThirdPass.xml
print_info "[${BASENAME}] Third Pass Speeral Config file ${SPEERAL_THIRD_CFG}" 3

# for all speaker
for lspeaker in $(ls $LST/*.lst)
do
    speaker=$(basename $lspeaker ".lst")
    # for all AM
    for (( i=0; $i<${#MTAG[@]} ; i++ ))
    do
        if [ -e $OUTPUT_DIR_BASENAME/plp_${MODS[$i]}.lst ]; then
            type=$(grep -e "${speaker}$" "$OUTPUT_DIR_BASENAME/plp_${MODS[$i]}.lst")
            ## if is the good AM for the speaker
            if [ -n "$type" ]
            then
                ## Speeral decoding
                if [ -s $HMM/$speaker.hmm ] && [ -s $HMM/$speaker.cls ]
                then
                    print_info "[${BASENAME}] $SPEERAL_BIN $LST/$speaker.lst $RES_DIR $SPEERAL_THIRD_CFG -r $PLP_DIR_P1 -m $HMM/$speaker.hmm -c $HMM/$speaker.cls $FORKS --lock" 3
                    $SPEERAL_BIN $LST/$speaker.lst $RES_DIR ${SPEERAL_THIRD_CFG} -r $PLP_DIR_P1 -m $HMM/$speaker.hmm -c $HMM/$speaker.cls $FORKS --lock
                else
                    print_warn "[${BASENAME}] $HMM/$speaker.hmm and $speaker.cls empty, do default decoding..." 2
                    print_info "$SPEERAL_BIN $LST/$speaker.lst $RES_DIR ${SPEERAL_THIRD_CFG} -r $PLP_DIR_P1 -m $SPEERAL_AM/${MODS[$i]}.hmm -c $SPEERAL_AM/${MODS[$i]}.cls $FORKS --lock" 3
                    $SPEERAL_BIN $LST/$speaker.lst $RES_DIR ${SPEERAL_THIRD_CFG} -r $PLP_DIR_P1 -m $SPEERAL_AM/${MODS[$i]}.hmm -c $SPEERAL_AM/${MODS[$i]}.cls $FORKS --lock
                fi

                if [ $CHECK -eq 1 ]
                then
                    check_third_pass_output_speeral "$LST/$speaker.lst" "$RES_DIR"
                    if [ $? -eq 1 ]
                    then 

                        print_warn "[${BASENAME}] Speeral output error : check $LOGFILE" 2
                        print_log_file $LOGFILE "WARN : Speeral number of output ERROR $LST/$speaker.lst"
                        ls $RES_DIR/*.seg 2>/dev/null | grep -e "$speaker" | sed -e "s|$RES_DIR\/||" | sed -e 's/\.seg//' | sort > ${OUTPUT_DIR_BASENAME}/.tmp
                        print_log_file $LOGFILE "Segs (and treil) not done :\n["
                        diff $LST/$speaker.lst ${OUTPUT_DIR_BASENAME}/.tmp | grep -e "^< " | sed -e "s/< //"  >> $LOGFILE
                        print_log_file $LOGFILE "] [$(date +'%d/%m/%y %H:%M:%S')]"
                        rm ${OUTPUT_DIR_BASENAME}/.tmp
                    fi
                fi
                break
            fi
        fi
    done
done

## Check missing seg and log it

## Check missing seg and log it
if [ $CHECK -eq 1 ]
then
    ls $RES_DIR/*.treil 2>/dev/null | sed -e "s|$RES_DIR\/||g" | sed -e 's/\.treil//' | sort > ${OUTPUT_DIR_BASENAME}/.tmp
    todo=$(cat ${PLP_LIST_P1} 2>/dev/null | wc -l)
    if [ $todo -eq 0 ]; then todo=1;fi
    notdone=$(($todo - $(cat ${OUTPUT_DIR_BASENAME}/.tmp | wc -l)))
    pourcentage=$((($notdone*100)/$todo))
    if [ $notdone -ne 0 ]
    then
        print_error "[${BASENAME}] Check $ERRORFILE"
        print_log_file "$ERRORFILE" "ERROR : Treil not done ["
        diff ${PLP_LIST_P1} ${OUTPUT_DIR_BASENAME}/.tmp | grep -e "^< " | sed -e "s/< //" >> $ERRORFILE
        print_log_file "$ERRORFILE" "] $pourcentage% $BASENAME"
   else
        print_log_file "$LOGFILE" "P3 OK $BASENAME | $(date +'%d/%m/%y %H:%M:%S')"
   fi
   rm ${OUTPUT_DIR_BASENAME}/.tmp > /dev/null 2>&1
fi

#---------------#
# Convert res   #
#---------------#

print_info "[${BASENAME}] Convert .res into .ctm" 1
# .res => .ctm
$SCRIPT_PATH/res2out.pl --dir $RES_DIR --format CTM --ignore $RULES/asupp --out ${OUTPUT_DIR_BASENAME}/${BASENAME}.3pass.ctm
print_info "[${BASENAME}] Convert .res into .trs" 1
# .res => .trs
echo -e "name $AUTHOR\nfileName ${BASENAME}\nfileExt wav\nsegFile ${OUTPUT_DIR_BASENAME}/${BASENAME}.seg" > ${OUTPUT_DIR_BASENAME}/${BASENAME}.trs_cfg
$SCRIPT_PATH/res2out.pl --dir $RES_DIR --format TRS --ignore $RULES/asupp --out ${OUTPUT_DIR_BASENAME}/${BASENAME}.3pass.trs --trs_config ${OUTPUT_DIR_BASENAME}/${BASENAME}.trs_cfg
rm ${OUTPUT_DIR_BASENAME}/${BASENAME}.trs_cfg > /dev/null 2>&1
print_info "[${BASENAME}] Convert .res into .txt" 1
# .res => .txt
$SCRIPT_PATH/res2out.pl --dir $RES_DIR --format TXT --ignore $RULES/asupp --out ${OUTPUT_DIR_BASENAME}/${BASENAME}.3pass.txt


print_info "[${BASENAME}] <= P3 End | $(date +'%d/%m/%y %H:%M:%S')" 1

# unlock directory
mv "$OUTPUT_DIR_BASENAME/THIRDPASS.lock" "$OUTPUT_DIR_BASENAME/THIRDPASS.unlock"