Новое в работе с терминалами, sayTo, sayReply

Новые релизы, обновления и т.п.

Модератор: immortal

maximuszar
Сообщения: 5
Зарегистрирован: Сб окт 14, 2017 2:16 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение maximuszar » Сб ноя 25, 2017 4:20 pm

Здравствуйте. МЖД установлен на ноутбуке ОС "Ubuntu Server 16.04.3", терминал на другом ноуте на Win 10 x64. Модуль TTS "RHVoice" (и там и там). При озвучке температур с датчиков DS18B20 Алиса через ChromeGateMJD произносит "двух градуса" вместо "два градуса", "двадцати градусов" вместо "двадцать градусов".

Код: Выделить всё

"$status="";
$status="Температура на улице ".gg("Temp_Ulica.Value")." градуса";
say($status,1);"
При этом на сервере произношение правильное.
Сделал шаблон для проверки произношения цифр, произносит правильно

Код: Выделить всё

"say("1 2 3 4 5 6 7 8 9",1);"
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение sergejey » Вс ноя 26, 2017 11:05 pm

ChromeGateMJD произносит используя установленный на компьютере синтезатор, а не тот, который используется на сервере, так что вполне могут быть "разночтения" в результатах синтеза речи.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение xor » Пн ноя 27, 2017 1:23 am

maximuszar писал(а):$status="Температура на улице ".gg("Temp_Ulica.Value")." градуса";
Судя по коду, при +5, сервер должен сказать "Температура на улице Пятого градуса"))

Можно формировать строку для проблемного терминала уже с правильным склонением и переводом числа в строку, типа (тут для денег, но можно переделать для градусов)

Код: Выделить всё

/**
 * Возвращает сумму прописью
 * @author runcore
 * @uses morph(...)
 */
function num2str($num) {
    $nul='ноль';
    $ten=array(
        array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
        array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
    );
    $a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
    $tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
    $hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
    $unit=array( // Units
        array('копейка' ,'копейки' ,'копеек',     1),
        array('рубль'   ,'рубля'   ,'рублей'    ,0),
        array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
        array('миллион' ,'миллиона','миллионов' ,0),
        array('миллиард','милиарда','миллиардов',0),
    );
    //
    list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
    $out = array();
    if (intval($rub)>0) {
        foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
            if (!intval($v)) continue;
            $uk = sizeof($unit)-$uk-1; // unit key
            $gender = $unit[$uk][3];
            list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
            // mega-logic
            $out[] = $hundred[$i1]; # 1xx-9xx
            if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
            else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
            // units without rub & kop
            if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
        } //foreach
    }
    else $out[] = $nul;
    $out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
    $out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
    return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
}

/**
 * Склоняем словоформу
 * @ author runcore
 */
function morph($n, $f1, $f2, $f5) {
    $n = abs(intval($n)) % 100;
    if ($n>10 && $n<20) return $f5;
    $n = $n % 10;
    if ($n>1 && $n<5) return $f2;
    if ($n==1) return $f1;
    return $f5;
}
maximuszar
Сообщения: 5
Зарегистрирован: Сб окт 14, 2017 2:16 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение maximuszar » Пн ноя 27, 2017 6:02 am

Синтезатор речи что на сервере, что на терминале "RHVoice", но может быть есть разница для Win и Linux. При вставке текста "Температура на улице 21 градус" в настройках синтезатора в Win, произношение правильное. На днях пробовал менять код шаблона, и чудо произошло Алиса стала говорить нормально. Вернул код к изначальному виду, все хорошо. Но, не долго музыка играла, недолго фраер танцевал, при добавлении в код еще 2-х. температур, произношение опять неправильное. Удаляю добавленные температуры, меняю код, но увы... Через отладку расширения нашел сообщение которое отправляет сервер, декодировал его думая что передается лишний знак типа больше или меньше "двух" или "двадцати", но нет, сообщение без лишних символов. Остается поменять голоса в синтезаторе, и сам синтезатор. По результатам отпишусь. Спасибо за участие.
maximuszar
Сообщения: 5
Зарегистрирован: Сб окт 14, 2017 2:16 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение maximuszar » Пн ноя 27, 2017 9:49 am

Дело было не в бобине, дол... сидел в кабине. Проблема оказалась в синтезаторе который устанавливается в расширении ChromeGateMJD, а именно синтезатор "Google русский". Только вот теперь проблема в том, что кроме гугла и Microsoft Irina Decktop(очень противный голос) выбрать ничего нельзя, при этом в настройках системы голосов много и как их прикрутить к ChromeGateMJD непонятно. Ещё раз спасибо за советы.
ilenkiv
Сообщения: 1
Зарегистрирован: Вт ноя 28, 2017 2:05 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение ilenkiv » Вт ноя 28, 2017 2:32 am

Возможно это уже не актуально , но хочу поделиться как я заставил MJD(MajorDomo) разговаривать в терминале.
У меня после какого-то обновления MJD отказывался разговаривать. Использов плагин в хроме (CromeGateMJD).

1. Остановил MJD на сервере и добавил правки
В файле \_majordomo\htdocs\lib\hooks.inc.php нужно изменить строку 71:
//postToWebSocketQueue($event_name, $details, 'PostEvent');
postToWebSocket($event_name, $details, 'PostEvent');
Запустил MJD.

2. Удалил плагин из хрома. Скачав новий плагін https://crx.dam.io/ext/omhmgbciiabipomm ... ngipi.html
РОБОЧА ВЕРСІЯ 1.2.0 - 188.9 (Только с этой версией начала говорить в терминале)
За это сообщение автора ilenkiv поблагодарил:
ledmax (Пт дек 29, 2017 12:27 am)
Рейтинг: 1.16%
maximuszar
Сообщения: 5
Зарегистрирован: Сб окт 14, 2017 2:16 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение maximuszar » Чт ноя 30, 2017 6:46 am

Все оказалось намного проще. Дело было в версии "RHVoice". Наивно пологая что версия 0.4а свежее, установил ее на терминал и поэтому в ChromeGateMJD синтезаторы только дефолтные. Установил версию 0.2.161 и все заработало. Всем спасибо.
koloboc74
Сообщения: 12
Зарегистрирован: Сб дек 09, 2017 1:31 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение koloboc74 » Сб дек 09, 2017 1:38 pm

Добрый день, у меня тоже после обновления отказала Алиса говорить , пришлось искать в чем проблема , ChromeGateMJD 1.3.1 , вычислил ,что в этой версии стоит в файле main строка 52 baseAddress = baseAddress + ':8001';, а в старых версиях где Алиса говорила serverUrl += "//" + Storage.local('address', i18n('settings.address.default')) + ':8002/majordomo'; адрес. После замены на 8002 порт Алиса ожила. Может в этом проблема.
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение ledmax » Пт дек 29, 2017 12:29 am

ilenkiv писал(а):Возможно это уже не актуально , но хочу поделиться как я заставил MJD(MajorDomo) разговаривать в терминале.
У меня после какого-то обновления MJD отказывался разговаривать. Использов плагин в хроме (CromeGateMJD).

1. Остановил MJD на сервере и добавил правки
В файле \_majordomo\htdocs\lib\hooks.inc.php нужно изменить строку 71:
//postToWebSocketQueue($event_name, $details, 'PostEvent');
postToWebSocket($event_name, $details, 'PostEvent');
Запустил MJD.

2. Удалил плагин из хрома. Скачав новий плагін https://crx.dam.io/ext/omhmgbciiabipomm ... ngipi.html
РОБОЧА ВЕРСІЯ 1.2.0 - 188.9 (Только с этой версией начала говорить в терминале)

Подтверждаю, что после этих манипуляций терминал заговорил.
Сервер на малинке 3 , терминал на винде

Версия андройд приложения из плеймаркета тоже молчала. Заговорила тестовая версия
Аватара пользователя
vitt76
Сообщения: 372
Зарегистрирован: Вс апр 09, 2017 2:36 pm
Благодарил (а): 101 раз
Поблагодарили: 51 раз

Re: Новое в работе с терминалами, sayTo, sayReply

Сообщение vitt76 » Пт янв 12, 2018 12:48 pm

Сергей, повторю вопрос, продолжает быть актуальным.
Друзья, и все же, как заставить систему говорить только через основной терминал main? У меня там апельсин и никаких DroidAPI нет.
Если использовать SayReply():
http://localhost/command.php?qry=привет&terminal=main - отвечают все терминалы
http://localhost/command.php?qry=привет&terminal=pad - отвечает только pad
http://localhost/command.php?qry=привет&terminal=fake - отвечают все терминалы
далее, если SayTo():
SayTo("тут ответ", 2, pad); - отвечает только pad
SayTo("тут ответ", 2, main); - не отвечает никто
Как быть?
Broadlink + Orange Pi PC ARMBIAN 5.31
Ответить