miércoles, 13 de agosto de 2014

Texto a Voz + SRT

Text to Speech + Subrip Subtitle

Algunas veces me gusta leer y al mismo tiempo escuchar lo que leo. Esto me permite llevar un ritmo constante y lograr mayor concentración en la lectura.

El otro día quise subir un texto a Youtube, sintetizado con una voz Loquendo y con subtítulos, de modo que desde Youtube el lector pudiera escuchar y al mismo tiempo leer la transcripción. Procedí a sintetizar el texto a voz utilizando SodelsCot Estándar y la voz de Loquendo Ximena. SodelsCot convierte a un archivo de audio el texto copiado al portapapeles y Youtube tiene una función que permite cargar la transcripción en formato de texto y convertirla a subtítulos en el video. Pero tanto SodelsCot como Youtube han presentado algunos inconvenientes:

  • Si el texto es muy grande, SodelsCot falla en el proceso de conversión de Texto a Voz.
  • Durante la conversión, prácticamente no se puede usar el portapapeles para otra cosa, ya que interfiere con el archivo de audio generado o crea archivos de más.
  • SodelsCot solamente permite convertir un texto a audio a la vez.
  • Si el texto es relativamente grande, Youtube demora muchas horas en procesar la transcripción.
  • Youtube falla frecuentemente, mostrando un mensaje de error en el procesamiento de la transcripción.
Con tanta "fricción cognitiva", pensé que sería mejor escribir un pequeño programa de uso personal que permita realizar lo siguiente:
  1. Recibir como entrada un archivo de texto plano.
  2. Generar 2 archivos, uno de audio (mp3 o wav) y un SRT con los subtítulos correspondientes.

SubTTS

SubTTS es el nombre con el que bauticé al programa. Por ahora es una aplicación de consola parametrizable por medio de un archivo de configuración.

SubTTS fue escrito en C# sobre .Net Framework 4.


Utilizando SubTTS

  1. Lo primero es descargar el programa aquí. Para descomprimir el RAR utiliza WinRAR y la clave: cristiandlr.blogspot.com
  2. Una vez descomprimido, ejecutar TTSub.exe para comprobar el listado de voces instaladas. Presionar Ctrl + C para salir del programa.
  3. Editar el archivo de configuración TTSub.exe.config y establecer los siguientes parámetros:
    • PathToText. Ruta completa al archivo de texto que se procesará.
    • WordsPerSub. Número de palabras por cada subtítulo.
    • VoiceName. Una de las voces instaladas (listadas en el paso 2).
    • VoiceRate. Velocidad de lectura, los valores oscilan entre -10 y 10.
    • OutputFormat. WAV o MP3.
  4. Una vez guardada la configuración, ejecutar nuevamente TTSub.exe, pero esta vez presionamos Enter para continuar luego de ver las voces instaladas.
  5. La ventana se cerrará sola al finalizar el trabajo y los archivos resultantes (wav y srt) quedan en la misma carpeta donde está el archivo de texto.

Qué hacer con los archivos?

Por ahora SubTTS es una herramienta que cumple una tarea muy simple. Por sí mismos los archivos de audio (wav o mp3) y srt (subrip subtitle) no pueden utilizarse juntos en un reproductor de audio convencional. El archivo de audio debe ser codificado en un formato de video (mp4, wmv, etc.) para que el reproductor cargue y despliegue los subtítulos. Se puede utilizar una herramienta como Windows Movie Maker para crear un video.

Licenciamiento

El programa es de uso libre para cualquier fin.

2016 11 25 Actualización: He publicado el código fuente en github.

martes, 30 de abril de 2013

Application pools y Web gardens (IIS / APS.NET)

Cuando se tienen varias aplicaciones ASP.NET corriendo sobre un servidor IIS, resulta conveniente crear pools diferentes para aquellas aplicaciones que tengan una demanda considerable.

Un pool de aplicaciones es una forma de agrupar una o más aplicaciones web bajo el dominio de un proceso (o un conjunto de procesos) denominado Worker Process.

Al asociar una aplicación a ese pool, IIS creará una (o más) instancia(s) del Worker Process para cada pool. En caso de que ocurra un fallo en una aplicación que provoque la finalización del Worker Process asociado al pool al que pertenece, otras aplicaciones asociadas a otros pools permanecerán funcionando sin problemas.

Cuando un pool de aplicaciones está controlado por más de una instancia del Worker Process se denomina Web Garden. El número de instancias del web garden es configurable en las propiedades del pool de aplicaciones.

Se debe tomar en cuenta que si la aplicación utiliza variables de sesión no funcionará con Web Gardens, ya que tales variables solo existen dentro del contexto de un único Worker Process.

Configurar un Pool de aplicaciones

Para administrar los pools de aplicaciones, se debe iniciar la interfaz de administración de IIS ejecutando el siguiente comando:

%SystemRoot%\system32\inetsrv\iis.msc

IIS 6

1. En la sección de Application Pools, se pueden crear nuevos pools, haciendo clic derecho sobre la misma, luego en la opción New, seleccionar Application Pool (ver imagen 2)... Para este ejemplo dejaremos los valores por defecto (ver imagen 1).

Imagen 1

2. En el directorio virtual, donde está la aplicación objetivo, clic derecho y elegir Properties. Se mostrará la ventana de propiedades de dicha aplicación. (ver imagen 2)

3. En el combo de Application Pool, se puede seleccionar el pool creado en el paso 1. (ver imagen 2)

Imagen 2

4. Para configurar el número máximo de instancias del Worker Process, presione clic derecho sobre el pool de aplicaciones, elija Properties y vaya a la pestaña Performance. En la sección Web garden, establezca el máximo número de procesos.

Imagen 3

IIS 7

1. Para crear un pool: Presione clic derecho en la sección de Application Pools y elija Add new application pool (imagen 4). Establezca un nombre para el mismo y presione la tecla Enter (imagen 5).

Imagen 4

Imagen 5

2. Para agregar una aplicación al pool creado, vaya a la aplicación o sitio web, haga clic derecho y elija Administrar sitio web / Configuración avanzada (imagen 6). Luego en la propiedad de Grupo de aplicaciones (Application pool) elija el que se creó en el paso anterior (imagen 7).

Imagen 6


Imagen 7

3. Para configurar el Web Garden para el pool creado, vaya al pool de aplicaciones (Sección Grupos de aplicaciones), haga clic derecho sobre el mismo y elija Configuración avanzada. Establezca la propiedad Maximum number of worker processes (Máximo de procesos de trabajo). Ver imagen 8.

Imagen 8







jueves, 12 de enero de 2012

IIS Remote Debugging / Visual Studio 2010

Existen ciertas diferencias al ejecutar una aplicación web en el equipo donde se ha desarrollado el código de la misma respecto al equipo donde se va a publicar.

Tales diferencias incluyen:

- Versión del sistema operativo
- Dependencias de aplicaciones (directorios creados, archivos de configuración, librerías de vínculos dinámicos, etc)
- Versión del Framework instalado
- Servidor que ejecuta la aplicacion (ASP.NET Development Server vs IIS, Ver artículo relacionado)

Por esa razón es común que existan fallos en ambientes de producción que no pueden ser detectados en ambientes de desarrollo.

Una herramienta muy util para encontrar (y resolver) este tipo de problemas es la aplicación de Depuración Remota incluída en Visual Studio "msvsmon.exe".

Hace poco tuve un problema de este tipo y estuve investigando sobre cómo conectar el Debugger con un servidor remoto, encontré diversos videos y tutoriales en Internet que describen el proceso pero ninguno describía la depuración remota en un servidor IIS, instalado en un equipo diferente al de desarrollo, por tal razón pensé en escribir un listado de pasos para facilitarle la vida a cualquiera que tenga la misma situación.


Depuración Remota en un servidor IIS



1. Compilar el código fuente en un directorio accesible desde el servidor



Al compilar una aplicación ASP.NET, se generan unos archivos con extensión PDB (Program Database) en el directorio bin, dichos archivos contienen información utilizada para la depuración de esa aplicación. Al depurar un equipo remoto, dichos archivos deben ser generados en una ubicación accesible al servidor donde está instalada la aplicación.

Para este propósito, se debe compartir la carpeta de código fuente con permisos de lectura y escritura a un usuario que tenga acceso al servidor.


  • Clic derecho sobre la carpeta

  • Elegir Propiedades

  • Ir a la pestaña Compartir

  • Escribir el nombre del usuario y hacer clic en agregar

  • Seleccionar los permisos Lectura y Escritura

  • Clic en Compartir

  • Clic en Listo





El siguiente paso es muy importante, se debe abrir el proyecto en VS utilizando la Ruta de acceso de red de la carpeta compartida, la cual puede consultarse en las propiedades de la carpeta:



Los pasos son:


  • Ejecutar VS2010 como administrador (clic derecho, Ejecutar como administrador; esto servirá posteriormente para la depuración remota)

  • Ir a Archivo / Abrir / Proyecto o Solución

  • Pegar la Ruta de acceso de red en el nombre del archivo y presionar la tecla Enter

  • Elegir el archivo de proyecto y hacer clic en Abrir






El proyecto debería compilar sin problemas. Posteriormente, se debe publicar la aplicación al servidor web donde se desea depurar (para que coloque allí los PDBs que hacen referencia al código fuente de la carpeta compartida).

Para tal propósito, hacer clic derecho sobre el proyecto (en el Explorador de soluciones) y realizar la publicación. Artículo relacionado



2. Levantar MSVMON.EXE en el servidor remoto




msvmon.exe es el ejecutable que levanta el Servicio de Depuración Remota en el servidor que deseamos analizar. Se instala por defecto con Visual Studio 2010 y no es necesario realizar ninguna instalación en el servidor, basta con copiar la carpeta que contiene dicho ejecutable al servidor.

Este ejecutable se puede encontrar en %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger en dos versiones, una para equipos de 32 bits (x86) y otra para equipos de 64 (x64), de acuerdo al procesador del servidor, se debe copiar la carpeta adecuada a dicho servidor.

Una vez trasladada la aplicación msvmon.exe se debe iniciar sesión en el servidor con el usuario al que se dieron permisos de Lectura y Escritura a la carpeta compartida y ejecutar msvmon.exe.

Se mostrará el mensaje Msvmon started a new server named ... Waiting for connections.

Se debe hacer clic en Tools / Options y copiar el Server Name, que nos servirá para Atachar el proceso (IIS Worker Process) a VS2010.

También debemos conocer el Process ID de la aplicación que queremos depurar, ya que IIS crea un proceso (IIS WP) para cada Pool de Aplicación que exista, para tal propósito, se puede ejecutar el siguiente comando en la línea de comandos:

cscript c:\windows\system32\iisapp.vbs



Si no aparece el PID del application pool deseado, se debe ir a un browser y ejecutar la aplicación web que se requiere depurar, para que inicie la instancia de w3wp, posteriormente, ejecutar de nuevo el comando indicado.

Una vez que tenemos estos datos (w3wp.exe PID del application pool deseado y el Server Name), volvemos al equipo de desarrollo.



3. Atachar el proceso w3wp a Visual Studio y realizar la depuración



Volvemos a VS2010 y realizamos los siguientes pasos:


  • Ir al menú Herramientas / Asociar al proceso

  • En la caja de texto de Calificador, pegar el Server Name que habíamos copiado desde el servidor remoto y hacer clic en el botón Actualizar. Si se tiene activado el Firewall, se debe agregar la excepción correspondiente cuando pregunte, o bien agregar Visual Studio 2010 al listado de excepciones de aplicación del firewall

  • Del listado de procesos, se debe localizar el w3wp.exe que corresponda al PID del pool de aplicaciones deseado.



  • Una vez seleccionado el proceso, hacer clic en Asociar

  • Ir a la líea de código que se desea depurar y colocar un Break Point



  • Por último, ejecutar la aplicación desde el browser. El break point debería detener su ejecución al alcanzar la línea marcada.



Saludos.

lunes, 9 de enero de 2012

User Control para Carga de Archivos (ASCX)

Realizar carga de archivos (file upload) en aplicaciones web es una tarea muy común. En ASP.NET puede efectuarse con facilidad por medio del control FileUpload, sin embargo, cuando la página ASPX se procesa en el servidor y el response se envía al browser, dicho control se convierte en una etiqueta del tipo <input type = "file" ... /> y por lo tanto, hereda las restricciones establecidas por el browser sobre dicha etiqueta:

- Sus propiedades no son accesibles a través del DOM
- Su valor (archivo seleccionado) se pierde entre los diferentes postbacks que ocurran a la página.

De acuerdo a lo anterior, si se realiza alguna validación del lado del servidor que impida que se acepte ese formulario, el usuario se verá obligado a corregir el error de validación y además, volver a seleccionar el archivo que desea cargar.

Para evitar estos inconvenientes, se puede desarrollar un control que permita cargar un archivo a un directorio temporal al servidor y mantener ese valor entre los distintos postbacks, de forma que una vez seleccionado y cargado un archivo, no haya necesidad de volver a realizar ese proceso, aún cuando no se cumplan otras validaciones en el formulario.


El control implementa las siguientes propiedades:

public string PostedMimeType: Mime Type del archivo cargado

public bool HasFile: Indica si se ha cargado un archivo al control

public string PostedFileName: Devuelve el nombre del archivo cargado (El nombre del archivo que el usuario ha cargado)

public byte[] PostedFileBytes: Devuelve un arreglo de bytes con el contenido del archivo cargado


El siguiente enlace es un pequeño proyecto (VS 2008 / C#) que implementa el control mencionado:

Descargar FileUploadTest.zip

miércoles, 28 de abril de 2010

Descargando vídeos desde YouTube (forma manual)

Cualquier contenido que pueda ser visualizado en un navegador web se puede descargar a la computadora, esto incluye cualquier formato que se vea vía streaming.

Hay una gran cantidad de sitios web, plugins y programas que permiten descargar vídeos de YouTube, pero qué pasa si queremos descargar un contenido de GoEar, MySpace Music o cualquier otro sitio? Habría que buscar una solución individual para cada caso.

Por suerte los navegadores nos permiten acceder a todos los archivos que se han descargado (o que se están descargando en ese momento) y simplemente habrá que sacar una copia o cuando mucho, habrá que cambiar la extensión a flv, mp3, etc...

Para descargar un vídeo de YouTube, podemos seguir estos pasos:
(Nota, en este ejemplo utilizaremos Google Chrome)

1. Encontrar el vídeo que se desea descargar
Al tener el enlace que nos llevará a la página en donde se va a reproducir el vídeo, lo abrimos en una ventana de navegación de incógnito.

Las ventanas de navegación de incógnito siempre tienen la caché vacía, así que nos será más fácil encontrar allí la dirección de descarga directa del vídeo (o audio).

Luego de abrir esa ventana es recomendable reproducir el vídeo y esperar hasta que se haya descargado por completo.






2. Acceder a la caché del navegador y encontrar el enlace del vídeo.
Una vez el vídeo se ha reproducido por completo, abrimos una nueva pestaña en la ventana de navegación de incógnito y en el espacio de dirección escribimos:

about:cache

Como el vídeo fue lo último que el navegador descargó, generalmente lo encontraremos entre los primeros enlaces. En el caso de YouTube, las direcciones de acceso directo a los vídeos llevan la palabra videoplayback, así que para ubicar el enlace con más facilidad podemos buscar esta palabra (Ctrl + F -> buscar).






3. Descargar el fichero del vídeo
Por último debemos copiar esa dirección que acabamos de encontrar y pegarla en una nueva pestaña en la misma ventana de navegación de incógnito. Cabe aclarar que no funciona simplemente haciendo clic sobre la dirección ni tampoco utilizando guardar destino como. Se debe copiar tal cual y pegarla en una nueva pestaña. (Ctrl + C, Ctrl + T, Ctrl + V -> copiar, nueva pestaña, pegar y luego Enter.)

El archivo se descargará de forma inmediata con el nombre videoplayback. Ya que los vídeos en YouTube se almacenan en formato flv, bastará con renombrar el archivo agregando dicha extensión para que el reproductor lo reconozca.






Si no tienen ningún reproductor de FLV, les recomiendo buscar e instalar el K-Lite Codec Pack que instala un codec para flv, de modo que se pueda abrir en nuestro reproductor favorito.