domingo, 12 de mayo de 2013

Entrada 14: Interfaz gráfica de usuario III - Abril 2013

Como podemos ver en la entrada anterior, model.record(); ejecuta un shell script. Dicho shell script lo que hace es llamar a un script que limpia los stats de reconocimientos realizados anteriormente (para tener una ocupación de memoria sostenible), y configura la entrada de audio y lanza la grabación en el archivo .wav que se la pasa como parámetro:
#!/bin/bash

LID_RPi_DIR=ruta_absoluta_al_proyecto
#Borrado de stats antiguos:
sh ${LID_RPi_DIR}/Borrar_temp.sh
# Nombre y ruta del fichero de audio con la grabación.
WAV_NAME=${1}
WAV_NAME_RUTA=${LID_RPi_DIR}/audio/${WAV_NAME}
# Configuración del micrófono para que grabe
amixer -c 1 sset Mic,0 100%,100% unmute cap >/dev/null
# Lanza la grabación
arecord -D hw:1,0 -f S16_LE -c 1 -r 8000 -B 900000 ${WAV_NAME_RUTA}.wav >/dev/null
El script que se encarga de borrar stats antiguos tiene las siguientes instrucciones:
#!/bin/bash

cd "ruta_absoluta_al_proyecto"/ivectoresMFCC
rm data/tmp.prm/* fea/* lbl/*
cd plenty_closed
rm ivec/ascii_out_512G_400i/* log/* results_512G_i400/tmp/* results_512G_i400/* /stats_512_400/*
En la siguiente vista, veremos un cronómetro que nos indica el tiempo que llevamos grabando, y un botón que pone "Parar". Al detener la grabación lo que hacemos es que el propio navegador detiene el cronómetro, cambia el texto del botón a "Realizar el reconocimiento", y manda una petición al servidor para detener la grabación y comenzar a realizar el reconocimiento. La vista recording.html es la siguiente:
<script type="text/javascript" src="/js/timer.js"></script>
<div id="traza">
   Grabando...
</div>
<div id="timer">
   00:00
</div>
<div id="time"></div>
<script type="text/javascript">
   setInterval(function(){timer()}, 1000);//Cronómetro
</script>
<form method="GET" action="/init">
   <input id="stop" type="submit" value="Parar">
</form>
<form method="GET" action="/lidonrpi/results">
   <input id="recognize" type="submit" value="Realizar el reconocimiento" style="display: none">
</form>
<script type="text/javascript">
   $("#stop").on('click', function() {
      $("#stop").attr("style", "display: none");
      $("#recognize").attr("style", "display: yes");
      $("#timer").attr("style", "display: none");
      $("#time").html(decenasMinutos +''+ unidadesMinutos + ':' + decenasSegundos +''+ unidadesSegundos);
      $("#traza").html("Grabación realizada.");
   });
</script>
donde utilizamos jQuery para los cambios en la vista (en app.html importamos la librería) y el script en "/js/timer.js" es el que se encarga de realizar las acciones del cronómetro de la siguiente forma:
var unidadesSegundos = 1;
var decenasSegundos = 0;
var unidadesMinutos = 0;
var decenasMinutos = 0;
function timer() {
   var display = document.getElementById("timer");
   display.innerHTML = decenasMinutos +''+ unidadesMinutos + ':' + decenasSegundos +''+ unidadesSegundos;
   switch(unidadesSegundos) {
      case 9: {
 unidadesSegundos = 0;
 switch(decenasSegundos) {
    case 5: {
       decenasSegundos = 0;
       switch(unidadesMinutos) {
  case 9: {
     unidadesMinutos = 0;
     switch(decenasMinutos) {
        case 5: {
   decenasMinutos = 0;
   break;
        }
        default: { decenasMinutos++; break; }
            }
            break;
         }
         default: { unidadesMinutos++; break; }
       }
       break;
           }
           default: { decenasSegundos++; break; }
 }
        break;
      }
      default: { unidadesSegundos++; break; }
   }
}
Los cambios a realizar en el servidor serán:
  • En controller.init(); dentro del controlador:
model.stop();
model.recognize();
  • En el modelo, creo model.stop() y model.recognize():
stop: function () {
   child = exec('killall arecord',
   function (error, stdout, stderr) {
      if (error !== null) {
         console.log('"killall arecord" exec error: ' + error);
      }
   });
},
recognize: function () {
   child = exec('./scripts/reconoce.sh '+tmpAudio,
   function (error, stdout, stderr) {
      console.log('reconoce.sh -> stdout: ' + stdout);
      console.log('reconoce.sh -> stderr: ' + stderr);
      if (error !== null) {
         console.log('reconoce.sh -> exec error: ' + error);
      }
      result = stdout;//Resultado del reconocimiento
   });
}
El script reconoce.sh que se lanza con model.recognize(); tiene el siguiente contenido:
#!/bin/bash

# Ruta al programa que realiza el reconocimiento
LID_RPi_DIR="ruta_absoluta_al_proyecto"
# Ruta al fichero con los resultados
SCORES=${LID_RPi_DIR}/ivectoresMFCC/plenty_closed/results_512G_i400/plenty_closed_acus_400i_512G_WithLN_hmmHung_isEval__Albayzin_TEST.scores
# Actualizar la lista con el nombre del archivo 
basename $1 .wav > "${LID_RPi_DIR}/prueba.lst"
# Realizar el reconocimiento
${LID_RPi_DIR}/runAll2.sh >/dev/null
# Decidir el idioma reconocido: ESCOGE LA MÁXIMA PUNTUACIÓN.
scores=(`cat ${SCORES}`)
result_n=3
for i in 4 5 6 7 8
   do
      st=$(echo "${scores[result_n]} < ${scores[$i]}" | bc)
      if [ $st -eq 1 ]
 then
 result_n=$i
      fi
done
case $result_n in
   3) result=vasco;;
   4) result=catalán;;
   5) result=inglés;;
   6) result=gallego;;
   7) result=portugués;;
   8) result=español;;
esac
echo $result

No hay comentarios:

Publicar un comentario