Mcabber + Festival. Голосовые уведомления в Mcabber |
|
Дата публикации: Aug. 27, 2010, 2:19 p.m.
|
Теги: jabber, icq, mcabber, festival, |
Автор: Brainsburn |

Пару дней назад я написал статью об 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)
Комментировать:
Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.
Вот ссылка на проект
Там можно скачать исходники и поставить себе. Можно послушать синтез речи (четвертый самый классный).
И настройка его немножко описывалась на хабре
И на крайний случай вот пакет для Ubuntu.