Как научить ваш Linux разговаривать

573

Еще с тех времен, когда я пользовался Windows помню, что в этой ОС были решения для голосового воспроизведения текстов. Да и многие программы используют голосовой режим для выведения своих сообщений. В Linux я этого не вижу, хотя честно признаться, до сегодняшнего дня у меня просто не возникало необходимости икать подобные решения. А вот статья на Хабре, написанная Helius заставила меня задуматься. Тем более, что на домашнем компе у меня тоже стоит Ubuntu. В общем читаем и экспериментируем!

Для тех, у кого дома есть стационарный компьютер аля «home сервер». Предлагаю вашему вниманию одну интересную функцию, которую под силу реализовать многим.

Типичные задачи для такой машинки:

  • Медиа-центр
  • Torrent-качалка
  • Файловым хранилище
  • Репозиторий

Возложим на него еще одну задачу — человеческим голосом сообщать нам разные интересные вещи…

Например оповещать:

  • О новых письмах
  • О температуре за окном
  • О погоде на завтра
  • Еще много чего, на что способно ваше воображение вооружонное сценариями командной оболочки

От слов перейдем к делу, поставленную задачу можно реализовать практически на любой платформе под любой ОС.
Я расскажу как реализовал это на Ubuntu Server, которая работает на моем «сервере» на Intell Atom.
Подразумевается что у вас есть звуковая карта, способная работать под Ubuntu и аудио система, моя аудио система подключена к «серверу». Для этих целей подойдет все что угодно, даже «компьютерные колонки» за $7.

Установка Festival

Об этом написано много, вот например, и на Хабре и в интырнетах, скажу лишь что делал по инструкции и не столкнулся с какими либо проблемами.
Для того чтобы он что то произнес достаточно вызвать его таким образом:
echo «Привет» | festival -tts -language russian
Удобнее оформить это в скрипт, и передавать строку на его стандартный ввод.

А что если у нас играет музыка? Как быть если громкость синтезатора звуковой карты меняется при прослушивании музыки? Вы ведь не хотите подпрыгнуть утром от крика, если с вечера забыли убавить регулятор громкости?

У меня звук играется через 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

В целом если «подбирать слова» произношение очень даже не плохое! Хорошо поставленый мужской голос.

Синтез речи и применение его в «бытовых» целях находит все большее применение, приблизимся к будущему на пол-шага!

Ну вот и все что я имел вам сообщить, надеюсь зажег в ком то интерес к этому вопросу!
Спасибо за внимание.

Если вы пользуетесь компьютером и различными сетевыми решениями, то прекрасно понимаете всю важность правильного размещения серверов и качественного их обслуживания. Но для начала стоит изучить цены на услуги colocation, чтобы определиться, какое именно решение подходит именно вам.

А если ваш бизнес только начинается, и вы ищите себе офисное пемещение то сначала изучите агентства недвижимости в Москве и выбирете себе надежного партнера. Ведь от квалификации риэлтора зависит очень многое.