/ Статьи / Мультимедиа / Mcabber + Festival. Голосовые уведомления в Mcabber /

Mcabber + Festival. Голосовые уведомления в Mcabber

Дата публикации: Aug. 27, 2010, 2:19 p.m.
Теги: jabber, icq, mcabber, festival,
Автор: Brainsburn

голосовые уведомления в icq jabber

Пару дней назад я написал статью об mcabber (консольный jabber клиент), так что не буду рассказывать, что это и с чем его едят. В этой статье я выложил модифицированный скрипт eventcmd, который добавляет голосовые уведомления в mcabber. Вроде этого "%Username% has come online" приятным женским голосом :)

Все началось с того, что я ждал, пока войдет в ICQ ( а я использую icq в mcabber через транспорт ) один человек. Приходилось постоянно переключаться в окно mcabber и смотреть, не пришел ли он. Конечно, можно было бы сделать всплывающие уведомления, но я решил пойти дальше - сделать голосовые уведомления, когда кто-то возвращается из оффлайна. Для этого я взял стандартный скрипт eventcmd ( который можно найти в папке /usr/share/mcabber/scripts/events/ ) и слегка модифицировал его.

В этом скрипте реализовано голосовое уведомление только для событий, когда контакт возвращается из оффлайна. Звуковое уведомление при получении нового сообщения я сделал в виде короткого звука. Уведомления для остальных событий я не считаю полезными, но вы можете их добавить сами, если хотите, по аналогии с существующими.

Расскажу о голосовом синтезаторе. Я использовал для этих целей festival. В начале я сказал о "приятном женском голосе". Не обижайтесь - я пошутил. У festival довольно корявый дефолтный голос, поэтому мне пришлось поискать другой. Голос, который я добавил в festival, лучше дефолтного, но все еще далек от идеала. К тому-же, он может говорить только на английском. С русскими голосами в Linux вообще беда... Но не будем о плохом, английские фразы прочитываются вполне разборчиво.

Как вы уже догадались, вам нужно просто установить сам festival. Я расскажу, как я добавил новый голос к нему.

$ cd /usr/share/festival/voices/english/
# wget -c http://www.speech.cs.cmu.edu/cmu_arctic/packed/cmu_us_clb_arctic-0.95-release.tar.bz2
# tar xavf cmu_us_clb_arctic-0.95-release.tar.bz2 
# ln -s cmu_us_clb_arctic cmu_us_clb_arctic_clunits
# echo "(set! voice_default 'voice_cmu_us_clb_arctic_clunits)" >> /etc/festival/siteinit.scm
Проверить, что новый голос добавился, можно командой:
$ echo "Yes i can speak. Its not so hard as i see" | festival --tts
Фраза должна проговориться женским голосом.

Теперь научим mcabber говорить с помощью скрипта eventcmd. Как настроить выполнение стандартного скрипта и откуда его взять я уже рассказал тут . Вот сам скрипт:



#! /bin/sh
#
# Sample events script for mcabber
# Plays a sound when receiving a message
#
# To use this script, set the "events_command" option to the path of
# the script (see the mcabberrc.example file for an example)
#
# MiKael, 2005-07-15

# The following sound comes with the gtkboard package,
# you can modify this line to play another one...
CMD_MSG_IN="/usr/bin/play /home/brainsburn/.mcabber/sounds/codecover.wav"

event=$1
arg1=$2
arg2=$3
filename=$4


# Note that the 4th argument is only provided for incoming messages
# and when 'event_log_files' is set.

if [ $event = "MSG" ]; then
  case "$arg1" in 
    IN)
      # Incoming message from buddy $arg2
      $CMD_MSG_IN > /dev/null 2>&1
      if [ -n "$filename" -a -f "$filename" ]; then
        # We could process filename here...
        /bin/rm $filename
      fi
      ;; 
    MUC)
      # Groupchat message in room $arg2
      if [ -n "$filename" -a -f "$filename" ]; then
        # We could process filename here...
        /bin/rm $filename
      fi
      ;; 
    OUT)
      # Outgoing message for buddy $arg2
      ;; 
  esac

elif [ $event = "STATUS" ]; then
  # Buddy $arg2 status is $arg1 (_, O, I, F, D, N, A)
 # echo > /dev/null
        prev_st=$(/bin/cat ~/.mcabber/prev_st_$arg2)
        if [ $arg1 = "O" ] || [ $arg1 = "F" ] || [ $arg1 = "D" ] || [ $arg1 = "N" ] || [ $arg1 = "A" ]; then
                if [ $prev_st = "_" ]; then
                        if [ $arg2 = "jabrss@cmeerw.new" ]; then
                                name="rss reader"
                        else
                                name=$arg2
                        fi
                        echo $name | gawk -F "@" '{ print $1 " has come online"}' | festival --tts
                fi
        fi
        echo $arg1 > ~/.mcabber/prev_st_$arg2
elif [ $event = "UNREAD" ]; then
  # $arg1 contains 4 numbers separated with space chars:
  # Nr of unread buffers, nr of unread buffers with attention sign,
  # nr of MUC unread buffers, nr of MUC unread buffers with attention sign.
  echo > /dev/null
fi


Помимо голосовых уведомлений, скрипт по прежнему выполняет свою изначальную обязанность - проигрывает короткий wav файл (имя файла записано в переменной CMD_MSG_IN) при получении нового личного сообщения. Скрипт модифицирован начиная от "elif [ $event = "STATUS" ]; then" до "elif [ $event = "UNREAD" ]; then".

Разберем по порядку.

        prev_st=$(/bin/cat ~/.mcabber/prev_st_$arg2)
Голосовые уведомления будут проигрываться только если контакт действительно возвращается из оффлайна. Для этого, скрипт записывает предыдущий статус контактов в файлы ~/.mcabber/prev_st_%username%. Да-да, для каждого контакта отдельный маленький текстовый файл. Можно было бы записывать все в один файл, но мне было бы лень это все парсить :)

        if [ $arg1 = "O" ] || [ $arg1 = "F" ] || [ $arg1 = "D" ] || [ $arg1 = "N" ] || [ $arg1 = "A" ]; then
При каких статусах будет срабатывать голосовое уведомление. O - online, F - free, D - dnd, N - not availavle, A - away. Т.е. все кроме статуса offline.

                if [ $prev_st = "_" ]; then
Уведомление будет срабатывать только если предыдущий статус был "_", то бишь "offline". Иначе, скрипт спамил бы при каждой смене статуса контактами.

                        if [ $arg2 = "jabrss@cmeerw.new" ]; then
                                name="rss reader"
                        else
                                name=$arg2
                        fi
Тут можно задать алиасы для контактов. Дело в том, что mcabber передает скрипту не имя контакта, а полный его JID. Если вы используете транспорт для icq, то JID будет такой: 123456789@site.ru . Скрипт будет прочитывать только ту часть. что до "@", но в случае с ICQ пользователями придется сделать для каждого алиас, как я сделал для jabrss@cmeerw.new. Напомню, что инфо о пользователе в mcabber можно узнать, выделив его ник и написав /info.

echo $name | gawk -F "@" '{ print $1 " has come online"}' | festival --tts
Это - сама команда, которая передает festival фразу.

        echo $arg1 > ~/.mcabber/prev_st_$arg2
В конце сохраняем статус контакта в файл.

Вот, собственно, и все. Если что-то не понятно, почитайте статью по настройке mcabber, в частности, про настройку звуковых уведомлений. Ну и спрашивайте - отвечу.

PS:
Будем надеяться, что ситуация с синтезаторами речи под Linux улучшится в скором времени.






Возможно, эти материалы Вас заинтересуют:


Рекомендовать эту страницу:

Комментарии:(2)

# qlonik March 23, 2011, 9:53 p.m.
Добрый вечер, я быстро проглядел Вашу статью, но тем не менее хочу Вам предложить синтезаторы русского языка для festival.
Вот ссылка на проект http://festlang.berlios.de/docu/doku.php?id=russianru
Там можно скачать исходники и поставить себе. Можно послушать синтез речи (четвертый самый классный).
И настройка его немножко описывалась на хабре http://habrahabr.ru/blogs/linux/60977/
И на крайний случай вот пакет для Ubuntu. http://packages.ubuntu.com/maverick/festvox-ru Там так же есть исходники

# Brainsburn March 24, 2011, 4:51 p.m.
Спасибо. Посмотрим.

Комментировать:

Гость, Вы можете оставить свой комментарий.

Стиль кода:
Имя
Сайт * не обязательное поле
Поставьте галку, если вы - бот
Поставьте галку, если вы - человек

Друзья! Убедительная просьба воздержаться от нецензурной лексики!



Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.




Последние комментарии:

Brainsburn_: “Написание в 1-й” подразумевает “в первой”, а не в... >>>
ZZZ: “Написание в 1-й” подразумевает &ldquo... >>>
SBOdin: Спасибо за полезное руководство... >>>
fanyit: Спасибо за обзор. очень полезно и доступно.... >>>
cheech: Спасибо, статья полезная )... >>>