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