Как стать автором
Обновить

Комментарии 15

Интересно, спасибо.
А в обратную сторону — не пробовали? Я какое то время назад пытался играться со сфинксом, и чем то ещё(уже не помню чем), но результаты, не впечатлили.

Вот если бы, кто то вдруг озвучил саццес стори на этом поприще — было бы очень круто :)
Это следующий этап. Попытки были, но не такие успешные.
Как только добъюсь приемлемых результатов, обязательно напишу.
Играться пробовал, не более. Использовать, имхо, можно.
http://habrahabr.ru/post/167479/
А можно видео-демку результата?
И все же Google Translate говорит значительно лучше и к тому же женским голосом. Скрипты есть в Инете.
Лучшее, что я слышал из доступного под Linux — это RHVoice.
После просмотра фильмов стоит сбрасывать громкость
Простите за нубский вопрос, но что это значит?
Посмотрел фильм на 100, закрыл программу. Громкость на 100, max громкость сообщений по дефолту 60, но это будет с непривычки громко, и элемент неожиданности сделает своё дело. Другое дело, если играла музыка больше 60, элемент неожиданности пропадает.
Ясно. Я просто очень редко трогаю глобальный регулятор громкости, обычно регулирую отдельно в каждом приложении.
В данном случае, gem управляет всеми потоками, уменьшает и возвращает до текущей глобальной громкости. Надо поэкспериментировать, возможно и правда стоит сделать управление каждым потоком(своя громкость, своя пониженная). Так же задумался о разбросе шага громкости(min < step < max).
Столкнулся с тем, что весь текст переданный в festival нужно предварительно очищать и оставлять только текст. Я так понимаю, чо это повсеместная проблема. Написал скрипт который это делает (с использованием примеров, конечно же), хотя и не идеально. Но до сих пор удивлён отсутствием стандартного решения. Что бы, к примеру, можно было читать любой текст из буфера обмена. Может он есть и я просто его упустил?
Стандартные решения есть, но не для русского. clas.mq.edu.au/speech/synthesis/festival/festival_1_4_3.pdf пункт 9.1 про пунктуацию.

(defvar eou_tree
  '((n.whitespace matches ".*\n.*\n\\(.\\|\n\\)*") ;; 2 or more newlines
    ((1))
    ((punc in ("?" ":" "!"))
     ((1))
     ((punc is ".")
      ;; This is to distinguish abbreviations vs periods
      ;; These are heuristics
      ((name matches "\\(.*\\..*\\|[A-Z][A-Za-z]?[A-Za-z]?\\|etc\\)")
       ((n.whitespace is " ")
        ((0))
        ;; if abbrev single space isn't enough for break
        ((n.name matches "[A-Z].*")
         ((1))
         ((0))))
       ((n.whitespace is " ") ;; if it doesn't look like an abbreviation
        ((n.name matches "[A-Z].*") ;; single space and non-cap is no break
         ((1))
         ((0)))
        ((1))))
      ((0)))))


В целом нужно читать больше доков, даже старых. Также стоит обратить внимание на 13 лексику и написания правил для неё.
Для чтения буфера потребуется:

— написать правила игнорирования всех символов (ниже дефолтные)

;;; Symbols ...
(lex.add.entry 
 '("*" nil ( ((u) 0) ((m n o) 1) ((zh i tt) 0) )))
(lex.add.entry 
 '("%" nil ( ((p r o) 1) ((c e n t) 0) )))

;; Basic punctuation must be in with nil pronunciation
(lex.add.entry '("." punc nil))
(lex.add.entry '("'" punc nil))
(lex.add.entry '(":" punc nil))
(lex.add.entry '(";" punc nil))
(lex.add.entry '("," punc nil))
(lex.add.entry '("-" punc (((pau) 0))))
;(lex.add.entry '("-" punc nil))
(lex.add.entry '("\"" punc nil))
(lex.add.entry '("`" punc nil))
(lex.add.entry '("?" punc nil))
(lex.add.entry '("!" punc nil))
(lex.add.entry '("--" punc (((pau) 0))))


— написать функцию игнорирования независимо от местоположения в тексте

— Написать механизм чтения для нескольких языков (ru, en)

После этого и логи не страшно будет читать…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории