Pull to refresh

Пишем скрипт под линукс, прочитывающий свежие статьи с хабра в мп3 файл.

Reading time3 min
Views1.2K
Многие из нас хотели бы еще немного сэкономить свое время. Одна из технологий, позволяющих сделать это — tts (text to speech): Когда компьютер читает вслух какой-либо текст. Согласитесь, как приятно было бы прослушать все свежие статьи с хабра, пока вы готовите еду, убираете квартиру, одеваетесь или завязываете шнурки т.е. в те моменты когда ваши глаза и руки заняты, а мозг и уши почти свободны.
Недавно я написал скрипт, позволяющий перевести в мп3 все свежие статьи с хабра для того чтобы можно было их прослушать. Немного изменив его вы сможете получать статьи и с других сайтов, вместо записи в мп3 можно будет проговорить статьи на компьютере немедленно, также в скрипте реализован достаточно простой способ работы с rss через консоль linux.

С начала хочу предупредить, что по скольку в линуксе тяжело с tts мы будем запускать Win версию через вайн.
Для скрипта вам понадобится поставить wine, потом АПИ для работы tts, файл должен называться примерно так Spchapi.exe (у вас ведь есть лицензия на использование виндоуз и его компонентов ^_^ ?). После чего находим виндовый движок для голоса и ставим его тоже, например вы можете попробовать триальную версию Digalo.
Чтобы проверить все ли поставлено правильно, надо запустить какую-нибудь читалку. Если вы идете за ней на сайт говорилки то не забудьте скачать еще и Govorilka CP, она то и будет запускаться через скрипт.
Итак вы установили wine, Spchapi.exe, голосовой движок и скачали Govorilka CP.
Теперь можно переходить непосредственно к скрипту.
для начала нужно создать рабочую директорию, я буду использовать ~/rss2mp3/, вы вольны вибирать сами.
для начала войдем в заготовленную директорию
$ cd ~/rss2mp3/
Как мы знаем рсс хабра находится по адресу habrahabr.ru/rss/main
С него и будем качать:
$ wget habrahabr.ru/rss/main -O rssindex.tmp

Файл, в котором будут храниться уже прочитанные ссылки:
$ touch rssold.tmp

Вытаскиваем из рсс все сылки на посты:
$ cat rssindex.tmp | grep '' | sed 's///g;s/<\/link>//g;s/ *//g' > rss.tmp

Находим свежие ссылки сравнивая со старыми:
$ comm rssold.tmp rss.tmp -13 | sed 's/\t*//;s/ *//'> rsslinks.tmp

Т.о. все ссылки на свежие статьи находятся в файле rsslinks.tmp

Добавляем новые ссылки к списку старых:
$ comm rssold.tmp rss.tmp | sed 's/\t*//;s/ *//' > rssold.tmp

Теперь для каждой ссылки из файла rsslinks.tmp нужно делать одинаковые действия:
$ for a in $( cat rsslinks.tmp | tr "\r\n" " ");
do


первым делом надо скачать статью:
$ wget $a -O rsshtm.tmp;

Далее надо получить нужный текст из скачанной нами html страницы.
$ cat rsshtm.tmp | sed -n -e '//, // p' | html2text -nobs > rsstext.tmp
вырезает из длинной хтмлки нужный сегмент, начинающийся после и кончающийся до (особенности хабра).
html2text убивает теги в этом куске, хотя его название описывает процесс точнее.

Внимение, у меня govorilka cp запускается по команде wine /home/psysonic/gvrlcp.exe, т.к. я ее переименовывал!
Текстовой файл переводим в вейв с синтезированным голосом:
$ wine /home/psysonic/gvrlcp.exe -s70 -f rsstext.tmp -TO rsstmp.wav


Жмем в мп3, имя вытаскиваем из вайла. (У всех стоит лейм?)
$ lame -V0 rsstmp.wav "$(head -1 rsstext.tmp | sed 's/\*//g' | iconv -f cp1251).mp3"

Поздравляю.
done

Уверен, что после небольших танцев с бубнами этот скрипт заработает и у вас.

Привожу его целиком:
cd ~/rss2mp3
wget habrahabr.ru/rss/main -O rssindex.tmp
touch rssold.tmp
cat rssindex.tmp | grep '' | sed 's///g;s/<\/link>//g;s/ *//g' > rss.tmp
comm rssold.tmp rss.tmp -13 | sed 's/\t*//;s/ *//'> rsslinks.tmp
comm rssold.tmp rss.tmp | sed 's/\t*//;s/ *//' > rssold.tmp
for a in $( cat rsslinks.tmp | tr "\r\n" " ");
do
wget $a -O rsshtm.tmp;
cat rsshtm.tmp | sed -n -e '//, // p' | html2text -nobs > rsstext.tmp
wine /home/psysonic/gvrlcp.exe -s70 -f rsstext.tmp -TO rsstmp.wav
lame -V0 rsstmp.wav "$(head -1 rsstext.tmp | sed 's/\*//g' | iconv -f cp1251).mp3"
done

P.s. Писалось на убунте.

upd
постарался немного упростить читаемость кода
Tags:
Hubs:
+3
Comments10

Articles