Yandex TTS и Алиса на украинском
Модератор: immortal
- mag999
- Сообщения: 20
- Зарегистрирован: Вс окт 08, 2017 12:32 pm
- Откуда: Черкассы
- Благодарил (а): 14 раз
- Поблагодарили: 0
Yandex TTS и Алиса на украинском
Всем привет, подскажите как заставить Алису (с модулем Yandex TTS) разговаривать на украинском языке? Дайте направление куда копать.
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 816 раз
Re: Yandex TTS и Алиса на украинском
а яндекс в украине заблокирован



это не мое - но искать оригинал влом..
https://github.com/tarasfrompir/majordomo-google_tts
работает на украинском
- За это сообщение автора tarasfrompir поблагодарил:
- mag999 (Вс ноя 04, 2018 11:52 am)
- Рейтинг: 1.16%
Спасибо нам ПОМОЖЕТ..!
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 816 раз
Re: Yandex TTS и Алиса на украинском
а на русском говорит ? Если нет то смотри выше ....
Спасибо нам ПОМОЖЕТ..!
- Ron
- Сообщения: 480
- Зарегистрирован: Пт окт 27, 2017 6:44 pm
- Благодарил (а): 144 раза
- Поблагодарили: 70 раз
Re: Yandex TTS и Алиса на украинском
Синтез Алиски на Яндексе:
русский
английский
украинский
турецкий
Если к Яндексу с братской (а для меня это Родина, хотя я уже хрен знаю кто я такой. Жопа мотается везде
) территории есть доступ (только дебилы срутся и политики), то говорить можно заставить просто.
Формат запроса
Текстовые данные следует передавать по протоколу HTTPS, методом GET.
Язык уже установлен на украинский
Выбор:
lang=<ru-RU|en-US|uk-UK|tr-TR>
русский
английский
украинский
турецкий
Если к Яндексу с братской (а для меня это Родина, хотя я уже хрен знаю кто я такой. Жопа мотается везде

Формат запроса
Текстовые данные следует передавать по протоколу HTTPS, методом GET.
Код: Выделить всё
https://tts.voicetech.yandex.net/generate?
key=<API‑ключ>
& text=<текст>
& format=<mp3|wav|opus>
& [quality=<hi|lo>]
& lang=<uk-UK>
& speaker=<jane|oksana|alyss|omazh|zahar|ermil>
& [speed=<скорость речи>]
& [emotion=<good|neutral|evil>]
Выбор:
lang=<ru-RU|en-US|uk-UK|tr-TR>
- Ron
- Сообщения: 480
- Зарегистрирован: Пт окт 27, 2017 6:44 pm
- Благодарил (а): 144 раза
- Поблагодарили: 70 раз
Re: Yandex TTS и Алиса на украинском
К стати можно Сергею написать просьбу в модуле Yandex TTS вставить выбор языка для Алиски, кто уж очень хочет
Выбор из 4 языков.
Посмотрел - там не сложно добавить выбор к гет запросу. Ну в самом модуле.
Выбор из 4 языков.
Посмотрел - там не сложно добавить выбор к гет запросу. Ну в самом модуле.
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 816 раз
Re: Yandex TTS и Алиса на украинском
так а по людски это делается примерно так
Код: Выделить всё
$lang = SETTINGS_SITE_LANGUAGE;
if ($lang == 'ua') {
$lang = 'uk';
}else if ($lang == 'ru') {
$lang = 'ru';
}else {
$lang = 'en';
}
Спасибо нам ПОМОЖЕТ..!
- Ron
- Сообщения: 480
- Зарегистрирован: Пт окт 27, 2017 6:44 pm
- Благодарил (а): 144 раза
- Поблагодарили: 70 раз
Re: Yandex TTS и Алиса на украинском
Я в модуль залез.
Там Сергей описал гет запрос с переменной от выбранного языка в интерфейсе.
То есть выбираешь язык интерфейса и оттуда дергает переменную чего слать.
Но по ходу в модуле не все норм.
Синтез запрашивает (улетает гет запрос) только на рус.
Я уж и интерфейс переключал - в чате норм на украинском отпечатывает,а молчит упорно.
Попробовал добавить руками переменные языка в конфиг модуля, но пока не але на мове.
Если руками а Яндекс сформировать запрос на Укр - отлично Алиска балакает )
Там Сергей описал гет запрос с переменной от выбранного языка в интерфейсе.
То есть выбираешь язык интерфейса и оттуда дергает переменную чего слать.
Но по ходу в модуле не все норм.
Синтез запрашивает (улетает гет запрос) только на рус.
Я уж и интерфейс переключал - в чате норм на украинском отпечатывает,а молчит упорно.
Попробовал добавить руками переменные языка в конфиг модуля, но пока не але на мове.
Если руками а Яндекс сформировать запрос на Укр - отлично Алиска балакает )
- Ron
- Сообщения: 480
- Зарегистрирован: Пт окт 27, 2017 6:44 pm
- Благодарил (а): 144 раза
- Поблагодарили: 70 раз
Re: Yandex TTS и Алиса на украинском
Да, если интерфейс Украинский, то упорно молчит, даже на Рус не але.
Лучше его (модуль) переделать (там просто, но исходник у Сереги, в ручную его перепахивать,а потом слетит при очередном апдейте, что есть не фонтан)
Нужно выбор языка в ручную выставлять в настройках модуля и 4 штуки в выбор поставить, потому что интерфейс многоязычен,а Яндекс умеет только 4 языка пока.
Пиши пулреквест Сереге
Лучше его (модуль) переделать (там просто, но исходник у Сереги, в ручную его перепахивать,а потом слетит при очередном апдейте, что есть не фонтан)
Нужно выбор языка в ручную выставлять в настройках модуля и 4 штуки в выбор поставить, потому что интерфейс многоязычен,а Яндекс умеет только 4 языка пока.
Пиши пулреквест Сереге

- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 816 раз
Re: Yandex TTS и Алиса на украинском
а остальные языки как тогда сделать - ведь их уже много - надо как то унифицировать все это...Ron писал(а): ↑Вс ноя 04, 2018 6:35 pmДа, если интерфейс Украинский, то упорно молчит, даже на Рус не але.
Лучше его (модуль) переделать (там просто, но исходник у Сереги, в ручную его перепахивать,а потом слетит при очередном апдейте, что есть не фонтан)
Нужно выбор языка в ручную выставлять в настройках модуля и 4 штуки в выбор поставить, потому что интерфейс многоязычен,а Яндекс умеет только 4 языка пока.
Пиши пулреквест Сереге![]()
Спасибо нам ПОМОЖЕТ..!
- Ron
- Сообщения: 480
- Зарегистрирован: Пт окт 27, 2017 6:44 pm
- Благодарил (а): 144 раза
- Поблагодарили: 70 раз
Re: Yandex TTS и Алиса на украинском
Яндекс Speech (синтезировать\распознать и отослать при синтезе звуковой файл) умеет только 4 языка.
Я же дал исходник с Яндекса
Поэтому и говорю, ну пишу, что нужно вставить в настройки модуля Яндекс ТТС выбор языка на каком болтать,а не привязываться (и то привязка косяковая) к выбору языка в интерфейсе.
Тогда Алиска ВСЕГДА будет говорить, не зависимо от выбора языка в интерфейсе.
Вот приблизительно такая наметка как переделать yandex_tts.class.php
Хотя в упор не понимаю, почему Яндекс Speech влупил турецкий. Забашлали что-ли...
Белорусский, Украинский, Чешский и все славянские бы сделали.. Вот дурни...
Я же дал исходник с Яндекса
Можешь сам глянутьСинтез Алиски на Яндексе:
русский
английский
украинский
турецкий
Поэтому и говорю, ну пишу, что нужно вставить в настройки модуля Яндекс ТТС выбор языка на каком болтать,а не привязываться (и то привязка косяковая) к выбору языка в интерфейсе.
Тогда Алиска ВСЕГДА будет говорить, не зависимо от выбора языка в интерфейсе.
Вот приблизительно такая наметка как переделать yandex_tts.class.php
Код: Выделить всё
<?php
class yandex_tts extends module {
function yandex_tts() {
$this->name="yandex_tts";
$this->title="Yandex TTS";
$this->module_category="<#LANG_SECTION_APPLICATIONS#>";
$this->checkInstalled();
}
/**
* saveParams
*
* Saving module parameters
*
* @access public
*/
function saveParams($data=0) {
$p=array();
if (IsSet($this->id)) {
$p["id"]=$this->id;
}
if (IsSet($this->view_mode)) {
$p["view_mode"]=$this->view_mode;
}
if (IsSet($this->edit_mode)) {
$p["edit_mode"]=$this->edit_mode;
}
if (IsSet($this->tab)) {
$p["tab"]=$this->tab;
}
return parent::saveParams($p);
}
/**
* getParams
*
* Getting module parameters from query string
*
* @access public
*/
function getParams() {
global $id;
global $mode;
global $view_mode;
global $edit_mode;
global $tab;
if (isset($id)) {
$this->id=$id;
}
if (isset($mode)) {
$this->mode=$mode;
}
if (isset($view_mode)) {
$this->view_mode=$view_mode;
}
if (isset($edit_mode)) {
$this->edit_mode=$edit_mode;
}
if (isset($tab)) {
$this->tab=$tab;
}
}
/**
* Run
*
* Description
*
* @access public
*/
function run() {
global $session;
$out=array();
if ($this->action=='admin') {
$this->admin($out);
} else {
$this->usual($out);
}
if (IsSet($this->owner->action)) {
$out['PARENT_ACTION']=$this->owner->action;
}
if (IsSet($this->owner->name)) {
$out['PARENT_NAME']=$this->owner->name;
}
$out['VIEW_MODE']=$this->view_mode;
$out['EDIT_MODE']=$this->edit_mode;
$out['MODE']=$this->mode;
$out['ACTION']=$this->action;
$this->data=$out;
$p=new parser(DIR_TEMPLATES.$this->name."/".$this->name.".html", $this->data, $this);
$this->result=$p->result;
}
/**
* BackEnd
*
* Module backend
*
* @access public
*/
function admin(&$out) {
$this->getConfig();
$out['ACCESS_KEY'] = $this->config['ACCESS_KEY'];
$out['SPEAKER'] = $this->config['SPEAKER'];
$out['LANG'] = $this->config['LANGUAGE'];
$out['EMOTION'] = $this->config['EMOTION'];
$out['EMPHASIS'] = $this->config['EMPHASIS'];
$out['DISABLED'] = $this->config['DISABLED'];
switch($this->view_mode) {
case 'update_settings':
global $access_key;
$this->config['ACCESS_KEY'] = $access_key;
global $speaker;
$this->config['SPEAKER'] = $speaker;
global $lang;
$this->config['LANGUAGE'] = $language;
global $emotion;
$this->config['EMOTION'] = $emotion;
global $emphasis;
$this->config['EMPHASIS'] = $emphasis;
global $disabled;
$this->config['DISABLED'] = $disabled;
$this->saveConfig();
$this->redirect('?view_mode=ok');
break;
case 'clear_cache':
array_map('unlink', glob(ROOT.'cms/cached/voice/*_yandex.mp3'));
$this->redirect('?view_mode=ok');
break;
case 'add_emphasis':
global $search_str, $replace_str, $case;
if(!empty($search_str) && !empty($replace_str)) {
if($query = SQLSelectOne("SELECT * FROM `yandex_tts_emphasis` WHERE `search_str` LIKE '".DBSafe($search_str)."'")) {
$query['search_str'] = $search_str;
$query['replace_str'] = $replace_str;
$query['case'] = ($case=='1'?1:0);
if(SQLUpdate('yandex_tts_emphasis', $query)) {
$this->redirect('?view_mode=ok');
} else {
$this->redirect('?view_mode=err');
}
} else {
$query = array();
$query['search_str'] = $search_str;
$query['replace_str'] = $replace_str;
$query['case'] = ($case=='1'?1:0);
if(SQLInsert('yandex_tts_emphasis', $query)) {
$this->redirect('?view_mode=ok');
} else {
$this->redirect('?view_mode=err');
}
}
} else {
$this->redirect('?view_mode=err');
}
break;
case 'delete_emphasis':
global $id;
if(SQLExec('DELETE FROM `yandex_tts_emphasis` WHERE `ID` = '.intval($id))) {
$this->redirect('?view_mode=ok');
} else {
$this->redirect('?view_mode=err');
}
break;
case 'emphasis_clear':
if(SQLExec('TRUNCATE TABLE `yandex_tts_emphasis`')) {
$this->redirect('?view_mode=ok');
} else {
$this->redirect('?view_mode=err');
}
break;
case 'emphasis_import':
if($this->mode == 'update') {
$error = FALSE;
global $file;
if(file_exists($file)) {
$tmp = LoadFile($file);
$lines = mb_split("\n", $tmp);
foreach($lines as $line) {
$line = mb_split(':', $line);
$count = count($line);
if($count == 2 || $count == 3) {
$line[0] = str_replace(':', ':', $line[0]);
$line[1] = str_replace(':', ':', $line[1]);
$line[2] = ($count == 3?intval($line[2]):0);
if($query = SQLSelectOne("SELECT * FROM `yandex_tts_emphasis` WHERE `search_str` LIKE '".DBSafe($line[0])."'")) {
$query['search_str'] = $line[0];
$query['replace_str'] = $line[1];
$query['case'] = ($line[2]==1?1:0);
SQLUpdate('yandex_tts_emphasis', $query);
} else {
$query = array();
$query['search_str'] = $line[0];
$query['replace_str'] = $line[1];
$query['case'] = ($line[2]==1?1:0);
SQLInsert('yandex_tts_emphasis', $query);
}
}
}
$this->redirect('?view_mode=ok');
} else {
$this->redirect('?view_mode=err');
}
}
break;
case 'emphasis_export':
if($emphasis = SQLSelect('SELECT * FROM `yandex_tts_emphasis` ORDER BY `search_str`')) {
$data = '';
foreach($emphasis as $item) {
$item['search_str'] = str_replace(':', ':', $item['search_str']);
$item['replace_str'] = str_replace(':', ':', $item['replace_str']);
$item['case'] = intval($item['case']);
$data .= $item['search_str'].':'.$item['replace_str'].':'.$item['case'].PHP_EOL;
}
header('Content-Disposition: attachment; filename=yandex_tts_export_'.date('d-m-Y_H-i-s').'.dic');
header('Content-Type: text/plain');
die($data);
} else {
$this->redirect('?view_mode=err');
}
break;
case 'ok':
$out['OK'] = 1;
break;
case 'err':
$out['ERR'] = 1;
break;
}
// Show emphasis list
$emphasis = SQLSelect('SELECT * FROM `yandex_tts_emphasis` ORDER BY `search_str`');
foreach($emphasis as $item) {
$out['EMPHASIS_LIST'][] = array(
'ID' => $item['ID'],
'search_str' => htmlspecialchars($item['search_str']),
'replace_str' => htmlspecialchars($item['replace_str']),
'case' => intval($item['case']),
);
}
}
/**
* FrontEnd
*
* Module frontend
*
* @access public
*/
function usual(&$out) {
$this->admin($out);
}
function processSubscription($event, &$details) {
$this->getConfig();
if ($event=='SAY' && !$this->config['DISABLED'] && !$details['ignoreVoice']) {
$level=$details['level'];
$message=$details['message'];
if($this->config['EMPHASIS']) {
$emphasis = SQLSelect('SELECT * FROM `yandex_tts_emphasis`');
foreach($emphasis as $item) {
if($item['case']) {
$message = str_replace($item['search_str'], $item['replace_str'], $message);
} else {
$message = preg_replace_callback('/('.preg_quote($item['search_str'], '/').')/ui', function($match) use($item) {
return $item['replace_str'];
}, $message);
}
}
}
$accessKey=$this->config['ACCESS_KEY'];
$speaker=$this->config['SPEAKER'];
$emotion=$this->config['EMOTION'];
$lang=$this->config['LANGUAGE'];
if ($level >= (int)getGlobal('minMsgLevel') && $accessKey!='')
{
$filename = md5($message) . '_yandex.mp3';
$cachedVoiceDir = ROOT . 'cms/cached/voice';
$cachedFileName = $cachedVoiceDir . '/' . $filename;
$base_url = 'https://tts.voicetech.yandex.net/generate?';
if (!file_exists($cachedFileName))
{
$lang = SETTINGS_SITE_LANGUAGE;
$qs = http_build_query(array('format' => 'mp3', 'lang' => $language, 'speaker' => $speaker, emotion => $emotion, 'key' => $accessKey, 'text' => $message));
try
{
$contents = file_get_contents($base_url . $qs);
}
catch (Exception $e)
{
registerError('yandextts', get_class($e) . ', ' . $e->getMessage());
}
if (isset($contents))
{
CreateDir($cachedVoiceDir);
SaveFile($cachedFileName, $contents);
}
} else {
@touch($cachedFileName);
}
if (file_exists($cachedFileName)) {
playSound($cachedFileName, 1, $level);
$details['ignoreVoice']=1;
processSubscriptions('SAY_CACHED_READY', array(
'level' => $level,
'tts_engine' => 'yandex',
'message' => $message,
'filename' => $cachedFileName,
));
}
}
}
}
/**
* Install
*
* Module installation routine
*
* @access private
*/
function install($data='') {
subscribeToEvent($this->name, 'SAY', '', 10);
parent::install();
}
function dbInstall($data) {
$data = <<<EOD
yandex_tts_emphasis: ID int(10) unsigned NOT NULL auto_increment
yandex_tts_emphasis: search_str text
yandex_tts_emphasis: replace_str text
yandex_tts_emphasis: case boolean NOT NULL DEFAULT FALSE
EOD;
parent::dbInstall($data);
}
function uninstall() {
SQLExec('DROP TABLE IF EXISTS `yandex_tts_emphasis`');
parent::uninstall();
}
}
Белорусский, Украинский, Чешский и все славянские бы сделали.. Вот дурни...
