[igracka za desktop] cron + festival = "radio Mileva" :)

5 odgovora [Poslednji unos]
RiSK
Slika korisnika RiSK
Offline
User
Član od: 29/05/2006

Evo jedne ideje koju mi je sugerisao drug pre neki dan.

Festival je, kao sto znate, sintisajzer govora. Iskoristicemo njega da izgovori informacije koji inace lepimo po conky-ju gkrellm-u i slicnim ukrasima za desktop. A onda, strpamo skriptu koja to radi u crontab i svakih sat vremena (recimo) imamo potpun izvestaj. Bas kao na radiju - vesti na svaki pun sat Wink

Cron ili slicnu alatku, pretpostavljam, vec imate na sistemu. Ako nemate festival, instalirajte ga.
Prva 'caka' - festival podrazummevano pusta ton upisivanjem u /dev/dsp, sto ce reci da koristi zvucni podsistem ekskluzivno. Dakle, ako nesto pusta zvuke u trenutku kada pokrecemo festival, on nece moci. Ako pokrenemo festival, nakon njega nista nece moci da koristi zvuk. Da bi smo prevazisli ovo, poteracemo festival tako da koristi ALSA uredjaje. Na srecu, ovo je lagano. Dodajte u fajl /etc/festival.scm (ukoliko ne postoji napravite ga) sledece redove:
(Parameter.set 'Audio_Command "aplay -D plug:dmix -q -c 1 -t raw -f s16 -r $SR $FILE")
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Required_Format 'snd)
Ovo ce naterati festival da koristi aplay za zvuk.

Hajde da napravimo i neku skriptu za informacije. Ja sam se organizovao ovako: napravio sam jedan direktosijum za skripte za "radio". Kod mene je to /home/rile/local/radio. Preporucijem i vama da negde unutar $HOME direktorijuma kreirate jedan nov direktorijum za ovo. U nastavku cemo napraviti nesto fajlova (uglavnom bash skripte). Podrazumevacu da su svi fajlovi sacuvani u ovom direktoijumu.

Sta bi mogli da strpamo u skripte? Ja sam stavio ovo:

1) Tacno vreme. Skripta se zove time.sh
#!/bin/bash

echo -n "It's  "
echo -n `date | cut -d ' ' -f 4  | cut -d ':' -f 1`
echo -n " hours  and  "
echo -n `date | cut -d ' ' -f 4  | cut -d ':' -f 2`
echo -n " minutes. "

echo "..."

Rezultat izvrsavanje je sledeci:rile@rile:~/local/radio$ ./time.sh
It's  01 hours  and  30 minutes. ...

2) Zauzetost masine. Skripta se zove system.sh
#!/bin/bash

  prolaz="a"
  mfree=0
  mcache=0 

for i in `cat /proc/meminfo | grep MemFree`
do
#echo $prolaz
if [ "$prolaz" == "aa" ]
then
mfree=$i
fi
prolaz=$prolaz"a"
done

prolaz="a"

for i in `cat /proc/meminfo | grep Cached`
do
#echo $prolaz
if [ "$prolaz" == "aa" ]
then
mcache=$i
fi
prolaz=$prolaz"a"
done

ukupno=$(( $mfree + $mcache ))
ukupno=$(( $ukupno/1024 ))

prosek=`uptime | cut -d ',' -f 5 | cut -d '.' -f 2`

echo "Average processor load is $prosek percents."
echo "There's $ukupno megabytes of free memory."
echo "..."

exit 0

Rezultat izvrsavanja:rile@rile:~/local/radio$ ./system.sh
Average processor load is 32 percents.
There's 1415 megabytes of free memory.
...

Sto se ove skripte tice: zauzetost procesora je za zadnjih 15 minuta (prosecna), a ako ovo citaju ljudi koji se uce bash skriptama, nemojte koristiti one cikluse za izdvajanje zauzetosti kod provere memorije. To je los princip, al sam ja na brzaka prvo to ispisao Wink

3) Vremenska prognoza. Skripta se zove weather.sh
Ovde i u sledecoj skripti cemo iskoristiti nekoliko mocnijih unux komandnih alata za rad sa tekstom i XMLom.
Stvari koje su na netu postavljenje u vidu web servisa (koji koristi SOAP, tj XML u sintaksi) ili bilo kakvih servisa koji koriste tekstualne ili XML poruke mozemo lagano obradjivati i koristiti u ovoj situaciji.
Za ovu skriptu se koristi curl i morate ga instalirati da bi uopste proradilo sve. Wink Vremenska prognoza se "svlaci" sa http://www.weather.com (tamo postoji jedan od web servisa za ovu namenu) pa se primenjuje sledeca XSL transformacija:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output method="text" disable-output-escaping="yes"/>
<xsl:template match="weather">
<xsl:apply-templates select="cc"/>
<xsl:apply-templates select="dayf/day[@d='1']"/>
</xsl:template>

<xsl:template match="cc">

<xsl:text>Temperature: </xsl:text> <xsl:value-of select="tmp"/>
<xsl:text> Celsius degree </xsl:text>

<xsl:text>. Conditions: </xsl:text><xsl:value-of select="t"/>

</xsl:template>

<xsl:template match="dayf/day[@d='1']">
<xsl:text>. Tomorrow: </xsl:text>
 
  <xsl:value-of select="low"/>
  <xsl:text> to </xsl:text>
  <xsl:value-of select="hi"/><xsl:text> Celsius degree </xsl:text>
  <xsl:text>, </xsl:text><xsl:value-of select="part[@p='d']/t"/>
 
<xsl:text>.</xsl:text><xsl:value-of select="/weather/swa/a/t"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Ovaj fajl sacuvajte kao weather.xslt

Skripta koja koristi ovo izgleda ovako
#!/bin/sh

export http_proxy=http://user:pass@proxy.domen.lan:8080

LOCID=SRXX0027
UNITS=m
RUNDIR=/home/rile/local/radio

CURLCMD=/usr/bin/curl
XSLTCMD=/usr/bin/xsltproc

CURLURL="http://xoap.weather.com/weather/local/$LOCID?cc=*&unit=$UNITS&dayf=2"
XSLT=$RUNDIR/weather.xslt
eval "$CURLCMD \"$CURLURL\" 2>/dev/null| $XSLTCMD $XSLT - $FILTER"

Ovde trebate uneti sledece izmene:
Red koji izvosi http proxy prilagodite vasem proksiju, ili izbacite ako ne koristite proxy.
Redove RUNDIR, CURLCMD i XSLTCMD izmenite tako da odgovaraju lokacijama na vasem disku.
Promenljivu LOCID podesite tako da odgovara vasem mestu. Ovde je lokacija za Nis. Na http://www.weather.com mozete pronaci kod koji odgovara Vasem mestu.

Izlaz koji daje skripta izgleda ovako: rile@rile:~/local/radio$ ./weather.sh
Temperature: 10 Celsius degree . Conditions: Partly Cloudy. Tomorrow: 6 to 6 Celsius degree , Rain.

Ovo je inace minimalno modifikovana skripta koju sam nasao negde na webu i koju koristim u conky-ju.

4) Zadnje vesti iz BBC-a. Skripta se zove bbc.sh
#!/bin/bash

export http_proxy=http://user:pass@proxy.domen.lan:8080

wget <a href="http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml" title="http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml">http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml</a>

xmlstarlet sel -t -m "rss/channel/item" -v title -n -v description -n rss.xml | sed -e 's/$/./' > bbcnews

rm rss.xml

exit 0
Vazi ista izmena za http_proxy varijablu kao kod prethodne skripte.

Ova skripta izvlaci vesti iz BBC-evog RSS feeda. Modifikovanjem lokacije sa koje wget dovlaci fajl mozete iskoristiti ovu skriptu za dovlacenje informacija sa bilo kog RSS feeda.
Potreban vam je xmlstarlet (moj omiljeni sekvencni konzolni XML editor) da bi ovo proradilo.
Izlaz necu postovati jer je poveci. Zbog toja je i "tailovan" u sledecoj skripti.

Ok... Sad jos da sklopimo sve u jedno.
Napravicemo novu skriptu koja se zove radio.sh
#!/bin/bash

workDir="/home/rile/local/radio/"

cd "$workDir"

if [ -f "block" ]
then
log=`date`
echo "Stopped on $log" > last.log
exit 0
fi

echo "This is regular hourly report." > "vesti.txt"

$workDir/time.sh >> "vesti.txt"

echo "." >> "vesti.txt"

./system.sh >> "vesti.txt"

echo "Weather forcast:" >> "vesti.txt"

./weather.sh >> "vesti.txt"

echo "The latest BBC news:" >> "vesti.txt"

./bbc.sh
cat "bbcnews" | tail -n 15 >> "vesti.txt"

echo ". . . Have a nice day." >> "vesti.txt"

ogg123 intro.ogg
festival --tts "vesti.txt"

log=`date`
echo "Executed on $log" > last.log

exit 0

Izmenite promenljivu workDir da pokazuje na direktorijum u kome ste Vi stavili sve ove fajlove.

Ova skripta preusmerava izlaze svih prethodnih skripti u jedan fajl, a zatim taj fajl "cita" festivalom.
Ukoliko u direktorijumu u kojima su skripte postoji fajl koji se zove 'block' skripta nece uraditi nista. Ovim smo dobili mogucnost da "redovne vesti" iskljucimo jednim `touch block` i ukljucimo sa `rm block`.
U fajlu last.log se cuva vreme zadnje akcije i to da li je skripta izvrsena ili blokirana.

Osim toga, u direktorijum sam stavio fajl intro.ogg, sto je ustvai ovaj fajl spakovan u ogg format. Obican zvuk gonga koji se lepo uklapa kao "spica za vesti" i koji se pokrece malim konzolnim plejerom `ogg123` (i njega trebate instalirati da bi sve proradilo).

Ok... Sad je sve tu. Ako vec niste, dodajte privilegije za izvrsavanje svim bash skriptama.
Sada treba samo dodati u crontab red kojim se izvrsava "glavna" skripta na odredjeno vreme. Ako zelite da se izvrsava svakog punog sata, ukucajte crontab -e i dodajte red koji izgleda ovako nekako 0 * * * * /putanja/do/skripti/radio.sh

Uzivajte u festivalu i izvestajima! Wink

0
__________________

Programmer (noun): an organism that transforms coffe into code.

BRANKKO
Slika korisnika BRANKKO
Offline
User
Član od: 29/05/2006

Hehe skroz dobra ideja  Afro

Koliko je korisno, diskutabilno je, ali ideja je do yaya  Wink

burga
Slika korisnika burga
Offline
User
Član od: 29/05/2006

elem, zezanja radi hoću da cronujem komandu „fortune | festival --tts“

Lepo to radi, tačnije radi ali nije lepo. Glas je mnogo ružan. Kako mogu da u komandnoj liniji promenim govornika? Recimo, ovde ima jako dobrih govornika, naročito pod HMM sekcijom.

__________________

Нема бога, и Дирак је његов пророк

dens
Slika korisnika dens
Offline
User
Član od: 29/05/2006

Skript za meteo podatke nije funkcionalan... jer sajt ocekuje validan partner kod...

izlaz iz skripta je:

"Invalid Partner Code."

Neki workaround?

RiSK
Slika korisnika RiSK
Offline
User
Član od: 29/05/2006

@burga: Mozda ovo pomogne
http://www.cstr.ed.ac.uk/projects/festival/mbrola.html
Mada sumnjam da ces izvuci neki mnogo dobar kvalitet izgovora iz festivala.

Mozda je bolje da se sve ovo prebaci na espeak. Ako nista podrzava i srpski Wink

@dens: Neam pojma o cemu se radi., Verovatno su promenili web servis :\
Ja inace ovo ne pustam odavno, pa nisam nista primetio Laughing out loud Kad se dograbim boljeg neta (sutra ili eventualno veceras) mozda se poigram ponovo sa ovim cudesom pa da napravimo da radi malo bolje (ili samo: da radi Laughing out loud )

__________________

Programmer (noun): an organism that transforms coffe into code.

burga
Slika korisnika burga
Offline
User
Član od: 29/05/2006

ma nije ovo problem. Kažem ja njemu kad ga bustim (voice_šta_god), nego me zanima kako to isto da odradim iz komandne linije, da mogu da pustim
fortune -s | festival --tts

__________________

Нема бога, и Дирак је његов пророк