Как научить Xubuntu говорить (не)человеческим голосом
Здесь речь пойдёт о примере использования в Linux синтезаторов речи
(и офлайновых, и онлайновых).
Как я настроил систему на чтение голосом – по-английски или по-русски – текстовых файлов, выделенного текста, буфера.
А ещё, при загрузке системы, она мне говорит "Welcome to Xubuntu"
Я недавно заинтересовался синтезаторами речи — например для прослушивания фраз в программе для изучения иностранных слов Anki
(Она сейчас обновилась с 1-й на 2-ю версию,
надо с сайта авторов ставить http://www.ankisrs.net )
Там некоторые обучающие словари озвучены, но многие – нет.
Для озвучки Anki можно использовать мощное дополнение, которое называется AwesomeTTS
Про него здесь:
https://ankiatts.appspot.com/
(Как сделать примерно то же, и для Anki, и для любой линуксовской программы, где можно выделить текст, я напишу далее.)
Ещё использую обучающую программу BX_memo ( http://bxmemo.narod.ru/ ), она в линуксе прекрасно работает через wine. Для озвучки слов, которых нет в звуковой библиотеке, там можно использовать синтезаторы речи. У меня Digalo установлены. Неплохие голоса. Есть и более новые, и более качественные, но для системы SAPI5, а мне в wine удалось только голоса для SAPI4 завести.
Однако стало обидно — виндозная программа работает с синтезаторами речи, а в линуксе синтезаторы не установлены.
Оказалось, что и в линуксе дела с синтезом речи обстоят неплохо. Особенно с английскими голосами.
Русский тоже есть хороший, не хуже гугловского. Причём уже в репозитории убунты. Но он немножко глючный — не любит в тексте всякие типографские символы (длинные тире, кавычки ёлочкой, и прочие...).
//прим.
Решил эту проблему:
см. Дополнение от 15.01.2014
и Дополнение от 09.08.2015 (там же команда для озвучки выделенного русского текста).
Ещё можете поставить голоса от RHVoice
https://github.com/Olga-Yakovleva/RHVoice
или, для убунт,
https://launchpad.net/~linvinus/+archive/ubuntu/rhvoice
//
Кратко, как настраивал:
Поставил из стандартных репозиториев программу голосового синтеза festival,
поставил голоса для него: festvox-ru, и прочие festvox-..., из тех, что есть в репозиториях.
festvox-ru — большой (256Мб), остальные маленькие (несколько Кб — несколько Мб).
!!¡¡ Ещё установите, если уже не установлен, пакет xsel (чтение выделения и буфера).
Проверяем:
echo 'Hello!' | festival --tts
echo 'Здравствуйте!' | festival --tts --language russian
Теперь будем добавлять более качественные английские голоса.
Сначала расскажу, как это сделать для свежих Xubuntu (14.04 и 15.04), в них Festival поновее.
А потом для Xubuntu 12.04, там Festival более старый, и настройка чуть посложнее.
(Да и я там лишнего понастраивал, а реально пользовался почти исключительно озвучкой выделенного фрагмента текста по горячим клавишам, в Xubuntu: Настройки - Клавиатура - Комбинации клавиш)
Xubuntu 14.04 (15.04)
Скачайте
usr-share-festival-voices-us.tar.gz
В архиве, в каталоге ./us/ находятся подкаталоги
nitech_us_slt_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_awb_arctic_hts
Распакуйте их в каталог
/usr/share/festival/voices/english
Голоса slt и clb женские, rms, bdl, jmk, awb – мужские.
Проверка:
echo '(voice_nitech_us_awb_arctic_hts) (SayText "To be or not to be.")' | festival
Вот пример команды, которую можно на горячую клавишу повесить. Команда озвучивает выделенный текст, и ещё помещает результаты в форматах wav и mp3 с именем вида Дата-Время... в каталог /tmp (он у меня на RAM-диске). В команде используются программы xsel, sox и mpg123.
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt ; echo "$sel_txt"|text2wave -eval "(voice_nitech_us_slt_arctic_hts)" -o "$fil_nam".wav; sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
________________________
В общем-то это необходимый минимум.
Теперь можете ещё почитать Дополнения....
Там всякие ценные сведения про подключение онлайновых голосов, других офлайновых линуксовских TTS, а также про исправление вылетов русского голоса фестиваля.
Xubuntu 12.04
У кого до сих пор Xubuntu 12.04, те могут пойти двумя путями.
Настраивать тот фестиваль, который в репозитории Xubuntu 12.04 лежит. Эти настройки, как теряющие актуальность, я теперь перенёс в самый конец статьи, в Приложение. Старые настройки для Xubuntu 12.04
(Там же настройки всяких меню и кнопок, которыми я фактически не пользовался – вполне хватило чтения выделенного текста по горячим клавишам.)
Второй путь – обновить Festival. Тогда можно настраивать всё так же, как и в Xubuntu 14.04 (15.04).
Для этого надо поставить Festival из такого PPA:
sudo add-apt-repository ppa:zeehio/festcat
sudo apt-get update
sudo apt-get install festival
Но тогда не будет работать русский голос из репозитория Ubuntu 12.04. Можно скачать и поставить deb-пакет более новой версии из Debian 8:
Например
http://ftp.br.debian.org/debian/pool/main/f/festvox-ru/festvox-ru_0.5+dfsg-3_all.deb
При втором варианте вы сможете более современные голоса подключать. И, в частности, сэкономите мегабайт 350 за счёт английских голосов: маленькие голоса nitech_us_XXX_arctic_hts дают качество даже получше, чем cmu_us_XXX_arctic-0.95-release, которые я раньше скачивал для Festival'я.
===============================
Дополнение от 15.01.2014+27.03.2015+07.08.2015+26.10.2015+24.09.2016
1) Немного переделал команды, чтобы синтезированная фраза ещё и в файл сохранялась.
2) Сделал команды для использования Google Text-To-Speech API
3) "Убедил" русский синтезатор фестиваля не вылетать на незнакомых ему символах.
Подробнее
Из того разнообразия команд для запуска синтезаторов голоса, которые я понаделал в прошлый раз (чтение файлов, озвучивание выделения, буфера; горячими клавишами, из меню), реально пользовался только озвучиванием выделенного текста по нажатию горячих клавиш (повесил Alt-r на русский голос, Alt-f – английский, баба, Alt-m – английский, мужик).
Ну, понятно, когда часто пользуюсь, это быстрее всего, и с минимумом "беготни" мышкой и клавишами.
Только переделал запускающие команды, чтобы озвучка ещё и сохранялась в файлах в темпе (он у меня на рам-диске). Чтобы, при необходимости, использовать эти файлы например для исправления криво озвученных карточек в Anki
(~/Anki/1-й пользователь/collection.media).
А то при многократном повторении неверная озвучка уши режет.
Файлы по дате произнесения назывются. И рядом ещё файл с признесённым текстом...
Вот команды для английских голосов (используют программы xsel, sox и mpg123)
В Xubuntu их можно вписывать в
Настройки-Клавиатура-Комбинации клавиш:
______
Xubuntu 12.04 (старые настройки Festival)
баба (Alt-f)
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt ; echo "$sel_txt"|text2wave -eval "(voice_cmu_us_clb_arctic_clunits)" -o "$fil_nam".wav; sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
мужик (Alt-m)
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt ; echo "$sel_txt"|text2wave -eval "(voice_cmu_us_rms_arctic_clunits)" -o "$fil_nam".wav; sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
______
Xubuntu 14.04 или 15.04 (после добавления голосов nitech_us_XXX_arctic_hts)
баба (Alt-f)
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt ; echo "$sel_txt"|text2wave -eval "(voice_nitech_us_slt_arctic_hts)" -o "$fil_nam".wav; sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
мужик (Alt-m)
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt ; echo "$sel_txt"|text2wave -eval "(voice_nitech_us_rms_arctic_hts)" -o "$fil_nam".wav; sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
Ещё, если есть доступ к интернету, можно использовать для чтения небольших фраз Google Text-To-Speech API.
(Если уже не установлен, установите пакет mpg123 , он воспроизводит mp3 из консоли, и пакет normalize-audio, а то тихо будет).
английский голос (повесил на Alt-g)
tl=en (он же tl=en-GB), либо tl=en-US , либо tl=en-AU
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; wget -q -U Mozilla -O "$fil_nam".mp3 "http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&tl=en&q=$sel_txt"; normalize-mp3 -q -a -11dBFS --bitrate 64 --mp3encode="lame --quiet %w %m -b %b" "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
русский голос (повесил на Alt-h)
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; wget -q -U Mozilla -O "$fil_nam".mp3 "http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&tl=ru&q=$sel_txt"; normalize-mp3 -q -a -11dBFS --bitrate 64 --mp3encode="lame --quiet %w %m -b %b" "$fil_nam".mp3; mpg123 -q "$fil_nam".mp3'
Кроме самих команд, для гугловских голосов и настраивать то ничего не надо. Но только при подключённом интернете будут работать. И есть неприятное ограничение ≈100 букв.
В самом гугл-переводчике http://translate.google.ru/ эти же голоса читают гораздо большие тексты.
Есть скрипт на питоне, gtts-cli.py, который может читать большие тексты через GoogleTTS (напиливая и соединяя кусочки):
https://github.com/pndurette/gTTS
(Для его установки предварительно надо pip настроить.)
Похожий скрипт, speak.pl, ещё живёт здесь:
https://github.com/Glutanimate/simple-google-tts
А вот мой башевский скрипт для вызова одного из этих скриптов :-)
#!/bin/bash
#параметр ru , либо en (он же en-UK), либо en-US , либо en-AU , либо другой язык
lang="$1"
sel_txt=`xsel --primary`
fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`
echo "$sel_txt">"$fil_nam".txt
#speak.pl "$lang" "$fil_nam".txt "$fil_nam".mp3 >/dev/null
gtts-cli.py -l "$lang" -f "$fil_nam".txt -o "$fil_nam".mp3
normalize-mp3 --tmpdir /tmp -a -10dBFS --bitrate 64 --mp3encode="lame --quiet %w %m -b %b" --quiet "$fil_nam".mp3
mplayer "$fil_nam".mp3
rm "$fil_nam".txt
Назвал его gtts.sh
Повесьте его на горячие клавиши, и пользуйтесь:-)
Выделяете кусок текста, и запускаете
для английского-английского
gtts.sh en
для американского английского
gtts.sh en-US
для русского
gtts.sh ru
и т.д.
Ещё я сделал скрипт, который "вылечивает" русский голос festival'я, voice_msu_ru_nsh_clunits, от вылетов на любых, не знакомых ему, значках. Теперь его можно нормально использовать, а то было одно расстройство...
(Смотрите, так же, другой вариант решения, на Си – Дополнение от 09.08.2015)
Вот этот скрипт (Пока черновой вариант, работает не на 100% текстов! Попозже доделаю, вникнув в sed:-)
#!/bin/bash
sel_txt=`xsel --primary`
fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`
echo "$sel_txt">"$fil_nam".txt
sel_txt=`echo "$sel_txt"|sed -r 's/[«»]/"/g'|sed -r 's/[–—]/-/g'|sed -r 's/[^0-9A-Za-zА-Яа-яЁё.,:;?!"+()-]/ /g'|sed -r 's/([,:;?!])([^ ")])/\1 \2/g'|sed -r 's/\.([^ .")])/\. \1/g'|sed -r 's/ ([.,:;?!])/\1/g'|sed -r 's/…/\.\.\./g'`
echo "$sel_txt"|text2wave -eval "(voice_msu_ru_nsh_clunits)" -o "$fil_nam".wav
sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3
echo
echo "$sel_txt"
mpg123 -q "$fil_nam".mp3
Тут в нескольких заменах sed корректирует «особенности текста», которые voice_msu_ru_nsh_clunits не переваривает (по крайней мере те, что я успел заметить):
заменяет «ёлочки» на кавычки,
среднее и длинное тире на минус,
"неведомые" символы на пробелы,
добавляет (если нету) пробелы после знаков препинания.
Назвал его rusvoice.sh
Сохранил в каталог пользователя. И сделал исполняемым.
Соответсвенно, в Настройки-Клавиатура-Комбинации клавиш надо вписать команду
sh -c '/home/Ваше_имя_пользователя/rusvoice.sh'
И комбинацию клавиш для вызова (у меня Alt-r)
Пришлось бороться даже с точками и запятыми, т.к. учёные из МГУ, которые этот голос делали, похоже, никак не ожидали конструкций вида: "я,дебил.не,ставлю.пробелов", а такое в интернете сейчас сплошь и рядом...
Но теперь проблема решена – интеллигентному русскому голосу от современного правописания больше не плохеет(((-:
Ещё узнал, что для этого голоса можно подправить ударения, если зар+анее пом+етить их в т+ексте пл+юсиками:-)
Для других фестивалевских голосов это не работает.
Гугловский русский голос в отношении ударений сделан ещё более толково – не надо никаких плюсиков придумывать, понима́ет обы́чное типогра́фское ударе́ние.
(Я его набираю с помощью Compose, назначил в ~/.XCompose на кнопку Compose и два апострофа, и на Compose и два "э")
: "́" U0301 # COMBINING ACUTE ACCENT ударение (комбинирующееся)
: "́" U0301 # COMBINING ACUTE ACCENT ударение (комбинирующееся)
======================
Дополнение от 27.01.2014
Скрипты для отправки выделенного слова, или словосочетания, на forvo.com, и на Oxford Advanced Learner's Dictionary
Послушать произношение слова или словосочетания «носителями» на сайте forvo.com
#!/bin/bash
xsel -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "http://ru.forvo.com/word/" $1 "/#en"}' | xargs chromium-browser
Повесил на него в Xfce сочетание клавиш Alt-точка
to the Oxford Advanced Learner's Dictionary
(англо-английский словарь с произношением в британском и американском вариантах)
#!/bin/bash
xsel -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "http://oxfordlearnersdictionaries.com/dictionary/"$1}' | xargs chromium-browser
Повесил на него в Xfce сочетание клавиш Alt-o
Скрипты такие страхолюдные, чтобы в адресную строку правильным образом передавались словосочетания
(не .../fuck off, а .../fuck+off :-))
Я обычно фаерфоксом пользуюсь, но в скриптах – хромиум, т.к. он чуть быстрее запускается, и нет риска потом случайно закрыть фаерфокс с другими полезными вкладками (...поправимо, но не приятно:-)))
Основа этих скриптов потырена из похожих – из gxneur.
...И не забудьте пакет xsel доустановить (если его ещё нет).
===============================
Дополнение от 7.10.2014
Нашёл очень неплохой голос для Firefox'а — его предлагает дополнение Simple TTS
(Аналогичное дополнение для Chrome или Cromium — это SpeakIt!)
Лучше гугловского (использует голоса из ispeech.org).
В браузере можно, при необходимости, и локальные документы открывать: и txt, и pdf, да и другие.
И там их послушать.
(И звук сохранить, если надо, DownloadHelper'ом, или FlashGot'ом, или ещё чем).
Но в следующем дополнении приведу команды для использования этого движка без браузера.
========================
Дополнение от 27.01.2015
Команды для озвучивания буфера выделения хорошим TTS-движком c www.ispeech.org
(и записи в Дата-Время.mp3, в /tmp)
Английский:
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; wget -q -U Mozilla -O "$fil_nam".mp3 "http://api.ispeech.org/api/rest?apikey=ispeech-listenbutton-betauserkey&action=convert&text=$sel_txt&voice=ukenglishfemale&speed=-1&format=mp3"; normalize-mp3 -a -11dBFS --bitrate 96 --mp3encode="lame --quiet %w %m -b %b" $voi_fil_nam; mpg123 -q "$fil_nam".mp3'
Русский:
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; wget -q -U Mozilla -O "$fil_nam".mp3 "http://api.ispeech.org/api/rest?apikey=ispeech-listenbutton-betauserkey&action=convert&text=$sel_txt&voice=rurussianfemale&format=mp3"; normalize-mp3 -a -13dBFS --bitrate 96 --mp3encode="lame --quiet %w %m -b %b" $voi_fil_nam; mpg123 -q "$fil_nam".mp3'
Список языков:
US English Female (default)
usenglishfemale
US English Male
usenglishmale
UK English Female
ukenglishfemale
UK English Male
ukenglishmale
Australian English Female
auenglishfemale
US Spanish Female
usspanishfemale
US Spanish Male
usspanishmale
Chinese Female
chchinesefemale
Chinese Male
chchinesemale
Hong Kong Cantonese Female
hkchinesefemale
Taiwan Chinese Female
twchinesefemale
Japanese Female
jpjapanesefemale
Japanese Male
jpjapanesemale
Korean Female
krkoreanfemale
Korean Male
krkoreanmale
Canadian English Female
caenglishfemale
Hungarian Female
huhungarianfemale
Brazilian Portuguese Female
brportuguesefemale
European Portuguese Female
eurportuguesefemale
European Portuguese Male
eurportuguesemale
European Spanish Female
eurspanishfemale
European Spanish Male
eurspanishmale
European Catalan Female
eurcatalanfemale
European Czech Female
eurczechfemale
European Danish Female
eurdanishfemale
European Finnish Female
eurfinnishfemale
European French Female
eurfrenchfemale
European French Male
eurfrenchmale
European Norwegian Female
eurnorwegianfemale
European Dutch Female
eurdutchfemale
European Polish Female
eurpolishfemale
European Italian Female
euritalianfemale
European Italian Male
euritalianmale
European Turkish Female
eurturkishfemale
European Turkish Male
eurturkishmale
European German Female
eurgermanfemale
European German Male
eurgermanmale
Russian Female
rurussianfemale
Russian Male
rurussianmale
Swedish Female
swswedishfemale
Canadian French Female
cafrenchfemale
Canadian French Male
cafrenchmale
Ещё есть
voice=obama
:))
============
Дополнение от 30.07.2015
Нашёл как можно подключить яндексовские голоса (без всяких джав, питонов и прочих сложных скриптов):
Команда для произнесения выделенного текста через YandexTTS английским голосом:
sh -c 'sel_txt=`xsel --primary` ; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N` ; echo "$sel_txt">"$fil_nam".txt ; wget -q -U Mozilla -O "$fil_nam".mp3 "http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&lang=en_GB&text=$sel_txt" ; mpg123 -q "$fil_nam".mp3'
Команда для произнесения выделенного текста через YandexTTS русским голосом:
sh -c 'sel_txt=`xsel --primary` ; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N` ; echo "$sel_txt">"$fil_nam".txt ; wget -q -U Mozilla -O "$fil_nam".mp3 "http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&lang=ru_RU&text=$sel_txt" ; mpg123 -q "$fil_nam".mp3'
Можно и другие русские голоса от Яндекса использовать
(мужские, женские, с эмоциями, больные, пьяные:-).
Но тогда нужно получить персональный ключ.
(Это не больно;-)
Инструкции тут:
https://tech.yandex.ru/speechkit/cloud/doc/dg/concepts/speechkit-dg-tts-docpage/
А здесь интересная статья по яндексовскую систему синтеза и распознавания речи:
http://habrahabr.ru/company/yandex/blog/243813/
_______________
Flite
Ещё в репозиториях есть очень простая в использовании офлайновая система синтеза речи flite.
Голоса только английские, похуже чем у лучших современных систем, но и не отвратные. У flite четыре голоса: kal или kal16, awb, rms, slt.
Вот команда для произнесения выделенного текста через flite голосом awb
sh -c 'sel_txt=`xsel --primary`; flite -voice awb -t "$sel_txt"'
А это команда для крнвертации текста в звуковые файлы .wav и .mp3, wav потом проговаривается (здесь, для примера, голос kal16):
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; flite -voice kal16 -o "$fil_nam".wav -t "$sel_txt"; normalize-audio -a -11dBFS -q "$fil_nam".wav; sox -v 1.1 "$fil_nam".wav -r 44100 --norm "$fil_nam".mp3; aplay -q "$fil_nam".wav'
=============
Дополнение от 04.08.2015
Пропустил очень достойный синтезатор речи SVOX Pico (pico2wave).
Исправляюсь! :-)
В Ubuntu он живёт в стандартных репозиториях, в пакете libttspico-utils
sudo apt-get install libttspico0 libttspico-utils libttspico-data
В нём есть такие голоса:
en-US
en-GB
de-DE
es-ES
fr-FR
it-IT
Русского нет.
Не смотря на маленький размер движка, голоса вполне приличные. Не хуже фестивалевских, которые занимают за сотню мегабайт, да их ещё и дополнительно скачать и настроить надо.
Т.е., на данный момент, в линуксе именно pico2wave получается самым быстрым и простым способом офлайнового синтеза удобоваримых европейских голосов.
(!!¡¡А вот уже и не совсем так:-) В новых версиях линукс – Festival 2.1, для него есть тоже маленькие, но качественные, английские голоса nitech_us_XXX_arctic_hts)
Простейший пример:
pico2wave -l en-GB -w /tmp/tmp.wav "to be or not to be" ; aplay -q /tmp/tmp.wav
(en-GB чуть приятнее en-US, который по-умолчанию используется, если параметр -l не указать)
А вот команда, чтобы на горячие клавиши вешать:
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; pico2wave -l en-GB -w "$fil_nam".wav "$sel_txt"; normalize-audio -a -10dBFS -q "$fil_nam".wav; sox -v 1.1 "$fil_nam".wav -r 48000 "$fil_nam".mp3; aplay -q "$fil_nam".wav'
Команда произносит выделенный текст
(так же она в /tmp сохраняет wav и mp3 с именем из текущих даты и времени)
Это будет работать практически в любой программе, где вы можете выделить текст.
Но некоторые специализированные программы и сами знают этот синтезатор голоса.
AwesomeTTS, звуковое дополнение к программе изучения слов Anki, так же знает SVOX Pico (pico2wave), его там можно добавить в используемый набор пресетов.
И в Read-Text (TextToSpeech) дополнении к LibreOffice (OpenOffice), предназначенном для чтения документов, тоже присутствует озвучка через SVOX Pico.
Сам Read-Text живёт тут:
http://extensions.libreoffice.org/extension-center/read-text
После установки дополнения Read-Text, в либре-офисе появится кнопка в виде перевёрнутой чёрной капли (с чУдным названием "Читать выбора":-) и два пункта в меню Сервис-Дополнения.
Чтобы услышать текст в LibreOffice, надо его выделить и нажать на чёрную каплю. Сначала вылезет окно с настройками Read Text.
Нажмёте OK, и только тогда выделенный ранее текст произнесётся.
Чтобы окно с настройкой Read Text не вылезало каждый раз, в нём можно убрать галочку "Всегда показывать этот диалог".
Если в дальнейшем настройки Read Text опять понадобятся, их можно вызвать из меню:
Сервис — Макросы — Выполнить_макрос — Мои_макросы — textToSpeech — TextToSpeech — SetupReadTextAloud
(либо вывести на какую-то панель кнопочку от этого макроса)
Для использования голоса из pico2wave в настройках Read Text надо выбрать "Наружное применение" (которое не Festival),
и вписать туда
/usr/bin/python
и
"(PICO_READ_TEXT_PY)" --language=en-GB --visible=false "(TMP)"
Но в LibreOffice 6 это дополнение что-то расхотело через pico2wave говорить (хотя в других программах pico2wave нормально работает). Так что я опять поставил галочку на "Использовать Festival со сценарием"
/usr/bin/festival
Только голос поменял (их можно в /usr/share/festival/voices/ подсмотреть, и перед названием голоса надо дописать voice_ )
(voice_nitech_us_rms_arctic_hts)( tts "(TMP)" nil)(quit)
=============
Дополнение от 09.08.2015
Про русский голос для festival'я
Всё мне никак не собраться довести до ума фильтр на SED'е для символов, не перевариваемых русским голосом фестиваля (заклинаниями SED'а действительно можно случайно дьявола вызвать:-).
Но, оказалось, что товарищ Paca
http://startubuntu.ru/?p=148&select=5601
сделал соответствующий фильтр ещё в 2013 году, на Си.
Я его программу немножко переделал.
"Разрешил" латинские буквы, минус.
Замену среднего и длинного тире на минус,
и замену "\" и "/" на пробел.
А ещё развернул вложенный if в основном фильтре, чтобы не приходилось каждый дополнительный подфильтр добавлять как ещё один уровень вложенности if'а :-)
Вот эта программка, festival_msu_ru_filter.c
/*
festival_msu_ru_filter.c - Text filter for russian voice msu_ru_nsh_clunits-0.5 of festival in Linux.
by Paca
http://startubuntu.ru/?p=148&select=5601
http://ge.tt/api/1/files/5cI16pt/0/blob?download
Modified by Comrade
http://liberatum.ru/blog/25253
Input data from stdin stream (limited in 1 MB, edit BUFFER_SIZE to change it).
Output data to stdout stream.
Examples of festfilt usage:
1) To hear text file:
cat mytextfile | festival_msu_ru_filter | festival --tts --language russian
2) To view text file:
cat mytextfile | festival_msu_ru_filter | more
3) To make result file:
cat mytextfile | festival_msu_ru_filter > resultfile
4) To hear text from clipboard:
xsel --clipboard | festival_msu_ru_filter | festival --tts --language russian
5) To hear text from selection:
xsel --primary | festival_msu_ru_filter | festival --tts --language russian
*/
#include
#define BUFFER_SIZE 1024*1024
#define TRUE 1
#define FALSE 0
searchedChar (unsigned char c) {
switch (c) {
case ' ':
case ',':
case '.':
case '!':
case '?': return TRUE;
}
return FALSE;
}
unsigned char hardestSearchedChar (unsigned char mainSearchedChar, unsigned char c) {
/* < , < . < ! < ? */
if (
(mainSearchedChar == ' ') ||
(mainSearchedChar == ',' && c != ' ') ||
(mainSearchedChar == '.' && (c == '!' || c == '?')) ||
(mainSearchedChar == '!' && c == '?')
)
return c;
else
return mainSearchedChar;
}
main ()
{
int read_bytes, i=0, j=0, k, N, headTrash = TRUE;
unsigned char b[BUFFER_SIZE], B[BUFFER_SIZE], mainSearchedChar;
read_bytes = fread (b, sizeof (char), BUFFER_SIZE-1, stdin) ;
/* Pass #1 - filter & substitution */
while (i= 0x90 && b[i+1] <= 0xBF))) ||
(b[i] == 0xD1 && (b[i+1] == 0x91 || (b[i+1] >= 0x80 && b[i+1] <= 0x8F)))
)
)
{
b[j++] = b[i++];
b[j++] = b[i++];
headTrash = FALSE;
continue;
}
//U+2013 – e2 80 93 EN DASH
//U+2014 — e2 80 94 EM DASH
if (i= '0' && b[i] <= '9') ||
(b[i] >= 'a' && b[i] <= 'z') ||
(b[i] >= 'A' && b[i] <= 'Z')
)
{
b[j++] = b[i++];
headTrash = FALSE;
continue;
}
if (!headTrash) {
switch (b[i]) {
case '(':
case ')':
case '[':
case ']':
case '{':
case '}':
case ':':
case ';':
case ',': b[j++] = ','; break;
case '.':
case '!':
case '?':
case '-':
case ' ': b[j++] = b[i]; break;
case '/':
case '\\':
case '\n': b[j++] = ' '; break;
}
i++;
continue;
}
}
/* Pass #2 - replace superfluous characters */
N = j;
for (i = j = 0; i < N; i++) {
if (searchedChar (b[i])) {
mainSearchedChar = b[k = i];
while (searchedChar (b[++k]) && k < N)
mainSearchedChar = hardestSearchedChar (mainSearchedChar, b[k]);
b[j++] = mainSearchedChar;
i = --k;
}
else
b[j++] = b[i];
}
/* Pass #3 - insert after every ,.!? */
N = j;
for (i = j = 0; i < N; i++) {
B[j++] = b[i];
switch (b[i]) {
case ',':
case '.':
case '!':
case '?': B[j++] = ' ';
}
}
b[j] = 0; /* Null-terminator for C-string */
fputs (B, stdout);
return (0);
}
"Порадовало", конечно, что в utf-8 цифры, латинские буквы и часть значков – однобайтовые, русские буквы – двухбайтовые, а, например, среднее и длинное тире – трёхбайтовые.
(Да ещё, похоже, в gcc перепутан код для "Ё":-)
Наверняка, тут большую часть можно было сделать в одно действие через какие-то стандартные библиотеки.
Но программа и так не сложная, так что уважаемый Paca и так прекрасно справился. А мои дополнения минимальны.
Как пользоваться?
Скомпилировать.
Исполняемый файл festival_msu_ru_filter я закинул в /usr/bin/ (только права поменял, на всякий случай).
Проверка:
echo "проба-проба:-)" | festival_msu_ru_filter | festival --tts --language russian
Команда для чтения выделенного русского текста:
xsel --primary | festival_msu_ru_filter | festival --tts --language russian
А на горячие клавиши я сейчас такой вариант команды повесил:
sh -c 'sel_txt=`xsel --primary | festival_msu_ru_filter` ; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N` ; echo "$sel_txt">"$fil_nam".txt; echo "$sel_txt"|text2wave -eval "(voice_msu_ru_nsh_clunits)" -o "$fil_nam".wav; sox "$fil_nam".wav -r 48000 --norm "$fil_nam".mp3; echo "$sel_txt"; mpg123 -q "$fil_nam".mp3'
Она читает выделенный фрагмент русского текста по нажатию назначенной комбинации клавиш, а ещё записывает его в /tmp (он у меня на RAM-диске) в текстовой файл, в wav, и в mp3 (у mp3 нормализует громкость), с названием типа Дата_Время...
==============
Дополнение от 07.01.2016
Умные люди придумали как "бездвоздмездно, то есть даром":) пользоваться хорошими голосами с acapela-group.com
Пример из http://stackoverflow.com/questions/9893175/google-text-to-speech-api
curl $(curl --data 'MyLanguages=sonid10&MySelectedVoice=Sharon&MyTextForTTS=Hello%20World&t=1&SendToVaaS=' 'http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2.php' | grep -o "http.*mp3") > tts_output.mp3; mplayer tts_output.mp3
А такая команда будет озвучивать выделенный мышкой английский текст (до 300 символов):
curl $(curl -d "MyLanguages=sonid10&MySelectedVoice=Will&MyTextForTTS=$(xsel --primary)&t=1&SendToVaaS=" "http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2.php" | grep -o "http.*mp3")>/tmp/acapela.mp3; mplayer /tmp/acapela.mp3
Здесь, для примера, взят голос Will.
Какие ещё языки и голоса можно использовать, смотрите (и слушайте:-) в демо-окошке на http://www.acapela-group.com/
(Из этого окошка curl голоса и тырит;-)
Русский голос там пока один, Alyona, но качественный.
======================
Дополнение от 24.09.2016
Надо будет ещё как-нибудь про RHVoice написать – отличные голоса, причём это open-source проект.
Но пока смотрите сами на авторских сайтах:
https://github.com/Olga-Yakovleva/RHVoice/
http://tiflo.info/rhvoice/
Для пользователей Ubuntu и её производных в 2016 году заработал PPA для удобной установки синтезаторов голоса RHVoice.
https://launchpad.net/~linvinus/+archive/ubuntu/rhvoice
======================
Приложение. Старые настройки для Xubuntu 12.04
Качественные английские голоса можно скачать отсюда:
http://www.speech.cs.cmu.edu/cmu_arctic/packed/
Понравились:
женский голос
http://www.speech.cs.cmu.edu/cmu_arctic/packed/cmu_us_clb_arctic-0.95-re...
(124Мб)
и мужской голос
http://www.speech.cs.cmu.edu/cmu_arctic/packed/cmu_us_rms_arctic-0.95-re...
(111Мб)
Распаковываю, получаются каталоги
cmu_us_clb_arctic (192Мб) и cmu_us_rms_arctic (177Мб)
Их надо переименовать в cmu_us_clb_arctic_clunits и cmu_us_rms_arctic_clunits ,
и скопировать в каталог /usr/share/festival/voices/english/
Со скриптами и структурой festival'я я особо разбираться не стал — чтобы использовать по-умолчанию понравившиеся голоса, просто подменил британский и американский голоса по-умолчанию в языковом файле
/usr/share/festival/languages.scm
(Сначала копию languages.scm сделайте, на всякий случай;-)
Стало так:
..............................
(define (language_british_english)
"(language_british_english)
Set up language parameters for British English."
(require 'voices)
;; Will get more elaborate, with different choices of voices in language
(set! male1 (lambda () (voice_cmu_us_clb_arctic_clunits)))
..............................
и
..............................
(define (language_american_english)
"(language_american_english)
Set up language parameters for Aemerican English."
(if (symbol-bound? 'voice_cmu_us_rms_arctic_clunits)
(set! female1 (lambda () (voice_cmu_us_clb_arctic_clunits))))
(set! male1 (lambda () (voice_cmu_us_rms_arctic_clunits)))
..............................
Проверяю — в терминале:
echo 'Hello!' | festival --tts --language britishenglish
echo 'Hello!' | festival --tts --language americanenglish
echo 'Welcome to ix-uhb-uhntuh' | text2wave -eval '(voice_cmu_us_clb_arctic_clunits)' | aplay -q
echo 'Welcome to ix-uhb-uhntuh' | text2wave -eval '(voice_cmu_us_rms_arctic_clunits)' | aplay -q
Всё говорит, порядок!
Дальше настраиваю "на разговор" Xfce и Thunar
Голосовое приветствие при загрузке системы:
Меню Xfce - Настройки - Диспетчер настроек - Сеансы и запуск - Автозапуск приложений - Добавить
sh -c "echo 'Welcome to ix-uhb-uhntuh' | text2wave -eval '(voice_cmu_us_clb_arctic_clunits)' | aplay -q"
Чтение голосом текстового файла:
http://i.piccy.info/i9/2333024335ccb2868fd8c4f1da4a231c/1412584417/12592...
Thunar - Правка - Настроить особые действия - Добавить особое действие
Имя: speaking - english (woman)
Команда:
xfce4-terminal -e "festival --tts --language britishenglish %f"
Условия появления — Текстовые файлы, другие файлы
Имя: speaking - english (woman)
Команда:
xfce4-terminal -e "festival --tts --language americanenglish %f"
Условия появления — Текстовые файлы, другие файлы
Имя: speaking - russian
Команда:
xfce4-terminal -e "festival --tts --language russian %f"
Условия появления — Текстовые файлы, другие файлы
Чтение выделенного текста или текста в буфере — горячими клавишами:
Меню Xfce - Настройки - Диспетчер настроек - Клавиатура - Комбинации клавиш
Alt-f (английский, женский)
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_cmu_us_clb_arctic_clunits)' | aplay -q"
Alt-m (английский, мужской)
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_cmu_us_rms_arctic_clunits)' | aplay -q"
Alt-comma (английский, оба голоса)
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_cmu_us_clb_arctic_clunits)' | aplay -q ; xsel --primary ; xsel --primary | text2wave -eval '(voice_cmu_us_rms_arctic_clunits)' | aplay -q"
Alt-r (русский голос)
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_msu_ru_nsh_clunits)' | aplay -q"
Чтение выделенного текста или текста в буфере — мышкой, из меню:
http://i.piccy.info/i9/f23d7aca7bd42ab0ce6982b8b3f6c794/1412584598/58713...
На панели у меня был выведен запуск GoldenDict. Добавляю к нему выкидное меню.
Щёлкнул его правой кнопкой – Свойства – Добавить новый пустой элемент
Имя: _выделенное по-английски (ж) Alt-f
Команда:
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_cmu_us_clb_arctic_clunits)' | aplay -q"
Параметры: запускать в терминале
Имя: _выделенное по-английски (м) Alt-m
Команда:
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_cmu_us_rms_arctic_clunits)' | aplay -q"
Параметры: запускать в терминале
Имя: _выделенное по-русски Alt-r
Команда:
sh -c "xsel --primary ; xsel --primary | text2wave -eval '(voice_msu_ru_nsh_clunits)' | aplay -q"
Параметры: запускать в терминале
Имя: _буфер по-английски (ж)
Команда:
sh -c "xsel --clipboard ; xsel --clipboard | text2wave -eval '(voice_cmu_us_clb_arctic_clunits)' | aplay -q"
Параметры: запускать в терминале
Имя: _буфер по-английски (м)
Команда:
sh -c "xsel --clipboard ; xsel --clipboard | text2wave -eval '(voice_cmu_us_rms_arctic_clunits)' | aplay -q"
Параметры: запускать в терминале
Имя: _буфер по-русски
Команда:
sh -c "xsel --clipboard ; xsel --clipboard | festival --tts --language russian"
Параметры: запускать в терминале
В других линуксовских рабочих средах можно сделать похожие настройки.
Комментарии
pomodor
15 марта, 2013 - 21:32
Комбинируя все это с возможностями программы cron, может неплохой розыгрыш получиться для друзей. Например, компьютер вечером может человеческим голосом спать проситься или регулярно жаловаться на усталость. ;)
comrade
15 марта, 2013 - 22:58
...или компьютер может хлебушка попросить:)))
pomodor
15 марта, 2013 - 23:30
Можно и полезные функции прикрутить. Например, скрипт периодически проверяет погоду и если объявляется штормовое предупреждение, то может заботливо предупредить хозяина: "не ходи, милый друг, сегодня на улицу, а то сдует к #@#$%%". Всяк круче, чем "самая продаваемая" программа в Центре приложений Убунты. ;)
comrade
15 января, 2014 - 00:17
Дополнение от 2014.01.15
1) Немного переделал команды, чтобы синтезированная фраза ещё и в файл сохранялась.
2) Сделал команды для использования Google Text-To-Speech API
3) «Убедил» русский синтезатор фестиваля не вылетать на незнакомых ему символах.
Подробности добавил к основному тексту...
pomodor
15 января, 2014 - 00:49
А как меняется голос от версии к версии? Стала ли девушка произносить фразы более сексуально? Когда я в последний раз знакомился с этим классом программ, то голос скорее принадлежал даже не девушке, а гриппующей бабке, подавившейся рыбной костью.
comrade
15 января, 2014 - 01:03
Гугловский английский голос – неплохой
(https://cloud.mail.ru/public/2321a86f746b/2014-01-15_03-26-42_155177494.mp3).
Русский – менее приятный
(https://cloud.mail.ru/public/e75defc7f252/2014-01-15_03-25-29_624347252.mp3).
«Фестивальский», вроде, получше
(https://cloud.mail.ru/public/4f84059ac41a/2014-01-15_03-03-54_757831537.wav).
comrade
27 января, 2014 - 17:28
Скрипты для отправки выделенного слова, или словосочетания, на forvo.com, и на Oxford Advanced Learner's Dictionary
Послушать произношение слова или словосочетания «носителями» на сайте forvo.com
#!/bin/bash
xsel -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "http://ru.forvo.com/word/" $1 "/#en"}' | xargs chromium-browser
Повесил на него в Xfce сочетание клавиш Alt-точка
to the Oxford Advanced Learner's Dictionary
(англо-английский словарь с произношением в британском и американском вариантах)
#!/bin/bash
xsel -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "http://oxfordlearnersdictionaries.com/dictionary/"$1}' | xargs chromium-browser
Повесил на него в Xfce сочетание клавиш Alt-o
Скрипты такие страхолюдные, чтобы в адресную строку правильным образом передавались словосочетания
(не .../fuck off, а .../fuck+off :-))
Я обычно фаерфоксом пользуюсь, но в скриптах – хромиум, т.к. он чуть быстрее запускается, и нет риска потом случайно закрыть фаерфокс с другими полезными вкладками (...поправимо, но не приятно:-)))
Основа этих скриптов потырена из похожих – из gxneur.
...И не забудьте пакет xsel доустановить (если его ещё нет).
pomodor
27 января, 2014 - 18:42
Что-то в скриптах одни каракули какие-то. Признавайтесь, на самом деле это обфускация команды на установку трояна? :)
comrade
27 января, 2014 - 20:34
Первокурсники мединститута, изучая латынь, случайно вызвали дьявола.
comrade
6 октября, 2014 - 23:00
Нашёл скрипт, который лечит гугловский синтезатор голоса от жадности. Чтобы он и при внешнем вызове говорил тексты >100 символов.
Сейчас допишу ещё одно дополнение в статейке...
comrade
27 января, 2015 - 20:21
Дополнение от 27.01.2015
Добавил команды для озвучивания буфера выделения хорошим TTS-движком c www.ispeech.org
(и записи в Дата-Время.mp3, в /tmp)
Английский:
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; voi_fil_nam="$fil_nam".mp3; wget -q -U Mozilla -O $voi_fil_nam "http://api.ispeech.org/api/rest?apikey=ispeech-listenbutton-betauserkey&action=convert&text=$sel_txt&voice=ukenglishfemale&speed=-1&format=mp3"; normalize-mp3 $voi_fil_nam; mpg123 -q $voi_fil_nam'
Русский:
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; voi_fil_nam="$fil_nam".mp3; wget -q -U Mozilla -O $voi_fil_nam "http://api.ispeech.org/api/rest?apikey=ispeech-listenbutton-betauserkey&action=convert&text=$sel_txt&voice=rurussianfemale&format=mp3"; normalize-mp3 $voi_fil_nam; mpg123 -q $voi_fil_nam'
Список языков:
US English Female (default)
usenglishfemale
US English Male
usenglishmale
UK English Female
ukenglishfemale
UK English Male
ukenglishmale
Australian English Female
auenglishfemale
US Spanish Female
usspanishfemale
US Spanish Male
usspanishmale
Chinese Female
chchinesefemale
Chinese Male
chchinesemale
Hong Kong Cantonese Female
hkchinesefemale
Taiwan Chinese Female
twchinesefemale
Japanese Female
jpjapanesefemale
Japanese Male
jpjapanesemale
Korean Female
krkoreanfemale
Korean Male
krkoreanmale
Canadian English Female
caenglishfemale
Hungarian Female
huhungarianfemale
Brazilian Portuguese Female
brportuguesefemale
European Portuguese Female
eurportuguesefemale
European Portuguese Male
eurportuguesemale
European Spanish Female
eurspanishfemale
European Spanish Male
eurspanishmale
European Catalan Female
eurcatalanfemale
European Czech Female
eurczechfemale
European Danish Female
eurdanishfemale
European Finnish Female
eurfinnishfemale
European French Female
eurfrenchfemale
European French Male
eurfrenchmale
European Norwegian Female
eurnorwegianfemale
European Dutch Female
eurdutchfemale
European Polish Female
eurpolishfemale
European Italian Female
euritalianfemale
European Italian Male
euritalianmale
European Turkish Female
eurturkishfemale
European Turkish Male
eurturkishmale
European German Female
eurgermanfemale
European German Male
eurgermanmale
Russian Female
rurussianfemale
Russian Male
rurussianmale
Swedish Female
swswedishfemale
Canadian French Female
cafrenchfemale
Canadian French Male
cafrenchmale
Ещё есть
voice=obama
:))
comrade
27 марта, 2015 - 00:52
Дополнение от 27.03.2015
Заменил в скрипте для голоса festival-ru очистку текста с помощью tr на sed.
Sed, оказывается, с utf-8 давно умеет работать.
Правда, пишут, что поначалу через sed с помощью особых utf8-заклинаний умельцы выполняли произвольный код:) Надеюсь, это пофиксили уже...
Если использовать sed, то локаль ru_RU.CP1251 добавлять уже не потребуется.
Вот новая версия скрипта:
#!/bin/bash
sel_txt=`xsel --primary`
fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`
echo "$sel_txt">"$fil_nam".txt
sel_txt=`echo "$sel_txt"|sed 's/[«»]/"/g'|sed 's/[–—]/-/g'|sed 's/[^0-9A-Za-zА-Яа-яЁё\.,:;?!"+\(\)-]/ /g'|sed -r 's/([,:;?!])([^ "\)])/\1 \2/g'|sed -r 's/\.([^ \."\)])/\. \1/g'|sed -r 's/ ([\.,:;?!])/\1/g'|sed 's/…/\.\.\./g'|sed 's/\.\. /\.\.\. /g'|sed 's/ / /g'`
voi_fil_nam="$fil_nam".wav
echo "$sel_txt"|text2wave -eval "(voice_msu_ru_nsh_clunits)" -o $voi_fil_nam
normalize-audio --peak --quiet $voi_fil_nam
#sox "$fil_nam".wav "$fil_nam".ogg
sox "$fil_nam".wav -r 44100 --norm "$fil_nam".mp3
echo
echo "$sel_txt"
aplay -q $voi_fil_nam
Тут в нескольких заменах sed корректирует «особенности текста», которые voice_msu_ru_nsh_clunits не переваривает (по крайней мере те, что я успел заметить):
заменяет «ёлочки» на кавычки,
среднее и длинное тире на минус,
"неведомые" символы на пробелы,
добавляет (если нету) пробелы после знаков препинания.
Ещё добавил конвертацию в mp3 (или в ogg).
Новый скрипт помещу в основной текст статьи.
А старый вариант, на всякий случай, перенёс сюда.
Было так
Вот этот скрипт:
#!/bin/bash
sel_txt=`xsel --primary`
fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`
echo "$sel_txt"
echo "$sel_txt">"$fil_nam".txt
sel_txt=`echo "$sel_txt"|iconv -c -s -f UTF-8 -t WINDOWS-1251`
export LANG=ru_RU.CP1251
sel_txt=`echo "$sel_txt"|tr -cs "\ \'\-+0-9A-Za-z\250\270\300-\337\340-\377" "\n"`
export LANG=ru_RU.UTF-8
sel_txt=`echo $sel_txt|iconv -c -s -f WINDOWS-1251 -t UTF-8`
voi_fil_nam="$fil_nam".wav
echo "$sel_txt"|text2wave -eval "(voice_msu_ru_nsh_clunits)" -o $voi_fil_nam
aplay -q $voi_fil_nam
Я его назвал rusvoice.sh
Сохранил в каталог пользователя. И сделал исполняемым.
Соответсвенно, в Настройки-Клавиатура-Комбинации клавиш надо вписать команду
sh -c '/home/Ваше_имя_пользователя/rusvoice.sh'
И комбинацию клавиш для вызова (у меня Alt-r)
Чтобы скрипт работал, в систему должна быть добавлена локаль ru_RU.CP1251
(У меня основная локаль ru_RU.UTF-8)
Как это сделать?
Добавить в файл /var/lib/locales/supported.d/ru строку
ru_RU.CP1251 CP1251
И выполнить
sudo locale-gen
Тогда
locale -a
должен показать в списке
ru
ru_RU.cp1251
ru_RU.utf8
Если хотите KOI8-R использовать (при основной UTF-8), то надо будет позаменять соответствующие места на:
ru_RU.KOI8-R KOI8-R
KOI8-R
tr -cs "\ \'\-+0-9A-Za-z\243\263\300-\337\340-\377" "\n"
А если у вас и так основная кодировка однобайтовая (например та же KOI8-R, или CP1251), то из скрипта надо убрать строки с iconv, и с export LANG.
Почему пришлось ещё локаль добавлять?
А потому, что башевская команда tr, которая в скрипте чистит текст от "бесовских значков", работает нормально только с однобайтовыми кодировками. Так что я в скрипте сначала конвертирую текст из системной UTF-8 в WINDOWS-1251.
Потом tr заменяет на перенос строки любую последовательность символов, не принадлежащих множеству {пробел, апостроф, минус, плюс, цифры, латинские и русские большие и малые буквы}.
Пришлось бороться даже с точками и запятыми, т.к. учёные из МГУ, которые этот голос делали, похоже, никак не ожидали конструкций вида: "я,дебил.не,ставлю.пробелов", а такое в интернете сейчас сплошь и рядом...
Но теперь проблема решена – интеллигентному русскому голосу от современного правописания больше не плохеет(((-:
От замены всего, что можно, и не можно, на переносы строк речь не пострадала, даже лучше стало – автоматом получились микропаузы:))
Ещё узнал, что для этого голоса можно подправить ударения, если зар+анее пом+етить их в т+ексте пл+юсиками:-)
Для других фестивалевских голосов это не работает.
comrade
30 июля, 2015 - 15:25
Дополнение от 30.07.2015
(GoogleTTS замолк, зато YandexTTS заговорил:-)
Примерно с 28.07.2015 перестали работать вызовы GoogleTTS типа
wget -U Mozilla -O /tmp/hello.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q='Hello world'"
Выдаёт «...ОШИБКА 503: Service Unavailable»
Хотя из браузера
http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q="Hello world"
сработает.
Видимо гугел какие-то дополнительные меры против халявщиков принял.
Скорее всего, это обходится. Новая версия голосового дополнения для ANKI – AwesomeTTS – вышла уже на следующий день, и там гугл опять заговорил. Но я пока не разобрался – как они это сделали.
Зато нашёл как можно подключить яндексовские голоса (без всяких джав, питонов и прочих сложных скриптов):
Команда для произнесения выделенного текста через YandexTTS английским голосом:
sh -c 'sel_txt=`xsel --primary` ; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N` ; echo "$sel_txt">"$fil_nam".txt ; wget -q -U Mozilla -O "$fil_nam".mp3 "http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&lang=en_GB&text=$sel_txt" ; mpg123 -q "$fil_nam".mp3'
Команда для произнесения выделенного текста через YandexTTS русским голосом:
sh -c 'sel_txt=`xsel --primary` ; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N` ; echo "$sel_txt">"$fil_nam".txt ; wget -q -U Mozilla -O "$fil_nam".mp3 "http://tts.voicetech.yandex.net/tts?format=mp3&quality=hi&platform=web&application=translate&lang=ru_RU&text=$sel_txt" ; mpg123 -q "$fil_nam".mp3'
pomodor
30 июля, 2015 - 16:23
503 — Service Temporarily Unavailable. Скоро, возможно, заработает обратно.
comrade
7 августа, 2015 - 03:41
Разобрался с замолчавшим Google TTS API!
В запросе теперь надо дополнительный параметр указывать: client=t
Например:
wget -U Mozilla -O /tmp/hello.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&client=t&q='Hello world'"; mpg123 -q /tmp/hello.mp3
Исправил в основном тексте команды (для озвучки через гугл до 100 символов).
А так же поменял скрипт, который решает "проблему 100 символов":-), на исправленный.
comrade
30 июля, 2015 - 17:27
Ещё в репозиториях есть очень простая в использовании офлайновая система синтеза речи flite.
Голоса только английские, похуже чем у лучших современных систем, но и не отвратные. У flite четыре голоса: kal или kal16, awb, rms, slt.
Вот команда для произнесения выделенного текста через flite голосом awb
sh -c 'sel_txt=`xsel --primary`; flite -voice awb -t "$sel_txt"'
А это команда для крнвертации текста в звуковые файлы .wav и .mp3
wav потом проговаривается
(здесь, для примера, голос kal16):
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; flite -voice kal16 -o "$fil_nam".wav -t "$sel_txt"; normalize-audio -a -11dBFS -q "$fil_nam".wav; sox -v 1.1 "$fil_nam".wav -r 44100 --norm "$fil_nam".mp3; aplay -q "$fil_nam".wav'
comrade
4 августа, 2015 - 15:07
Пропустил очень достойный синтезатор речи SVOX Pico (pico2wave).
Исправляюсь! :-)
В Ubuntu он живёт в стандартных репозиториях, в пакете libttspico-utils
sudo apt-get install libttspico0 libttspico-utils libttspico-data
В нём есть такие голоса:
en-US
en-GB
de-DE
es-ES
fr-FR
it-IT
Русского нет.
Не смотря на маленький размер движка, голоса вполне приличные. Не хуже фестивалевских, которые занимают за сотню мегабайт, да их ещё и дополнительно скачать и настроить надо.
Т.е., на данный момент, в линуксе именно pico2wave получается самым быстрым и простым способом офлайнового синтеза удобоваримых европейских голосов.
Простейший пример:
pico2wave -l en-GB -w /tmp/tmp.wav "to be or not to be" ; aplay -q /tmp/tmp.wav
(en-GB чуть приятнее en-US, который по-умолчанию используется, если параметр -l не указать)
А вот команда, чтобы на горячие клавиши вешать:
sh -c 'sel_txt=`xsel --primary`; fil_nam=/tmp/`date +%Y-%m-%d_%H-%M-%S_%N`; echo "$sel_txt">"$fil_nam".txt; pico2wave -l en-GB -w "$fil_nam".wav "$sel_txt"; normalize-audio -a -10dBFS -q "$fil_nam".wav; sox -v 1.1 "$fil_nam".wav -r 48000 "$fil_nam".mp3; aplay -q "$fil_nam".wav'
Команда произносит выделенный текст
(так же она в /tmp сохраняет wav и mp3 с именем из текущих даты и времени)
Это будет работать практически в любой программе, где вы можете выделить текст.
Но некоторые специализированные программы и сами знают этот синтезатор голоса.
AwesomeTTS, звуковое дополнение к программе изучения слов Anki, так же знает SVOX Pico (pico2wave), его там можно добавить в используемый набор пресетов.
И в Read-Text (TextToSpeech) дополнении к LibreOffice (OpenOffice), предназначенном для чтения документов, тоже присутствует озвучка через SVOX Pico.
Сам Read-Text живёт тут:
http://extensions.libreoffice.org/extension-center/read-text
После установки дополнения Read-Text, в либре-офисе появится кнопка в виде перевёрнутой чёрной капли (с чу́дным названием "Читать выбора":-) и два пункта в меню Сервис-Дополнения.
Чтобы услышать текст в LibreOffice, надо его выделить и нажать на чёрную каплю. Сначала вылезет окно с настройками Read Text.
Для использования голоса из pico2wave там надо выбрать "Наружное применение" (которое не Festival),
и вписать туда
/usr/bin/python
и
"(PICO_READ_TEXT_PY)" --language=en-GB --visible=false "(TMP)"
Нажмёте OK, и только тогда выделенный ранее текст произнесётся.
Чтобы окно с настройкой Read Text не вылезало каждый раз, в нём можно убрать галочку "Всегда показывать этот диалог".
Если в дальнейшем настройки Read Text опять понадобятся, их можно вызвать из меню:
Сервис — Макросы — Выполнить_макрос — Мои_макросы — textToSpeech — TextToSpeech — SetupReadTextAloud
(либо вывести на какую-то панель кнопочку от этого макроса)
comrade
9 августа, 2015 - 18:00
Про русский голос для festival'я
Всё мне никак не собраться довести до ума фильтр на SED'е для символов, не перевариваемых русским голосом фестиваля (заклинаниями SED'а действительно можно случайно дьявола вызвать:-).
Но, оказалось, что товарищ Paca
http://startubuntu.ru/?p=148&select=5601
сделал соответствующий фильтр ещё в 2013 году, на Си.
Я его программу немножко переделал.
Сейчас размещу в основном тексте статьи
(см. Дополнение от 09.08.2015)
dk
9 августа, 2015 - 19:46
1. Пардон, могу ошибаться, но wchar не для этого придумали?
2. Выложили бы на какой-либо gitрвский хостинг, а то по статье черт ногу сломит, что нынче актуально, а что — наследие царского режима.
comrade
9 августа, 2015 - 20:14
Статью регулярно исправляю.
На данный момент (Ubuntu 14.04, 15.04) не актуальны только правки файла настроек фестиваля (его изменили). Но и без этого всё работает.
comrade
10 августа, 2015 - 01:59
Вот прямо сейчас скорректировал основную статью про системы голосового синтеза:
вынес вперёд краткую информацию про настройку Festival'я в свежих версиях (X)Ubuntu.
А старые и редко используемые настройки (для Xubuntu 12.04) перенёс под конец основного текста.
dk
10 августа, 2015 - 05:47
Та ни я именно больше про код. С экрана 1024x600 не шибко здорово читается, да и привычка к подсветке развращает. И пока все вынешь тоже не шибко удобно. Да и (как уже отмечали выше) свернутые однострочники навевают воспоминания о патче Баримина:). А так git clone url /tmp/url и ковыряй в любимом редакторе.
Кстати, а wget -U Mozilla — это что? Он же тогда юзер-агент пошлет только "Mozilla" а не "Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0"? Или этого хватает?
comrade
10 августа, 2015 - 12:27
Вы имеете в виду, чтобы "большие" куски кода ещё в виде упакованных архивчиков выкладывать?
Я эту мысль подумаю:-)
Просто программки и скрипты тут довольно мелкие, а начиналось всё вообще с однострочных команд.
А про wget -U Mozilla...
(Это символически, главное не дразнить,
чтобы wget -U wget не шёл ;-)
Пока проблем с халявными онлайновыми голосами из-за этого не было, я постоянно это "проверяю" – интенсивно их голоса использую:) Всё-таки качество повыше, чем у офлайновых.
Хотя прогресс в открытых системах синтеза тоже радует: голоса nitech_us_XXX_arctic_hts и pico2wave уже очень приличные (и это при маленьких размерах!).
А для русских голосов есть очень продвинутый открытый RHVoice, но мне всё пока до него не добраться (я больше английских роботов коллекционирую – помогают язык учить).
dk
10 августа, 2015 - 12:43
Хотя бы. Банальный tar.gz сильно удобнее будет, чем Ctrl-C, Ctrl-V. Хотя на мое скромное git все равно удобнее.
В смысле "Wget/VERSION". Не, я перестраховываюсь и обычно с еременной с полным-реалистичным UA
comrade
26 октября, 2015 - 20:40
"Бедный" Google продолжает бороться с любителями нахаляву пользоваться его онлайн-синтезаторами голоса.
С самого начала у бесплатного API TTS гугла было ограничение примерно в 100 произнесённых букв.
Которое грамотные люди преодолели автоматическим напиливанием нужного текста на кусочки, и склеиванием звуковых файликов.
В августе этого года в параметры запроса вдруг добавили client=t. После чего всем дистанционным вызывальщикам пришлось исправлять "вдруг замолчавшие" скрипты.
Сейчас очередной раунд. Добавили весёлый параметр tk, который должен быть равен двум случайным числам от 0 до 100000 с вертикальной палочкой "|" между ними
(-:
Соответственно, "хело ворлд" скажет теперь примерно такой скрипт:
tkrnd=$(shuf -i 0-100000 -n 1)"|"$(shuf -i 0-100000 -n 1); wget -q -U Mozilla -O /tmp/hello.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&client=t&tk=$tkrnd&q='Hello world'"; mpg123 -q /tmp/hello.mp3
Пришлось и мне исправлять скрипты у меня в системе, и здесь в статье. Снова заговорили...
(До следующего хода гугла, видимо:-)
============
Ещё планирую написать про систему синтеза голоса с открытым кодом – MaryTTS
(интересно, но не очень;
см. также тут: http://liberatum.ru/exclusive/marytts ).
И про отечественную TTS с открытым кодом RHVoice
(а вот это уже очень интересно!
Можете пока самостоятельно глянуть:
https://github.com/Olga-Yakovleva/RHVoice )
А вот тут PPA для убунты (с инструкциями по установке):
https://launchpad.net/~linvinus/+archive/ubuntu/rhvoice
Только там автор ещё не выложил вариант для Ubuntu 16.04, так что в списке репозиториев замените пока xenial на wily.
Возможно ещё напишу про свежевышедший GNUspeech.
http://www.gnu.org/software/gnuspeech/
Его авторы скромно провозгласили цель – сделать лучший в мире синтезатор голоса. Но пока до этого явно далековато(-;
Единственное, что у них порадовало: вариант голоса large_child – почти один-в-один голос бодрого компьютера из "Обители зла" :-)
comrade
7 января, 2016 - 18:21
Возможность халявного использования "голосов гугла" опять утрачена, и на этот раз, похоже, весьма основательно. Так что из текста статьи все упоминания про вызов гугловских голосов я убираю.
Ещё перестал работать сайт и голос tts-api.com. Тоже убираю...
Зато умные люди придумали как "бездвоздмездно, то есть даром":) пользоваться хорошими голосами с acapela-group.com
Пример из http://stackoverflow.com/questions/9893175/google-text-to-speech-api
curl $(curl --data 'MyLanguages=sonid10&MySelectedVoice=Sharon&MyTextForTTS=Hello%20World&t=1&SendToVaaS=' 'http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2.php' | grep -o "http.*mp3") > tts_output.mp3; mplayer tts_output.mp3
А такая команда будет озвучивать выделенный мышкой английский текст (до 300 символов):
curl $(curl -d "MyLanguages=sonid10&MySelectedVoice=Will&MyTextForTTS=$(xsel --primary)&t=1&SendToVaaS=" "http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2.php" | grep -o "http.*mp3")>/tmp/acapela.mp3; mplayer /tmp/acapela.mp3
Здесь, для примера, взят голос Will.
Какие ещё языки и голоса можно использовать, смотрите (и слушайте:-) в демо-окошке на http://www.acapela-group.com/
(Из этого окошка curl голоса и тырит;-)
Русский голос там пока один, Alyona, но качественный.
pomodor
7 января, 2016 - 18:48
А мне нравится http://imtranslator.net/translate-and-speak/. Не знаю, есть ли там API, но звук с сайта довольно качественный. И ударения уже расставлены (более-менее).
А если завтра передумают и вернут? :) Имхо, лучше просто дописать в примечании, что данная фича с такой-то даты не работает.
comrade
7 января, 2016 - 18:59
Текст и так длинный, лучше отмёршие участки удалять.
(Но, если что, верну – "у меня все ходы записаны":-).
А тот сайт у меня в коллекции тоже есть. Хорошие голоса.
Но я пока немного притормозил с онлайновыми голосами, уже хватает.
Да и офлайновые в линуксе оказались неплохие.
Надо будет ещё как-нибудь про RHVoice написать – отличные голоса, причём это open-source проект:
https://github.com/Olga-Yakovleva/RHVoice/
comrade
24 сентября, 2016 - 15:13
Вернул в текст описание команд для озвучивания фразы через Google TTS – опять заработали после небольших изменений.
Ещё для пользователей Ubuntu и её производных в 2016 году появился PPA для удобной установки хороших свободных синтезаторов голоса RHVoice.
https://launchpad.net/~linvinus/+archive/ubuntu/rhvoice
А сайты самого проекта (с описаниями, инструкциями и исходниками):
http://tiflo.info/rhvoice/
https://github.com/Olga-Yakovleva/RHVoice
Комментировать