Видео ролики бесплатно онлайн

Смотреть русское видео

Официальный сайт openclass 24/7/365

Смотреть видео бесплатно

07.02.10 21:51 digiwhite

Tips & tricksГолосовое чтение уведомлений (от notify-send) в GNOME с помощью festival.

Сегодня г-н vorovtsev в этом посте задал соответствующий вопрос. Стало мне интересно самому, что такое этот festival и как реализовать то, что ему ( vorovtsev`у) нужно. Да и пилить модель для QTreeView несколько надоело :).


И так. Что такое festival. festival это синтезатор человеческой речи, поддерживает несколько языков, в том числе и русский. Поэтому, если он у вас не установлен, то для начала нужно его установить (замечу сразу, что русский языковой пакет для festival занимает 196 Мб). Т.к. у меня Ubuntu, то для установки будет достаточно сделать:
sudo apt-get install festival festvox-ru


Вся шутка заключается в том, что несмотря на установленный русский языковой пакет, festival все равно не понимает русский. Чтобы он его начал понимать, придется ручками поправить конфигурацию festival (походу это все же косяк мйнтейнеров пакета). И так, открываем вашим любимым текстовым редактором из под суперпользователя файл /usr/share/festival/languages.scm и добавляем в него (если все же нету) туда в начале и конце соответственно следующие строчки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14

(define (language_russian)
"(language_russian)
Set up language parameters for Russian."

  (set! male1 voice_msu_ru_nsh_clunits)
  (male1)
  (Parameter.set 'Language 'russian)
)

;; ...

((equal? language 'russian)
(language_russian))
 


Строчку вида ;; ... вставлять не надо, а вторую часть вставьте в конце, там уже будут аналогичные конструкции, только для других языков (кстати, увидел там клингонский o_O). Кстати, в конфигурации в частности и в festival вообще используется Scheme.

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

Итак, скрипт первый (speech.sh):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#!/bin/bash

COMMAND_COUNTER=0
MESSAGE_HEADER=""
MESSAGE_BODY=""
PARSE_REQUIRED=0

while read -r DBUS_MESSAGE ; do
        ID=`echo $DBUS_MESSAGE | grep "string\ \"notify-send\""`

        if [[ $ID ]] ; then
                let COMMAND_COUNTER=0
                let PARSE_REQUIRED=1
        else
                if [ $PARSE_REQUIRED -eq 1 ] ; then
                        ID=`echo $DBUS_MESSAGE | egrep "string\ \""`

                        if [[ $ID ]] ; then
                                let COMMAND_COUNTER=$COMMAND_COUNTER+1
                        fi

                        if [ $COMMAND_COUNTER -eq 2 ] ; then
                                MESSAGE_HEADER=`echo $DBUS_MESSAGE | grep "string\ \"" | sed s/^string\ \"//g | sed s/\"$//g`
                        fi

                        if [ $COMMAND_COUNTER -eq 3 ] ; then
                                MESSAGE_BODY=`echo $DBUS_MESSAGE | grep "string\ \"" | sed s/^string\ \"//g | sed s/\"$//g`

                                echo "Новое уведомление на тему $MESSAGE_HEADER. $MESSAGE_BODY" | festival --tts --language russian

                                let COMMAND_COUNTER=$COMMAND_COUNTER+1
                                let PARSE_REQUIRED=0
                        fi
                fi
        fi
done

 


Суть этого скрипта на bash заключается в следующем. Он принимает со стандартного ввода данные, полученные из второго скрипта и затем парсит их. Затем формирует сообщение и отправляет его в festival для синтеза речевого сообщения. Данные для этого скрипта предоставляет второй скрипт (run_speech.sh), который очень короткий и выглядит так:
1
2
3
4
5
6

#!/bin/bash

dbus-monitor "interface='org.freedesktop.Notifications',  member='Notify'" | $1

 


Что делает этот скрипт. Он в качестве параметра принимает название первого скрипта (путь до него должен быть полный) и вызывает утилиту dbus-monitor, которая позволяет увидеть, что передается по шине dbus непосредственно для всплывающих уведомлений. Вывод от dbus-monitor мы передаем на вход нашему первому скрипту.

Далее, добавляем в запускаемые приложения GNOME новую команду (у меня выглядит так):
1
2
3

/home/digiwhite/devel/scripts/notify-speech/run_speecher.sh /home/digiwhite/devel/scripts/notify-speech/speech.sh
 

Перезапускаем GNOME и смотрим что получилось. Для проверки можно сделать следующее:
notify-send "Привет" "Я твое новое голосовое сообщение"


Скрипты, чтобы не копировать в буфер и из буфера можно скачать по этим ссылкам:
  • run_speech.sh

  • speech.sh



PS: к недостаткам, которые мне не удалось победить, скажу следующее. При совместной работе с pidgin`ом, если слать уведомления то в звуковые сообщения они попадают через минуты. Связано это с тем, что pidgin отправляет уведомления туда-же и шлет гигантские массивы данных. Они хоть и не парсятся, но разовый вызов grep все же на скорость влияет. Как победить это, пока не знаю.



Aineko 07.02.10 22:26 # +0
а как вызвать notify в кде?
exelens 07.02.10 22:34 # +0
Точно так как написано в топике.
Принцип одинаковый и в ГНОМе и в КДЕ
digiwhite 07.02.10 22:37 # +1
Ну средствами KDE4, вроде так например:
kdialog --passivepopu 'Сообщение' 5
exelens 07.02.10 22:37 # +0
точнее
Для проверки можно сделать следующее:
notify-send "Привет" "Я твое новое голосовое сообщение"

работает
Aineko 07.02.10 22:48 # +0
работать то оно работает, но не нативно.
digiwhite 07.02.10 23:03 # +0
Да выглядит оно нативно кстати. Можно ничего не переделывать даже.
digiwhite 07.02.10 22:38 # +0
Ответ выше :). Не туда ответил.
ner_uto 07.02.10 22:31 # +0
А насколько фестиваль вообще внятно читает? Пробовал как-то давно под виндой какой-то синтезатор - это кошмар. И с тех пор и не смотрел в их сторону.
digiwhite 07.02.10 22:37 # +0
Ну :). Читает в общем :). Понять можно. С ударениями не все гладко.
exelens 07.02.10 22:39 # +0
Если запятые расставлять то становится лучше
kstep 08.02.10 03:35 # +0
У меня он на стыках слов слоги проглатывал, как будто торопился куда-то...
exelens 08.02.10 13:05 # +0
а ты прямо в слово вставь запятую и он сделает паузу
kstep 08.02.10 03:34 # +0
в конфигурации в частности и в festival вообще используется lisp.

Не Lisp, а его диалект — Scheme. Это хоть и похожие, но всё же разные вещи, просьба не путать.
digiwhite 08.02.10 06:30 # +0
Корошо, не буду.
digiwhite 08.02.10 06:35 # +0
fixed
mirivlad 12.02.10 04:38 # +1
sudo apt-get install festiАval festvox-ru

поправьте на
sudo apt-get install festival festvox-ru
digiwhite 12.02.10 06:36 # +0
Спасибо, поправил :).
yuretsz 12.02.10 13:36 # +0
А если сообщение на английском?
digiwhite 12.02.10 13:56 # +0
Если вы знаете, как на лету определить язык то тогда можно.

Лучшие блоги (все 107)
Топ пользователей Топ блогов
Топ пользователей Топ блогов
Элита (все 2128 из 160 городов)
Топ пользователей Топ блогов
welinux.ru

В хорошем качестве hd видео

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн