Пользователь
0,0
рейтинг
19 марта 2010 в 17:44

Администрирование → Учим ПК разговаривать

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

Типичные задачи для такой машинки:
  • Медиа-центр
  • Torrent-качалка
  • Файловым хранилище
  • Репозиторий
Возложим на него еще одну задачу — человеческим голосом сообщать нам разные интересные вещи…

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


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

Установка Festival


Об этом написано много, вот например, и на Хабре и в интырнетах, скажу лишь что делал по инструкции и не столкнулся с какими либо проблемами.

Позже решил собрать сам и запустить festival сервером, т.е. он весит демоном а мы подключаемся к нему с помощью клиента и командуем им. Плюсы — значительно меньшее время отклика, на «шустрой» системе и фразах типо текущего времени задержка не более 1-2с.

Качаем все архивы исходников с страницы проекта.
Распаковываем в папку например /usr/local/bin/festival/ (дале $INST_DIR) установить продукт стандартным sudo make install не получится, собирать надо там где будет лежать в результате. Теперь в нашей директории появится festival/ и speech_tools/ последний — библиотека голосовых средств The Edinburgh Speech Tools, сборку надо начинать с нее.

$cd speech_tools
$ ./configure
$make

будет ругаться на отсутствие libcurses доустанавливаем
$sudo aptitude install libncurses-dev

и повторяем сборку

Собираем сам festival

$cd ../festival
$ ./configure
$make

В festival/bin/ среди прочего появятся festivale и festivale_client — это симлинки на бинарники которые лежат тут же не подалеку.

Запускаем festivale (с указанием пути до нового нашего файла, иначе запустится старый или вообще ничего не запустится) и пробуем для начала английский текст:
festival> (SayText «Hello World»)
Если заговорил — дело за малым, если Linux: Can't open /dev/dsp смотрим cюда https://wiki.archlinux.org/index.php/Festival#can.27t_open_.2Fdev.2Fdsp (спасибо RussianNeuroMancer)

Руссифицируемся!

Качаем русский голос тут: http://festlang.berlios.de/docu/doku.php?id=russianru
Распаковываем msu_ru_nsh_clunits-0.5.tar.bz2 (на момент написания это самая свежая версия) в $INST_DIR/festival/lib/voices/ru/ — структуру директорий надо сохранять.

В начало файла $INST_DIR/festival/lib/languages.scm пишем:
(define (language_russian)
 "(language_russian)
 Set up language parameters for Russian."
 (set! male1 voice_msu_ru_nsh_clunits)
 (male1)
 (Parameter.set 'Language 'russian)
 )

Ищем блок начинающийся строкой:
(define (select_language language)

по аналогии с другими языками добавляем
   ((equal? language 'russian)
   (language_russian))


Проверяем русский язык:
echo "Привет" | festival --tts --language russian

Если говорит — отлично, пробуем запустить сервером:
$INST_DIR/festival/bin/festival --server --language russian 
в фон пока запускать его не будем, пусть висит в терминале на время отладки.

Запускаем клиента в другом терминале (вариант у кого есть alsa и aplay работает нормально)
echo "Привет" | $INST_DIR/festival/bin/festival_client -ttw | aplay
ключик -ttw означает text to wave, можно запустить с ключем -tts что означает text to speech
echo "Привет" | $INST_DIR/festival/bin/festival_client -tts


Говорит? — супер! Если нет — смотрим в терминал где запущен сервер, может появиться сообщение о том что клиент Reject так как он не в списке разрешеных подключений, тогда правим файл $INST_DIR/festival/lib/festival.scm:
найдите параметр
(defvar server_access_list '("192.168.2.1" "127.0.0.1" localhost)
и допишите IP адрес хоста с которого вы подключаетесь (хотя я и пытался подключаться через 127.0.0.1 сервер ругался и определял клиента как 192.168.2.1, добавил IP стало все ОК). Очевидно что рулить им можно с удаленного хоста, к слову, для подключения используется порт 1314, его можно сменить как в этом конфиге, так и при запуске клиента и сервера ключиком --port, естественно порт клиента и сервера должен быть одинаковый.

Для православного запуска при старте системы я накидал init-script:
#!/bin/sh

### BEGIN INIT INFO
# Provides:          helius
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Should-Start:      $network
# Should-Stop:       $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Festival server
# Description:       Start Festival daemon as server
### END INIT INFO

. /lib/lsb/init-functions

PATH=/sbin:/bin:/usr/sbin:/usr/bin
NAME=festival
DESC="Festivale Speech system"
DAEMON=/home/eugene/src/festival_src/festival/bin/festival
START_MPD=

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0



fest_start () {

    log_daemon_msg "Starting $DESC" "$NAME"

    start-stop-daemon --start --quiet --oknodo \
        --exec "$DAEMON" -- --server --language russian &
    log_end_msg $?
}

fest_stop () {

    log_daemon_msg "Stopping $DESC" "$NAME"
    start-stop-daemon --stop --quiet --oknodo --retry 5  \
        --exec $DAEMON
    log_end_msg $?
}

case "$1" in
    start)
        fest_start
        ;;
    stop)
        fest_stop
        ;;
    restart|force-reload)
        fest_stop
        fest_start
        ;;
    force-start|start-create-db)
        FORCE_CREATE_DB=1
        fest_start
        ;;
    force-restart)
        FORCE_CREATE_DB=1
        fest_stop
        fest_start
        ;;
    *)
        echo "Usage: $0 {start|start-create-db|stop|restart}"
        exit 2
        ;;
esac

Скопировать в /etc/init.d/ от рута, сделать
$sudo update-rc.d festivald defaults

стартуем
$sudo /etc/init.d/festivald start

проверяем что клиент нормально коннектится — фразы произносятся, оформляем запуск клиента в скрипт, наслаждаемся! :D

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

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

У меня звук играется через Alsa, почитав маны я нашел как можно управлять alsa-mixer-ом устанавливая нужную громкость. Плеер я использую MOC (Music On Consol) который позволяет ставить его на паузу и запускать воспроизведение нехитрыми командами (если у вы используете другой аудио-плеер, найдите как им управлять, ставить на паузу — снимать, или просто уберите эти строки).

Таким образом:
1) ставим плеер на паузу
2) устанавливаем заранее определенный «комфортный» уровень громкости
3) произносим фразу
4) возвращаем уровень громкости
5) снимаем плеер с паузы

Вот что у меня получилось: скрипт sayit
#!/bin/bash<br/>
# читаем фразу из стандартного ввода<br/>
read str <&0<br/>
#ставим плеер на паузу<br/>
/usr/bin/mocp -P<br/>
#устанавливаем громкость<br/>
amixer -c 0 -- sset Master playback 40<br/>
#запускаем синтезатор<br/>
echo "$str" | festival --tts --language russian<br/>
#возвращаем громкость на прежний уровень<br/>
amixer -c 0 -- sset Master playback 100<br/>
#убираем паузу<br/>
/usr/bin/mocp -U<br/>
 


Проверяем почту


Я использую gmail, как получить список новых писем уже рассказывали на Хабре, с ним все просто, алгоритм такой:
1) получаем кол-во новых писем
2) сравниваем кол-во с записаным ранее в файл (дабы не болтал, если «новых» непрочитаных нету, а только по появлении еще одного непрочитаного)
3) если оно больше записаного, произносим фразу «У вас новое письмо»
4) если записанное кол-во больше нуля (есть еще непрочитанные), тогда выводим на стандартный вывод «Непрочитанных $Number»

Скрипт:
#! /bin/bash<br/>
# Получаем кол-во писем<br/>
Nmb=`curl -u LOGIN:PASSWORD --silent "mail.google.com/mail/feed/atom" | grep -c "<entry>"`<br/>
# Читаем из файла кол-во непрочитаных писем<br/>
OldNmb=`cat /home/eugene/mail_count`<br/>
# если оно больше - значит пришло одно или несколько новых<br/>
if (( $Nmb > $OldNmb ))<br/>
then<br/>
   # если непрочитаных больше чем одно, произносим их кол-во<br/>
   # запускаем "говорящий" скрипт передавая ему фразу<br/>
    if (( $Nmb > 1 ))<br/>
    then<br/>
    echo "У вас новое письмо. непрочитанных " $Nmb | /home/eugene/.bin/sayit<br/>
    else<br/>
    echo "У вас новое письмо." | /home/eugene/.bin/sayit<br/>
    fi<br/>
fi<br/>
# сохраняем кол-во непрочитаных писем обратно в файл<br/>
echo "$Nmb">/home/eugene/mail_count<br/>
 <br/>
 

не забываем подставить свой LOGIN/PASSWORD! =)
Добавляем в Cron.

Температура «за окном»


Тут тоже все довольно просто, надо только найти любой «погодный» сайт который легко распарсить и выдернуть текущую температуру, в Новосибирске (где я нахожусь) есть www.ngs.ru на главной у которого «висит» температура, что ж, скрипт get_cur_tmpr:
1) подтягиваем страничку wget-ом,
2) проходим регулярным выражением,
3) возвращаем температуру в «чистом» виде, например 16 или -9.

>#!/bin/bash<br/>
# подтягиваем страничку с температурой c http://ngs.ru<br/>
wget -P /home/eugene/.tmp http://ngs.ru -q<br/>
# перекодируем в UTF-8 из вендо-кодировки<br/>
stringZ=`cat /home/eugene/.tmp/index.html | iconv -f CP1251 -t UTF-8`<br/>
# ищем нужную подстроку<br/>
tmp_str=`expr "$stringZ" : '.*Погода</a></h2>:&nbsp;\(.........\).*$'`<br/>
# получаем цифру<br/>
digit=`expr "$tmp_str" : '^.*\([0-9]\{1,2\}\)'`<br/>
# получаем знак<br/>
sign=`expr "$tmp_str" : '^\(.......\)'`<br/>
# если имел место знак минус - добавляем "-"<br/>
if [[ $sign = "&minus;" ]]<br/>
then<br/>
        tmpr="-"<br/>
fi<br/>
tmpr=$tmpr$digit<br/>
# выводим на стандартный вывод<br/>
echo $tmpr<br/>
#удаляем файл с температурой<br/>
rm /home/eugene/.tmp/index.html


Осталось выполнить этот скрипт по рассписанию, добавив в cron такую команду
get_cur_tmpr | sayit

Например у меня он запускается во время утренней чашки кофе, таким образом я знаю как одеваться в дорогу на работу.

Прогноз на завтра


Этот скрипт у меня запускается Cron-ом по вечерам, перед сном, дабы я знал какую транспортную схему предпочесть по пути на работу завтра и ехать ли на нее вообще :D :D :D

Он мало чем отличается от предыдущего, только в качестве источника информации я использую Яндекс (надеюсь я не нарушаю ни чьих прав =)). Яндекс умный, он знает откуда запросили страничку и выдаст прогноз погоды по вашей местности, поэтому скрипт будет работать везде одинакого, то есть везде по разному ))

Скрипт get_fut_tmpr:
#!/bin/bash<br/>
# подтягиваем страничку с температурой<br/>
wget -P /home/eugene/.tmp http://m.weather.yandex.ru/ -q<br/>
# парсим ее на предмет температуры<br/>
stringZ=`cat /home/eugene/.tmp/index.html<br/>
#вытягиваем цифру температуры<br/>
tmpr="`expr "$stringZ" : '.*Завтра.*день....\(..............\)'`"<br/>
#проверяем ответ с сервера, есть ли данные<br/>
if [ -n "$tmpr" ]    # данные получены<br/>
then<br/>
  #разделить максимальную и минимальную температуру (яндекс возвращает диапазон: -9 -11)<br/>
  tmprhi=`echo $tmpr | egrep -o '^.?[0-9][0-9]?'`<br/>
  tmprlo=`echo $tmpr | egrep -o '.?[0-9][0-9]?$'`<br/>
  #формируем сообщение<br/>
  if (($tmprhi<0))     # минус один<br/>
  then<br/>
    shi="минус"<br/>
    #удалить знак минуса из строки<br/>
    tmprhi=`echo $tmprhi | egrep -o '[0-9][0-9]?'`<br/>
  else<br/>
    shi=" "<br/>
  fi<br/>
  if (($tmprlo<0))     # минус один<br/>
  then<br/>
    slo="минус"<br/>
    #удалить знак минуса из строки<br/>
    tmprlo=`echo $tmprlo | egrep -o '[0-9][0-9]?'`<br/>
  else<br/>
    slo=" "<br/>
  fi<br/>
else<br/>
  echo "Прогноз яндэкса недоступен."<br/>
  exit 0<br/>
fi<br/>
 <br/>
echo "Завтра яндэкс обещает $shi $tmprhi $slo $tmprlo градусов"<br/>
#удаляем файл с температурой<br/>
rm /home/eugene/.tmp/index.html



«Яндэкс» написано исключительно для благозвучности, некоторые слова синтезатор произносит криво, приходится эксперементировать

Что еще можно придумать, да массу! Сообщать карму на хабре, рейтинг на torrents, результаты бэкапов (особенно отрицательные), замеченую атаку из интернет, кол-во посещений домашнего сайта по вечерам подытоживать, я молчу про контроль сайтов (для web-программистов). Представляю картину, ночь, 3 часа, голос «на сайте xxx недоступно часть контента!»

С синтезатором есть пару неприятных моментов:
1) Долго думает перед тем как произнести фразу (поиск по словарям, синтез) как это победить я не нашел, на это все жалуются, видимо особенности реализации.
2) Словарь оставляет желать лучшего в плане произношения отдельных слов, некоторые слова приходится заменять синонимами, т.к. звучат они откровенно ужасно :D

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

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

Ну вот и все что я имел вам сообщить, надеюсь зажег в ком то интерес к этому вопросу!
Спасибо за внимание.
Евгений @Helius
карма
50,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (43)

  • –1
    Ииииии.....?
    Уж не Ваш ПК ли это сказал?
    • +1
      Считается, что компьютер никогда не сможет говорить как человек.
      Но сможете ли вы так:

      cd /usr/local/src/kernel-2.6.33.1
      configure | festival
      • 0
        Считается, что компьютер никогда не сможет говорить как человек
        Кем считается? Британскими учёными? Почему не сможет?
      • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          Дорого друг, вы не хуже меня знаете: что пока жив Чак Норис, никакого Скайнета не будет.
  • –7
    Вроде в Win7 есть функции воспреизведение голосом печатного текста.
    • +1
      В WinXP она тоже была, только вроде надо было что то скачать — доустановить, кажется движок сам.
      Пуск->Панель управления->Звук, речь и аудиоустройства->Речь (Start->Control Panel-> Sound, Speech and Audio Devices->Speech).
      • –3
        Вполне может быть, просто я никогда этим особо не занимался а в 7-ке случайно заметил, когда режим Бога наcтраивал =)
    • 0
      Ну так голосовые движки есть не только в Win7, это вообще затея давняя. И их можно использовать аналогичным образом — если вам интересно, я об этом писал на хабру в блог о PowerShell.
  • +2
    О, первое апреля как раз близко, возьму на заметку :)
  • +3
    Пошутить здорово можно! )) Как то я был на работе, а девушка дома, я логинюсь с работы по ssh на сервак домой (белый IP), и начинаю беседывать с ней запуская синтезатор и передавая ему нужные фразы :D, она звонит мне в панике, говорит «твой компьютер со мной разговаривает!!!» )))
    • +2
      а как же классический прикол с выдвиганием сидюка по среди ночи/просмотра ужастика?
      теперь можно дополнить фразой «дайте покушать/заплати за интернет не вставая со стула!» :)
  • –2
    tts можно заменить подготовленными записями, типа play 20-hours.mp3 15-minutes.mp3
  • +1
    у меня так сервер оповещает о землятресениях =)
  • 0
    Респект =)

    Для того чтобы не было задержек, можно сначала сохранять вывод festival в файл (wav или mp3), и только когда он будет готов, ставить плеер на паузу и проигрывать временный файл. После этого файл можно даже удалить =)
    • 0
      Вроде как-то в режиме сервера можно запустить festival.
  • 0
    У кого-нибудь получилось? И как качество звука?
    У меня проблема возникла при установке festival на ubuntu

    [root@ubuntu:/home/vitaliy]
    # echo «Привет» | festival --tts --language russian 20:11:45
    «Unsupported language, using English»
    SIOD ERROR: unbound variable: voice_rab_diphone
    festival: fatal error exiting.
    • +1
      вот тут решали такую же проблему, успешно
      www.linux.org.ru/forum/desktop/3622248
    • +1
      Чтобы оно вообще заговорило (хотя бы и на английском) надо было в самой программе (в терминале запускаем festival) набрать, вместе со скобками:
      (SayText «What is thy bidding, my master?»)

      Русский словарь у меня по дефолту отсутствовал, пришлось добавить festvox-ru. Других вариантов русского не увидел.

      Дальше в самой программе было проще:

      festival> (voice.list)показывает список установленных в системе голосов
      (rab_diphone kal_diphone msu_ru_nsh_clunits)
      festival> (voice_msu_ru_nsh_clunits)выставляет нужный нам голос
      msu_ru_nsh_clunits#<Utterance 0x7f22224ec030>
      festival> (SayText «Я ЛЮБЛЮ ХАБРАХАБР»)произносит желанную фразу
      #<Utterance 0x7f2222560610>

      Почему-то не распознались маленькие буквы, пришлось использовать только заглавные.

      Все вышеописанное работало на версии 1.96 beta.
      • 0
        А, ну и кавычки, понятное дело, нужны обычные, а не фигуристые как парсер повтыкал.
      • 0
        Спасибо, таким способом работает. А способом из статьи — ошибки как у betal.
        Обошел проблему так:
        echo "(voice_msu_ru_nsh_clunits) (SayText \«Привет, Хабрахабр!\»)" | festival

        P.S. а у меня строчные буквы работают…
  • +1
    Если у вас появляется ошибка Linux: can't open /dev/dsp вместо голоса, решение описано тут: wiki.archlinux.org/index.php/Festival#can.27t_open_.2Fdev.2Fdsp
  • 0
    В Убунту есть же встроенная возможность отображать температуру за окном рядом с часами + при наведении мышки на градусы показываются дополнительные сообщения о погоде: ветер, осадки и т.п., и эти сообщения на русском языке.



    Может, кто-нибудь подскажет, как взять погоду оттуда, а не с сайта?
  • 0
    vitali@vitali-desktop:~/.bin$ /home/vitali/.bin/get_cur_tmpr.sh | /home/vitali/.bin/sayit.sh
    /home/vitali/.bin/sayit.sh: строка 3: ошибка синтаксиса около неожиданной лексемы `newline'
    /home/vitali/.bin/sayit.sh: строка 3: `read str <&'


    Делал всё как по инструкции…
    В чём может быть проблема?
    • +1
      3-я строка, может он ругается на /usr/bin/mocp -P, это пауза плееру moc, если у вас он не установлен тогда ругнется конечно, попробуйте скрипты запусать без пайпа "|", проче будет понять где ошибка.
      • 0
        Поставил пакет moc, проблема не исчезла, ошибка таже…

        vitali@vitali-desktop:~/.bin$ /home/vitali/.bin/get_cur_tmpr | /home/vitali/.bin/sayit
        /home/vitali/.bin/sayit: строка 3: ошибка синтаксиса около неожиданной лексемы `newline'
        /home/vitali/.bin/sayit: строка 3: `read str <&'
        vitali@vitali-desktop:~/.bin$ /home/vitali/.bin/get_cur_tmpr
        -9
        • +1
          #!/bin/bash
          # читаем фразу из стандартного ввода
          read str
          #запускаем синтезатор
          echo "(voice_msu_ru_nsh_clunits) (SayText \"$str\")" | festival
          • 0
            Теперь всё работает… однако по какой то причине программа говорит просто «Девять» вместо положенных «Минус девять»

            и скрипт gmail тоже почему то не пашет.

            vitali@vitali-desktop:~/.bin$ /home/vitali/.bin/gmail | /home/vitali/.bin/sayit
            
            FATAL_ERROR: The server is not running
            
            Invalid card number.
            Usage: amixer <options> [command]
            
            Available options:
              -h,--help       this help
              -c,--card N     select the card
              -D,--device N   select the device, default 'default'
              -d,--debug      debug mode
              -n,--nocheck    do not perform range checking
              -v,--version    print version of this program
              -q,--quiet      be quiet
              -i,--inactive   show also inactive controls
              -a,--abstract L select abstraction level (none or basic)
              -s,--stdin      Read and execute commands from stdin sequentially
            
            Available commands:
              scontrols       show all mixer simple controls
              scontents	  show contents of all mixer simple controls (default command)
              sset sID P      set contents for one mixer simple control
              sget sID        get contents for one mixer simple control
              controls        show all controls for given card
              contents        show contents of all controls for given card
              cset cID P      set control contents for one control
              cget cID        get control contents for one control
            Invalid card number.
            Usage: amixer <options> [command]
            
            Available options:
              -h,--help       this help
              -c,--card N     select the card
              -D,--device N   select the device, default 'default'
              -d,--debug      debug mode
              -n,--nocheck    do not perform range checking
              -v,--version    print version of this program
              -q,--quiet      be quiet
              -i,--inactive   show also inactive controls
              -a,--abstract L select abstraction level (none or basic)
              -s,--stdin      Read and execute commands from stdin sequentially
            
            Available commands:
              scontrols       show all mixer simple controls
              scontents	  show contents of all mixer simple controls (default command)
              sset sID P      set contents for one mixer simple control
              sget sID        get contents for one mixer simple control
              controls        show all controls for given card
              contents        show contents of all controls for given card
              cset cID P      set control contents for one control
              cget cID        get control contents for one control
            
            FATAL_ERROR: The server is not running
            • 0
              И это «Девять» повторяет 2 раза…
              • 0
                vitali@vitali-desktop:~/.bin$ /home/vitali/.bin/get_cur_tmpr
                -9


                Если скрипт возвращает "-9", то читаться будет «девять»
                По-идее, скрипт должен возвращать «минус девять», но это, как видно, не так. Значит проблема со скиптом возвращения температуры.

                Кстати, в нём у автора явная ошибка:
                stringZ=`cat /home/eugene/.tmp/index.html

                вместо
                stringZ=`cat /home/eugene/.tmp/index.html`
                • 0
                  с минусом проблему решил заменив

                  tmpr="-"

                  на

                  tmpr=«минус „

                  Проблема с озвучиванием температуру дважды, исключительно мой косяк и уже исправлен.

                  Вообщем спасибо за помощь.

                  Однако проблема с gmail всё ещё осталась :(
                  • 0
                    gmail у меня работал.
                    Предполагаю, что ты где то накосячил
  • 0
    Подскажите, версию Ubuntu Server какую используете?
    • 0
      9.10
  • +1
    А кто-нибудь нашёл женский английский голос как в фильмах?
  • 0
    Такс… а я где-то видел руководство, как научить udev сообщать голосом о подключённых устройствах
    • 0
      Проверить сейчас возможности нет, но подозреваю, что правило, которое надо положить в /etc/udev/rules.d/, будет выглядеть примерно так:
      ACTION!="add", GOTO="festival_say_end"
      RUN+="echo $name | festival --tts --language russian"
      LABEL="festival_say_end"
      • 0
        Практика показала, что с потоками у udev какая-то фигня, поэтому лучше так:
        RUN+="/home/torkvemada/sayit.sh Подключен $name"

        И соответственно шелл-скрипт:
        #!/bin/bash
        echo "$@" | festival --tts --language russian

        Но в идеале надо добавить еще обработчики по типам, иначе даже на обычную флэшку произносит по пять сообщений — «Подключен sg1», «Подключен sdb1»…
    • 0
      вот так получилось (Ubuntu 9.10):
      добавляем в файл /etc/udev/rules.d/70-mount-usb-storage.rules следующие строчки

      # Добавление
      ACTION==«add», KERNEL==«sd[a-z][0-9]», ENV{ID_USB_DRIVER}==«usb-storage», RUN+=«echo 'обнаруженъъ носитель информации' | festival --tts --language russian»

      # Удаление
      ACTION==«remove», KERNEL==«sd[a-z][0-9]», ENV{ID_USB_DRIVER}==«usb-storage», RUN+=«echo 'устройство удалено' | festival --tts --language russian»
  • 0
    Заставил говорить скайп.

    Создал скрипт следующего содержания:
    #!/bin/bash
    echo "(voice_msu_ru_nsh_clunits) (SayText \"$1\")" | festival


    В настройках уведомления вбиваем ~/say.sh "%smessage"
  • +5
    Берём девушку с красивым лицом торсом голосом, записываем 73 фразы и юзаем их.
    Минусы:
    — при склейках цифр могут быть нестыковки
    — надо продумать список того что надо записать
    Плюсы:
    — красивый голос
    — общение с девушкой
  • 0
    у меня как бы нету слов
    браво :)
  • 0
    Отличная статья. Собираюсь все себе такое же реализовать да руки не доходят.
    Еще круче было бы приглушать музыку, чтобы она играла тихо, и на ее фоне зачитывать объявления. Но для этого видимо надо будет похитрому настраивать звуковую систему, чтобы могла получать сигнал из двух источников, наверно это можно сделать через pulseaudio.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.