31 мая 2009 в 20:03

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

Прочитал статью про SAPI и Powershell (Учим PowerShell разговаривать), и мне стало интересно как же с синтезом русскоязычной речи в родной для меня операционке, Linux'e. Как выяснилось все далеко не так радужно, да и качество синтеза далеко до голоса Алены, но все же.

Для синтеза речи в 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* <a #
Ну что же значит надо поубивать из текст ссылки.
Пока что результат меня не особо радует, в принципе синтез русской речи под 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. устанавливается очень просто, русский язык сразу из коробки, для сохранения образца голоса можно всего лишь добавить один параметр, но вот качество мне показалось просто ужасным. Наверно можно под строить произношение чтобы получить более менее цивильный результат, но у меня не получилось.
P.P.P.S выложил два примера синтезируемой фразы при дефолтных параметрах в espeak и в festival
espeak
festival
(если кто может предложить другое место куда будет удобней положить wav'ки с удовольствием воспользуюсь)
UPD: Ответ от хабраюзера vk2 голос Алены
tkf @tkf
карма
47,6
рейтинг 0,0
Похожие публикации

Комментарии (58)

  • НЛО прилетело и опубликовало эту надпись здесь
  • –3
    Как всегда имеем дело с хитрой системой костылей и подпорок. Linux…
    Спасибо за заметку, будем пробовать.
  • +5
    еще на 8.10 (или раньше) я как-то обнаружил команду:
    'espeak'
    она мне читала текстовый файл с нашими стихами и мы с подругой ухахатывались!!!
    русский тоже присутствовал.
    смотрите 'man espeak'…
    • 0
      сейчас проверим. Просто у espeak в поддерживаемых языках (http://espeak.sourceforge.net/languages.html) для русского написано So far it's just an initial attempt with basic pronunciation rules.
      Но надо попробовать. Как попробую отпишусь.
    • 0
      у меня при попытке
      espeak -f game.log
      espeak: wave_pulse.cpp:707: size_t wave_write(void*, char*, size_t): Assertion `stream' failed.
      Aborted
    • 0
      Ну что же, попробовал espeak. Качество просто ужас. Далекий до идеала Festival заметно лучше espeak'a.
  • 0
    Теперь будет с кем поговорить, холодными сибирскими ночами xD А как качество речи? не режет слух?
    • 0
      Качество речи чем то сильно напоминает Мерлина майкрософтсовского, то есть не блещет.
  • 0
    ну вот опять.
    зачем пост сразу после виндового аналога.
    эх, сейчас посыпятся холивары.
    • +1
      Ну я прочитал про виндовый аналог, и мне стало интересно а как с этим сейчас под линем. ^_^
    • +3
      Мне кажется, что подобные посты с не до конца полученным результатом стимулируют вытягивание знаний из ленивых, но знающих эту тему профи. Самим писать статью лень («Ну это же очевидно!») а вот в комментах кто-нибудь да и напишет что-то в стиле «Вы не правы, под линуксом легко и непринужденно текст читает прога %appName%! Почитайте вот этот мануал». Не оставаться же равнодушным, когда в соседнем посте под виндой все гладко и красиво.
      • 0
        Странно, я не ждал в комментариях ответ на главный вопрос жизни, вселенной и всего такого. Я и так знаю что 42.
        Просто во время своих экспериментов я потратил достаточно времени на гугления, и поэтому решил поделиться своими изысканиями.
        • 0
          С вами все понятно — вы уже запустили голос. А я, например, жду :)
      • 0
        простите не в тему (возможно офтопик),

        то статью я написать не могу:
        1. я был на работе и занят (когда комментировал)
        2. у меня карма минусовая (могу только комментировать)
        • 0
          т.е., у вас есть, чем поделиться с общественностью?
          • 0
            :) при первой возможности!!!
            а у Вас? :)
            • 0
              Мне в этом плане делиться нечем — сам пока набираюсь знаний. Да и возможность пропала не так давно. Сейчас опять терпеливо набираю хабрасилу :)
  • +2
    Этот пакет можно не ставить ручками, а подключить вот этот ppa.
  • +4
    Автор, напиши лучше про распознование речи, к примеру Sphinx
    Мне так и не удалось его настроить
    • 0
      присоединяюсь. тоже неудалось.
    • 0
      Так как тема самому интересно, то надо будет попробовать. Хотя я слышал что качество распознование оставляет желать много лучшего.
  • –8
    «качество синтеза далеко до голоса Алены»

    А с чего это линуксоид мечтает о голосе Алены? Только Ричард и Линус!
    • +1
      А кто такая Алена?
      • +2
        Роскошная женщина с сексуальным голосом.
      • 0
        Голосовой движок под Microsoft'ский SAPI. В этом комменте выкладывали пример habrahabr.ru/blogs/powershell/60965/#comment_1666861
  • +2
    Можно поставить под вайн SAPI и Голосовой движок, а потом использовать govorilka cp. К сожалению на данный момент лучшие русскоязычные движки под винду. Медвед чтоли бы денег подкинул на развитие отечественных голосовых технологий под линукс. Это же важно на самом деле.
    • –2
      Ну SAPI и голосовой движок под вайном это имхо извращение, как говорит всегда мой знакомый «Если ты юзаешь софт под вайном, а зачем тебе собственно прослойка в виде linux'a»
      ^_^ к тому же интеграции с программами которые поддерживают festival не будет.
    • +2
      Справедливости ради замечу, что Алену можно пригласить и на Mac OS X: www.assistiveware.com/infovox_ivox.php

      30-дневная триал-версия доступна для скачивания совершенно бесплатно (в комплекте также идет еще один женский голос, Heather для American English).

      Алена, надо признать, умница — это лучший русский голос, что я слышал. А уж учитывая, что она встраивается в MacOS Speech API, результат и вовсе прекрасный (от чтения текста в браузере до озвучивания событий в Growl и через в /usr/bin/say). Полная интеграция с операционной системой.
  • 0
    Выложил примеры синтеза речи. Пока выложил на народ, если кто может предложить другое место, то воспользуюсь с удовольствием
    • +1
      наш синтезатор отвечает Вашему :)
      www.box.net/shared/ibxoplkqbt

      вообще я удивлен, festival совсем неплохо звучит.
  • 0
    Ох, Алёнушка… *мечтательно вздыхает*
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    forum.sources.ru/index.php?showtopic=204030&view=showall
    вот тут предлагают голос чуть по лучше, судя по образцу синтеза. сам не ставил.
    • 0
      это билд с того же сайта откуда я брал голос. Версия вроде та же :(
      • 0
        я попробовал текст, который они там синтезировали, у меня звучит по другому
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Позволю себе дать ссылку archlinux.org.ru/arch_forum/viewtopic.php?f=8&t=1509&p=13915#p13915 Все достаточно грамотно расписано.
  • 0
    Даёшь хабраинтервью (подкаст) с диктором — прототипом Алёны!
  • 0
    напишите как сделать из воспроизведения текста mp3 файл, а потом разбить на файлы по 4-5м

    тогда можно будет создавать аудио книги самостоятельно :)

    уверен это будет интересно
    • 0
      Для виндошного голоса не знаю, под рукой нет винды :)
      а для festival'а делаем вот так.
      cat book.txt | text2wave -o file.wav -eval '(voice_msu_ru_nsh_clunits)'
      получившийся wav файл сжимаем lame'ом.
      lame file.wav file.mp3
      А с полученной mp3 шкой можно делать что угодно.
      • 0
        Спасибо!

        win тут и не причём :)

        осталось найти простой способ сделать split для mp3 :)
        • 0
          не уверен поможет ли вам, но посмотреть в эту сторону mp3splt.sourceforge.net/mp3splt_page/home.php, сам не пользовался поэтому ничего сказать не могу.
  • 0
    к плюсам Фестиваля стоит упомянуть поддержку в VoIP станции Asterisk:
    www.voip-info.org/wiki/view/Asterisk+festival+installation

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

    • 0
      Угу, задержка у него что то уж очень значительная, не сказать чтобы у меня уж шибко мощная система, но на мой взгляд он столько думает сколько он думать не должен.
      • 0
        а есть конкретные замеры затрат времени на синтез?
        • 0
          Даже не знаю как бы это замерить, если есть предложения как правильно это измерить то могу провести тесты.
          • 0
            думаю, хорошим оценочным параметром может служить отношение времени синтеза к времени звучания.
            на достаточно длинных фразах, по идее, оно должно стремиться к какому-то фиксированному значению.
            оно же умеет генерить звук в файл?
            • 0
              угу умеет habrahabr.ru/blogs/linux/60977/#comment_1671419
              Сейчас сделал замеры, для кусков речи длинной в секунду и в 5 секунд, перед началом синтеза он думает приблизительно 1,5 секунды.
    • +1
      Русский голос довольно объемный, можно исключить время загрузки используя сервер. Подключил так MCabber и IRSSI

      $ festival --server
      $ cat speaker.py

      CMD_MSG_SAY = 'echo "%s" | festival_client --async --ttw --aucommand \'aplay $FILE\''
      • 0
        что-то не понял, как это поможет сократить время загрузки?
        особенно в контексте использования изнутри астериска…
        • +1
          При запуске festival'a происходит чтение всех необходимых правил для русского языка, и для самого festival'a. Если же исключить загрузку, то есть запустить festival как сервер, то все правила уже будут загруженны, и по идее должно быстрее работать
          • 0
            а! ну да.
            у меня он как-то по дефолту как сервер в голове нарисовался, такчто я подумал, что те 1.5 секунды — это чисто синтез.
            буду, наверно, скоро поднимать тестовый астериск, поиграюсь на нём.
  • 0
    Перепостила Вашу статью в community.livejournal.com/ru_wearable/55002.html (со ссылками и указанием авторства), если Вы против — скажите, уберу пост.
  • 0
    Хороший материал, есть только момент — да, это работает после плясок из консоли. Но увы, не работает в KDE 3.5

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