<<< Back

Проговаривание фраз по два раза


tarasfrompir (2018-11-04 10:47:43):

попробуй онбновись и отпиши результат.. все ли исправилось...

(0)
 
Xor (2018-11-04 11:14:54):

Ты проверку в терминалах поставил только на те ивенты, на которые модуль подписан? Это лишним не будет. Но проблема в том, что после обращения с терминала в системе начинает при say генериться ещё и sayto, что терминалы и обрабатывают (что правильно). Я не понимаю, откуда это SAYTO начинает лезть((

(0)
 
Xor (2018-11-04 11:52:30):

Вот, вроде, нашёл. В функции SAY после запуска processSubscriptionsSafe('SAY', array('level' => $level, 'message' => $ph, 'member_id' => $member_id, 'ignoreVoice'=>$ignoreVoice));
ищутся все терминалы онлайн с дроидом или googlehomenotifier и им рассылается SAYTO:

$terminals=SQLSelect("SELECT NAME FROM terminals WHERE (IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier'");
$total=count($terminals);
for($i=0;$i<$total;$i++) {
sayToSafe($ph, $level, $terminals[$i]['NAME']);
}

Но у меня в терминалах

  1. на момент вызова ещё нет кэшированного файла сообщения, и терминалы формируют кэш через гугл
  2. отправляют этот файл на терминал phone через playMedia($cached_filename, $target, true). У phone не стоит галка Может проигрывать медиа, и раньше сообщения шли на него через tts:.
    Почему у меня в этом случае кэшированный файл гугла на сервере проигрывается ещё не разобрался
(0)
 
tarasfrompir (2018-11-04 12:27:13):

так а с каким типом терминала проблема? или со всеми?

(0)
 
tarasfrompir (2018-11-04 12:32:01):

если с теми двумя типами что ты вспоминал выше, то да это так и есть - тут надо редактировать функцию сей. НО странно то что терминалы на сей функцию не подписаны - и они не должны затрагивать воспроизведение функции сей

(0)
 
Xor (2018-11-04 12:51:30):

Что меня напрягло, что в терминалах хоть и написано // main play instruction with generate message for terminals when not installed TTS идёт рассылка на терминал, у которого не установлена галка Может проигрывать медиа

(0)
 
tarasfrompir (2018-11-04 12:58:05):

не напрягайся я хотел написать что если мы не получаем кешированый файл звука то генерируем свой

(0)
 
tarasfrompir (2018-11-04 14:58:08):

как оказалось DebMes('Total - '.$total);
if (!$total){
DebMes('Total - '.$total);
return;
}
DebMes('Total 1- '.$total);
for($i=0;$i<$total;$i++) {
//sayToSafe($ph, $level, $terminals[$i]['NAME']);
} н
не причем ..

(0)
 
tarasfrompir (2018-11-04 19:32:27):

нашел причину, но не нашел где она работает...
во всем виновата где то команда playMedia
и больше всего в паттернах ПУ

(0)
 
Xor (2018-11-04 21:04:37):

Вот сюда у меня прилетает из терминалов playMedia(гуглофайл,'phone',true), где phone - терминал с дроидом без возможности проигрывания медиа

function playMedia($path, $host = 'localhost', $safe_play = FALSE) {
if(defined('SETTINGS_HOOK_PLAYMEDIA') && SETTINGS_HOOK_PLAYMEDIA != '') {
eval(SETTINGS_HOOK_PLAYMEDIA);
}

if(!$terminal = getTerminalsByName($host, 1)[0]) {  //пробуем найти терминал по имени
    $terminal = getTerminalsByHost($host, 1)[0]; // иначе пробуем через айпи
}

if(!$terminal['ID']) { //не нашли
    $terminal = getTerminalsCanPlay(1)[0]; //возьмём тот, который умеет играть медиа
}

if(!$terminal['ID']) { //не нашли
    $terminal = getMainTerminal(); //возьмём главный терминал
}

if(!$terminal['ID']) { //не нашли
    $terminal = getAllTerminals(1)[0]; //возьмём любой
}

if(!$terminal['ID']) { //не нашли
    return 0; //уйдём ни с чем
}

include_once(DIR_MODULES.'app_player/app_player.class.php');

$player = new app_player();
$player->terminal_id    = $terminal['ID']; //отправим в плеер
$player->command        = ($safe_play?'safe_play':'play');
$player->param          = $path;
$player->ajax           = TRUE;
$player->intCall        = TRUE;
$player->usual($out);

return $player->json['success'];

}

(0)
 
tarasfrompir (2018-11-04 21:12:11):

и меня сюда завели исследования - а вот getMainTerminal() с этим надо бы разобратся - что за главный терминал...

(0)
 
Viktor1 (2018-11-04 21:21:53):

16:37:49 0.36131700 Executing (exclusive): start c:/_majordomo/apps/autoitv3/AutoIt3.exe C:_majordomo\htdocs/rc/scripts/vlc_play.au3 " 'http://192.168.1.22/cms/cached/voice/29 ... google.mp3'"
16:37:47 0.52731400 Executing (exclusive): start c:/_majordomo/apps/autoitv3/AutoIt3.exe C:_majordomo\htdocs/rc/scripts/vlc_close.au3

16:37:42 0.06429000 Executing (exclusive): C:_majordomo\htdocs/rc/madplay.exe C:_majordomo\htdocs/cms/sounds/dingdong.mp3
16:37:41 0.88429000 Терминалы отправили - http://192.168.1.22/cms/cached/voice/29 ... google.mp3
16:37:41 0.05928900 External context response:

Это воспроизводит слово капец (xray) Появилось сие после обновления.Открывается несколько окон VLC и с отставанием повторяет , причем может пол слова .

(0)
 
Viktor1 (2018-11-04 21:28:59):

Если спросить о погоде , откроется до десятка окон VLC и из всех фраз будет повторятся только пару.Похоже на каждую фразу окно VLC.Часть открывается и закрывается сразу, часть висит.

(0)
 
Xor (2018-11-04 21:37:25):

из плейМедиа это передается в апп_плеер
а там проверяется терминал на canplay, и если нет(а в моём случае - нет) -- вызывается главный терминал.
if(!$terminal['CANPLAY']) {
$terminal = getMainTerminal();

И получается мой случай:

Итого:

1.приходит SAY
В этой функции:

  1. формируется processSubscriptionsSafe('SAY'/... это уходит в штатную говорилку отдельным потоком (говорилка начинает готовить кэшированный файл, чтобы его штатно произнести)
  2. по всем терминалам, удовлетворяющем условию SELECT NAME FROM terminals WHERE (IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier' рассылается sayToSafe($ph, $level, $terminals[$i]['NAME']);
    Как я понимаю, это рождает ивент SAYTO через getURLBackground с указанием терминала из п.3
    Это передает в терминал tts фразу, а далее SAYTO и терминал (в моём случае - phone из п.3) обрабатывает модуль Терминалы
    В моём случае
  3. модуль Терминалы, подписанный на SAYTO начинает обработку - ищет кэшированный файл по фразе,
    не находит (говорилка из п.2 ещё не сделала файл),
    просит гугл сделать мп3 из фразы и отправляет в playMedia(гуглофайл,'phone',true)
  4. playMedia отправляет это в app_player
  5. app_player видит, что терминал phone не поддерживает возможность играть, перенаправляет гуглофайл на главный терминал, на котором в это время играется файл от говорилки из п.2.

Когда две тётки - одна штатная оффлайновая Татьяна, а другая - гундосая из Гугла, наперебой лопочут одно и то же -- очень противно!

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

(0)
 
tarasfrompir (2018-11-04 21:54:08):

пункт 3 не запускается продебаж его и удостоверишся...

(0)
 
Xor (2018-11-04 22:24:30):

п.3 отрабатывает
22:18:56 0.93581400 say sayToSafe ph=добрый вечер!! terminal=phone ---- тут в say
22:18:56 0.76280400 sayToSafe $url http://127.0.0.1:80/objects/?sayTo=1&ph=%D0%B4%D0%... --- тут в sayToSafe
22:18:56 0.55179200 Executing (exclusive): C:_majordomo\htdocs/rc/madplay.exe C:_majordomo\htdocs/cms/sounds/dingdong.mp3
22:18:56 0.26677600 cscript to cache C:_majordomo\htdocs/cms/cached/voice/sapi_d2c949ad13f299dd17e861e5623fae88.mp3

(0)
 
Logrus (2018-11-04 22:25:14):

насчет главного, по умолчанию это сервер (MAIN Server (+media: mpd))
https://github.com/sergejey/majordomo/blob/2ac5773...

(0)
 
Xor (2018-11-04 22:32:48):

в сэй добавил
$terminals=SQLSelect("SELECT NAME FROM terminals WHERE (IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier'");
$total=count($terminals);
for($i=0;$i<$total;$i++) {
sayToSafe($ph, $level, $terminals[$i]['NAME']);
debmes('say sayToSafe ph='.$ph.' terminal='.$terminals[$i]['NAME']); //////////////////////////////////////////////////////////
}

в sayToSafe

function sayToSafe($ph, $level = 0, $destination = '') {
$data=array(
'sayTo'=>1,
'ph'=>$ph,
'level'=>$level,
'destination'=>$destination,
);
$url=BASE_URL.'/objects/?'.http_build_query($data);
if (is_array($params)) {
foreach($params as $k=>$v) {
$url.='&'.$k.'='.urlencode($v);
}
}
debmes('sayToSafe $url'.$url); /////////////////////////////////////////////////////////////////
$result = getURLBackground($url,0);
return $result;

(0)
 
Xor (2018-11-04 22:36:45):

to Logrus
ну да. У меня на нем проигрываются все сообщения say, а теперь туда по описанной логике перенаправляется воспроизведение для терминала phone без медиа(((

(0)
 
tarasfrompir (2018-11-04 22:38:30):

так это у тебя терминал с дроид апи и или гуглхомнотифиер?

(0)
 
Xor (2018-11-04 22:40:07):

Заметил, что есть два
\htdocs\lib\terminals.class.php
и
\htdocs\modules\terminals\terminals.class.php

(0)
 
tarasfrompir (2018-11-04 22:45:28):

в lib это лишнее уже давно...
вставь в \htdocs\modules\terminals\terminals.class.php
вместо - DebMes ('Терминалы отправили - '.$cached_filename);
playMedia($cached_filename, $target, true);
это и попробуй

 $terminals=SQLSelect("SELECT ID FROM terminals WHERE NAME = "'.$target.'" AND ((IS_ONLINE=1 AND MAJORDROID_API=1) OR PLAYER_TYPE='googlehomenotifier'"));
 if ($terminals){
     return;
 }
     DebMes ('Терминалы отправили - '.$cached_filename);
     playMedia($cached_filename, $target, true);
(0)
 
tarasfrompir (2018-11-04 22:46:32):

Ой SQLSelect замени на SQLSelectOne

(0)
 
Xor (2018-11-04 22:47:48):

то tarasfrompir (2018-11-04 22:38:30)
да, у меня терминал с дроид, без возможности проигрывать медиа.
И сейчас на него приходит tts для проговаривания + из терминалов на него через плэймедиа() шлётся гуглофайл мп3, который перенаправляется в апп_плеере на МЭЙН )))
Может, в терминалах сделать, чтобы гуглофайл или кэш рассылался только на те терминалы, у которых нет дроида(они не проговаривают tts) и у которых есть возможность проигрывать медиа?

(0)
 
tarasfrompir (2018-11-04 22:51:33):

согласен вполне - но я еще одну ошибку отлавливал и она связана с патернами ПУ....
Ну а это что у тебя - да ....
Опробуй предложенные изменения выше и если все исчезнет - то подам реквест...
Ато у меня не на чем опробовать...

(0)
 
Xor (2018-11-04 22:51:47):

то tarasfrompir (2018-11-04 22:45:28):
Это будет работать, если такой терминал один(( Но мысль верная.

Повторюсь:
Может, в терминалах сделать, чтобы гуглофайл или кэш рассылался только на те терминалы, у которых нет дроида(они не проговаривают tts) и у которых есть возможность проигрывать медиа?

Вроде, логично?

(0)
 
tarasfrompir (2018-11-04 22:56:34):

по большому счету надо из функции сей выпилить рассылку на терминалы ...
Но давай не будем заглядывать далеко -
и еще поскольку каждый терминал отрабатывает в цикле -то достаточно таких изменений... что предложены выше...
поэтому прошу еще раз - опробуй такие изменения - и если все окей то буду реквестить...

(0)
 
Xor (2018-11-04 23:14:45):

предлагаю в терминалы добавить
//...
// check the level message for nigth or darknest mode
if ( $minMsgLevel >= $levelMes ){
//add this
//предполагается, что терминал приходит именем или хостом
if(!$terminal = getTerminalsByName($target, 1)[0]) {
$terminal = getTerminalsByHost($target, 1)[0];
}
//если терминал не найден или с дроидом или не может играть медиа выход
if(!$terminal[ID] || $terminal[MAJORDROID_API]==1 || $terminal[CANPLAY] == 0) {
return;
}
//...

(1)
 
Xor (2018-11-05 00:32:42):

Исправление применил, восстановил подписку терминалов на SAYTO, перезагрузился, тестирую, пока всё ок.

(0)
 
tarasfrompir (2018-11-05 08:18:04):

кстати по твоему красивше написано - это и вставлю - но вот по скорости обработки данных данный вариант тяжелее поскольку делает как минимум два запроса в базу - а мой только один. что в общем на оптимизацию всего мажордомо плохо сказывается..... я думаю что уже для всяких малинок-калинок вопрос должен начинать подниматся. поскольку оптимизация желает оставлять лучшего... НО это мысли в слух - поскольку сам писатель еще тот

(1)
 
Logrus (2018-11-05 08:32:32):

Тарас, но мы же не сдадимся ;)

(0)
 
tarasfrompir (2018-11-05 08:36:14):

никогда и ни за что - кроме как победим - тогда сдадимся - но об этом можна и не мечтать

(0)
 
tarasfrompir (2018-11-05 10:04:34):

реквест принят - опробуйте

(1)
 
Xor (2018-11-05 16:04:57):

Ок, попробую.
Второй запрос - на случай, если терминал айпишником пришёл. А так - тоже один))

(0)
 
Sas (2018-11-12 15:23:56):

А можно вообще в терминалы засылать minMsgLevel на sayReply/sayTo?
Что бы там уже смотреть говорить или просто текст выводить?
У меня сейчас все терминалом болтается и это никак не отключить
Вроде в новой альфе появилась настройка уровня, но "автоматом" ее менять не получается и
она не шлет даже в текст в терминалы при "не том уровне"

(0)
 
tarasfrompir (2018-11-12 15:41:51):

ну если вам не нужно воспроизводить а только в чат - то пользуйте простой сей

(0)
 
Sas (2018-11-12 16:21:53):

Мне надо воспроизводить на терминале так как терминал единственное средство общение с системой
А сейчас если что то спросить даже через телегу оно приезжает и в телегу, и текстом на терминал + голос туда же

(0)
 

Please login to leave comments. Join us!