Для синтеза речи в linux`e по традиции используется Festival последняя стабильная версия 1.95, но в поставке нет русского голоса, немного порыскав я набрел на проект по синтезу русской речи посредством Festival, где написано что для работы с русским языком понадобится как минимум версия 1.96 бета. Ну ничего в Ubuntu 9.04 как раз такая и стоит. Дальше есть два варианта, либо собрать пакет самостоятельно, либо для пользователей Debian`a или Ubuntu поставить отдельный пакет, весит данное чудо ~190 метров, не хило так я бы сказал. Так как у меня Ubuntu решил поставить пакет.
Пакет называется Festvox-ru, и будет доступен в ubuntu начиная с версии 9.10, так как на руках 9.04, то скачиваем пакет и устанавливаем его в ручную. И тут вскрылась маленькая проблема.
При попытке попросить festival произнести что то по русски он просто молчал, если же указывался язык
echo "Проверка" | festival --tts --language russian
, то вываливался c ошибкой:«Unsupported language, using English»
SIOD ERROR: unbound variable: voice_rab_diphone
festival: fatal error exiting.
Дамс, попробуем сделать так как в мануале, запускаем festival в интерактивном режиме, указываем голос принудительно (voice_msu_ru_nsh_clunits) и просим сказать что нибудь (SayText “Проверка”), вуаля все нормально работает, оформляем это в виде bash script`a и получаем
#!/bin/sh
festival -b "(begin (voice_msu_ru_nsh_clunits) (SayText \"$1\" nil))"
Теперь сохраняем это в файл sayit.sh, назначаем права на запуск chmod a+x sayit.sh и проверяем
./sayit.sh «Проверка»
Ура! все работает.
Если хотим прочить файл используем:
#!/bin/sh
festival -b "(begin (voice_msu_ru_nsh_clunits) (tts_file \"$1\" nil))"
Но все же почему же у нас не заработал русский язык по умолчанию, копаем дальше.
Немного гугления и мы находим багрепорт к debian`овцам от Сергея Кирпичева, вот этот багрепорт. Похоже нам нужно подправить файл languages.scm/
Так что идем в каталог /usr/share/festival где находим этот файл и вносим изменения.
Дописываем вначале:
(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))
Все теперь русский язык поддерживается.
Пробуем прочитать файл.
festival --language russian -tts festival.txt
Ну что же все даже не так уж и плохо, единтвенное «но» это то что Festival достаточно заметно думает перед тем как начать произносить, и иногда ему не нравиться текст, например вместо того чтобы пропускать то что он не может произнести он вываливается с сообщением о
LTS_Ruleset russian_downcase: no rule matches:
LTS_Ruleset: # *here* Ну что же значит надо поубивать из текст ссылки.
Пока что результат меня не особо радует, в принципе синтез русской речи под Linux с одной стороны возможен, с другой качество этого синтеза оставляет желать лучшего. А у меня появилось два новых шелл скрипта. sayit.sh и readit.sh ^_^
Примеры озвучивания можно посмотреть в статье Учим iPod Shuffle G3 говорить по-русски
Используемые источники:
Искусство программирования на языке сценариев командной оболочкиРусский в Festival
Новая база для синтеза речи, и голос для festival
Debian Bug report logs — #516262 festival: Please add support for --language russian
P.S. по совету rengel_system лучше вместо установки пакета ручками подключить этот репозиторий
P.P.S по совету eugenex15 решил попробовать espeak. устанавливается очень просто, русский язык сразу из коробки, для сохранения образца голоса можно всего лишь добавить один параметр, но вот качество мне показалось просто ужасным. Наверно можно под строить произношение чтобы получить более менее цивильный результат, но у меня не получилось.
_________
Текст подготовлен в ХабраРедакторе