Ver la Versión Completa : [ IDEA ] Asistente de voz total en tasker
Pequeña demostración de lo que puede hacerse con el asistente:
https://www.youtube.com/watch?v=m4sT4XUf2eg
SERIE DE VIDEO TUTORIALES:
Cómo crear un perfil, una tarea, dos variables y una escena para que sean reconocidas por el asistente:
https://www.youtube.com/watch?v=CsiQSyQk7vQ
Cómo cambiar la expresión regex para una variable para luego nombrarla y referirnos a ella mediante esa expresión:
https://www.youtube.com/watch?v=VBPnliE1RLg
Pequeña demostración de lo que se puede hacer el asistente con esas tareas, perfiles, variables y escenas que hemos creado:
https://www.youtube.com/watch?v=cW6veczX8yQ
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)
Notification: no
Evento: AutoVoice Recognized [ Configuración:Command: "(%tasc).*?(?=(\s)(%tasc)|$) (regex)" ]
Estado: Valor de variable [ %Habla != 1 ]
Entrada: COMANDO RECONOCIDO (383)
A1: Anchor
A2: Bip [ Frecuencia:12305 Duración:23 Amplitud:50 Stream:5 ]
A3: Array Push [ Nombre:%InBuffer Posición:50 Valor:%avcomm Rellenar Espacios:Encendido ]
Perfil: BUFFER LLENO 2 (381)
Priority: 9 Restore: no Enforce: no
Estado: Valor de variable [ %InBuffer1 !~ %* ]
Entrada: INBUFFER3 (407)
A1: [X] Array Push [ Nombre:%InBuffer Posición:51 Valor:ESCUCHA Rellenar Espacios:Encendido ]
A2: Establecer variable [ Nombre:%Wait A:%TIMES+12 Calcular:Encendido Añadir:Apagado ]
A3: Establecer variable [ Nombre:%conforc A:1 Calcular:Apagado Añadir:Apagado ]
A4: Establecer variable [ Nombre:%prior A:10 Calcular:Apagado Añadir:Apagado ]
A5: For [ Variable:%fora Ítems:%InBuffer(:) ]
A6: Array Clear [ Nombre:%tarea ]
A7: JavaScriptlet [ Código://Declaramos arrays
var tarea = [];
var parametro = [];
var splitvoz = [];
//Preparamos variables necesarias
tasc = global('TasC');
splitasc = tasc.split("|#|");
tas = global('Tas');
splitas = tas.split("|#|");
//Separamos los comandos de voz y las tareas
var pat_a = "("+(tasc)+")"+".*?((?= "+"("+(tasc)+"))|$)";
var patrona = new RegExp (pat_a,"g");
splitvoz = fora.match(patrona);
//FOR del array splitvoz
for ( a= 0; a < splitvoz.length; a++)
{
//FOR del array splitasc
for ( b = 0; b < splitasc.length; b++)
{
var pat_b = splitasc[b]+"\\w*(\\s|$)";
var patronb = new RegExp (pat_b,"g");
if (patronb.test(splitvoz[a]))
{
var pat_c = splitasc[b];
var patronc = new RegExp (pat_c,"g");
coinci = splitvoz[a].match(patronc);
if (pardos === undefined )
{
var pardos = coinci
}
else
{
var pardos = pardos+","+coinci;
};
var pat_p = "("+splitasc[b]+")"+"(\\w)* ";
var patronp = new RegExp (pat_p,"");
parametro[a] = splitvoz[a].replace(patronp,"");
tarea.push(splitas[b]);
break;
}
}
};
var param = [];
var param = pardos;
var param = param.split(",");
// Explicacion del regex: Busca todo lo que contiene la variable tasc, seguido de cualquier carácter ( .) repetido una o mas veces (*) pero que la coincidencia mas corta posible (?, se le llama non greedy) y seguido espacio (\s) y seguido de cualquier cosa que se contenga en la variable tasc o que sea el final de la frase (|$) pero todo esto sin incluirlo en el patrón ( por eso empleo lo que se llama un look around assertion) Librerías: Salida Automática:Encendido Cuenta atrás (segundos):45 ]
A8: Establecer variable [ Nombre:%conforb A:%conforc Calcular:Apagado Añadir:Apagado ]
A9: For [ Variable:%forb Ítems:%tarea(%conforb:) ]
A10: Sumar a variable [ Nombre:%prior Valor:1 Módulo (wrap around):0 ]
A11: Limpiar variable [ Nombre:%error Coincidencia de Patrón:Apagado ]
A12: Realizar tarea [ Nombre:%forb Prioridad:%prior Parámetro 1 (%par1):%parametro(%conforc) Parámetro 2 (%par2):%param(%conforc) Devolver Valor de Variable:%error Detener:Apagado ]
A13: Si (if) [ %error ~ fallo | %error !~ %* &+ %error !~ ok ]
A14: Array Clear [ Nombre:%InBuffer ]
A15: Establecer variable [ Nombre:%Wait A:%TIMES+10 Calcular:Encendido Añadir:Apagado ]
A16: Realizar tarea [ Nombre:(decir) Prioridad:%priority+1 Parámetro 1 (%par1):fallo: %splitvoz(%conforc) Parámetro 2 (%par2): Devolver Valor de Variable: Detener:Encendido ]
A17: Fin si (End if)
A18: Sumar a variable [ Nombre:%conforc Valor:1 Módulo (wrap around):0 ]
A19: End For
A20: Establecer variable [ Nombre:%conforc A:1 Calcular:Apagado Añadir:Apagado ]
A21: End For
A22: Array Clear [ Nombre:%InBuffer ]
Perfil: Elemento Tocado (opcional) (357)
Priority: 8
Evento: AutoInput UI Action [ Configuración:Reacting to clicks on the Android UI ]
Estado: Valor de variable [ %Con = 1 ]
Entrada: Elemento Tocado (358)
A1: Realizar tarea [ Nombre:(decir) Prioridad:10 Parámetro 1 (%par1):"%aielementtext" Parámetro 2 (%par2): Devolver Valor de Variable: Detener:Apagado ]
A2: Limpiar variable [ Nombre:%Con Coincidencia de Patrón:Apagado ]
ESCUCH(A|AR) (369)
Abortar Tarea Existente
A1: Establecer variable [ Nombre:%Wait A:%TIMES+12 Calcular:Encendido Añadir:Apagado ]
A2: AutoVoice Continuous [ Configuración:
Starting continuous voice recognition without headset
Notification Title: GUASAP.S. M
Notification Text: Listo para escuchar comandos. Paquete:com.joaomgcd.autovoice Nombre:AutoVoice Continuous Cuenta atrás (segundos):0 ]
A3: Si (if) [ %Blue = 1 ]
A4: AutoVoice Ctrl BT [ Configuración:Enabling Headset Sound Paquete:com.joaomgcd.autovoice Nombre:AutoVoice Ctrl BT Cuenta atrás (segundos):5 ]
A5: Esperar [ MS:176 Segundos:1 Minutos:0 Horas:0 Días:0 ]
A6: Fin si (End if)
A7: Esperar hasta [ MS:0 Segundos:1 Minutos:0 Horas:0 Días:0 ] Si (if) [ %Wait < %TIMES ]
A8: AutoVoice Ctrl BT [ Configuración:Disabling Headset Sound Paquete:com.joaomgcd.autovoice Nombre:AutoVoice Ctrl BT Cuenta atrás (segundos):0 ] Si (if) [ %Blue = 1 ]
A9: AutoVoice Continuous [ Configuración:
Stopping continuous voice recognition Paquete:com.joaomgcd.autovoice Nombre:AutoVoice Continuous Cuenta atrás (segundos):0 ]
A10: Bip [ Frecuencia:5800 Duración:100 Amplitud:50 Stream:5 ]
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(#
pothala
23/02/15, 21:16:47
👏👏👏
Enviado desde mi GT-I9505 mediante Tapatalk
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:Disabling 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 ]
josemaGL
24/02/15, 00:59:21
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!
BlackBlex
24/02/15, 01:26:08
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.
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.
Caravantes
24/02/15, 11:02:12
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 :D donde la tarea tiene un carácter de dos puntos : seguido de un carácter D mayúscula.
ruco1980
24/02/15, 11:07:17
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 :platano:
todo esto + un reloj android wear + autowear... me duele la cabeza de pensarlo :risitas::risitas:
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/c0ht2xjmzlcoyrx/TAREAS_VOZ.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/qmm7t4fa18rs9i8/MODULO_BLUE_VOZ.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!" ;-)
GraphicAdventure
01/03/15, 05:25:09
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.
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.
GraphicAdventure
02/03/15, 01:47:24
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.
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!
GraphicAdventure
03/03/15, 00:13:05
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.
GraphicAdventure
06/03/15, 05:26:01
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 :risitas:
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.
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.
Me encantaría implementarlo, compartilo cuando puedas. Saludos
- 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%"
GraphicAdventure
14/03/15, 18:57:26
Si tienes algún problema con descomponer el comando de voz dímelo.
Utilizar variables locales cuando es posible siempre es buena idea.
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.
EDITO: Esto que expongo no va a funcionar nunca. Ya estaba muy espeso cuando puse esto. Lo siento.
Creo que puede hacerse si en vez de nombres completos para tareas expresados en regex almacenamos las palabras q utilizamos para las tareas una a una en una variable separadas todas por |.
Esto nos permite traducir lo dicho a digamos regex y entonces buscar ese patrón en la variable que contiene todos los nombre de las tareas según están escritos en tasker.
Con dos buscar ya obtenemos el nombre de de la tarea.
Lo que no encuentre coincidencia al sustituir las palabras es que es la información adicional que se pasa a la tarea en par1. Xej: abrir root explorer. Root explorer no coincide con ninguna palabra del array luego es la información para par1. O sea whatsapp es el Qué de la tarea abrir.
Bueno es lo único que se me ha ocurrido.
GraphicAdventure
17/03/15, 01:22:23
Mlesir, te estás desviando de tu idea inicial y tornando el funcionamiento más complejo.
La idea que te propuse es para tornar el sistema más eficiente sin complicarte mucho.
Los problemas que pones con la búsqueda se pueden solucionar, lo que pasa es que regex es muy rastrero y cada flavor tiene también sus reglas.
Tasker utiliza javascript flavor, así que hay que limitarse al motor. Por ej.: no puedes utilizar un lookbehind negativo o infinito.
Además, todavía no entiendo bien porque vas a tener una tarea abrir whatsapp cuando la tarea abrir ya existe y de ahí puedes abrir whatsapp.
A ver si mañana tengo un hueco, miro las cosas que pides y te digo la expresión. Ahora mismo es muy tarde y me voy a enredar.
Graphic llevas razón que me he estoy desviando pero es que estoy obsesionado con que sea rápido. Y es que tiene que ser rápido.
El caso es que ya estoy bloqueado. Fíjate que pensaba ya hacerlo con javascript y quitarme de complicaciones. Al fin y al cabo es lo mismo q en tasker, usar un forma e ir comparando pero se supone que con javascript va muchísimo mas rápido.
Pues ni eso soy capaz!
Escribo esta simple tarea y no soy capaz de tener disponible el array q hace el split en tasker. Jodela! Con esta tarea puedo comprobar q todas las variables salen vacías menos la %estasi. No lo entiendo si son locales se supone q están disponibles en tasker. Total q ya no se ni por donde tirar ni que usar ni nada....
Javascript (333)
A1: JavaScriptlet [ Código:var aficiones = "futbol,hockey,natacion"; var aficiones = aficiones.split(",");
var ddd = aficiones;
var estasi = aficiones[2];
alert (aficiones[1]); Librerías: Salida Automática:Encendido Cuenta atrás (segundos):45 ]
A2: Flash [ Texto:%aficiones
%estasi
%aficiones()
%aficiones3
%ddd
%ddd2 Largo:Apagado ]
P.D: respecto a lo de abrir y abrir whatsapp te pongo un ejemplo mejor. Pulsar. Es posible que tuviéramos varias tareas con pulsar:
1 Pulsar X ( donde x es el nombre del elemento)
2 Pulsar largo X ( para emular el dejar pulsado en el elemento x)
3 Pulsar dos veces X
En definitiva quiero decir que habrá tareas q compartan palabras, o lo q es lo mismo, habrá una palabras que utilicemos para invocar distintas tareas.
De todos modos ya digo que con este proyecto estoy atorado, cuanto mas lo pienso mas perdido estoy.
GraphicAdventure
19/03/15, 03:13:17
A ver Mlesir, por partes:
Tu último ej. de pulsar, no probé tu proyecto en funcionamiento pero me parece que de como tienes el sistema no te funciona.
Para un comando de dos palabras, lo que comentas en el punto 2 de ordenar de mayor a menor no es obligatorio pero yo enfocaría por ahí. Así que ordénalo para hacer esto.
Me fijé que tienes una tarea con 3 regex: escrib(e|a|ir), pero yo solo contemplo 2, así que si quieres los 3 tendré que modificar el regex y será menos eficiente.
Creo que ni hace falta el perfil Buffer Lleno, lo haría todo por el Comando Universal y solo variables locales.
Si te fijas bien, estás copiando constantemente variables locales a globales y viceversa entre los dos perfiles.
Yo haría esto:
Comando Universal
A1 Establecer %tas a %Tas
A2 La misma acción pero almacenar en: %comandos
A3 For variable: %parametro items: %comandos()
A4 Buscar Reemplazar: %parametro buscar: %tas, Una sola coincidencia: encendido, Almacenar en: %tarea, Reemplazar: encendido Con: (nada)
Con la A4 ya tienes el nombre de la tarea y del parámetro.
De aquí puedes buscar sin regex o unificas todo en la expresión.
Ahora coges la primera palabra de la %tarea1 para descomponerla. Yo pensé hacerlo a través de sección de variable con 2 contadores inversos. No sé cuál es tú idea.
Para la búsqueda del regex utiliza esta expresión:
(%inicio)(\((?:[^|])+?\|(%final)\)|\((%final)\|(?:[^)])+?\))(%tarea1)?(?=\||$)
%inicio = inicio de la palabra, %final = las letras que se van separando por el final
A ver si no te enfrentas a más problemas.
Lo siento pero no tengo mucha disponibilidad.
Me equivoqué y puse %parametro en vez de %tarea1 en la última variable. Cambiado.
GraphicAdventure
21/03/15, 18:31:04
Me puse con tu proyecto.
Terminé mi idea y está funcionando. Con 1 variable solucioné el juntar las letras, no me hizo falta un contador.
Probé tus perfiles, para 2 palabras no te funciona. Tienes que ordenar el array de mayor a menor.
Hacerlo en java no estoy seguro que vaya a ser más rápido porque no vas a modificar el array. Haré pruebas y te diré.
Las variables de java están disponibles en Tasker pero un array no, tienes que declararlo:
var tas = [];
var tas = global("Tas").split(",");
Lo mejor es que tengas la %Tas como la tienes ahora para la activación del perfil y otra %Tasarray concatenada con "," por ej. para separarla en javascriptlet si quieres probarlo.
Si no, voy a ver si es posible separarla con regex, pero lo veo difícil porque hay muchas "|" y no siguen un orden y además incrementaría el tiempo de ejecución.
Veo 2 posibilidades:
1- Verificar el comando de voz en %tas
2- Procesar el array %tas() localmente y verificar todos los índices
Cualquier una de estas será más rápida que hacerlo globalmente y todo en un perfil. Puedes aprovechar el Buffer Lleno para hacer otras cosas.
Así que pueda probaré que todo está funcionando sin fallos y voy a medir el tiempo de ejecución de cada método a través de la %TIMEMS.
En la A1 pongo %timems a %TIMEMS, en la última acción pongo %Timems a %TIMEMS-%timems
Cuando tenga datos te comento.
Por cierto, no te obsesiones porque ya lo tienes hecho, solo cuestión de ir modificando.
Que tal Graphic?
Pues gracias por tu trabajo.
Yo me he decantado por la idea de javascript. El regex siempre le encontraba alguna pega. No cubre todas las posibilidades, limita la manera en que cada uno puede escribir el regex para esa tarea/as. Además java es mas fácil porque es mas comprensible para los taskeros.
De momento voy lento pq nunca he utilizado javascript. Por cierto gracias por decirme como hacer lo del array.
Totalmente de acuerdo contigo en intentar resolver todo en una sola tarea y así poder utilizar locales.
Podrías ponerme el proyecto tal como lo tienes para poder estudiarlo? Es que así lo entiendo mejor. O si quieres ponlo para que lo importe. Como tu veas.
Por cierto para separar los comandos he aprendido que se podría usar esta expresión: "(?#comentario)" Es na forma de hacer comentarios en regex. Así separa pero no interfiere.
GraphicAdventure
22/03/15, 01:03:02
Puedes escribir el regex de las tareas como quieras, la limitación sería en el número de posibilidades, pero se puede solventar: (%inicio1)(\(.*?(%final1).*?\))(%tarea1)?
No la utilicé inicialmente no vaya a ser que algo se me escape ahora mismo, tendría que analizar.
Tienes que tener en cuenta que aunque que pases el array por java necesitas regex para separar los comandos y es necesario ordenar el array.
Puedo hacerlo sin ordenar pelo resultaría más trabajoso y menos eficiente por eso te dije para enforcarlo por ahí. El regex no es text-directed y no analiza todos los OR.
Pondré el perfil así que verifique que no tiene fallos, a ver si mañana queda listo.
Que yo sepa javascript no soporta comentarios, tendré que probarlo.
Si funciona perfecto, esa parte está solucionada.
GraphicAdventure
23/03/15, 00:26:53
Al final no me dio tiempo de comparar los 2 métodos, simplemente ejecuté unas 7 órdenes seguidas para verificar si funciona y encontré un fallo con un espacio al final del nombre de la tarea y me olvidé de los paréntesis de las tareas sin regex.
Para no perder más tiempo solucioné con una acción. Funciona igual de bien pero ya pondré la solución adecuada.
Se pueden utilizar varias órdenes sin limitaciones en regex: escrib(o|es|e|a|ir).
Tienes que ordenar el array.
Haré el método de descomposición del array y mediré los tiempos. El que menos tiempo consuma será el más eficiente, no hay que dar más vueltas al asunto.
Por cierto, el comentario (?#comment) funciona. Yo daba por sentado que en javascript no se podía ya que no soporta free-spacing.
Perfil: 690134
EDIT: El problema de los paréntesis está resuelto adecuadamente, además me había olvidado que hay acciones como (esto|aquello).
Ví que tienes una tarea llamada (atrás)|(detrás), tienes que utilizar el formato de arriba.
Al fin!
Creo que ya tengo el javascript resuelto. Lo que me ha costado! No sera lo mas elegante ni mas limpio pero funciona.
Bueno yo probaré por mi parte con javascript como ya te dije y a ver cuanto tarda.
Una vez que lo tenga todo engranado estudiaré tu método y vemos cual es mejor.
Te he hecho caso y he intentado hacer todo el proceso en la tarea "InBuffer" para así solucionarlo todo con un solo script y utilizando solo variables y arrays locales.
Supongo que mañana lo tengo listo para que le eches un vistazo y yo miro el tuyo.
Por fin! Mi nueva version del asistente de voz:
https://www.dropbox.com/s/9sz7q845yikb3uh/ASISTENTE_VOZ_2.prj.xml?dl=0
Arregla fallos e intenta mejorar la velocidad. Además como principal novedad ahora trae lo mismo que con las tareas pero con variables.
Respecto al tema de las variables:
Se compone de la tarea "Actualizar 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?
Respecto al tema de las tareas : usa las dos variable también. Esto nos permite a diferencia de antes que si no queremos no tenemos que escribir como regex el nombre de la tarea, porque podemos escribir su expresión regex en %TasC.
Seguiré editando este post para hacerlo mas claro y explicar cosas que creo que me he dejado en el tintero.
También me queda pendiente examinar tu proyecto Graphic y compararlos.
Por cierto Graphic tenias razón. Los comentarios "(?#comentario) no me los acepta en Javascript. Curiosamente en una expresión regex de tasker en otra acción si. Por eso he tenido q usar como separador "|#|".
Editado el primer post. Ese primer post es el que iré actualizando con las novedades. También esta allí el enlace de descarga de la nueva versión.
Graphic probando mi nueva versión me he dado cuenta de dos cosas: la primera es que realmente donde puede tardar es desde que dices algo hasta que dispara el contexto de AV. En eso no podemos hacer nada. Luego la tarea la hace a toda leche. Por eso me parece que no merece la pena intentar hacer la tarea más rápida para arañar una decima de segundo cuando lo que tarda es realmente el reconocimiento en si no?
Por otro lado he notado que el reconocimiento a veces tarda mas y otra menos. Pero vamos que se nota claramente la diferencia. No entiendo la razón ???
A ver tu que opinas pero yo creo que usar javascript y no depender tanto de regex, de la forma que lo he hecho es mejor porque asi permite más flexibilidad. Ahora el que quiera que escriba las tareas directamente como regex, o no. Incluso puedes escribir el nombre de las tareas sin la "marca", pasar de las tareas de actualizar variables y tareas y simplemente editar tu mismo las dos variables que guardan los nombres exactos y sus equivalentes en regex.
P.D: utilizando el MiKey de xiaomi y la app que me recomendo Ruco es una gozada. Aprietas el botoncito y Ala! a darle ordenes!
La tarea de actualizar comandos o tareas no funciona bien. Falla después de la primera vez, no incorpora las nuevas tareas. Estoy en ello, pero de momento tendréis que incorporarlas manualmente.
Lo siento.
josemaGL
13/04/15, 17:26:12
Una duda mlesir... Teniendo GSM activado cuando está conectado al Bluetooth, hay que cambiar alguna opción de su configuración, para compatibilizarlo con los perfiles AUTOVOICE BT (Y BT2) PULSADO?
Por ejemplo, ¿hay que desactivar las opciones "lanzar reconocimiento con botón ppal (o secundario) Bluetooth, y activarlas en autovoice? (Creo recordar que en el manual de GSM decía que en autovoice tenían que estar desmarcadas).
Puff!!! Menuda pregunta!! A ver quien se acuerda ahora de GSM!!!jeje
Vamos a ver...
Lo que digas en Autovoice lo recoge todo lo que utilice Autovoice. Si dices hola, ese hola lo detectará GSM, un perfil que tengas tu o hasta Google Now si es el caso.
Lo mismo pasa con pulsar el botón de bluetooth.
El problema entonces es que, si tienes GSM, también marcado en autovoice que se lance el reconocimiento automaticamente al pulsarlo y además tienes un contexto tuyo de boton BT pulsado, los tres lo van a detectar y se puede liar un jaleo. Todo será que lo pruebes pero vamos que en principio no parece buena idea. Es como si tuvieras tres contextos de pantalla encendida pero cada uno con una tarea distinta, te imaginas el lio?
Bueno pues dicho esto, lo que yo haría sería utilizar sólo una manera de detectarlo, o bien la que incorpora AV digamos de serie, o GSM o un contexto tuyo. Si utilizas el de GSM puedes utilizarlo para disparar contextos tuyos como los de este asistente, al fin y al cabo GSM lo único que hace es encender el modo continuo eso si la diferencia es que lo hace de un modo controlado, quiero decir que sabes que a los 10 segundos lo apaga o que si no te entiende te lo repite, etc.
Si quieres utilizar un contexto tuyo que detecte el botón bluetooth puedes hacerlo pero es mejor entonces que deshabilites las otras opciones ( tanto en GSM como en AV). Y lo mismo. Si en este contexto tu dices "mandar whatsapp a ...." a GSM se lo va chivar AV asi que no hay pproblema.
Lo único que es incompatible es tener comandos nuestros que coincidan con los de GSM ( leer, contestar, etc). Por lo demás ya te digo que no creo que haya ningún problema, si lo hay me lo dices y lo pienso con más calma.
Por último: lo de AV de botón 1 y 2, en principio no es que sean dos botones, sino dos maneras distintas de detectar el botón por si la otra falla. Pero si tienes la suerte, que yo no, de tener un dispositivo que cuente con dos botones, que AV detecte, uno como el 1 y otro como el 2, entonces si puedes utilizar un contexto propio y GSM por ejemplo. A uno le asocias el botón 1 y al otro el 2.
ACTUALIZACIÓN: He actualizado la tarea "ACTUALIZAR COMANDOS". Si no funciona ya me cargo el móvil a bocaos!!! Esta en el enlace de descarga como tarea suelta con el nombre de "ACTUALIZAR COMANDOS 4". Lo descargais, sustituis la versión vieja por la nueva y listo.
Por otro lado os informo de que AutoInput en su versión Beta trae una nueva característica que es que siempre que detecte que tiene que hacer algo enciende y desbloquea la pantalla automaticamente. Además marcando en la primera acción de AI que use la tarea, el parametro "esta es la primera acción" y luego poniendo la acción system lock al final te deja el móvil como estaba, si tenía la pantalla apagada te la deja apagada y si la tenías encendida pues encendida. Al menos eso es más o menos lo que yo he entendido, el problema es que a mi nunca me paga la pantalla. Me lo tengo que estudiar con más tiempo todo esto.
En todo caso para mi lo realmente importante es que cuando le demos una orden al asistente que implique usar AI este automaticamente encenderá la pantalla, genial!!! Bien es cierto que esto tampoco es muy complicado solucionarlo con tasker: basta hacer una tarea para el asistente que sea "encender pantalla" y otra "apagar", o mejor aún como dice Graphic para no llenar todo de tareas, poner en la misma que mediante IF detecte si queremos apagar o encender.
Cuando tengamos esto iniciamos el reconocimiento de voz y decimos: " encender pantalla abrir whatsapp pulsar Maria escribir hola pulsar enviar apagar pantalla".
Por cierto se me olvidaba que también ha mejorado la acción de escribir para que ya no tengamos que copiarlo al portapapeles lo que decimos.
Wow, impresionante trabajo y grandes ideas. Muchas gracias por compartirlo, de momento no pero algún día me pondré a configurarlo, se le puede sacar mucho partido
Eso sí, no me ha quedado claro lo de 'si ya lo hace google now, para qué añadirlo', es decir qué pasará con las acciones que ya hace el GN? Se hacen dos veces?
Yo por ejemplo uso alguna tarea sencilla como enciende el Bluetooth. Y me pasa que por un lado tasker lo enciende gracias a mi contexto con autovoice, pero GN además abre las opciones de Bluetooth por su cuenta. Cómo llevas tú estas situaciones?
Yo tengo unos seis perfiles o asi creados con autovoice. Es decir seis contextos distintos... Lo cual se hace engorroso porque si hago muchos se me llena de perfiles... Ya veo que tú lo haces distinto, me lo tengo que mirar con tiempo porque la idea está muy bien, gracias de nuevo
Subido al primer post un pequeño video para que veáis lo que se puede hacer con el asistente de voz. ( y SIN ROOT!)
https://www.youtube.com/watch?v=m4sT4XUf2eg
Actualizado el asistente (la versión de ahora es la 4) y las tareas ( ahora son la versión 2).
He corregido errores, añadido que te avise de cuando una tarea se ha ejecutado con error y también he añadido alguna tarea nueva.
Graphic lo he pensado y llevas toda la razón con lo de las tareas. Resultaría mucho mejor meter en una sola tarea varias subtareas. Por ejemplo apagar y encender wifi, mediante IR A ( en etiqueta pondríamos una variable) podríamos hacer que hiciera apagar o encender dependiendo de la variable. O por ejemplo meter en una sola tarea todas las que se refieran a escribir, copiar, borrar texto, etc. Es mucho más claro, ocupa menos etc.
Pero no va a ser fácil pasarle a la variable el nombre de lo que debe hacer. Más adelante intentaré solucionarlo.
P.D: si alguno nota algún fallo, quiere sugerir algo o lo que sea, comentarmelo por favor. Yo lo he probado un poco y ahora parece que todo está correcto. Por supuesto si alguno se le ocurre alguna tarea nueva para utilizar con el asistente que la comparta, al fin y al cabo las que he creado son sólo un aperitivo de todo lo que se puede hacer. Como veréis además las tareas más simples no pueden ser, son dos o tres acciones, incluso una.
Se me olvidaba, ya está arreglada la tarea de actualizar comandos. A mi me ha pasado que a la hora de incluir una nueva tarea no la incluyo a la primera, sino la segunda vez que ejecuté la tarea actualizar comandos. Quizás sea que Tasker no guarda inmediatamente las nuevas tareas aunque se haya salido de la aplicación.
Genial!!!
Cuales 3 archivos son los mas actuales para descargar, ASISTENTE_VOZ_3
MODULO_BLUE_VOZ y TAREAS_VOZ_2? el que dice actualizar comandos tambien?
Lo mas actual es el Asistente de voz 4, tareas 2 y Modulo bluetooth no ha cambiado sigue siendo el mismo la de actualizar comandos no hace falta descargarla esta en el asistente.
josemaGL
24/04/15, 15:32:59
Mlesir, hay un actualizar comandos 4, pero no asistente de voz 4... Supongo que te refieres al asistente de voz 3.
707211
Llevas toda la razón Josema. Lo he vuelto a subir por si acaso y quitado lo que sobra. Ahora si que hay solo un tareas, un modulo de bluetooth y un Asistente de voz que incluye dentro la tarea de actualizar comandos.
GraphicAdventure
26/04/15, 21:57:42
Por cierto Graphic tenias razón. Los comentarios "(?#comentario) no me los acepta en Javascript. Curiosamente en una expresión regex de tasker en otra acción si. Por eso he tenido q usar como separador "|#|".
Javascript no los soporta, en Tasker funciona porque seguramente utiliza alguna variante complementaria de regex que los soporta.
Graphic probando mi nueva versión me he dado cuenta de dos cosas: la primera es que realmente donde puede tardar es desde que dices algo hasta que dispara el contexto de AV. En eso no podemos hacer nada. Luego la tarea la hace a toda leche. Por eso me parece que no merece la pena intentar hacer la tarea más rápida para arañar una decima de segundo cuando lo que tarda es realmente el reconocimiento en si no?
Si la diferencia es inferior a segundos, resulta indiferente el método.
Por otro lado he notado que el reconocimiento a veces tarda mas y otra menos. Pero vamos que se nota claramente la diferencia. No entiendo la razón ???
Yo diría que será por Google Now, puede ser por utilizar el modo online.
Intenta con el AutoVoice Recognize y offline.
A ver tu que opinas pero yo creo que usar javascript y no depender tanto de regex, de la forma que lo he hecho es mejor porque asi permite más flexibilidad. Ahora el que quiera que escriba las tareas directamente como regex, o no. Incluso puedes escribir el nombre de las tareas sin la "marca", pasar de las tareas de actualizar variables y tareas y simplemente editar tu mismo las dos variables que guardan los nombres exactos y sus equivalentes en regex.
Javascript permite más flexibilidad al poder hacer cosas que Tasker no dispone.
De la forma anterior nada te obligaba a usar regex, de hecho, manejar regex te permite más flexibilidad cuando necesario. Habrá situaciones que con 1 acción se soluciona con regex.
En cosas pequeñas como estas es indiferente su utilización, pero también advierto que manejar mucho texto como documentos puede resultar ineficiente si se utiliza mucho backtracking.
Graphic lo he pensado y llevas toda la razón con lo de las tareas. Resultaría mucho mejor meter en una sola tarea varias subtareas. Por ejemplo apagar y encender wifi, mediante IR A ( en etiqueta pondríamos una variable) podríamos hacer que hiciera apagar o encender dependiendo de la variable. O por ejemplo meter en una sola tarea todas las que se refieran a escribir, copiar, borrar texto, etc. Es mucho más claro, ocupa menos etc.
Pero no va a ser fácil pasarle a la variable el nombre de lo que debe hacer. Más adelante intentaré solucionarlo.
No veo el problema, el parámetro del comando se guarda en una variable.
Si tienes dudas avisa.
Estoy bastante ocupado últimamente, pero miraré el nuevo modo cuando pueda para ver si hay algún fallo si quieres.
Hola buenas, lo primero gracias por todo.
Quiero probar el proyecto así que me he descargado los tres archivos y los he importado en Tasker pero no se como hacer para que el Asistente de voz me detecte las palabras en continuo.
Que tengo que hacer justo después de importar los tres archivos? Tengo que activar algo o dejarlo por defecto?
Gracias.
josemaGL
30/04/15, 16:52:46
Prueba a realizar la tarea ACTUALIZAR COMANDOS, y después lanzas el reconocimiento de voz.
Prueba a realizar la tarea ACTUALIZAR COMANDOS, y después lanzas el reconocimiento de voz.
Hola ya lo he hecho, para lanzar el reconocimiento de voz, lanzo la tareo, abro el ok google o el autovoice?
josemaGL
30/04/15, 17:43:42
Yo utilizo la opción de lanzar autovoice dejando la tecla inicio pulsada. No se si con ok google funciona, cuestión de probar...
Yo utilizo la opción de lanzar autovoice dejando la tecla inicio pulsada. No se si con ok google funciona, cuestión de probar...
Pues si me reconoce los comandos porque me sale la notificación toast abajo con el comando pero no hace nada más, ni siquiera abre whatsapp
La tarea para lanzar la escucha ( o sea el modo continuo) es ESCUCHAR. Si lanzas esa tarea veras como se enciende el modo continuo.
Como dice josema hay otras formas de encender el modo continuo, eso ya depende de las preferencias de cada uno. Lo que si que va a misa es que si tu dices algo en autovoice el perfil te va a detectar el comando.
Otra cosa que tienes que hacer es encender o poner en on los perfiles o contextos de "InBuffer" y el de "comando reconocido".
Por último esta claro que como te dice Josema tienes q tener tareas configuradas. Una vez que tengas descargadas las tareas sal de tasker totalmente. Esto es pq hasta que no sales tasker no te guarda las tareas. Vuelve a entrar y lanzas manualmente la tarea de actualizar tareas,tarda un poco.
Listo.
Una cosa que tengo que resolver y que os puede dar problemas es que por cualquier cosa no se realicen las tareas, q den error. El problema es que entonces el Array InBuffer no se vacía y por tanto cuando vuelves a dar ordenes no se activa el contexto InBuffer.
Resumiendo: si veis que no hace nada comprobar q el array InBuffer esta vacío. Si no lo esta borrar todos los valores.
Si tienes mas problemas Doble dímelo.
Por cierto ya he conseguido que:
1 Podamos tener subtareas. En una misma tarea podremos tener varios comandos de voz.
2 Sumar, restar, establecer, reemplazar,etc, las variables que como las tareas queramos q el asistente tenga disponibles.
La tarea para lanzar la escucha ( o sea el modo continuo) es ESCUCHAR. Si lanzas esa tarea veras como se enciende el modo continuo.
Como dice josema hay otras formas de encender el modo continuo, eso ya depende de las preferencias de cada uno. Lo que si que va a misa es que si tu dices algo en autovoice el perfil te va a detectar el comando.
Otra cosa que tienes que hacer es encender o poner en on los perfiles o contextos de "InBuffer" y el de "comando reconocido".
Por último esta claro que como te dice Josema tienes q tener tareas configuradas. Una vez que tengas descargadas las tareas sal de tasker totalmente. Esto es pq hasta que no sales tasker no te guarda las tareas. Vuelve a entrar y lanzas manualmente la tarea de actualizar tareas,tarda un poco.
Listo.
Una cosa que tengo que resolver y que os puede dar problemas es que por cualquier cosa no se realicen las tareas, q den error. El problema es que entonces el Array InBuffer no se vacía y por tanto cuando vuelves a dar ordenes no se activa el contexto InBuffer.
Resumiendo: si veis que no hace nada comprobar q el array InBuffer esta vacío. Si no lo esta borrar todos los valores.
Si tienes mas problemas Doble dímelo.
Por cierto ya he conseguido que:
1 Podamos tener subtareas. En una misma tarea podremos tener varios comandos de voz.
2 Sumar, restar, establecer, reemplazar,etc, las variables que como las tareas queramos q el asistente tenga disponibles.
Hola, pues he echo todo lo que me dices y la cosa sigue igual. me detecta los comandos de abrir whatsapp y menú porque me suena el beep; en el caso del menú si me lo abre, en el caso del whatsapp o cualquier otra aplicación ni caso.
Lo hago borrando las variables y solo me vale para un comando, por ejemplo, si digo menú entonces me suena el beep y me abre el menú pero si ejecutó otra vez la tarea escuchar y lo digo otra vez entonces me suena el beep pero no me abre el menú.
Para que vuelva a funcionar tengo que limpiar las variables y ya el perfil de Buffer Lleno 2 no me sale en verde.
La verdad es que no tengo ni idea de esto, empezó ayer pero me gustaría aprender y ayudar.
Un saludo y gracias.
Ah! Creo que ya se lo que puede pasar. Tienes Autolaunch instalado?
De momento el proyecto utiliza cuatro autoplugins: Voice claro, Input, launch y notificación.
No tienes pq tenerlos todos pero claro algunas tareas no las tendrás disponibles.
Por ejemplo para abrir whatsapp también podemos emplear en vez de la acción de Autolaunch la de tasker, o mas chapucero hacerlo usando "tocar whatsapp" si esta el icono de whatsapp en la pantalla.
Si no es eso prueba otra vez pero encendiendo el registro de ejecución de tasker ( menu/mas/registro y le das a on).
Sobre todo mira a ver si sale algo en rojo como "err".
Ah! Creo que ya se lo que puede pasar. Tienes Autolaunch instalado?
De momento el proyecto utiliza cuatro autoplugins: Voice claro, Input, launch y notificación.
No tienes pq tenerlos todos pero claro algunas tareas no las tendrás disponibles.
Por ejemplo para abrir whatsapp también podemos emplear en vez de la acción de Autolaunch la de tasker, o mas chapucero hacerlo usando "tocar whatsapp" si esta el icono de whatsapp en la pantalla.
Si no es eso prueba otra vez pero encendiendo el registro de ejecución de tasker ( menu/mas/registro y le das a on).
Sobre todo mira a ver si sale algo en rojo como "err".
Hola pues que va no tengo el autolaunch instalado. Estoy intentando instalarlo en mi S5 con 5.0 stock y root pero no me deja desde el google play, me pone error -505 y no encuentro nada en Google acerca de ese error.
Ni siquiera me deja instalarlo teniendo el apk me pone aplicación no instalada. A ver si la consigo instalar...
http://images.tapatalk-cdn.com/15/05/02/dc58aea07b0cff25d1de69f85bade173.jpg
Pues después de varios días de prueba he podido compraba que en mi S5 con 5.0 no puedo tener instalados el autolaunch y el autovoice full a la vez, si instalado cualquiera de los dos, al instalar el otro me da error... probaré la versión de prueba del autovoice pero son 7 días... espero echar a andar el script y si es así lo compro.
Intenta instalarte Autoapps. Es una app gratuita para desde ahí poder gestionar y descargar todos los autoplugin. Yo creo q con esos debería solucionarse.
Ok, ahora tengo instalados Tasker, Autovoice (versión de 7 días de prueba) y autolaunch.
Abro tasker le doy a actualizar comandos, lanzo la tarea escuchar, digo el comando y me lo detecta, me sale la notificación toast pero sigue sin ejecutar lo que digo...
No se que estoy haciendo mal...
A autoinput le has dado los permisos en accesibilidad? Te funciona algun comando? Cuales?
Por cierto un consejo cuando quiero probar algo que requiere de autovoice yo suelo usar la opción test. Es mejor pq te permite escribir exactamente lo que quieres, así no hay errores de reconocimiento. Le das a test y como si lo hubieras dicho tu.
Si te sigue sin funcionar mandame por privado el log de tasker. Eso si limpialo antes de ejecutar el comando y me lo mandas cuando acabe.
yo no se que estaré haciendo mal, me reconoce el primer comando que le digo por ejemplo abrir aplicaciones recientes. Luego vuelvo a ejecutar la tarea de escuchar y salta el autovoice pero no reacciona a lo que le digo. Parece que debe ser un problema del inbuffer pero ahora mismo no caigo que puede ser.
P.D. Le tengo que dar manualmente a la tarea inbuffer3 para que me funcione la tarea que previamente he dicho que haga, sino no funciona.
Ok tbooo gracias por el feedback.
Pues si que es raro lo que dices. De todos modos estoy a punto de acabar una nueva versión q mejora muchos fallos.
Para mañana creo q que mañana ya estará.
Hola buenas a mi me pasa lo mismo que tboooo y no he comentado antes porque he estado instalando todas las autoapp desde cero por si había algún error.
Si hay una versión la espero con ansias, muchas gracias.
Enlace para la nueva versión del asistente:
https://goo.gl/qpZEJQ
La nueva versión es "Asistente de voz 5" y "Tareas de voz 3".
Novedades: Pues que he corregidos un montón de fallos. Como novedades en si:
1 Podéis meter en una tarea subtareas. O sea que por ejemplo en la tarea variables o escritura se contienen todas las subtareas ( cortar, pegar, escribir, etc). De este modo se queda todo más limpio, recogido y ordenado en Tasker. Esto quiere decir que vosotros mismos podéis tener por ejemplo una tarea "Wifi" que contenga la subtarea "apagar" y "encender".
2 El tema de las variables: Ahora podeis jugar con las variables. Teniendo excepto para el comando decir, para el resto de comandos (sumar, restar, establecer, limpiar,etc) teneis que decir antes la palabra clave "variable". Ejemplo: Pongamos que ya hemos incluido en el asistente la variable propia "rojo_V" y la variable propia "azul_V". Pues podriamos hacer esto: "establecer variable uno a 5", "establecer variable dos a 10", "Sumar a variable rojo variable azul" o "Sumar variable azul a variable rojo" ( es indiferente el orden pero siempre tiene que indicarse a quién mediante "a". Luego decimos " decir rojo azul" ( en decir no se dice "Variable"). Pues después de todo esto nos tendría que decir: " rojo quince azul cinco".
3- Puedes incorporar variables internas de tasker como %BATT o %DATE. Evidentemente estas no las podemos manipular pero si podemos pedir que nos las diga.
4- Nuevas tareas:
- Intro: para reproducir la pulsación de un intro. Solo si tienes root. Útil por ejemplo para introducir la dirección en Google Maps.
- Tabular: para moverse entre los campos de escritura. Aunque también funciona para activar el trackball, o sea que se ponga en azul el icono, y así luego con arriba, izquierda etc llegar hasta el icono o elemento que queremos y ya allí decir "pulsar" ( no tocar).
La verdad es que estoy más que satisfecho de como ha quedado. Creo que se puede manejar razonablemente bien todo el móvil con sólo esto. Luego ya cada uno se pondrá o quitará las tareas que crea pero la filosofia con la que yo he abordado el proyecto es la de contruir una base de Asistente de Voz que pueda usar todo el mundo, después cada uno lo irá personalizando.
Faltan muchas cosas, muchas tareas y cosas increibles que se pueden hacer. Es cuestión de ir aportando entre todos.
Tres cosas básicas que me faltan son: Hacer lo mismo con los perfiles y las escenas que con las tareas y variables, y por último pegarle un repaso al módulo de notificaciones para que nos lea todo lo que llega.
Algunos trucos o ideas:
- He probado touchless Chat. Por lo que se se ejecuta sólo desde Google Now. Pues con la tarea del asistente de "Ok Google" lanzamos GN y luego a enviar mensajes de Whatsapp, Telegram, etc como locos!!! En realidad esto lo podemos hacer ya con el asistente sólo que de una tacada y con un sólo comando lo hacemos con Touchless. Además no lee los qu enos llegan, y hasta podemos ignoralos o dar por leidos. Una pasada vamos!
- En algunas apps no funciona bajar, utilizar deslizar, eso si las coordenadas están par mi One Plus.
- Algunos botones o elementos de las apps o no sabemos como se llaman o no se activan con la tarea "tocar". Utiliza la subtarea o comando de Tabular o de arriba,abajo, derecha o izquierda que utiliza el viejo trackball ( os acordais de el?).
Por último Graphic gracias por tus consejos y por tu ayuda, y gracias a Maid450, al final has conseguido que utilice Javascript, menuda pelea he tenido con el jodido!! Menos mal que tenía tu tutorial.
ATaskREADOS
14/05/15, 20:14:52
PERDÓN: hacia mucho que no la cagaba. He vuelto a usar el avatar que no corresponde. Bueno a todos los efectos esto lo ha escrito Mlesir, no ATaskREADOS.
Bueno pues he hecho este tutorial a ver si la idea del asistente queda más claro. Ni mucho menos esta completo, seguiré ampliandolo. Si algo no está claro o creeis que se puede explicar mejor por favor decirmelo. Gracias.
PARTE PRIMERA: “las dos variables”
Para entender el funcionamiento de este asistente hay que tener en cuenta que la pieza esencial son dos variables.
Se utilizan: %Tas y %TasC, para las tareas. Para las variables son: %Var y %VarC.
En %Tas se guarda los nombres exactos de las tareas. Es el mismo nombre que nos aparece en Tasker. Este nombre lo necesitamos para luego ponerlo en "Realizar tarea". Y tiene que ser exacto. Desgraciadamente Tasker no permite usar regex, tiene que ser exactamente igual.
La otra variable es %TasC. Aquí vamos a guardar las expresiones regex para cada una de esas tareas. Por ejemplo para la tarea abrir: en %Tas se guardara "abrir" y en %TasC por ejemplo "abril(e|ir)". A partir de aquí me referiré a estas expresiones regex como comandos de voz y a las que se contienen en %Tas como nombres de la tareas.
Todos los nombres se concatenan en estas dos variables usando el separador "|#|". La razón es porque para ciertas cosas de las que luego hablare nos interesa tener todos los comandos de voz en una sola variable. Luego para muchas tareas estas dos variables se separan. Entonces si tenemos dos arrays. Pero antes se meten en variables locales (%tas y %tasc), estas son las variables que se separan. Por qué? Porque las variables locales se guardan en la RAM y son muchisimo mas rapidas.
Lo fundamental es que los elementos que se guardan en ambas variables están ordenados y relacionados. El nombre de la tarea que se guarda en cuarto lugar se corresponde con el comando de voz que esta en cuarto lugar en la variable %TasC.
Para que veáis a que me refiero os pongo un ejemplo que resume lo dicho de manera mas gráfica:
%Tas: "abrir|#|escribir|#|leer|#|pulsar|#|apagar wifi"
%TasC: "abr(e|ir|#|escrib(e|ir)|#|le(a|er)|#|puls(a|ar|#|a pag(a|ar) wifi"
- Después de igualar %Tas A %tas y %TasC A %tasc, si hieramos un separar variable ( separador: "|#|", nos quedaría asi:
%tas1: abrir. %tasc1: abril(e|ir)
%tas2: escribir %tasc2: escrib(e|ir)
%tas3: leer %tasc3: le(a|er)
%tas4: pulsar. %tasc4: puls(a|ar)
%tas5: apagar wifi %tasc5: apag(a|ar) wifi
De esta manera, usando el indice, podemos relacionarlas entre si, saber que expresión regex corresponde con que tarea y viceversa.
Sabiendo esto ya podemos comentar la pregunta más frecuente: Cómo meto mis tareas?
1- Mediante la tarea “Actualizar Comandos” que viene con el asistente. Esta tarea utiliza la acción “Probar” o “Test” del grupo Tasker. Con esto consigue el nombre de TODAS las tareas que tenemos en Tasker. Pero:
- Hasta que no sales de Tasker, tasker no las guarda, asi que después de crearla o renombrarla, cierra tasker y vuelve a entrar.
- La tarea actualizar sólo coge las tareas que tienen una “marca”. Dicho de otro modo: esta tarea hace un IF y si no coincide con ese criterio no las guarda. Esto es así por si no queremos que haya tareas disponibles o que se puedan ejecutar por error en el asistente. La marca que el nombre de la tarea contenga un iinicio de paréntesis “(“. O sea que si escribes una posible tarea prueba la puedes escribir así: “(prueba)” o “pr(o|ue)ba”, etc.
- Por defecto el asistente guarda como comando regex el nombre literal de la tarea. Esto quiere decir: A) que no tenemos porque utilizar regex si estamos seguros de que cuando decimos “abrir” el reconocimiento entiende “abrir y no “abre”, “abra” etc. B) Por el otro lado significa que podemos usar directamente el nombre de la tarea como la expresión regex. Si yo llamo a mi tarea: “abr(e|a|ir)” no tengo que hacer nada más porque en %TasC me guardará como expresión regez para esa tarea el nombre, o sea: “abr(e|a|ir)”.
2- Puedes incluir el nombre de tus tareas y sus expresiones regex manualmente. Si no quieres tener nombres raros, coge la variable %TasC donde se haya incluido la tarea ydonde ponga su nombre cambialo por una expresión regex. Listo.
Si ni siquieras quieres usar la marca entonces puedes hacerlo: incluye en %Tas el nombre exacto de tu tarea, y en %TasC la expresión regex que quieres para ella. Listo. Eso si es aconsejable que luego ejecutes la tarea actualizar para que las vuelva a ordenar por longitud, de mayor a menor.
Como ves la libertad es absoluta.
Se que esto con escenas sería mucho más sencillo y más claro pero bueno todavía estamos en fase beta, y en cualquier caso también lo podéis implementar vosotros.
PARTE SEGUNDA: “El único contexto de Autovoice”
Vamos ahora con el contexto de Autovoice que se llama "Comando reconocido". Este asistente solo usa un contexto que sirve para ilimitadas tareas. Cómo? Porque Autovoice permite usar una expresion regex y tambien una variable en el campo filtro. En el filtro usamos la variable %TasC. Daros cuenta que el separador "|#|" es en realidad una expresión regex que vendría a decir algo así como "...o almohadilla o..." De manera que cuando das un comando de voz, AV buscara, uno a uno si ese comando coincide con cualquiera de los que hay en %TasC.
La tarea de entrada de este contexto lo que hace es meter en el array %InBuffer un nuevo elemento. El contenido de ese elemento es lo que has dicho. Por ejemplo si digo "abre whatsapp" se activará porque abre encuentra coincidencia con el filtro ( ya sabéis %TasC que a su vez es igual a "....|#|(abr(e|ir)|#|...". La tarea hace un array push con lo que tenemos que si antes el array %InBuffer estaba vacío ahora tiene un elemento:
%InBuffer1: "abre whatsapp".
Tenéis que pensar en este contexto y tarea como si realmente se tratara de un buffer, como el de la impresora. El va recibiendo las ordenes y las va almacenado en el array.
TERCERA PARTE: “El procesamiento”
La tercera parte del proyecto de asistente es la que procesa eso que esta en el buffer. Es el contexto "Buffer lleno". Es un contexto de valor de variable: si la variable %InBuffer1, no coincide (!~) con (%*) o sea con un "%" seguido de lo que sea, lo que a su vez equivale a decir que no está vacía, este contexto entonces sabe que tiene trabajo y se pone a realizarlo.
Mediante un bucle la tarea InBuffer va cogiendo por orden de menor a mayor ( o sea por orden de llegada) los elementos de %InBuffer y se los pasa a el “cerebro de la Bestía”.
Este cerebro de la bestía esta hecho en Javascript. Por qué? Porque principalmente javascript es muchisimo más rápido que utilizar acciones de Tasker. En una acción he podido meter lo que sería el equivalente a no menos de 15 acciones de Tasker. Este conjunto de sentencias de javascript básicamente lo que hace es mediante bucles, comparaciones y sustituciones, como veis nada que nos sea extraño a los que manejamos Tasker, conseguirnos:
1- Separar lo dicho en comandos de voz individuales, para lo cual hace una comparación regex que si dijeramos “apagar wifi apagar datos”, nos lo dividiría en: “apagar wifi” y “apagar datos”. Esta, creo, que es una de las grandes virtudes de este sistema, poder dar varias ordenes o comandos de voz de una sola vez. No tienes que ir dando una a una.
2- Nos consigue también tres arrays:
El array “%tarea” contiene los nombres literales de las tareas tal y como figuran en Tasker, después de que ha ido comparando una a una las expresiones regex para esos comandos hasta encontrar coincidencia. Una vez que encuentra coincidencia, pongamos que con el 4º elemento, coge el elemento número 4 de %Tas.
El array %parametro contiene la orden de voz una vez que le hemos quitado el comando de voz (lo que coincide con la expresión regex.
El array %param contiene la coincidencia que se ha encontrado con la expresión regex.
Como siempre estos arrays están relacionados por el índice. Después de conseguir estos arrays se hace un bucle para ir realizando las tareas una a una, mediante claro esta, la acción de Tasker “Realizar Tarea”.
Os hago un esquema de todo esto que creo que explica mejor cómo funciona, para el esquema voy a utilizar por ejemplo que digamos al reconocimiento de voz esto:
DIGO:
“encender pantalla escribir hola”
|
|
CONTEXTO DE AUTOVOICE “Comando reconocido” Filtro: %TasC
¿¿¿Lo que he dicho coincide
SI__________regex con la variable %TasC???________NO
|
|
|
%InBuffer1 = “enciende pantalla escribir hola”
----------------------------------------------------------------------------
CONTEXTO DE VALOR DE VARIABLE: %InBuffer1 !~ %* (o sea %InBuffer1 no está vacía)
FOR de %InBuffer()
( ve cogiendo uno a uno
los elementos de %InBuffer)
|
|
|
INPUT>>>>>>>>>>>>>>>>>>>>>>JAVASCRIPLET>>>>>>>>>>>>>>>>OUTPUT: %tarea1="encender"
("enciende pantalla>>>>>>>>>>>>>>(sentencias de >>>>>>>>>>>>>>>>>>>>>>%parametro1="pantalla"
escribir hola") >>>>>>>>>>>>>>>>>javascript)>>>>>>>>>>>>>>>>>>>>>>>> %param1="enciende"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>%tarea2="escribir"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>%parametro2="hola"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>%param2="escribir"
|
|
|
FOR de %tarea()
(va cogiendo uno a uno
los elementos de %tarea
y los mete en %forb)
|
|
|
|
|
REALIZAR TAREA:
Nombre: %forb----------------- “escribir”
Par1: %parametro(%indice)----- “hola”
Par2: %param(%indice)--------- “escribe”
Atualización del asistente de voz, última versión la número 6, link de descarga:
https://goo.gl/ykNmV9
SERIE DE VIDEO TUTORIALES: ( realizados con la inestimable ayuda de "screencast" de cyanogen y la app "videoshow", si están cutres es por mi culpa ;) )
Cómo crear un perfil, una tarea, dos variables y una escena para que sean reconocidas por el asistente:
https://www.youtube.com/watch?v=CsiQSyQk7vQ
Cómo cambiar la expresión regex para una variable para luego nombrarla y referirnos a ella mediante esa expresión:
https://www.youtube.com/watch?v=VBPnliE1RLg
Pequeña demostración de lo que se puede hacer el asistente con esas tareas, perfiles, variables y escenas que hemos creado:
https://www.youtube.com/watch?v=cW6veczX8yQ
NOVEDADES:
- Escena "mostrar ASISTENTE" con la que gestionar ahora fácilmente ( espero) todo lo que quieres que este disponible para el asistente: añadir, actualizar, cambiar los regex, añadir tareas aunque no lleven la "marca", cambiar la marca...
- Poder encender y apagar perfiles.
- Poder mostrar y destruir escenas.
- Corregidos más errores.
Pero Jusss que haces levantada a estas horas por Dios!? Deberías irte a la cama! ;)
Pero Jusss que haces levantada a estas horas por Dios!? Deberías irte a la cama! ;)
Jaja, aca son las 22.00 Horas!! :D.
Una pregunta estoy pensando comprar el autolunch veo que en tu tarea lo usas, cual es la diferencia entre usar la tarea de Tasker de lanzar una App con usar "autoLunch"? Se justifica la compra o todo se puede hacer con Tasker solo. Ahora si es hora de dormir jaja
Tasker el problema es que no deja usar una variable para indicarle que app quieres usar.
Si quisieras usar tasker tendrías que emplear un montón de IF.
Lo bueno de Autolaunch es que te facilita mucho las cosas ya que te hace el la búsqueda con regex,etc. Por ejemplo te encontrara google now incluso si lo dices al reves , now google.
leromaro
31/05/15, 22:09:27
Hola: esto me parece genial, he descargado la versión anterior y no he podido probarla aun, descargaré la nueva. Una consulta, para ponerla en funcionamiento debemos seguir los pasos de "INSTRUCCIONES PARA PONERLO EN MARCHA" de la primera página del post?
Gracias.
Si y no. Tengo que repasar esa parte porque ahora con los perfiles y las escenas y la nueva pantalla de ayuda la cosa cambia.
Descarga las tareas de voz y el asistente versión 6.
Habilita los perfiles de comando reconocido y de Inbuffer.
Ejecuta la tarea mostrar asistente te saldrá la pantalla. Le das a perfiles, y actualizar. Luego lo mismo con variables, tareas y escenas.
Y creo que listo.
Lo de la manera de decir que te muestre las escenas y la manera de manejar los perfiles es demasiado rigida por lo que es fácil que de error. Lo cambiare mas adelante.
Bueno ya me diréis que tal os va el asistente y que pensáis de el.
Una pregunta estoy pensando comprar el autolunch veo que en tu tarea lo usas, cual es la diferencia entre usar la tarea de Tasker de lanzar una App con usar "autoLunch"? Se justifica la compra o todo se puede hacer con Tasker solo. Ahora si es hora de dormir jaja
Supongo que llego tarde pero es que he descubierto que quizás hay una manera de no necesitar Autolaunch.
Se trata de usar la accion Javascriptlet y desde ahí usar la función para abrir Apps de tasker. Por lo que he leído en el manual de tasker sobre javascript ahí si se puede utilizar una variable, y por lo que dice primero hace la búsqueda por nombre de paquete y si no lo encuentra por nombre simple.
No tengo tiempo de probarlo de momento pero mas adelante seguro que lo haré.
Supongo que llego tarde pero es que he descubierto que quizás hay una manera de no necesitar Autolaunch.
Se trata de usar la accion Javascriptlet y desde ahí usar la función para abrir Apps de tasker. Por lo que he leído en el manual de tasker sobre javascript ahí si se puede utilizar una variable, y por lo que dice primero hace la búsqueda por nombre de paquete y si no lo encuentra por nombre simple.
No tengo tiempo de probarlo de momento pero mas adelante seguro que lo haré.
No aun jaja, pero hasta q pueda implementar y entender lo de Javascriptlet sin un ejemplo, creo que me hago vieja
leromaro
05/06/15, 03:27:18
Qué lástima que no me funcione! Por si les sirve de algo a los que saben, tengo todas las aplicaciones con permisos y la accesibilidad activada. Las tareas, si las ejecuto desde si misma funcionan todas las que he probado, ej: ejecuto la tarea (inicio) y va a inicio, así que creo poder descartar un problema con Autoimput. Me reconoce los comandos ya que suena el pitido del perfil COMANDO UNIVERSAL. Otra cosa que me pasa es que al ejecutar la tarea escuchar, enciende el modo continuo y si reconoce el comando (aunque no ejecuta nada por los problemas que comenté antes) lo desactiva inmediatamente. Hasta aquí llega mi pobre diagnóstico que lo pongo por si se puede encontrar alguna solución, ya que yo no puedo aportar nada porque la mayoría de las tareas del asistente de voz para mi son chino básico.
Comprueba que el array %Inbuffer esta vacío. Si no es así lo borras.
Y si no enciende el registro de ejecución, lo limpias, prueba a ejecutar un comando sencillo como el de inicio. Comprueba que en el registro no aparezca ningún error marcado en rojo.
Dicesnque tras reconocer el comando apaga el modo continuo? Seguro? Con que comando hace eso?
Mándame una copia del registro por privado y cuando pueda le echo un vistazo.
Podría alguien confirmarme que el asistente le funciona bien?
josemaGL
12/09/15, 02:27:17
Buenas Mlesir...
Pues refloto un poco este tema para hacerte una consulta. Estoy probando tu asistente, después de (si recuerdas) tener muchos problemas con guasap sin manos y la escucha a través de los altavoces del coche. Pero hay una tarea que me tiene jodido. Con el asistente, abro whatsapp, escribo, envío... Pero cuando ejecuto tocar x, para que me abra la conversación de ese x, me hace la pulsación sobre la foto y se abre la imagen que tiene ese contacto en su whatsapp en vez de mi chat con él. No se si me he explicado, o sea, toca tan a la izquierda de la pantalla que me sucede lo que te comento. Cual sería la manera de poder solucionar esto? Siento mi ignorancia, pero a lo mejor es cualquier chorrada que no logro ver. Un saludo!
Entiendo lo q quieres decir. Pues dejame probarlo y te digo vale? Ahora en el finde no se si podre pero tranquilo q lo tendré en mente.
Enviado desde mi T1-701u mediante Tapatalk
josemaGL
12/09/15, 10:34:18
Sin problema, cuando tú puedas, faltaría más.. Por cierto, la tarea de la que te hablaba no es (pulsar), es (tocar). Perdón por el error. Voy a editar el mensaje anterior. Gracias.
Ok. Confirmado el "bug". Efectivamente te abre la foto.
El problema es con whatsapp y sus actualizaciones porque antes no pasaba.
Resulta q los dos elementos (la foto y la conversacion) tienen el mismo texto! ( Bien por los de whatsapp!). O sea que ambos tienen en texto del elemento ( %aitext) "pepe" por ejemplo. No han sido capaces de poner al menos foto o algo asi para diferenciar. En el array ademas para mala suerte nuestra esta antes el elemento de la foto.
La solución es relativamente facil si lo que queremos es hacer la ñapa o chapuza para whatsapp pero si lo que buscamos es hacerlo universal, o sea q para este tipo de casos en los que dos elementos comparten un nombre exacto este previsto en todas las apps, va a ser jodido.
La solucion ñapera te la puedo hacer si tu lo ves dificil.
Enviado desde mi T1-701u mediante Tapatalk
josemaGL
12/09/15, 20:28:57
Gracias, por tu pronta respuesta. De momento me apaño cuando digo tocar y al abrirse la foto, vuelvo con "tocar mensaje" y ya se abre el chat correspondiente. Supongo que la solución que planteas será más limpia, pero no quiero entretenerte.
Muchas gracias Mlesir.
Ah! Muy ingenioso lo q haces si señor. Molestia para nada, menos mal q alguien por fin dice algo! asi mejoro el asistente. No se me hubiera ocurrido q dos elementos tuvieran el mismo texto.
Me piro a cenar por ahi Un abrazo Josema.
Enviado desde mi T1-701u mediante Tapatalk
clonico2
05/12/15, 22:13:59
Regex
clonico2
05/12/15, 22:14:33
Perdón. No iba aquí
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.