ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Синтез русской речи в Linux

03/12/2008 22:41:07

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

Лежать... Сидеть... Голос!

В фантастических фильмах или книгах немыслимо представить себе компьютерную систему управления без голосового сопровождения. Мягкий, с эротическими нотками, ласкающий слух, женский голос компьютерной системы обычно уверенным тоном заявляет, что до уничтожения всего мира осталось где-то около 2,128 секунды. И я подумал, что не плохо было бы иметь что-то подобное и у себя дома. "Умный Дом" безусловно должен разговаривать. Пусть без эротики, но желательно по-русски.

Выяснилось, что в природе существует некий проект Festival, которым занимается сразу несколько институтов и множество специалистов, профессоров и студентов. Вокруг этой системы существует также много всевозможных программ, утилит, языков, моделей и прочего... Но меня, прежде всего, интересовал русский. Слава Богу нашелся добрый человек, который создал русский голос для системы синтеза речи Festival. Вот ссылка на его страничку, касательно этой области

http://festlang.berlios.de/docu/doku.php?id=russianru

Благодаря автору, наработкам МГУ, а также словарям ударений и голосу Карлова, у меня появилась возможность подарить системе управления домом возможность говорить. Наверное, девушка с ласково-зазывающим голосом была бы лучше, но, поверьте, имеющийся мужской голос тоже неплох.

Вскоре, правда, выяснилось, что на материнской плате сервера, который был собран из практически антикварного компьютера, не оказалось интегрированной звуковой платы. Но к счастью оказался свободный PCI-слот, куда была установлена самая дешевая PCI-плата на базе C-Media 8738. Linux без проблем распознал эту звуковую карту без каких-либо дополнительных манипуляций.

Согласно инструкции необходимо скачать, собственно, сам голос, speechtools и festival версии 1.96. Скачиваем, компилируем. Стоит отметить, что для Debian и некоторых других дистрибутивов есть уже готовые пакеты (в стабильных или нестабильных ветках). Но если есть желание скомпилировать festival под Debian lenny самостоятельно, то, во-первых, следует скачать самую свежую версию. (Требуется установленный пакет subversion)

svn checkout http://svn.berlios.de/svnroot/repos/festlang/trunk/speech_tools
svn checkout http://svn.berlios.de/svnroot/repos/festlang/trunk/festival

А, во-вторых, при компиляции следует ждать следующих ошибок:
EST_TNamedEnum.cc:215: error: no matching function for call to "split"
Это связано с тем, что в Debian lenny используется компилятор gcc 4.3.2, который имеет ошибку, мешающую успешной компиляции программы festival.
Решение простое. В файл config/compilers/gcc_defaults.mak в строку CXXFLAGS нужно добавить опцию -ffriend-injection

Распаковываем архив с русским голосом в папку festival/lib/voices/russian/msu_ru_nsh_clunits. Теперь переходим в папку festival/bin и запускаем программу синтеза

./festival (voice_msu_ru_nsh_clunits) (SayText "Привет, дружище!") (quit)

Важно! Русский текст должен быть в кодировке UTF8!

Если Вы компилировали festival самостоятельно из SVN, то распаковывать голос нужно в папку festival/share/voices/russian/
При этом важно отредактировать файл festival/share/voices/russian/msu_ru_nsh_clunits/festvox/msu_ru_nsh_clunits.scm
В этом файле перед строчкой

(provide 'msu_ru_nsh_clunits)

нужно добавить

(proclaim_voice 
 'msu_ru_nsh_clunits 
 '((language russian) 
   (gender male) 
   (dialect moscow) 
   (coding utf-8) 
   (description 
    "Russian festival voice."))) 

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

В случае появления ошибки:
Linux: can't open /dev/dsp
нужно установить пакеты: alsa-oss и oss-compat

Теперь у меня появилась необходимость привязать festival с русским голосом к системе автоматизации дома. Программа festival может работать в пакетном режиме или в качестве TCP-сервера. В пакетном режиме можно запускать ее из командной строки или по cron'у

festival -b my_text.txt

Где в файле my_text.txt прописывать какой-либо текст, но оптимальнее, правильнее запустить программу в качестве сервера

festival --server &

Тогда появляется возможность обратиться к серверу синтеза речи на 1314 порт. Как это работает можно проверить telnet'ом

telnet localhost 1314

Можно задать вышеуказанные команды и festival выполнит их. Удобно, не правда ли? Неудобно каждый раз задавать голос. Чтобы прописать голос по умолчанию, нужно отредактировать файл lib/init.scm
Голос должен быть прописан так

;;; Default voice (have to do something cute so autoloads still work)
(eval (list voice_msu_ru_nsh_clunits))

Теперь мы можем сразу давать команду (SayText ""). А имея запущенный TCP-сервер, у нас также появляется возможность посылать команды нашей "птице-говоруну" не только непосредственно из командного режима, но и с помощью, например, PHP-скриптов. Если с командной строкой все более-менее понятно, то PHP-скрипт может выглядеть примерно так:

<?    
    $host="localhost";
    $my_text="Температура воздуха на улице 5 градусов";
    $h=fsockopen($host,1314);
    fwrite($h,"(SayText "$my_text")
");
    sleep(3);
    fwrite($h,"(quit)");
    fclose($h);
?>

В случае, когда мы посылаем команды серверу с другого комьютера, можно наблюдать следующую надпись:

rejected from srv2.home not in access list

Для решения этой проблемы нужно отредактировать файл lib/festivsal.scm - найти в нем опцию defvar server_access_list и добавить необходимый нам узел или IP-адрес.

 Моя компьютерная система каждый час сообщает об основных параметрах работы, температуре воздуха. Обязательно система сообщает о различных аварийных ситуациях. Например, говорит, что неплохо было бы вымыть посуду или делает замечание, если люди слишком сильно шумят после 11 часов вечера. ;)

Несколько слов о непосредственном подключении сервера и колонок. Тянуть отдельный кабель мне показалось нерациональным, поэтому я пустил звук по витой паре. В 100Мб/с сети для передачи данных используется только 4 провода из 8. Кабель у меня идет один, на нем сеть, звук и 1-wire шина. Качество звука значения особого не имеет. В качестве колонок использовались старые ненужные активные компьютерные колонки. Для голоса более чем достаточно. Кстати, мой сервер генерирует не только речь. Настроены также некоторые звуковые события. Например, утром играет гимн Советского... ну то есть Российской Федерации.

Сейчас глас системы установлен только в одном помещении, однако в будущем ничего не мешает вывести звук на 6 разных направлений (колонок). Ведь каналов у звуковой карты 6, значит программно переключая конкретный канал, можно адресовать сообщения в определенное место. Это в планах.

Интеграция системы с GSM-сигнализацией позволило мне использовать синтез речи в случае проникновения в дом. На этот случай у меня подготовлен соответствующий файлик с литературно-художественными фразами повышенной смысловой емкости, почти поэзией. Но, надеюсь, синтезировать текст этого файлика программе festival не потребуется.

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2014-09-25 23:00:14 | mab
а ссылочка то не рабочая!

в debian7 ставил festvox-ru с русским голосом так..
в /etc/apt/sources.list добавляем:
deb /ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main
deb-src /ppa.launchpad.net/sergey-udaltsov/ppa/ubuntu jaunty main
затем:
sudo apt-get install festvox-ru


2014-07-12 11:09:53 | Andrey_B
krikim, это неправда. Самый распространенный стандарт 100Baste-T (он же Fast Ethernet) использует для передачи только 2 пары проводов. Поищите в Википедии по запросу "Fast Ethernet".


2014-07-12 04:49:41 | krikim
Хотелось бы отметить, что по 4 проводам витой пары пропускная способность 10 мб/сек, а 8 100/1000 в зависимости от работы сет карты. Но даже при десяти полных это примерно 1,2 мегабайта в сек, что за глаза для передачи в хорошом качестве 1мин записи8)


2013-12-25 21:58:39 | Леонид
Проблема разрешилась - скачал с другого ресурса.


2013-12-16 19:50:45 | Леонид
Андрей, не могу по ссылке скачать русский голос (печально, если проект умер). Не могли бы сбросить файл msu_ru_nsh_clunits-0.5.tar.bz2 на адрес l.grz@mail.ru?


2012-03-16 00:14:17 | Максим
Если хочется обязательно женский голос, то можо глянуть в сторону RHVoice.
https:/github.com/Olga-Yakovleva/RHVoice


2012-02-17 16:20:38 | Andrey_B
artem, эта задача обсуждалась на нашем форуме
Вкратце, резюме такое - лучше использовать цифровые каналы передачи звука. То есть в комнатах устанавливать дешевые клиенты (LAN, Wi-Fi) для проигрывания звука, например, младшие модели планшетов на Android. И приложение свое можно написать и функциональность больше. Ведь это не просто передача звука, но и тач-скрин монитор, управление, доступ в Интернет и т..д. По стоимости выйдет даже дешевле, чем тянуть аналоговые провода, делать усилители и прочее.


2012-02-17 13:59:49 | artem
Потрясающая футуристичная идея! Хотел бы спросить Ваше мнение. Я тоже собираю дома похожую систему. Пока мой сервер умеет только контролировать электрическое напряжение на каждой лампочке и розетке.

Следующим, планирую научить свой дом говорить. Пока не вижу, как реализовать маршрутизацию звуков по моим 5 помещениям. На моем сервер есть всего 2 разъема jack3.5: для наушников и микрофона.

Как по вашему мнению, в моем случае, будет разумнее всего реализовать маршутизацию звуков по 5 каналам? Нужен ли мне отдельный контроллер? Какие провода лучше протягивать?


2011-10-18 18:40:56 | Вадим
Андрей, спасибо. Проверил подаю в UTF-8.
Значит не подключён русский голос.
когда пытаюсь запустить вручную - ./festival (voice_msu_ru_nsh_clunits) (SayText "Привет, дружище!") (quit) , то выдает ошибку bash: ошибка синтаксиса около неожиданной лексемы `voice_msu_ru_nsh_clunits'

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


2011-10-18 17:52:47 | Andrey_B
Если вы вводите текст непосредственно с клавиатуры, подключенной к компьютеру с Linux, то проверьте настройки языка через GUI или такую команду
set|grep LANG
Если вы работаете с Linux через SSH/telnet клиента (например, putty), то проверьте настройки клиента Translation / Charachet set.


2011-10-18 13:52:17 | Вадим
А как проверить вывод сообщений, что они в UTF-8 ?


2011-10-18 11:28:10 | Andrey_B
Вадим, более подробно, чем это написано в статье, я рассказать не смогу. Либо у вас не подключен русский голос, либо кодировка текста не UTF-8. В обоих случаях русский текст произносится не будет.


2011-10-18 00:54:21 | Вадим
Адрей, спасибо Вам за Ваш сайт. Я нашел очень много полезной и главное нужной информации.

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

Ubuntu 11.10

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

Заранее спасибо.


2011-10-09 15:04:25 | _Sergey_
Андрей, спасибо большое, помогло.


2011-10-09 10:45:52 | Andrey_B
Сергей, у меня используется такая конструкция
fwrite($h,"(SayText \"$my_text\")\n");
Видимо, при публикации на сайте маскирование вставилось некорректно.


2011-10-08 17:15:54 | _Sergey_
Пардон, правильная вресия: 5.3.5-1ubuntu7.2 (php5)


2011-10-08 17:09:32 | _Sergey_
Андрей, огромное спасибо за информацию, предоставленную на сайте. Все интересно и познавательно.

При попытке использовать Ваш пример PHP+telnet возникает ошибка:
PHP Parse error: syntax error, unexpected T_VARIABLE in /home/serg/Documents/test2.php on line 6
Строка 6 это:
fwrite($h,"(SayText "$my_text")");

Если же ее заменить на
fwrite($h,'(SayText "Температура воздуха на улице 15 градусов")');
то тогда все работает замечательно.

Есть предположение, что в первом варианте компилятор путается в принадлежности кавычек.
Если попробовать промежуточный вариант:
fwrite($h,'(SayText "$my_text")');
Ошибки в PHP не происходит, данные передаются, однако в этом случае "плохеет" серверу фестиваля:
LTS_Ruleset russian_downcase: no rule matches:
LTS_Ruleset: here $ m y _ t e x t

Какая есть возможность корректно передать данные из PHP в festival?

Система: Ubuntu 11.04, php v. 5.1


2010-10-25 21:20:10 | Andrey_B
Максим, конечно, управление голосом - перспективное и интересное направление. Есть кое-какие мысли по этому направлению. Обязательно буду пробовать в своей системе решить задачу распознавания русской речи. О результатах непременно расскажу.
Сегодня попробовал использовать CMU sphinx 0.6.1 для распознавания речи. Качество распознавания английских слов сильно зависит от качества микрофона, наличия посторонних шумов и четкого произношения. Простые слова угадывает хорошо. Фразы посложнее - 50 на 50. Русская акустическая модель присутствует, но, видимо, несовместима с последней версией Sphinx. Нужно подождать.


2010-10-25 20:03:24 | Максим
А функцию управления умным домом посредством голоса добавить не планируете? Не думали об этом?


2010-08-04 16:02:11 | spoofy
Ещё в случае получения ошибки "Linux: can't open /dev/dsp" можно сказать festival'у, чтобы играл звук через aplay, добавив три строки в ~/.festivalrc:
(Parameter.set 'Audio_Command "aplay -D plug:dmix -q -c 1 -t raw -f s16 -r $SR $FILE")
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Required_Format 'snd)


2010-05-05 23:47:31 | Ste
Great work! Greetings Germany! I just came along by chance and I am fascinated of your work! Awesome!
I hope you can read that!

I am trying to control a Vaillant auromatic 620 by Pc (a linux vdr! )
Cheers
Stephan


2009-10-25 21:52:09 | Дмитрий
Благодарю, очень интересно и полезно! Кстати, вместо telnet настоятельно рекомендую использовать ssh. Он гораздо более серьезно защищен от посторонних если использовать интернет.