Tasker Para hablar de todo lo relacionado con la aplicación tasker

Respuesta
 
Herramientas
  #1  
Viejo 23/12/13, 18:16:43
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
Tarea para escuchar un texto largo, una y otra vez

Puede ser útil para cualquiera que necesite aprender un texto de memoria, ya sea un actor de teatro, un estudiante que necesita memorizar la lección o un homenajeado que va a dar un discurso y quiere hacerlo sin papeles. Esta tarea sirve para que puedas escuchar ese texto tantas veces como quieras, mientras conduces o haces footing, o mientras duermes.

Como es lógico, la clave de la tarea está en la acción DECIR, pero el problema es que esa acción solo admite 4000 caracteres aproximadamente. Si el texto es mayor, hay que trocearlo y organizar la tarea para que vaya diciendo cada trozo. Inicialmente yo había usado el punto (.) para dividir todo el texto en frases, pero eso no funcionaba bien en todos los casos; por ejemplo, hay frases que terminan con un cierre de interrogacion, y por otro lado algunas veces tenemos un punto como separador decimal (45.50 euros) y no debería considerarse ese punto como un separador de frases. Posteriormente, el compañero Maid450 aportó una buena solución (ver su mensaje más abajo) mediante el uso de expresiones regulares, y eso ha mejorado significativamente la tarea.

La tarea añade algunos detalles interesantes. Uno es que no siempre comienza por la primera frase, sino que elige una frase al azar para comenzar por ella, luego completa el resto y tras eso vuelve a comenzar por el principio una y otra vez, sin límite. Esto de empezar por una frase distinta cada vez es para evitar que nos aprendamos mejor las primeras frases, cosa que ocurriría si siempre empezamos por el principio, porque algunas veces no tendremos tiempo de escucharlas todas.

La tarea repite cíclicamente todas las frases del archivo, sin pausa ni límite. Se detiene cuando volvemos a lanzar la misma tarea de nuevo (volvemos a pulsar el widget, por ejemplo), pues hay un mecanismo para detectar esa segunda ejecución cuya finalidad es terminar el proceso. Para que eso funcione hay que haber modificado la configuración de la tarea a Abortar-Tarea-Existente (en el manejo de incompatibilidades). Otro detalle es que la frase se muestra en una acción FLASH antes de ser vocalizada. Todos estos aspectos se pueden modificar fácilmente a gusto del consumidor.

MiscRollazo (87)
Abortar Tarea Existente
<Esta tarea vocaliza las frases de un fichero de texto.>
A1: Destino (de goto)
<La variable %MiscRolloFuncionando es boleana, puede valer 1 ó 0 alternativamente, y se utiliza para detener la tarea cuando la tarea es lanzada por segunda vez. Esto funciona porque en las propiedades de la tarea se ha establecido el manejo de incompatibilidades para abortar la tarea existente>
A2: Establecer variable [ Nombre:%MiscRolloFuncionando A:1- %MiscRolloFuncionando Calcular:Encendido Añadir:Apagado ]
A3: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:EXIT ] Si (if) [ %MiscRolloFuncionando = 0 ]
<Ruta y nombre.extensión del archivo. Cuidado con las mayúsculas.>
A4: Establecer variable [ Nombre:%pathfile A: Download/Rollo.txt Calcular:Apagado Añadir:Apagado ]
<comprobar que existe el fichero de texto y copiar su contenido a una variable>
A5: Prueba [ Tipo:File Type Datos:%pathfile Almacenar Resultado en:%filetype ]
A6: Leer Archivo [ Archivo:%pathfile A la variable:%rollazo ]
A7: Buscar y Reemplazar Contenido de Variable [ Variable:%rollazo Buscar:\(?[^\.]+(\.\d+)*[^\.]*[\.!\?]+\)? Ignore Case:Apagado Multi-Line:Encendido One Match Only:Apagado Almacenar Coincidencias En:%frases Reemplazar Coincidencias:Apagado Reemplazar Con: ]
A8: Establecer variable [ Nombre:%numfrases A:%frases(#) Calcular:Encendido Añadir:Apagado ]
<generar una variable aleatoria %saltarfrases para no comenzar siempre por la primera frase.>
A9: Establecer variable [ Nombre:%saltarmaximo A:%numfrases-1 Calcular:Encendido Añadir:Apagado ]
A10: Variable aleatoria [ Nombre:%saltarfrases Mín:0 Máx:%saltarmaximo ] Si (if) [ %numfrases > 2 ]
<Informar de cual sera la primera frase procesada, y del total de frases.>
A11: Establecer variable [ Nombre:%primerafrase A:%saltarfrases+1 Calcular:Encendido Añadir:Apagado ]
A12: Flash [ Texto:Iniciando el rollo en la frase
%primerafrase / %numfrases Largo:Encendido ]
<INICIOFRASES>
A13: Destino (de goto)
<la variable %numfrase contiene el numero de la frase que se esta procesando, para mostrarlo.>
A14: Establecer variable [ Nombre:%numfrase A:1 Calcular:Encendido Añadir:Apagado ]
<Procesar todas las frases (elementos de la matriz).>
A15: For [ Variable:%frase Ítems:%frases() ]
<si hay que saltar esta frase>
A16: Si (if) [ %saltarfrases > 0 ]
A17: Restar de variable [ Nombre:%saltarfrases Valor:1 ]
<Procesar la frase normalmente, mostrándola y vocalizandola.>
A18: Else
A19: Flash [ Texto:%frase
%numfrase/%numfrases Largo:Apagado ]
A20: Decir [ Texto:%frase Motor: Voz:default:default Stream:3 Tono:5 Velocidad:5 Respect Audio Focus:Encendido Continuar tarea inmediatamente:Apagado ]
A21: Fin si (End if)
A22: Sumar a variable [ Nombre:%numfrase Valor:1 Módulo (wrap around):0 ]
A23: End For
<Se han procesado todas las frases del archivo. Volver a empezar con la primera.>
A24: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:INICIOFRASES ]
<EXIT>
A25: Destino (de goto)
<Acciones finales para terminar la tarea correctamente>
A26: Establecer variable [ Nombre:%MiscRolloFuncionando A:0 Calcular:Encendido Añadir:Apagado ]
<Detener la acción DECIR que todavía pueda estar vocalizando.>
A27: Callar
<informar de que hemos acabado.>
A28: Establecer variable [ Nombre:%frase A:Terminando el rollo Calcular:Apagado Añadir:Apagado ]
A29: Flash [ Texto:%frase Largo:Apagado ]
A30: Decir [ Texto:%frase Motor: Voz:com.google.android.tts:spa-esp Stream:3 Tono:5 Velocidad:5 Respect Audio Focus:Encendido Continuar tarea inmediatamente:Apagado ]

---
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker

Última edición por Caravantes Día 24/12/13 a las 21:43:00.
Responder Con Cita
Gracias de parte de:


  #2  
Viejo 23/12/13, 20:57:15
Array

[xs_avatar]
Jusss Jusss no está en línea
Usuario muy activo
 
Fecha de registro: ago 2012
Mensajes: 713
Modelo de smartphone: Galaxy Note 3 N9005
Tu operador: Movistar
Me viene genial está tarea, para ir cambiando entre diferentes archivos solo cambiamos en "A5" la ruta del archivo por otra, no?
Responder Con Cita
  #3  
Viejo 23/12/13, 22:25:16
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
 Cita: Originalmente Escrito por Jusss Ver Mensaje
para ir cambiando entre diferentes archivos solo cambiamos en "A5" la ruta del archivo por otra, no?
En realidad hay dos acciones que hacen referencia al archivo, una para comprobar que el archivo existe y otra para leer su contenido... pero espera que te lo voy a poner un poco más fácil: inserto una nueva variable en A4 y ahora las dos instrucciones siguientes hacen referencia a esa variable. Ya está, solo tienes que modificar A4. Si el archivo no existe (o escribes mal su nombre) la tarea se detiene en A5 y muestra un mensaje de error.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
Gracias de parte de:
  #4  
Viejo 24/12/13, 11:04:46
Array

[xs_avatar]
maid450 maid450 no está en línea
Miembro del foro
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Tu operador: Yoigo
Pienso que lo mejor para trocear el texto es usar expresiones regulares, he hecho una pequeña tarea con lo básico: lee un archivo, lo trocea usando una expresion regular y recorre con un for el array de frases, aquí la descripción:

Código:
Prueba Texto (72)
    A1: Read File [ File:/sdcard/prueba.txt To Var:%txt ] 
    A2: Variable Search Replace [ Variable:%txt Search:\(?[^\.]+(\.\d+)*[^\.]*[\.!\?]+\)? Ignore Case:Off Multi-Line:On One Match Only:Off Store Matches In:%frases Replace Matches:Off Replace With: ] 
    A3: For [ Variable:%frase Items:%frases() ] 
    A4: Flash [ Text:%frase Long:Off ] 
    A5: End For
Esta es la expresión regular que he usado:
Código:
\(?[^\.]+(\.\d+)*[^\.]*[\.!\?]+\)?
La he encontrado por ahí y la he adaptado un poco para que funcione mejor en español (estaba muy pensada para el inglés donde no hay carácteres ¿ o ¡ por ejemplo) y tome en cuenta puntos suspensivos.

No la he testeado a fondo, pero parece que corrije los principales problemas del metodo inicial:
- Conserva los signos de puntuación (puntos finales de frase, puntos de interrogación/exclamación/suspensivos)
- toma los puntos suspensivos como un unico signo de puntuación, no como 3 puntos por separado
- no separa los números con punto decimal

Habría que adaptar la tarea original para usar este metodo de separación.
Responder Con Cita
  #5  
Viejo 24/12/13, 22:00:51
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
 Cita: Originalmente Escrito por maid450 Ver Mensaje
No la he testeado a fondo, pero parece que corrije los principales problemas del metodo inicial:
- Conserva los signos de puntuación (puntos finales de frase, puntos de interrogación/exclamación/suspensivos)
- toma los puntos suspensivos como un unico signo de puntuación, no como 3 puntos por separado
- no separa los números con punto decimal
Excelente, Maid, muchas gracias.
Ya he adaptado la tarea y las primeras pruebas parecen funcionar bien, así que he rectificado el post inicial con esas mejoras.

Siempre me gusta tener una idea aproximada de lo que utilizo, así que me he mirado la página de la Wikipedia sobre expresiones regulares, para ir aprendiendo algo de ello, y para tratar de entender un poco el significado de esa ristra de caracteres. Creo que he llegado a entender algunas cosas, o al menos creo entender el sistema, pero no llego a todo. Yo interpreto

\(?[^\.]+(\.\d+)*[^\.]*[\.!\?]+\)?

?[^\.]+ Un punto o una sucesión de puntos consecutivos(sea cual sea su número)
y que ha de ir seguido de
(\.\d+) Un punto seguido de un dígito (al menos UN dígito, puede que varios dígitos).
o bien
[^\.] Un punto o una sucesión de puntos consecutivos, sea cual sea su número.
o bien
[\.!\?]+ Un carácter que puede ser un punto, o un cierre de admiración, o un cierre de interrogación (y ese carácter puede aparecer repetido varias veces)
Supongo que tengo unos cuantos errores e imprecisiones. Por ejemplo soy incapaz de interpretar los caracteres de barra invertida (\) que hay al comienzo y al final.

Esto de las expresiones regulares parece muy prometedor, creo que voy a dedicarle un poco más de tiempo.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #6  
Viejo 26/12/13, 08:07:35
Array

[xs_avatar]
maid450 maid450 no está en línea
Miembro del foro
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Tu operador: Yoigo
Lo has analizado bastante bien, las expresiones regulares pueden llegar a ser muy esotericas, sobretodo al principio, pero son extremadamente potentes si se testea bien que funcionen en todos los casos previstos.
Personalmente me gusta mucho usar para depurar expresiones regulares la herramienta http://www.regexper.com que permite poner una expresión regular y te muestra una representación grafica de que textos la cumplirán.

Solo unas pequeñas correcciones para poder ayudarte a ti y a la gente del foro a pillarles un poco el punto:

En las expresiones regulares se usan ciertos caracteres con un significado especial, como ".", "(", ")", "+", "*", "?" con lo que cuando en la propia expresión quieres referirte a uno de esos caracteres sin usar su significado especial hay que ponerle una contrabarra "\" antes, por ejemplo al poner "\." me refiero a un caracter ".", mientras que si no pusiera la contrabarra estaría usando su significado especial, que para el "." es "cualquier caracter".

Así pues, los trozos "\(?" y "\)?" de principio y final vienen a decir que una frase puede comenzar/terminar por 0 o 1 carácteres "(" y ")" respectivamente.
El ^ dentro de un grupo de caracteres es una negación, es decir: "cualquier caracter que no sean estos", con lo que [^\.]+ significa realmente "1 o más caracteres distintos del punto" ya que una frase no puede empezar por un punto.
Después vendría
(\.\d+)* que sería que puede haber 0 o más veces un punto inmediatamente seguido de 1 o más digitos, esto es para que no considere terminada una frase al encontrarse numeros con punto decimal.
[^\.]* es 0 o más veces caracteres que no sean un ".", porque si encontrásemos un numero con punto decimal seguido por más palabras y esto no estuviese no se cumpliría la expresión.
Finalmente una frase debe acabar por uno o más caracteres de puntuación final: ".", "!" o "?" (aparte del posible fin de parentesis final que he comentado antes).
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Otro software para Android > Tasker



Hora actual: 03:03:36 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /