Caravantes
23/12/13, 18:16:43
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 ]
---
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 ]
---