Enviar Respuesta  Enviar Tema 
Audio rss Feeder
Autor Mensaje
RompeRatones
Usuario PL


Mensajes: 78
Grupo: Registrado
Registro en: May 2005
Estado: Sin Conexión
Reputación: 4
Mensaje: #1
Audio rss Feeder

Por supuesto que si, es como un podcasting a modo texto , es un poco complicado de explicarlo porque se involucran varios programas y realizandolo se pueden aprender varias cosas:

Primero que nada necesitamos :

Instalar perl
Instalar XML-RSS perl module
el rss2html.pl


Código:
#!/usr/bin/perl -w
# rss2html - converts an RSS file to HTML
# It take one argument, either a file on the local system,
# or an HTTP URL like http://slashdot.org/slashdot.rdf
# by Jonathan Eisenzopf. v1.0 19990901
# Copyright (c) 1999 Jupitermedia Corp. All Rights Reserved.
# See http://www.webreference.com/perl for more information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# INCLUDES
use strict;
use XML::RSS;
use LWP::Simple;

# Declare variables
my $content;
my $file;

# MAIN
# check for command-line argument
die "Usage: rss2html.pl (<RSS file> | <URL>)\n" unless @ARGV == 1;

# get the command-line argument
my $arg = shift;

# create new instance of XML::RSS
my $rss = new XML::RSS;

# argument is a URL
if ($arg=~ /http:/i) {
    $content = get($arg);
    die "Could not retrieve $arg" unless $content;
    # parse the RSS content
    $rss->parse($content);

# argument is a file
} else {
    $file = $arg;
    die "File \"$file\" does't exist.\n" unless -e $file;
    # parse the RSS file
    $rss->parsefile($file);
}

# print the HTML channel
&print_html($rss);

# SUBROUTINES
sub print_html {
    my $rss = shift;
    print <<HTML;
HTML

    # print the channel items
    my $i = 1;
    foreach my $item (@{$rss->{'items'}})
    {
      next unless defined($item->{'title'});
      print "news $i .... ....\n";
      print "$item->{'title'}      \n";
      print "\n$item->{'description'} \n\n";

      if($i==4){
         last;  
      }
       $i = $i + 1;
    }

    # if there's a copyright element
    if ($rss->{'channel'}->{'copyright'}) {
   print <<HTML;
<p><sub>$rss->{'channel'}->{'copyright'}</sub></p>
HTML
    }

    print <<HTML;
HTML
}

----

Eso nos da lo necesario para descargar los feeds a nuestra PC, el cual si queremos lo podemos ejecutar de forma automatica con un cron job

solo se ejecuta
$perl rss2html.pl "http://rss.slashdot.org/Slashdot/slashdot.RDF" > salida.txt


El script como puede ver no es perfecto, siempre quedan algunos tags de html una que otra vez .
ver ejemplo

por eso vamos a tener que usar sed y arreglaro un poco

$sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt > slashdot.txt

quedando finalmente algo mas presentable

Hay que acordarse que no todos los feed son iguales y quizas tengan que hacer algunas modicaciones dependiendo del sitio.

La parte del que mas van a editar es la siguiente

Cita:
foreach my $item (@{$rss->{'items'}})
{
next unless defined($item->{'title'});

# aca podemos escribir un mensaje personalizado al comienzo de cada registro
print "news $i .... ....\n";

# esta linea no se tendria que editar
print "$item->{'title'} \n";

# el script funciona para los feeds de slashdot, digg y otros sitios que
# indexan tanto el <title></title> como <description></description>, pero
# sin embargo para que este funcione en los feeds de sitio (por ejemplo )
#vivalinux.com.ar donde solo indexan los titulares, vamos a tener que dejar
#comentada la linea de abajo o bien crear una copia de todo el
#script rss2html.pl con los arreglos
#necesarios para estas circumstancias

print "\n$item->{'description'} \n\n";


# la cantidad de feeds que queres obtener, no recomiendo mas de 5 o 6, la onda es
# solo tener algo que leer mientras tomamos el desayuno o volvemos del trabajo
if($i==4){


-----------------

Poniendolo todo junto
escribimos un simple bash


leerslash.sh

Código:
#!/bin/bash
##   se ejecuta con $sh leerslash      
##   o  chmod +x leerslash para luego
##   poder  ejecutarlos ./leerslash      

perl rss2html.pl  http://rss.slashdot.org/Slashdot/slashdot.RDF > salida.txt
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'  salida.txt   > slashdot.txt
cat slashdot.txt |less
rm slashdot.txt salida.txt


Podemos agregar mas feed modificando ese archivo, digamos que queremos ver que esta pasando en los foros de dominio digital

Código:
perl rss2html.pl  http://rss.slashdot.org/Slashdot/slashdot.RDF > salida.txt
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'  salida.txt   > feeds.txt
perl rss2html.pl "http://www.psicofxp.com/forums/external.php?type=RSS2&forumids=287" >salida.txt
#usamos nuevamente sed para hacer los arreglos necesarios, en este caso me basto con
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt >>feeds.txt

#leemos
cat feeds.txt | less
##borramos los archivos
borrar='salida.txt feeds,txt'
rm $borrar



Y asi tenemos un lindo lector rss para la consola, creo que hay varios ya
No se nada de perl ni mucho menos de sed (que fue lo que mas me volvio loco), pero es un lindo ejercicio. me sirvio para conocer un poco mas sobre la gran utilidad de ambos

Yo les prometi audio y aca les dejo un avance (todavia no aprendi a usar el vcn2swf correctamente y no encuentro forma de embedirle el audio al swf , aca les dejo todo separado

Videito http://orbita78.com.ar/~german/rss.html
al archivo parseado por rss2html y sed http://orbita78.com.ar/~german/slashdot.txt
y finalmente el audio http://orbita78.com.ar/~german/slashdot.ogg


Convertir el archivo de texto a audio

Ahora viene la parte divertida, les recomiendo festival que es un motor tts (text to speech)open source y se usa muy facilmente

una vez instalado podemos usarlos para varios fines , pero no voy a cubrir todos, sino los que son mas importantes para el rss.

festival nos provee del script text2wave y oggenc, y se usa asi
text2wave < slashdot.txt >audio.wav


tambien podemos entubarlo y enviarlo al oggenc para que nos recodifique la salida de audio a un archivo.ogg
text2wave slashdot.txt | oggenc - -o slashdot.ogg

La unica contra es que todavia no encontre manera de como usar el text2wave en archivos de texto en español, pero encontre una vuelta...

en nuestro home creamos el archivo .festivalrc y ponemos lo siguiente

Código:
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "cat $FILE >> foo.raw")

Lo que nos va a resultar que cuando entremos a festival de modo interactivo no escuchar nada, ya que la salida de audio se vuelca a un archivo y luego usamos el mismo festival para pasar el texto al audio (nadie es imprecindible, escuchastes text2wave!?)


ejecutamos :
$festival --language spanish --tts archivo.txt

los que nos generara un archivo .raw

Para recodificarlo a un formato mas comun vamos a usar sox...

primero vamos a probarlo mediante play

play -c 2 -f s -r 6500 -s w -t raw foo.raw

los valores que estube manejando fueron entre 5800 a 8000 , queremos algo livianito y para uso personal, no para poder crear un mp3 de 41100 hertz y pasarlo a la ipod. Pero de todas formas no salio tan mal ver prueba de audio http://orbita78.com.ar/~german/prueba.ogg

Despues de jugar con play y encontrarle la frequencia ideal lo recodificamos a wav (hago este paso porque no se como mandarlo como ogg directamente)

$sox -c 2 -r 6500 -s -w foo.raw feed.wav

y por ultimo para codificarlo como mp3 usamos lame

$lame feed.wav feed.mp3

O bien, podemos tomar el camino mas alto y crearnos un lindo ogg, Un convertidor que me gusta usar es dir2ogg , ya que por default me borra los archivos wav al terminar la codificacion

$dir2ogg feed.wav
El comando anterior creara un archivo llamado feed.ogg y borrara el wav si es que no usamos ningun parametro

Ultimo paso

Es actualizar el script para que reprodusca sonida a la vez que leemos los feeds

leerslash.sh

Código:
#!/bin/bash
##   se ejecuta con $sh leerslash      
##   o  chmod +x leerslash para luego
##   poder  ejecutarlos ./leerslash      

erl rss2html.pl http://rss.slashdot.org/Slashdot/slashdot.RDF > salida.txt
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt > feeds_english.txt


## separar dos archivos diferentes para los feeds en ingles y los de español
ingles=feeds_english.txt


perl rss2html "http://www.psicofxp.com/forums/external.php?type=RSS2&forumids=287" >salida.txt
#usamos nuevamente sed para hacer los arreglos necesarios, en este caso me basto con
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt >feeds_espaniol.txt
espan=feeds_espaniol.txt
#convertimos los textos a audio
text2wave $ingles | oggenc - -o ingles.ogg

festival --language spanish --tts $espan
sox -c 2 -r 6400 -s -w foo.raw espaniol.wav
dir2ogg espaniol.wav

#concatenamos los feeds
cat $ingles > feeds.txt
cat $espan >>feeds.txt

#iniciamos la reproduccion
play ingles.ogg espaniol.ogg &

#leemos
cat feeds.txt | less
##borramos los archivos
borrar='salida.txt feeds,txt $espan $ingles foo.raw espaniol.ogg ingles.ogg'
rm $borrar


Espero que les haya gustado, como dije antes no se ni perl y recien ahora aprendi alguna maravillas del sed.. Si alguien encuentra algo mal , o algun atajo para ahorrarnos unos pasos... por favor deje un comentario

Fuentes:

http://www.student.northpark.edu/pemente...line52.txt
http://es.tldp.org/
http://www.cstr.ed.ac.uk/projects/festival/
http://leb.net/pub/blinux/doc/blinux/my-tts-linux.txt
http://www.oreillynet.com/pub/wlg/5894

http://www.webreference.com http://www.webreference.com/perl/tutorial/8/rss2html.pl


12-01-2005 08:17 PM
Visita el website del usuario Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
warp
Q


Mensajes: 2,009
Grupo: Registrado
Registro en: Jun 2005
Estado: Sin Conexión
Reputación: 10
Mensaje: #2
RE: Audio rss Feeder

muy interesante lo voy a probar....


12-02-2005 08:43 PM
Visita el website del usuario Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
Enviar Respuesta  Enviar Tema 

Ver la Versión para Impresión
Mandar este Tema a algún Amigo
Subscríbete a este Tema | Agrega este Tema a Tus Favoritos

Salto de Foro: