Об этом написано много, вот например, и на Хабре и в интырнетах, скажу лишь что делал по инструкции и не столкнулся с какими либо проблемами.
Для того чтобы он что то произнес достаточно вызвать его таким образом:
echo «Привет» | festival --tts --language russian
Удобнее оформить это в скрипт, и передавать строку на его стандартный ввод.
А что если у нас играет музыка? Как быть если громкость синтезатора звуковой карты меняется при прослушивании музыки? Вы ведь не хотите подпрыгнуть утром от крика, если с вечера забыли убавить регулятор громкости? :D
У меня звук играется через Alsa, почитав маны я нашел как можно управлять alsa-mixer-ом устанавливая нужную громкость. Плеер я использую MOC (Music On Consol) который позволяет ставить его на паузу и запускать воспроизведение нехитрыми командами.
Таким образом:
1) ставим плеер на паузу
2) устанавливаем заранее определенный «комфортный» уровень громкости
3) произносим фразу
4) возвращаем уровень громкости
5) снимаем плеер с паузы
Вот что у меня получилось: скрипт sayit
#!/bin/bash
# читаем фразу из стандартного ввода
read str <&
#ставим плеер на паузу
/usr/bin/mocp -P
#устанавливаем громкость
amixer -c -- sset Master playback 40
#запускаем синтезатор
echo "$str" | festival --tts --language russian
#возвращаем громкость на прежний уровень
amixer -c -- sset Master playback 100
#убираем паузу
/usr/bin/mocp -U
Проверяем почту
Я использую gmail, как получить список новых писем уже рассказывали на Хабре, с ним все просто, алгоритм такой:
1) получаем кол-во новых писем
2) сравниваем кол-во с записаным ранее в файл (дабы не болтал, если «новых» непрочитаных нету, а только по появлении еще одного непрочитаного)
3) если оно больше записаного, произносим фразу «У вас новое письмо»
4) если записанное кол-во больше нуля (есть еще непрочитанные), тогда выводим на стандартный вывод «Непрочитанных $Number»
Скрипт:
#! /bin/bash
# Получаем кол-во писем
Nmb=`curl -u LOGIN:PASSWORD --silent "https://mail.google.com/mail/feed/atom" | grep -c "" `
# Читаем из файла кол-во непрочитаных писем
OldNmb=`cat /home/eugene/mail_count`
# если оно больше - значит пришло одно или несколько новых
if (( $Nmb > $OldNmb ))
then
# если непрочитаных больше чем одно, произносим их кол-во
# запускаем "говорящий" скрипт передавая ему фразу
if (( $Nmb > 1 ))
then
echo "У вас новое письмо. непрочитанных " $Nmb | /home/eugene/.bin/sayit
else
echo "У вас новое письмо." | /home/eugene/.bin/sayit
fi
fi
# сохраняем кол-во непрочитаных писем обратно в файл
echo "$Nmb">/home/eugene/mail_count
не забываем подставить свой LOGIN/PASSWORD! =)
Добавляем в Cron.
Температура «за окном»
Тут тоже все довольно просто, надо только найти любой «погодный» сайт который легко распарсить и выдернуть текущую температуру, в Новосибирске (где я нахожусь) есть www.ngs.ru на главной у которого «висит» температура, что ж, скрипт get_cur_tmpr:
1) подтягиваем страничку wget-ом,
2) проходим регулярным выражением,
3) возвращаем температуру в «чистом» виде, например 16 или -9.
>#!/bin/bash
# подтягиваем страничку с температурой c http://ngs.ru
wget -P /home/eugene/.tmp http://ngs.ru -q
# перекодируем в UTF-8 из вендо-кодировки
stringZ=`cat /home/eugene/.tmp/index.html | iconv -f CP1251 -t UTF-8`
# ищем нужную подстроку
tmp_str=`expr "$stringZ" : '.*Погода: \(.........\).*$'`
# получаем цифру
digit=`expr "$tmp_str" : '^.*\([0-9]\{1,2\}\)'`
# получаем знак
sign=`expr "$tmp_str" : '^\(.......\)'`
# если имел место знак минус - добавляем "-"
if [[ $sign = "−" ]]
then
tmpr="-"
fi
tmpr=$tmpr$digit
# выводим на стандартный вывод
echo $tmpr
#удаляем файл с температурой
rm /home/eugene/.tmp/index.html
Осталось выполнить этот скрипт по рассписанию, добавив в cron такую команду
get_cur_tmpr | sayit
Например у меня он запускается во время утренней чашки кофе, таким образом я знаю как одеваться в дорогу на работу.
Прогноз на завтра
Этот скрипт у меня запускается Cron-ом по вечерам, перед сном, дабы я знал какую транспортную схему предпочесть по пути на работу завтра и ехать ли на нее вообще :D :D :D
Он мало чем отличается от предыдущего, только в качестве источника информации я использую Яндекс (надеюсь я не нарушаю ни чьих прав =)). Яндекс умный, он знает откуда запросили страничку и выдаст прогноз погоды по вашей местности, поэтому скрипт будет работать везде одинакого, то есть везде по разному ))
Скрипт get_fut_tmpr:
#!/bin/bash
# подтягиваем страничку с температурой
wget -P /home/eugene/.tmp http://m.weather.yandex.ru/ -q
# парсим ее на предмет температуры
stringZ=`cat /home/eugene/.tmp/index.html
#вытягиваем цифру температуры
tmpr="`expr "$stringZ" : '.*Завтра.*день....\(..............\)'`"
#проверяем ответ с сервера, есть ли данные
if [ -n "$tmpr" ] # данные получены
then
#разделить максимальную и минимальную температуру (яндекс возвращает диапазон: -9 -11)
tmprhi=`echo $tmpr | egrep -o '^.?[0-9][0-9]?'`
tmprlo=`echo $tmpr | egrep -o '.?[0-9][0-9]?$'`
#формируем сообщение
if (($tmprhi<)) # минус один
then
shi="минус"
#удалить знак минуса из строки
tmprhi=`echo $tmprhi | egrep -o '[0-9][0-9]?'`
else
shi=" "
fi
if (($tmprlo<)) # минус один
then
slo="минус"
#удалить знак минуса из строки
tmprlo=`echo $tmprlo | egrep -o '[0-9][0-9]?'`
else
slo=" "
fi
else
echo "Прогноз яндэкса недоступен."
exit
fi
echo "Завтра яндэкс обещает $shi $tmprhi $slo $tmprlo градусов"
#удаляем файл с температурой
rm /home/eugene/.tmp/index.html
«Яндэкс» написано исключительно для благозвучности, некоторые слова синтезатор произносит криво, приходится эксперементировать
Что еще можно придумать, да массу! Сообщать карму на хабре, рейтинг на torrents, результаты бэкапов (особенно отрицательные), замеченую атаку из интернет, кол-во посещений домашнего сайта по вечерам подытоживать, я молчу про контроль сайтов (для web-программистов). Представляю картину, ночь, 3 часа, голос «на сайте xxx недоступно часть контента!»
С синтезатором есть пару неприятных моментов:
1) Долго думает перед тем как произнести фразу (поиск по словарям, синтез) как это победить я не нашел, на это все жалуются, видимо особенности реализации.
2) Словарь оставляет желать лучшего в плане произношения отдельных слов, некоторые слова приходится заменять синонимами, т.к. звучат они откровенно ужасно :D
В целом если «подбирать слова» произношение очень даже не плохое! Хорошо поставленый мужской голос.
Синтез речи и применение его в «бытовых» целях находит все большее применение, приблизимся к будущему на пол-шага!
Ну вот и все что я имел вам сообщить, надеюсь зажег в ком то интерес к этому вопросу!
Спасибо за внимание.
Комментариев нет:
Отправить комментарий