Страница 18 из 26

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

Добавлено: Сб ноя 25, 2017 4:20 pm
maximuszar
Здравствуйте. МЖД установлен на ноутбуке ОС "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);"

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

Добавлено: Вс ноя 26, 2017 11:05 pm
sergejey
ChromeGateMJD произносит используя установленный на компьютере синтезатор, а не тот, который используется на сервере, так что вполне могут быть "разночтения" в результатах синтеза речи.

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

Добавлено: Пн ноя 27, 2017 1:23 am
xor
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;
}

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

Добавлено: Пн ноя 27, 2017 6:02 am
maximuszar
Синтезатор речи что на сервере, что на терминале "RHVoice", но может быть есть разница для Win и Linux. При вставке текста "Температура на улице 21 градус" в настройках синтезатора в Win, произношение правильное. На днях пробовал менять код шаблона, и чудо произошло Алиса стала говорить нормально. Вернул код к изначальному виду, все хорошо. Но, не долго музыка играла, недолго фраер танцевал, при добавлении в код еще 2-х. температур, произношение опять неправильное. Удаляю добавленные температуры, меняю код, но увы... Через отладку расширения нашел сообщение которое отправляет сервер, декодировал его думая что передается лишний знак типа больше или меньше "двух" или "двадцати", но нет, сообщение без лишних символов. Остается поменять голоса в синтезаторе, и сам синтезатор. По результатам отпишусь. Спасибо за участие.

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

Добавлено: Пн ноя 27, 2017 9:49 am
maximuszar
Дело было не в бобине, дол... сидел в кабине. Проблема оказалась в синтезаторе который устанавливается в расширении ChromeGateMJD, а именно синтезатор "Google русский". Только вот теперь проблема в том, что кроме гугла и Microsoft Irina Decktop(очень противный голос) выбрать ничего нельзя, при этом в настройках системы голосов много и как их прикрутить к ChromeGateMJD непонятно. Ещё раз спасибо за советы.

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

Добавлено: Вт ноя 28, 2017 2:32 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 (Только с этой версией начала говорить в терминале)

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

Добавлено: Чт ноя 30, 2017 6:46 am
maximuszar
Все оказалось намного проще. Дело было в версии "RHVoice". Наивно пологая что версия 0.4а свежее, установил ее на терминал и поэтому в ChromeGateMJD синтезаторы только дефолтные. Установил версию 0.2.161 и все заработало. Всем спасибо.

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

Добавлено: Сб дек 09, 2017 1:38 pm
koloboc74
Добрый день, у меня тоже после обновления отказала Алиса говорить , пришлось искать в чем проблема , ChromeGateMJD 1.3.1 , вычислил ,что в этой версии стоит в файле main строка 52 baseAddress = baseAddress + ':8001';, а в старых версиях где Алиса говорила serverUrl += "//" + Storage.local('address', i18n('settings.address.default')) + ':8002/majordomo'; адрес. После замены на 8002 порт Алиса ожила. Может в этом проблема.

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

Добавлено: Пт дек 29, 2017 12:29 am
ledmax
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 , терминал на винде

Версия андройд приложения из плеймаркета тоже молчала. Заговорила тестовая версия

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

Добавлено: Пт янв 12, 2018 12:48 pm
vitt76
Сергей, повторю вопрос, продолжает быть актуальным.
Друзья, и все же, как заставить систему говорить только через основной терминал 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); - не отвечает никто
Как быть?