RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.
Para el control del PIC mediante órdenes verbales vamos a emplear el módulo EasyVR de Veear al que previamente le hemos creado las voces a reconocer (voces definidas por el usuario SD) y la tabla de sonidos a emplear. Aunque la enseñanza de estas voces se puede realizar desde código en el PIC, resulta más sencilla la enseñanza mediante el software EasyVR Commander a través del PC, tal como se ha explicado en el artículo correspondiente. El ejemplo, meramente didáctico, va a consistir en reconocer voces, ya sean SI o SD, contenidas en uno de los grupos o wordset del EasyVR, reconocer parejas de voces mediante la combinación de 2 grupos y reproducir textos hablados. En el caso de voces SD, en un LCD aparecerá la etiqueta de la voz reconocida y la posición que ocupa dentro de su grupo. En el caso de voces SI, tan solo aparecerá la posición. Si se produce algún error en el reconocimiento de las voces, se mostrará el código del error y su descripción. Cada vez que se solicita el reconocimiento de una nueva voz, se indica en un mensaje de texto y simultáneamente con la reproducción de una frase. Todas estas opciones serán elegidas individualmente o de forma combinada según el estado de las entradas en el puerto A.
Este sería el procedimiento para la ejecución de un comando del PIC sobre el EasyVR:
comando = 'l';//Comando a emplear (l = idioma)
argumento = 4;//Argumento del comando (4 = español)
putc(comando);//Envía comando elegido
putc(argumento+'A');//Envío del argumento en su equivalente ASCII
Respuesta=getc();//Recibe la respuesta del EasyVR
Para el reconocimiento de voces...
comando = 'd';//Comando a emplear (d = reconocimiento voces SD)
if (respuesta == 'r'){//Si se ha reconocido la voz
putc(' ');//Solicita siguiente dato
respuesta=getc();//Recibe posición en el grupo
posicion = respuesta;//guarda la posición obtenida
}
if (respuesta == 'e'){//Si no se ha reconocido la voz
putc(' ');//Solicita siguiente dato
respuesta=getc();//Recibe 1º dato de error de 4 bits
error=respuesta;//Guarda el dato de error
putc(' ');//Solicita siguiente dato
respuesta=getc();//Recibe 2º dato de error de 4 bits
error=(error<<4)|(respuesta);//Transforma error en un byte de 8 bits
}
Obtenida la posición o el error, los gestionaremos para hacer la función deseada sobre el PIC. En el caso de reconocimiento de voces SI el procedimiento sería el mismo pero utilizando su correspondiente comando ('i'). La respuesta en caso de reconocimiento sería 's'.
Con este otro código, reproduciremos un sonido o frase de la tabla de sonidos:
int16 indice = 1;//Posición del sonido a reproducir en la tabla
volumen = 30;//Volumen de la reproducción (entre 0 y 31)
indice_bajo=make8(indice,0);//Parte alta de indice a indice_bajo
indice_alto=make8(indice,1);//Parte alta de indice a indice_alto
putc('w');//Envía comando
putc(indice_alto+'A');//Envía byte más peso del indice(8 bits)
putc(indice_bajo+'A');//Envía byte más peso del indice(8 bits)
putc(volumen+'A');//Envía el nivel de volumen
respuesta=getc();//Recibe un dato del EasyVR
Para leer la etiqueta asociada a una voz SD:
int i=0; //Indice del buffer
int grupo = 3; //nº de grupo
int posicion = 6;//posición en el grupo
char etiqueta [16]; //Buffer etiqueta; max.16
putc('p');//Envía comando "lectura etiqueta"
putc(Grupo+'A');//Envía el número de grupo
putc(posicion+'A');//Envía posición en el grupo
respuesta=getc(); //Recibe un dato del EasyVR
putc(' ');//Solicita siguiente dato
respuesta=getc();//Recibe un dato del EasyVR
putc(' ');//Solicita siguiente dato
respuesta=getc();//Recibe un dato del EasyVR
putc(' ');//Solicita siguiente dato
respuesta=getc()-'A';//Recibe nº de caracteres de la etiqueta
n_caracteres=respuesta;//Guarda nº caracteres de la etiqueta
//Llena el buffer con los caracteres de la etiqueta
for(i=0;i<n_caracteres;i++) {
putc(' '); //Solicita siguiente carácter
etiqueta[i]=getc();//Llena el buffer
}
Finalmente el procedimiento para obtener el nº de etiquetas dentro de un grupo de voces SD:
int grupo = 3;//nº de grupo putc('c');//Envía comando putc(Grupo+'A');//Envia nº de grupo respuesta=getc(); //Recibe un dato del EasyVR putc(' ');//Solicita siguiente dato respuesta=getc()-'A'; //Recibe nº de etiquetas del grupo
El programa completo que se muestra para el ejemplo de funcionamiento está estructurado con llamadas a funciones para poderlo emplear como plantilla para otros proyectos cambiando tan solo el código contenido en la función main.
//////////////////////////////////////////////////////////////////////////////// // // // CONTROL PIC POR VOZ CON EL MÓDULO EasyVR // // // // (c) RobotyPic // // http://robotypic.blogspot.com/ // // // //////////////////////////////////////////////////////////////////////////////// #include <16f876a.h> #fuses XT,NOLVP,PUT,NOWDT,NOWRT #use delay(clock=4000000) //Frecuencia de reloj externa //Habilitación y configuración de las funciones RS232 #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7) //Configuración de la gestión de los puertos #define use_portb_lcd TRUE //Puerto B para uso LCD #use fast_io (A) //Configuración puerto A #use fast_io (B) //Configuración puerto A #include <lcd.c> //Driver para pantalla lcd /********************** COMANDOS DE CONTROL EasyVR ****************************/ /* Definición de comandos de entrada al módulo de reconocimiento de voz EasyVR*/ #define CMD_LANGUAGE 'l' //Selecciona idioma de las palabras predefinidas (SI) //Espera recibir STS_SUCCESS #define CMD_BREAK 'b' //Detiene cualquier comando o reconocimiento en proceso //Espera recibir STS_SUCCESS o STS_INTERR #define CMD_RECOG_SI 'i' //Activa el reconocimiento de una voz predefinida (SI) //Espera recibir STS_SIMILAR, STS_TIMEOUT o STS_ERROR #define CMD_RECOG_SD 'd' //Activa reconocimiento de una palabra o voz de usuario (SD) //Espera recibir STS_RESULT, STS_TIMEOUT o STS_ERROR #define CMD_KNOW 'k' //Ajusta el nivel de reconocimiento para las palabras predefinidas (SI) //Espera recibir STS_SUCCESS #define CMD_LEVEL 'v' //Ajusta el nivel de reconocimiento de las voces usuario (SD) //Espera recibir STS_SUCCESS #define CMD_PLAY_SX 'w' //Reproduce los sonidos de la tabla de sonidos //Espera recibir STS_SUCCESS o STS_ERROR #define CMD_DUMP_SD 'p' //Lee la etiqueta de un comando SD //Espera recibir STS_DATA #define CMD_COUNT_SD 'c' //Indica número de comandos SD que hay en un grupo //Espera recibir STS_COUNT #define CMD_TIMEOUT 'o' //Ajusta el tiempo de reconocimiento //Espera recibir STS_SUCCESS /*************************** REGISTROS DE ESTADO ******************************/ /*Definición de estados o respuestas del módulo EasyVR tras ejecutar un comando*/ #define STS_SUCCESS 'o' //Ejecución correcta. Respuesta a varios comandos. #define STS_SIMILAR 's' //Voz similar. Respuesta al comando SI #define STS_TIMEOUT 't' //Tiempo sobrepasado en enseñanza o reconocimiento de voz #define STS_ERROR 'e' //Error en los comandos de enseñanza o reconocimiento de voces #define STS_RESULT 'r' //Voz reconocida. Respuesta al reconocimiento de voces SD #define STS_INTERR 'i' //Interrupción durante reconocimiento. Respuesta a CMD_BREAK #define STS_DATA 'd' //Respuesta al comando CMD_DUMP_SD. #define STS_COUNT 'c' //Respuesta al comando CMD_COUNT_SD. /********************* Prototipos de las funciones ****************************/ FUN_COMANDO (); //Envío de un comando FUN_RESPUESTA_COMANDO(); //Recepción de la respuesta del EasyVR tras un comando FUN_BREAK(); //Aborta cualquier operación en curso en el EasyVR FUN_RECONOCIMIENTO(int); //Función de reconocimiento de voces FUN_ACK_RESPUESTA(); //Función para solicitud de recepción de siguiente dato FUN_ERROR(); //Crea mensaje de texto en función del error recibido FUN_ETIQUETA_SD(); //Reconocimiento de la etiqueta asociada a una voz SD FUN_ARGUMENTO(int); //Envío del argumento del comando FUN_N_ETIQUETAS(); //Obtención del nº de etiquetas dentro de un grupo /******************* Definición de variables globales *************************/ int EVR_Dato; //Datos de propósito general int EVR_Replica; //Recibe las respuestas de los comandos. Códigos STS int EVR_Grupo; //Determina grupo (0=Trigger,1-15 genérico, 16=password) int EVR_Posicion; //Recibe la posición(0-31)dentro de un grupo char EVR_TipoVoz; //Tipo de voz 1=SI o 0=SD char EVR_Resultado; //Guarda el resultado del reconocimiento int EVR_Error; //Guarda código de error a partir de dos datos de 4 bits char EVR_Mensaje[16]; //Mensaje de error char EVR_Etiqueta[16]; //Etiqueta de la correspondiente voz int EVR_Volumen; //Volumen de reproducción del sonido int16 EVR_Indice; //Índice del mensaje o sonido a reproducir de la Tabla int EVR_IndiceAlto; //Byte alto del indice int EVR_IndiceBajo; //Byte bajo del índice int EVR_NCaracteres; //Nº de caracteres de la etiqueta de una voz int EVR_Esperado; //Respuesta esperada del reconocimiento de voces int EVR_NEtiquetas; //Nº de etiquetas de un grupo SD /*************************** FUNCIÓN COMANDO **********************************/ /* Envía el comando al EasyVR y su argumento */ FUN_COMANDO(int comando) { putc(comando); //Envía comando FUN_ARGUMENTO(EVR_Dato); //Función de envío del argumento del comando } /********************** FUNCIÓN ARGUMENTO DE COMANDO **************************/ /* Envía el argumento para los comandos que lo necesitan. Se espera a recibir respuesta que se deposita en EVR_Replica */ FUN_ARGUMENTO(int dato) { putc(dato+'A'); //Envío del argumento en su equivalente ASCII EVR_Replica=FUN_RESPUESTA_COMANDO(); //Recibe respuesta del comando } /************************ FUNCIÓN DE RUPTURA **********************************/ /* Aborta cualquier operación en curso. Devuelve 'o'(STS_SUCCESS) si no hay errores o 'i' (STS_INTERR) si la detención se produce durante el reconocimiento o enseñanza de una voz */ FUN_BREAK() { putc(CMD_BREAK); //Envía comando CMD_BREAK EVR_Replica=FUN_RESPUESTA_COMANDO(); //Lee el byte recibido } /************************ FUNCIÓN RESET BUFFER ********************************/ /*Reinicializa el buffer empleado para alojar la etiqueta leída correspondiente a una voz */ FUN_RESET_ETIQUETA() { int i; //Índice del buffer for(i=0;i<16;i++) //Nº de posiciones del buffer EVR_Etiqueta[i]=0; //Borra posición i del buffer } /******************** FUNCIÓN RESPUESTA DEL EasyVR **************************/ /* Recepción de un carácter de respuesta a un comando */ FUN_RESPUESTA_COMANDO() { int dato; dato=getc(); //Recibe un dato del EasyVR delay_ms(1); //Retardo entre un byte y el siguiente return dato; //Retorna el dato recibido } /******************* FUNCIÓN CONFIRMACIÓN Y RESPUESTA *************************/ /* Envía confirmación de la recepción de un caracter de respuesta a un comando y solicita el siguiente caracter de respuesta al Easy_VR */ FUN_ACK_RESPUESTA() { putc(' '); //Envía confirmación EVR_Dato=FUN_RESPUESTA_COMANDO()-'A'; //Recibe siguiente byte de respuesta } /********************* FUNCIÓN RESULTADO RECONOCIMIENTO ***********************/ /**** Resultado obtenido del reconocimiento de la voz y muestra en el LCD *****/ FUN_RESULTADO() { switch (EVR_Resultado) { //Caso error de reconocimiento: muestra en LCD código de error y mensaje case STS_ERROR: { printf(lcd_putc, "\fError %x Repetir", EVR_Error); printf(lcd_putc, "\n%s", EVR_Mensaje); break; } //Caso reconocimiento SI: muestra la posición en su grupo de la voz case STS_SIMILAR: { printf(lcd_putc, "\fSI n.%u ", EVR_Posicion); break; } //Caso reconocimiento SD: muestra la posición de la voz y su etiqueta case STS_RESULT: { printf(lcd_putc, "\fSD n.%u %s", EVR_Posicion,EVR_Etiqueta); break; } //Caso sobrepasamiento de tiempo: muestra mensaje case STS_TIMEOUT: { printf(lcd_putc, "\fFuera de Tiempo"); Break; } //Caso por defecto: muestra mensaje default: { printf(lcd_putc, "\fEsperando"); Break; } } } /*********************** FUNCIÓN MENSAJE DE ERROR *****************************/ /* Elije texto de error en función del código de error indicado por el módulo */ FUN_ERROR() { switch(EVR_Error) { //Analiza el error producido case 0x03: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Demasiado ruido"); break; } case 0x04: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz muy baja"); break; } case 0x05: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz muy alta"); break; } case 0x06: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz adelantada"); break; } case 0x07: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz muy compleja"); break; } case 0x11: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz desconocida"); break; } case 0x12: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz dudosa"); break; } case 0x13: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz dudosa"); break; } case 0x14: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Fallo de comando"); break; } case 0x17: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Duracion no ok"); break; } case 0x4A: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Version fichero"); break; } case 0x4E: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Datos fichero"); break; } case 0x80: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Voz no registrada"); break; } default: { //En EVR_Mensaje se guarda el mensaje strcpy (EVR_Mensaje, "Indefinido"); break; } } } /********************** FUNCIÓN RECONOCIMIENTO DE VOCES ***********************/ /* Función para el reconocimiento de una voz predeterminada (SI) o definida por el usuario (SD)según valor de "comando" (CMD_RECOG_SD o CMD_RECOG_SI). En EVR_Replica se devuelve: 'r' (STS_RESULT) si la voz ha sido reconocida (para voces SD), 's' (STS_SIMILAR) si la voz ha sido reconocida (para voces SI), 't' (STS_TIMEOUT) si ha habido sobre pasamiento en el tiempo o 'e' STS_ERROR si ha habido error en el reconocimiento. En EVR_Posicion se devuelve la posición dentro del grupo que ocupa la voz, en caso de ser reconocida. En el caso de una voz SD reconocida, además de la posición, su correspondiente etiqueta se almacena en EVR_Etiqueta[]. */ FUN_RECONOCIMIENTO(int comando) { putc(comando); //Envía comando CMD_RECOG_SD o CMD_RECOG_SI FUN_ARGUMENTO(EVR_Grupo); //Envía nº de grupo o Wordset switch(EVR_Replica) { //Analiza la respuesta case STS_RESULT: { //Si es una voz reconocida SD... EVR_Resultado = STS_RESULT; FUN_ACK_RESPUESTA(); //Recibe el nº de posición dentro del grupo EVR_Posicion=EVR_Dato; //Lo guarda if(EVR_TipoVoz==CMD_RECOG_SD); //Si es una voz SD ... FUN_ETIQUETA_SD(); //Lee la etiqueta asociada a esa voz break; } case STS_SIMILAR: { //Si es una voz reconocida SI... EVR_Resultado = STS_SIMILAR; FUN_ACK_RESPUESTA(); //Recibe nº de posición dentro del grupo EVR_Posicion=EVR_Dato; //Lo salva break; } case STS_TIMEOUT: { //Si hay sobre pasamiento del tiempo EVR_Resultado = STS_TIMEOUT; EVR_Posicion=0; //Puesta a 0 de la posición break; } case STS_ERROR: { //Si hay error EVR_Resultado = STS_ERROR; FUN_ACK_RESPUESTA(); //Recibe 1º dato de 4bits de código de error EVR_Error=EVR_Dato; //Lo guarda FUN_ACK_RESPUESTA(); //Recibe 2º dato de 4bits de código de error EVR_Error=(EVR_Error<<4)|(EVR_Dato); FUN_ERROR(); //Elije texto de mensaje según código de error EVR_Posicion=0; //Puesta a 0 de la posición break; } } } /**************** FUNCIÓN NÚMERO ETIQUETAS GRUPO DE VOZ SD ********************/ /* Obtiene el número de etiquetas dentro de un grupo de voces SD y lo guarda en EVR_NEtiquetas. Necesita la variable EVR_Grupo que contiene el grupo de voces SD (de 0 y 16). */ FUN_N_ETIQUETAS() { putc(CMD_COUNT_SD); //Envía comando 'c' putc(EVR_Grupo+'A'); //Envia nº de grupo EVR_Replica=FUN_RESPUESTA_COMANDO(); //Recibe la respuesta y guarda putc(' '); //Solicita siguiente dato EVR_NEtiquetas=FUN_RESPUESTA_COMANDO()-'A'; //Guarda el nº de etiquetas } /********************** FUNCIÓN LECTURA ETIQUETA VOZ SD ***********************/ /* Lee la etiqueta asociada a una voz SD y la guarda en EVR_Etiqueta[]. Necesita la variable EVR_Grupo que contiene el grupo de la voz SD (de 0 y 16). Y la variable EVR_Posicion, la posición dentro del grupo (de 0 y 31) */ FUN_ETIQUETA_SD() { int i; //Indice del buffer FUN_RESET_ETIQUETA(); //Reset buffer de la etiqueta putc(CMD_DUMP_SD); //Transmite comando 'p' putc(EVR_Grupo+'A'); //Envía el número de grupo putc(EVR_Posicion+'A'); //Envía posición en el grupo EVR_Replica=FUN_RESPUESTA_COMANDO(); //Recibe la respuesta y salva putc(' '); //Solicita siguiente dato EVR_Dato=FUN_RESPUESTA_COMANDO()-'A'; //Recibe información de la enseñanza putc(' '); //Solicita siguiente dato EVR_Dato=FUN_RESPUESTA_COMANDO()-'@'; //Recibe posición conflictiva putc(' '); //Solicita siguiente dato EVR_NCaracteres=FUN_RESPUESTA_COMANDO()-'A'; //Recibe nºcaracteres de la etiqueta //Llena el buffer con los caracteres de al etiqueta i=0; for(i=0;i<EVR_NCaracteres;i++) { putc(' '); //Solicita siguiente carácter EVR_Etiqueta[i]=FUN_RESPUESTA_COMANDO(); //Llena el buffer } } /************************** FUNCIÓN INICIALIZACIÓN ****************************/ /* Inicia la comunicación serie con el módulo de reconocimiento EasyVR. También espera Wake Up del módulo trás un Power Down. Debe retornar 'o' en EVR_Replica */ FUN_SERIAL() { do{ FUN_BREAK(); //Envía comando VR_BREAK... }while(EVR_Replica!=STS_SUCCESS); //...hasta recibir STS_SUCCESS } /**************************FUNCIÓN REPRODUCCIÓN SONIDO ************************/ /* Reproduce el sonido de la Tabla de sonidos. En EVR_Indice se indica el índice de 16 bits del sonido a reproducir (entre 0 y 1023). En EVR_Volumen se indica el volumen de reproducción entre 0 y 31. En EasyVR_Replica se devuelve 'o' al finalizar correctamente la reproducción o 'e' si hay error. */ FUN_REPRODUCCION(int16 EVR_Indice,int EVR_Volumen) { EVR_IndiceBajo=make8(EVR_Indice,0); //Parte alta de EVR_indice a EVR_IndiceBajo EVR_IndiceAlto=make8(EVR_Indice,1); //Parte alta de EVR_indice a EVR_IndiceAlto putc(CMD_PLAY_SX); //Envía comando 'w' putc(EVR_IndiceAlto+'A'); //Envía byte de más peso del indice(8 bits) putc(EVR_IndiceBajo+'A'); //Envía byte de más peso del indice(8 bits) putc(EVR_Volumen+'A'); //Envía el nivel de volumen EVR_Replica=FUN_RESPUESTA_COMANDO();//Lee respuesta } /******************************************************************************/ main() { int1 EVR_Grupo1; //Grupo 1 elegido si-no int1 EVR_Grupo2; //Grupo 2 elegido si-no set_tris_a(0xff); //Definición de entradas y salidas en puerto A set_tris_c(0b10111100); //Definición de entradas y salidas en puerto C lcd_init(); //Inicialización del LCD //Configuración inicial del EasyVR FUN_SERIAL(); //Inicia el módulo EasyVR //Elección del idioma empleado para el reconocimiento de las voces SI //según EVR_Dato: 0=Ingles,1=Italiano,2=Japonés,3=Alemán,4=Español,5=Francés EVR_Dato=4; //Elección del idioma español para las voces FUN_COMANDO(CMD_LANGUAGE); //Envío del idioma elegido al EasyVR //Ajuste nivel de exigencia del reconocimiento para voces predefinidas (SI) //según EVR_Dato: 0=nivel bajo, 2=valor medio(por defecto),4= nivel alto EVR_Dato=4; //Elección del nivel de reconocimiento de voces SI FUN_COMANDO(CMD_KNOW); //Envío del nivel SI elegido a EasyVR //Ajuste del nivel de exigencia del reconocimiento para voces de usuario (SD) //según EVR_Dato: 0=nivel bajo, 2=valor medio(por defecto),5=nivel alto EVR_Dato=2; //Elección del nivel de reconocimiento de voces SD FUN_COMANDO(CMD_LEVEL); //Envío del nivel SD elegido a EasyVR //Ajuste del tiempo de respuesta (Time Out). Si durante la ejecución de //determinados comandos se supera este tiempo, dicha ejecución se da por //finalizada. Según EVR_Dato: -1 (0xFF)= defecto, 0=infinito, .1 a .32 valor //del Time Out en segundos EVR_Dato=0; //Elección de tiempo infinito para el Time Out FUN_COMANDO(CMD_TIMEOUT); //Envío de la configuración del Time Out FUN_RESET_ETIQUETA(); //Reset buffer de la etiqueta de voz //Elección tipo de voz a reconocer, SD o SI, según el valor del PIN A0 if (input(PIN_A0) == 1) { EVR_TipoVoz=CMD_RECOG_SD; EVR_Esperado = STS_RESULT; printf(lcd_putc, "\fIniciado voz SD"); } else { EVR_TipoVoz=CMD_RECOG_SI; EVR_Esperado = STS_SIMILAR; printf(lcd_putc, "\fIniciado voz SI"); } //Reconocimiento de voces While(true) { //Elección del grupo o wordset, según valores de PIN A1 y PIN A2. //Si ambos son 1 realiza el reconocimiento combinado de los dos grupos if (input(PIN_A1) == 1) EVR_Grupo1 = 1; else EVR_Grupo1=0; if (input(PIN_A2) == 1) EVR_Grupo2 = 1; else EVR_Grupo2=0; //Si hay al menos un Grupo seleccionado se pide en LCD dictar la voz if ((EVR_Grupo1 == 1) || (EVR_Grupo2 == 1)) { lcd_gotoxy(1,2); //Texto en la segunda linea printf(lcd_putc, "Dictar Voz"); //Texto a mostrar //Si además PIN A3 = 1 lo solicita también reproduciendo un texto if (input (PIN_A3) == 1) { EVR_Indice = 1; //Sonido correspondiente a la 1º posición EVR_Volumen = 30; //Volumen de la reproducción (entre 0 y 31) FUN_REPRODUCCION(EVR_Indice,EVR_Volumen); //Reproducir sonido } } //Reconocimiento de voces SI o SD según valor de EVR_TipoVoz //y del Grupo elegido según valor EVR_Grupo if (EVR_Grupo1==1) { EVR_Grupo=1; //Grupo de la voz a reconocer do { FUN_RECONOCIMIENTO(EVR_TipoVoz); //Reconocimiento de voces FUN_RESULTADO(); //Resultado del reconocimiento de voz }while (EVR_Resultado !=(EVR_Esperado)); //Repetir hasta reconocimiento ok } //Si se combinan los dos Grupos se pide en LCD la segunda voz if ((EVR_Grupo1 == 1) && (EVR_Grupo2 == 1)) { lcd_gotoxy(1,2); //Texto en la segunda linea printf(lcd_putc, "Siguiente Voz"); //Texto a mostrar //Si además PIN A3 = 1 lo solicita también reproduciendo un texto if (input (PIN_A3) == 1) { EVR_Indice = 2; //Sonido correspondiente a la 1º posición EVR_Volumen = 30; //Volumen de la reproducción (entre 0 y 31) FUN_REPRODUCCION(EVR_Indice,EVR_Volumen); //Reproducir sonido } } //Reconocimiento de voces SI o SD según valor de EVR_TipoVoz //y del Grupo elegido según valor EVR_Grupo if (EVR_Grupo2==1) { EVR_Grupo=2; //Grupo de la voz a reconocer do { FUN_RECONOCIMIENTO(EVR_TipoVoz); //Reconocimiento de voces FUN_RESULTADO(); //Resultado del reconocimiento de voz }while (EVR_Resultado !=(EVR_Esperado)); //Repetir hasta reconocimiento ok } } }
En este vídeo se muestra el resultado. Se intenta reconocer voces de dos grupos diferentes. En uno de ellos hay contenidas voces de dirección y en el otro números. Deliberadamente se le hace reconocer un número (el nº 11) que no existe en el grupo para ver el mensaje de error asociado sobre el LCD.
No hay comentarios:
Publicar un comentario