|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Asistente de voz total en tasker
Pequeña demostración de lo que puede hacerse con el asistente:
SERIE DE VIDEO TUTORIALES: Cómo crear un perfil, una tarea, dos variables y una escena para que sean reconocidas por el asistente: Cómo cambiar la expresión regex para una variable para luego nombrarla y referirnos a ella mediante esa expresión: Pequeña demostración de lo que se puede hacer el asistente con esas tareas, perfiles, variables y escenas que hemos creado: Os presento mi idea de asistente de voz para Tasker. Lo básico está bien. Otras cosas pueden necesitar un repaso. Fecha última actualización: 31-05-2015 ÚLTIMA VERSIÓN: la número 6 Link de descarga: https://goo.gl/ykNmV9 NOVEDADES DE LA VERSIÓN 6: - Incluida escena asistente para manejar gestionar el asistente. Se tiene que lanzar desde la tarea "mostrar ASISTENTE". -Incluida la posibilidad de habilitar/deshabilitar perfiles que incluyas en el asistente. -Incluida la posibilidad de mostrar/destruir tus escenas de tasker que incluyas en el asistente. Tres archivos posibles para descargar: El asistente básico, las tareas sueltas y el módulo bluetooth. Con la nueva actualización intentaré hacer una mejor descripción y explicación del proyecto. De momento dejo aquí la antigua aunque puede contener cosas erroneas. INSTRUCCIONES PARA PONERLO EN MARCHA: * Tener instalados Autovoice (imprescindible), Autoinput ( para las tareas que impliquen "tocar" la pantalla) y para la tarea "abrir" Autolaunch. Con todos sus permisos de accesibilidad dados. * Si ya tenías tareas o variables ten en cuenta: - La "marca" para las variables ha cambiado a ..._V, antes era v minuscula. O sea si quiero incluir la variable "Prueba" tengo que escribirla: "Prueba_V". Recuerda que para que la reconozca no puede estar vacía y sal completamente de Tasker para que este la guarde. 1- Habilita los perfiles "Comando reconocido" y "Buffer Lleno". 2- Sal de tasker y vuelve a entrar. 3- Ejecuta manualmente la tarea manualmente la tarea "mostrar ASISTENTE". 4- En esa escena: A) pulsa el icono de menú ( arriba a la derecha) y pulsa la opción inicializar. De esta forma se añadirán al asistente todas las tareas, perfiles etc que tengas con la marca, tanto las propias como las que te hayas descargado. Además se cargaran ciertas variables y tareas, con los regex que he creado para ellas. Esto borrará cualquier dato que tuvieras antes. B) pulsa el icono actualizar para cada una de las cuatro pestañas ( tareas, perfiles,etc). Esto no borrará los datos que tuvieras antes. C) también puedes ir añadiendo las tareas, variables etc, una a una, añadiendo las que consideres. Si descargas tan sólo el asistente y te limitas a inicializar, tendrás el asistente tal como yo lo tengo. Con esto trato de decir que ni mucho menos está completo ni que tenga que ser del gusto de todos. Para eso tendrás tu que trabajártelo, crear tareas nuevas, regex que se adapten mejor a tu forma de expresarte, y compartirlas!!!, etc ;) IDEAS GENERALES: se trata de tener un asistente de voz que pueda hacer todo. Con el que puedas controlar de forma total el móvil. Por otro lado se trata de hacerlo sencillo. Por eso el "cerebro de la Bestia" se compone sólo de dos contextos el de COMANDO UNIVERSAL y el de BUFFER LLENO, además de dos tareas, una para encender el modo continuo y otra que sólo hay que ejecutar cuando tengamos nuevas tareas para el asistente de voz, para actualizar la lista. Nada de hacer un perfil de Autovoice para cada comando de voz con su correspondiente tarea. Con un contexto de Autovoice universal y otro de valor de variable nos sobra. Otro aspecto que he querido incluir es que trata de tener un asistente de voz que sea capaz de recibir varias ordenes en un mismo comando de voz ("enciende wifi apaga red apaga pantalla"). La sencillez de este este sistema radica en que a partir de esos dos contextos ya sólo tienes que crear las tareas o lo bueno es que puedes usar las que ya tienes. Otra cuestión es la de Google Now. A la hora de construirlo soy de los que piensa que si Google Now ya hace una cosa para qué vamos a intentar mejorarlo no? Se trata de sumarle comandos a Google Now. Pues bien como Autovoice se integra con Google Now si decimos un comando nuestro en GN se ejecutará. Otro aspecto de la cuestión es poder lanzar Google Now con nuestro asistente lo cual es tan fácil como decir "Ok Google" y que nuestro asistente nos lance GN. Tenéis la tarea para esto más abajo. El asistente de voz que me propongo hacer pretende utilizar todo lo que se pueda de las Autoapps. Obligatorio en principio sólo es Autovoice. Pero es que si le metemos Autoinput sobre todo y Autolaunch o Autonotification ya es la leche lo que se puede hacer. Otra idea es que el asistente este configurado de una forma "inteligente" de manera que el mismo encienda el reconocimiento cuando pasen cosas. Por ejemplo cuando llegue un mensaje, cuando detecte que nos conectamos a casa, o suena una alarma, tenemos un evento en el calendario, etc. Podéis ver el módulo de notificaciones para ver un ejemplo de lo que quiero decir. Por último lo mejor es que no es necesario ser root para la mayoría de las ordenes al menos. FUNCIONAMIENTO: 1- Lanzamos la tarea de actualizar comandos. El objetivo final de esta tarea es conseguir tener dos variables, %Tas y %TasC. La primera guardará el nombre literal de la todas las tareas que queremos que se puedan lanzar desde el asistente mientras que la segunda guardará las expresiones regex para esas tareas. Ambas variables tienen separados los elementos con el separador "|#|". Pues bien esta tarea primero guarda TODAS las tareas que tengamos en Tasker que contengan parentesis. Si no contienen parentesis, "IF !~ *(*", las descarta. Esta es digamos la "marca" que yo uso se pueden usar otras. Por defecto el nombre de la tarea es el que se va a guardar en %TasC. Con lo cual si no queremos usar una expresion regex porque creemos que el nombre es sufic¡entemente claro como para que cuando lo digamos no haya confusión no tenemos que hacerlo. Por otro lado esto nos permite que si no queremos poner en los nombres de las tareas expresiones raras, o ni siquiera la marca podemos editar manualmente las dos variables para incluir tanto el nombre de la tarea como el equivalente regex a esa tarea. Pongamos por ejemplo que creamos una tarea para encender el wifi. El nombre lo pondré así: "(encender|enciende) wifi". O sea usando regex para que tanto si decimos enciende wifi como encender wifi el asistente encuentre coincidencia con nuestro comando de voz y la tarea a realizar. Podemos no usar regex y nombrarla "(encender wifi)". Pero siempre con los parentesis para que la considere como una tarea de voz y la incluya en el array %Tas. Respecto al tema de las variables: Se compone de la tarea "Actualizar variables", la tarea variables y la tarea "(decir)". Limitaciones: son dos las limitaciones. La primera es que con la acción probar o test variables globales de tasker no se incluyen las variables vacías. La segunda es que las variables globales no desaparecen aunque la tarea/s que las creó haya sido borrada. Si siguen teniendo un valor siguen estando ahí y por tanto la acción prueba las recoge. La tarea actualizar variables lo que hace es coger todas las variables globales que tenemos en Tasker, todas! Comprueba si tienen la "marca" que le hayamos incluido. En este proyecto es "_v" escrito al final de la variable. Por ejemplo: %Bateria_v. Escribiendo la variable con esta marca hará que el asistente la incluya en su lista de variables disponibles desde el asistente. Resumiendo mucho después lo que hace es generar dos variables que agrupan todos los elementos separados por la expresión "|#|". %Vars contiene las variables, por ejemplo: %Bateria|#|%Hora|#|%Wifi %VarC contiene las expresiónes regex relativas a esas variables: bater(i|í)a|#|horas*|#|Wifi Los elementos de estas variables además se ordenan de mayor longitud a menor longitud. En principio cuando creamos la variable por ejemplo %Mi_ubicacion la expresión regex para esa variable es la variable quitándole el % y la marca _v. Si queremos lo podemos dejar así. Si no, podemos editar la variable %VarC y poner por ejemplo: en vez de Mi_ubicacion, Mi_ubicaci(o|ó)n Una vez que tenemos estas entra en juego la tarea "(decir)": Antes de nada comprueba que lo que ha de decir necesita sustituir variables o es una tarea de decir mandada por ejemplo por que nos leen una notificación que ha entrado con lo cual se saltaría toda esta parte. Mediante Javascript fundamentalmente sustituirá lo que coincida con las expresiones regex de variables por esa coincidencia+la variable. Por ejemplo digo: "decir batería y dime estado del wifi". El resultado será que dirá: "batería %Bateria y dime estado del wifi %wifi". De momento solo se usan las variables en decir. Pero porque no usarlas para poder sumar, establecer,limpiar, etc nuestras variables a lo que queramos? 2- Cuando lancemos el reconocimiento de voz y demos un comando utilizaremos regex para ver si coincide con una de las tareas que se contienen en el array %Tas. Además tiene otro contexto de estado asociado que es de valor de variable: que habla no valga 1. Esto es así para que cuando esta diciendo algo el asistente, por ejemplo leyendote un mensaje, no se dispare accidentalmente porque piense que lo decimos nosotros. Una vez que se reconozca el comando se ejecuta la tarea de entrada que lo que hace es buscar mediante regex (la explicación exacta del regex en este perfil la teneis en la etiqueta) los distintos comandos que componen la orden e ir metiendolos en el array %InBuffer por orden. De esta manera si yo digo "enciende wifi abrir tapatalk tocar buscar" el array %InBuffer quedará así: %InBuffer1 enciende wifi %InBuffer2 abrir tapatalk %InBuffer3 Tocar buscar 3- Ahora entra en juego el contexto BUFFER LLENO. Se dispara en cuanto la Variable %Inbuffer1 tenga un valor ( !~ %*). Básicamente lo que hace es ir cogiendo todos los elementos de %InBuffer, o sea, %InBuffer1,2,3...etc, y los compara con todos los valores del array %Tas hasta que encuentra coincidencia. (OJO: esto ha cambiado en la versión 2 pq usamos Javascript pero el planteamiento es el mismo): El kit de la cuestión es que lo hace mediante Buscar reemplazar. Si la variable donde se guardan las coincidencias esta vacía es que no coinciden, si esta llena si coinciden. Además esta marcado reemplazar pero con nada. Esto es así para que por ejemplo: pongamos que tengo la tarea "abr(ir|e)". Esta tarea mediante Autolaunch lanza la tarea que le digamos, y por supuesto no queremos tener una tarea por cada aplicación.Por eso si digo "Abrir Whatsapp" de esta manera cuando hacemos la acción Realizar Tarea, se queda en %fora sólo "whatsapp" lo cual enviamos como %par1 a la tarea para que sepa que app abrir. En %for por el otro lado tenemos el nombre de la tarea a realizar. Una vez que hemos realizado todas las tareas de %InBuffer limpiamos el array, y el contexto se queda listo para ejecutarse otra vez en cuanto se llene. En la versión 2 del asistente ya se usa una acción de Tasker, "Javascriplet", con código en Javascript para intentar que sea lo más rápido posible. 4- Cómo lanzar el reconocimiento o integrar esto con un perfil mio para que inicie el reconocimiento: ... esto es lo que me gusta de este sistema: sólo teneis que utilizar una acción De Array Push: Variable: %InBuffer Valor: "ESCUCHA" Rellenar Espacios: Marcado Posición: 51 CÓDIGO: A continuación tenéis la descripción de los perfiles y tareas básicos. Los que son obligatorios vienen escritos en MAYUSCULAS, los que son muy imortantes empiezan en Mayusculas, el resto en minusculas. Tenéis además muchos comentarios puestos en las etiquetas de las acciones para entender mejor el funcionamiento interno de cada tarea.Por razones de espacio sólo he puesto tres tareas que describen cada una las tres formas de incluir las tareas en el asistente. NO ESTÁ ACTUALIZADO CON LA VERSIÓN 6 DEL ASISTENTE: Perfil: COMANDO UNIVERSAL 2 (377)
(Click para mostrar/ocultar)
Perfil: BUFFER LLENO 2 (381)
(Click para mostrar/ocultar)
Perfil: Elemento Tocado (opcional) (357)
(Click para mostrar/ocultar)
ESCUCH(A|AR) (369)
(Click para mostrar/ocultar)
Actualizar Comandos 4 (315) [spoiler] A1: [x] Limpiar variable [ Nombre:%TasC Coincidencia de Patrón:Apagado ] A2: [x] Limpiar variable [ Nombre:%Tas Coincidencia de Patrón:Apagado ] A3: Array Clear [ Nombre:%Tas ] A4: Array Clear [ Nombre:%TasC ] A5: Separar variable [ Nombre:%Tas Separador:|#| Eliminar base:Apagado ] Si (if) [ %Tas ~ *|#|* ] A6: Separar variable [ Nombre:%TasC Separador:|#| Eliminar base:Apagado ] Si (if) [ %TasC ~ *|#|* ] A7: Probar Tasker [ Tipo:Tareas Datos: Almacenar Resultado en:%test ] A8: For [ Variable:%for Ítems:%test() ] A9: Array Push [ Nombre:%tastest Posición:200 Valor:%for Rellenar Espacios:Encendido ] Si (if) [ %for ~ *(* ] A10: End For A11: For [ Variable:%for Ítems:%tastest() ] A12: Si (if) [ %Tas !~ *%for* ] A13: Array Push [ Nombre:%Tas Posición:200 Valor:%for Rellenar Espacios:Encendido ] A14: Array Push [ Nombre:%TasC Posición:200 Valor:%for Rellenar Espacios:Encendido ] A15: Fin si (End if) A16: End For A17: Concatenar variable [ Nombre:%tastest Criterio de fusión:; Borrar partes:Encendido ] A18: Establecer variable [ Nombre:%nsobrantes A:%Tas(#
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
Última edición por mlesir Día 01/06/15 a las 06:13:05. |
| Los siguientes 11 usuarios han agradecido a mlesir su comentario: | ||
|
|
|
#2
|
||||
|
||||
|
👏👏👏
Enviado desde mi GT-I9505 mediante Tapatalk
__________________
Samsung Galaxy S4
Ampe A10 Freescale I.MX6Q, de cuatro núcleos ROOTED |
|
#3
|
||||
|
||||
|
MÓDULO BLUETOOTH:
(En las variables %Disp1,2 y 3 metemos el nombre exacto de los dispositivos bluetooth que queremos que se tengan en cuenta para en que en caso de que se detecte que esta conectado se ponga la variable %Blue a 1 y así al lanzar el reconocimiento de voz o que tasker utilice la acción decir lance todo el audio por el bluetooth. Perfil: BLUETOOTH ENCENDIDO (389) Estado: Estado BT [ Estado:Si ] Entrada: Anon (391) A1: Estado del perfil [ Nombre:BLUETOOTH CONECTADO Establecer:Encendido ] Salida: Anon (392) A1: Estado del perfil [ Nombre:BLUETOOTH CONECTADO Establecer:Apagado ] A2: Estado del perfil [ Nombre:BLUETOOTH DESCONECTADO Establecer:Apagado ] Perfil: BLUETOOTH CONECTADO (395) Priority: 6 Restore: no Estado: Bluetooth conectado [ Nombre:%Disp1/%Disp2/%Disp3 Dirección:* ] Entrada: Anon (397) A1: Estado del perfil [ Nombre:BLUETOOTH CONECTADO Establecer:Apagado ] A2: Detener [ Con error:Apagado Tarea:BLUETOOTH DESCONECTADO ] A3: Bip [ Frecuencia:3056 Duración:108 Amplitud:15 Stream:5 ] A4: Establecer variable [ Nombre:%Blue A:1 Calcular:Apagado Añadir:Apagado ] A5: Estado del perfil [ Nombre:BLUETOOTH DESCONECTADO Establecer:Encendido ] A6: Estado del perfil [ Nombre:AUTOVOICE BT 2 PULSADO Establecer:Encendido ] A7: Estado del perfil [ Nombre:AUTOVOICE BT PULSADO Establecer:Encendido ] Perfil: BLUETOOTH DESCONECTADO (396) Priority: 6 Estado: No Bluetooth conectado [ Nombre:%Disp1/%Disp2/%Disp3 Dirección:* ] Entrada: BLUETOOTH DESCONECTADO (399) A1: AutoVoice Ctrl BT [ Configuración isabling Headset Sound Paquete:com.joaomgcd.autovoice Nombre:AutoVoice Ctrl BT Cuenta atrás (segundos):0 ] A2: Esperar [ MS:0 Segundos:20 Minutos:0 Horas:0 Días:0 ] A3: Detener [ Con error:Apagado Tarea: ] Si (if) [ %PACTIVE ~ *BLUETOOTH CONECTADO* ] A4: Estado del perfil [ Nombre:BLUETOOTH DESCONECTADO Establecer:Apagado ] A5: Bip [ Frecuencia:13858 Duración:300 Amplitud:15 Stream:5 ] A6: Establecer variable [ Nombre:%Blue A:0 Calcular:Apagado Añadir:Apagado ] A7: Estado del perfil [ Nombre:BLUETOOTH CONECTADO Establecer:Encendido ] A8: Estado del perfil [ Nombre:AUTOVOICE BT 2 PULSADO Establecer:Apagado ] A9: Estado del perfil [ Nombre:AUTOVOICE BT PULSADO Establecer:Apagado ] Perfil: AUTOVOICE BT PULSADO (400) Evento: AutoVoice BT Pressed [ Configuración:No config necessary ] Entrada: BOTON BLUETOOTH (401) A1: Realizar tarea [ Nombre:ESCUCH(A|AR) Prioridad:5 Parámetro 1 (%par1): Parámetro 2 (%par2): Devolver Valor de Variable: Detener:Apagado ] Perfil: AUTOVOICE BT 2 PULSADO (402) Evento: AutoVoice BT Pressed (2) [ Configuración:No config necessary ] Entrada: BOTON BLUETOOTH (401) A1: Realizar tarea [ Nombre:ESCUCH(A|AR) Prioridad:5 Parámetro 1 (%par1): Parámetro 2 (%par2): Devolver Valor de Variable: Detener:Apagado ]
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
| Los siguientes 4 usuarios han agradecido a mlesir su comentario: | ||
|
#4
|
||||
|
||||
|
Como todo lo que haces con tasker, tiene una pinta estupenda mlesir. Una duda... Es compatible con tu app GSM? o sea, tendría sentido utilizar un perfil como el que has puesto de GSM junto con la aplicación? Y otra, vas a adjuntar los perfiles y tareas básicos para que los podamos importar y probar?
Una vez más, enhorabuena por tu trabajo!
__________________
|
|
#5
|
||||
|
||||
|
Excelente @mlesir, me gusto la utilidad que pudiste realizar la App de Autovoice, la verdad como dijiste las apps de joao, son lo mejor, y más si las relacionas entre ellas, haces practicamente todo.
|
|
#6
|
||||
|
||||
|
Bueno gracias pero como dice un colega mio antes de chuparnos las ..... mejor que lo probemos. Al fin y al cabo la experiencia es la madre de la ciencia.
Hola Josema. Si es todo totalmente compatible, es lo bueno del maravilloso plugin Autovoice. Tiene sentido porque el asistente de voz da opciones que GSM no trae. Eso si para la cuestión de whatsapp el asistente se quedara corto comparado con GSM. Y si, mi idea es subirlo a dropbox y q se pueda descargar directamente cuando este mas probado. De momento es solo una idea abierta a que hagáis sugerencias , aportaciónes... y que cada uno pueda aportar sus tareas, módulos, etc. La idea es crear entre todos un asistente de voz con Tasker. Esto es solo un esbozo para que os hagáis todos una idea y podamos discutirla.
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
Última edición por mlesir Día 24/02/15 a las 05:10:54. |
|
#7
|
||||
|
||||
|
Excelente, Mlesir, muchas gracias por ese trabajo.
Más adelante lo miraré con calma, a ver si entre todos lo vamos perfeccionando. De momento te pido una corrección. Edita (edición avanzada) los dos posts que tienen las descripciones de Perfiles o Tareas... Mete esas descripciones dentro de etiquetas CODE (el icono de la hoja con una almohadilla). De esa forma dejaremos de ver emoticonos en lugar de los caracteres originales. Por ejemplo, el servidor muestra una carita sonriente donde la tarea tiene un carácter de dos puntos : seguido de un carácter D mayúscula.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Gracias de parte de: | ||
|
#8
|
||||
|
||||
|
Qué grande mlesir!! A ver si lo leo más tranquilamente todo que estoy desde el móvil... Pero ya sabes que conmigo tienes betatester pesao pa rato
|
|
#10
|
||||
|
||||
|
Pues si sowed da mareos!!! jeje
Aqui teneis el enlace al asistente básico. Sólo tienes las dos tareas que para mi son fundamentales la de decir y la de lanzar Google Now. http://goo.gl/7acKk2 Aquí las tareas sueltas. Alguna puede contener algún fallo. Como dije, ya cada uno que coja, añada, modifique, etc... pero sobre todo que comparta!!! https://www.dropbox.com/s/c0ht2xjmzl...Z.prj.xml?dl=0 Aqui el módulo de Bluetooth. Para que detecte cuando te conectas a un dispositivo que tu indiques y a partir de ahi dirija el audio y la recepción de audio al bluetooth. https://www.dropbox.com/s/qmm7t4fa18...Z.prj.xml?dl=0 El de notificaciones no lo pongo porque a pesar de que funciona no estoy del todo contento con el. Me he dado cuenta de que hay que hacer un sistema como el de voz para que funcione del todo bien. Lo que no tengo ni idea de momento de cómo hacerlo y que funcione bien para todas las apps de mensajería. La idea de todo esto no es hacer una app ( se me han quitado las ganas de embarcarme en otra aventura después del "batacazo"). Además tampoco me parece que se pueda hacer una app de esto y me apetece que esto sea un proyecto del foro en el que todos participemos. P.D: Ni que decir tiene que igual este sistema nos damos cuenta de que es una mierda, o que a alguien se le ocurre algo mejor. Yo estoy abierto a cualquier proyecto y de lo que se trata es de hacer un asistente de voz en Tasker entre todos ( un proyecto que ya lleva mucho tiempo en el cajón y he querido retomar) de la leche para que los de Xda y los del foro oficial de Tasker digan: "Fuckin' Hispaniards!"
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
Última edición por mlesir Día 27/02/15 a las 23:53:25. |
|
#11
|
||||
|
||||
|
Cuando tenga un hueco de tiempo miraré con más detenimiento, pero visto así por alto creas un array global con el nombre de todas las tareas, el menú de las variables se incrementará mucho.
Yo dejaría como una variable q contenga todo. Al enviar un comando de voz, copia la variable a local y se descompone como array si necesario. Además tengo la mania de reducir todo, yo crearía una sola tarea con todas las acciones necesarias, eso es cosa de cada uno. Los perfiles en realidad no se pueden reducir, lo que haces es disparar los comandos de voz de un solo perfil, ¿es así verdad? Estoy viendo por el móvil con una pantalla pequeña y no me entero bien del esquema. |
|
#12
|
||||
|
||||
|
Efectivamente se utiliza un solo perfil para disparar los comandos de voz dado que en el filtro del contexto se utiliza una variable q contiene el nombre de todas las tareas.
Respecto a lo de descomponer el array según se requiera tendria un incoveniente: aumentaría lo que tarda en ejecutar las tareas y aquí si que hasta una décima de segundo es importante, se trata de que sea lo mas rápido posible no? En cuanto a lo de reducir todas las acciones a una sola tarea no entiendo bien a que te refieres.
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#13
|
||||
|
||||
|
Procesar un array localmente es mucho más rápido que globalmente.
Lo que no veo es por qué no pones todos los nombres de las tareas dentro de la variable %Tas en vez de un array. Puedes buscar dentro de %Tas sin descomponer. Si usas %inbuffer y copias %Tas a %tas, lo haces todo localmente, lo cual acelera el proceso. Lo de tener una sola tarea me refiero a acciones sueltas como encender wifi o apagar wifi. ¿Vas a crear 2 tareas para esto? O cambiar el modo silencio a off, on o vibrate. Una tarea que contenga todas las acciones necesarias, que pueden ser 50 o más. Última edición por GraphicAdventure Día 02/03/15 a las 01:50:54. |
| Los siguientes 2 usuarios han agradecido a GraphicAdventure su comentario: | ||
|
#14
|
||||
|
||||
|
En primer lugar Graphic muchisimas gracias por tomarte la molestia y el trabajo de hacer esas sugerencias. Aunque por lo que viene a continuación puedas percibir un tono de resistencia o de que rechazo tus propuestas... para nada. Ojala me ayudes a mejorar esto sobre todo sería fantastico si me pudieses conseguir que nos ahorraramos el tedioso FOR que es el que más lag crea. Lo único es que creo que no has tenido una visión de conjunto al hacerlas, puede ser? Quiero decir que las propuestas son válidas entendidas de manera aislada pero si las intentas en el conjunto creo que no funcionan.
Al lío: En cuanto a los arrays y las variables entiendo lo que me dices pero no me parece que sea posible y/o efectivo. Expongo lo más esquemático que pueda el problema y después expongo mi opinión: Partimos de la base de que tenemos un montón de tareas con nombres con expresiones regex: TAREAS: abr(e|ir), puls(a|ar), etc... Mediante la acción Probar Tareas y procesando el array que nos da conseguimos tener: LA VARIABLE %Tas (con todas las tareas separadas por "|"): abr(e|ir)|puls(a|ar)| etc EL ARRAY %Tas: (con el nombre de cada una de las tareas): %Tas1: abr(e|ir) %Tas2: pul(a|ar) ...etc Todo esto lo tenemos desde la primera que ejecutamos la tarea ACTUALIZAR COMANDOS, que sólo hay que hacerla una vez. Ya no hay que hacerlo cada vez que ejecutemos un comando. Después ya lo tenemos disponible hasta que no necesitemos actualizarlos otra vez pq por ejemplo hayamos hecho una tarea nueva que queremos incluir. También tenemos que cuando decimos un comando de voz este se mete en el array %InBuffer. Por ejemplo pongamos que decimos "abrir whatsapp". Por tanto %InBuffer1 = "abrir whatsapp". El kit de la cuestión es saber a partir del comando de voz qué tarea hay que realizar y sus parametros si es que esa tarea los tiene. En este ejemplo si los tiene. Sería el parametro "whatsapp" para que la tarea sepa qué app debe abrir. Lo que propones Graphic me plantea varios problemas: 1- Dices que no hace falta descomponer en un array la variable %Tas, que se puede buscar dentro de ella. Pues bien a mi no se me ocurre cómo buscar "abrir whatsapp" o incluso "abrir" y que nos de como resultado "abr(e|ir)" que es el nombre literal de la tarea y el que luego hay que poner en la acción realizar tarea para que la realice. Lo ponga cómo lo ponga no veo manera de que "abrir" encuentre coincidencia con "abr(e|ir)". Al reves si claro pero no me sirve. Ojala encontremos una manera para no tener que descomponer %Tas y tener que perder tiempo comparando mediante un FOR. A lo mejor tu sabes cómo al hacer buscar y reemplazar me saque en una variable la parte de %Tas con la que coincide pero yo no. Cierto que te va a meter en coincidencia "abrir" pero ese no es el nombre de la tarea. 2- Cómo ya habrás visto si que hay una variable que junta el nombre de todas las tareas o sea que eso si lo tienes. 3- En cuanto a lo de utilizar arrays locales. Doy por cierto que llevas razón, lo cual no voy a poner en duda porque yo a tanto no llego, y porque parece muy lógico lo que dices de que tarda menos en procesar un array local que uno global. Pero... es que el array global ya lo tenemos descompuesto, y sin embargo el local habría que descomponerlo cada vez. Incluso siendo así mantienes que es más rápido usar un array local para luego emplearlo en el FOR? Si es así, que ya te digo que yo no lo se, bienvenido sea! 4- Lo que dices de las tareas me sigue volviendo loco!! Es cierto que no se trata de tener 50 tareas más. Pero es que no tienes porque tener más tareas. Seguro que tu y casi todos tenemos ya una tarea para encender el wifi y otra para apagarlo. Se trata de cambiarle el nombre por "enc(iende|ender) wifi" o ni siquiera, porque si no quieres utilizar regex porque crees que el reconocimiento te va a entender siempre puedes mantenerlo como "(encender wifi)" ( poniendo los parentesis para que al actualizar comandos no los meta en el array. Si no tiene no lo mete. Esto es así para sacar las tareas que no queramos que esten disponibles mediante voz). Asi que no se trata de tener dos tareas encender wifi, una para voz u otra para los perfiles normales, se trata de usar la misma. Además la tarea única que propones tendría que utilizar comparaciones para saber qué encender y si tiene que encender o apagar y ya estaríamos perdiendo mucho tiempo no? Creo que queda claro la filosofia del proyecto no? Se trata de un asistente de voz con mantenimiento mínimo, e implementación rapidísima porque se trata de que mediante el seas capaz de lanzar y disponer de las tareas que ya tienes. Bueno espero tu respuesta. Estaré toda la noche disponible. Dame una alegria Graphic y metele un buen repaso al sistema!
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
| Los siguientes 2 usuarios han agradecido a mlesir su comentario: | ||
|
#15
|
||||
|
||||
|
No noto tono de rechazo, no te preocupes.
Lo que si es cierto es que no tengo una visión general del conjunto por lo que expliqué arriba. Me resulta totalmente inviable escribir en un foro una respuesta adecuada a través de un móvil donde solo veo 5 líneas. De momento no tengo ordenador y con una pantalla pequeña no soy capaz de leer los perfiles como un todo. Voy a intentar leerlo con atención y responder en lineas generales a lo que planteas. Cuando tenga el ordenador ya podré escribir con propuestas prácticas. Seguro que se puede hacer algo. Un saludo. |
| Los siguientes 2 usuarios han agradecido a GraphicAdventure su comentario: | ||
|
#16
|
||||
|
||||
|
Bueno, he tenido algo de tiempo y leí el tema con más atención.
De todas formas necesito mi ordenador, soy incapaz de ver un perfil entero en el móvil. O veo todo muy pequeño totalmente ilegible, o para poder leer cómodamente muy ampliado. El funcionamiento del sistema lo veo bien, pero paso a tus cuestiones y algunos detalles. No me queda claro si en la %Tas guardas el nombre completo de las tareas que tienen paréntesis o solo el comando, como "abr(e|ir) whatsapp". ¿Guardas todo o solo abr(e|ir)? Si la nombras (abre|abrir) facilitarías el funcionamiento. 1- No se puede hacer directamente está claro, pero se me ocurre que en vez de descomponer la %Tas, se descompone el comando de voz letra por letra empezando por la última, pero uniéndolas. Esto reduciría el número de búsquedas a la mitad o menos, por la cantidad de letras que tenga la palabra. En el comando abr(e|ir), si digo abrir, hago: abrir, abri r, abr ir. Al tercer intento ya lo encontró. La lógica es buscar "abri" seguido de "r" seguido de "nada" O "algo", O buscar "abri" seguido de "algo" seguido de "r". 2- Me di cuenta que utilizas el separador | para que funcione la búsqueda, pero eso supone un problema a la hora de separar la variable. Ahora mismo no veo forma de evitarlo, pero utilizando el método de arriba tampoco haría falta. 3- Veo que necesitas la %InBuffer para 2 perfiles, así que tiene que ser global. Curiosamente, para %Tas tienes un array global, pero utilizando un For estás creando uno local en Buffer Lleno. Procesas un array con la lectura de una variable global y la pasas a local hasta encontrar algo. Creo que con el Run Log de Tasker se puede comprobar el tiempo de ejecución de una tarea, así que se puede saber qué método tarda más. En la tarea Actualizar Comandos, no hace falta el For porque ya tienes el array. Tarda un poco más, pero tampoco pasa nada porque se actualiza una vez. Es solo para decir que se procesa 2x lo mismo. 4- No entiendo porque dices te vuelves loco con lo de las tareas ![]() Dices que no se trata de tener 2 tareas para encender wifi, yo tampoco. Lo que digo es que para una misma acción puedes tener varias configuraciones como %SILENT y veo preferible tenerlas todas dentro de una misma tarea. Pero yo voy más lejos y prefiero tener todo tipo de acciones en una sola. Utilizando "ir a etiqueta" se puede poner una variable, no voy a tardar más tiempo. Es una cuestión personal, no es mejor ni peor. Adicionando los paréntesis al nombre de las tareas es la implementación más rápida. A partir de ahí, ya cada uno puede organizarse como quiera. Bueno, siempre que tenga disponibilidad vendré echar un vistazo. Por cierto, creé un perfil que actualiza automáticamente las células de las antenas de casa y borra las células que no se conectan hace x días. Si alguien tiene interés que me lo diga. Última edición por GraphicAdventure Día 06/03/15 a las 05:29:45. |
| Los siguientes 3 usuarios han agradecido a GraphicAdventure su comentario: | ||
|
#17
|
||||
|
||||
|
|
|
#18
|
||||
|
||||
|
- En %Tas se guarda el nombre de todas las tareas separadas por "|". Lo que pasa es que efectivamente esta pensado para que la tarea la nombres "abr(e|ir)" o la expresión regex que se quiera. Aunque también puedes nombrarla solo "(abrir)" si no quieres usar regex o no lo necesitas.
1 Lo de buscar descomponiendo el comando de voz parece muy prometedor. Lo probaré y entonces te digo gracias. Si funciona y todo parece indicar q si me parece q es una genialidad por tu parte. 2 No hay problema pq primero se consigue un array de las tareas con la acción probar/tareas q crea un array. Después es cuando hago concatenar para tenerlas todas en %Tas utilizando como separador el |. Vamos q %Tas solo se utiliza para ponerlo en el filtro de Autovoice. No se separa pq ya las tengo separadas previamente. 3- He modificado la tarea actualizar comandos y he estado probando los arrays locales. Sin tener datos si que desde luego la sensación es que va Muuucho mas rápido. Así que gracias ahora siempre que puedo pongo arrays locales. Además así no ocupan y esta todo mas limpio. 4- Vale, ahora te pillo. Es verdad, yo también he utilizado ir a y una variable. Para por ejemplo tareas q pueden estar muy relacionadas ( encender y apagar WiFi por ejemplo) es muy razonable lo que dices. Ya digo que estoy modificando el sistema. En cuanto lo tenga os lo enseño. Adelanto que ahora habrá un array con el nombre de la tarea y otro array con su respectivo comando de voz. Xej: %Tas1=abrir* %TasC=abr(e|ir) Por defecto en el array %TasC se guarda el nombre de la tarea tal cual. Así que los que quieran poner el regex en el nombre directamente pueden hacerlo como hasta ahora. Los que prefieren no modificar o meter regex en el nombre pueden editar la variable %TasC respectiva y cambiarla. En las tareas esto no es que sea un grandisimo avance pero si en el tema de variables que no aceptan paréntesis ni otros signos. Digo variables pq lo que intento hacer es que el asistente disponga de todas nuestras variables. Por ejemplo: "dime blue, batería" blue~%VarC23 (=bl(u|ue)) y en el array de %Var el puesto 23 lo ocupa %Var23=Blue. Luego en la acción decir ponemos: %VarC23 %Blue, %VarC 12 %BATT, etc Con el resultado de que nos dirá: " Blue on, batería 43%"
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#19
|
||||
|
||||
|
Si tienes algún problema con descomponer el comando de voz dímelo.
Utilizar variables locales cuando es posible siempre es buena idea. |
|
|
|
#20
|
||||
|
||||
|
Desde luego lo de usar un array local si se puede es mucho mas rápido. Todo un descubrimiento!
En cuanto a lo de descomponer los comandos de voz he tenido mogollón de problemas. He probado de todo y al final creo q seguiré usando un FOR para ir comparando uno a uno a no ser que tu o alguien me des una idea. Eso si en esta semana de pelearme con el regex he aprendido mucho. Explico el problema: Por un lado tenemos una variable la cual contiene agrupadas todos los nombres de las tareas que queremos que estén disponibles para el asistente de voz. Así que: %Tas= abr(e|ir),abr(e|ir) mapas,baj(a|ar) panel,toc(a|ar),toc(a|ar) largo, ....etc Por otro lado tenemos en %InBuffer lo que el reconocimiento de voz ha recogido. Xej: "abrir whatsapp" Tu idea de usar Buscar en %Tas la variable %InBuffer y así no tener q usar un forma que vaya comparando todas las opciones encuentro q tiene estos problemas: 1 Funciona para abr(e|ir) pero no para abr.. 2 Si tenemos dos comandos como tocar y tocar largo o abrir y también abrir mapas. Creo que esto se arregla ordenando el array de %Tas de mas largo a menos. Luego concatenas. Si no abrir mapas coincidiría con abrir si es que esta puesto primero. 3 Que pasa si tengo un comando de voz con dos palabras? Por ejemplo "Tocar largo" o "baj(a|ar) volumen" ( este comando luego dices multimedia, timbre,etc. Pero eso forma parte de la parte variable del comando y por tanto la tarea es la misma. Pues entonces, aquí qué cojemos? La cuestión es que no se si cojer la primera palabra la primera y la segunda etc. Porque no solo va a haber comandos del tipo abrir + algo. Puede haber incluso varios abrir algo especifico pq quiera q ese abrir haga ciertas cos además de la tarea abrir a secas que solo abre la app q digo a continuación. 4 Y creo que mas importante. Explicó antes un poco lo que quería cambiar del sistema. Para no tener por obligación q ponerle un nombre regex a las tareas había pensado crear dos arrays respecto a ellas. Uno guarda el nombre tal cual ( si quiero le meto regex o no) y el otro mete ese nombre de la tarea en formato regex digamos. Esto que podría ser opcional para las tareas es obligatorio para las variables dado que por ejemplo no puedo renombrar %BATT o %WIFI. Estos dos arrays se relacionarían por el índice. De modo que el índice por ejemplo 23 contiene la tarea "abrir" (%Tas23) y el nombre regex (%TasC23). Si seguimos la idea de coger directamente de la variable %TasC ( que seria la concatenación de todos los comando regex) necesito además de buscarlo saber de alguna manera que posición ocupa la coincidencia en todo el patrón. He intentado de todo: grupos de captura en regex, hacer la busca de la lista de comandos en Inbuffer y viceversa. Total que por todo lo anteriormente dicho no le veo las ventajas. Incluso se me ocurrió desarrollar un poco mas tu idea y en vez de coger letra a letra por el final de la palabra se me ocurrió coger tanto del ppo como del final para que tardara menos. Y la idea en si es genial pero siempre topo con el problema de que no se puede saber que palabra/as coger si solo la primera o la primera y la segunda. Y por otro lado si lo que busco es el patron %TasC en abrir, el problema es saber con que parte del patrón ha coincidido o al menos con que posicion. Incluso probé a poner en cada comando una subparte "(abril(e|ir))|^)". Lo utilizaba como patrón Así siempre encuentra coincidencia al menos con el inicio y lo bueno es que te crea el elemento del array pero vacío claro pq mete inicio de frase con lo cual el array de coincidencias si muestro el flash %coincidencia() podría ser: %coincidencia1 %coincidencia2 %coincidencia3 puls(a|ar) Genial! Sabría la posición y el nombre de la tarea en regex. Problema: regex es "eager" así que no se puede hacer. Alguna idea alguien mejor q el FOR e ir comparando? Respecto a esto creo por lo poco que he leído que javascript acepta regex... eso espero! Probablemente no me haya explicado muy bien en este post. Si es así decírmelo y lo intento otra vez.
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
![]() |
Estás aquí
|
||||||
|
||||||