Страница 1 из 2

Очередь голосовых сообщений

Добавлено: Пт май 18, 2018 12:26 am
directman66
Разработал очередь сообщений, вроде работает но есть некоторые проблемы. Может коллективно допилим скрипт.
Зачем это нужно: при воспроизведении голоса Алисы через сетевые сервисы (dnla, chromecast, google home) предыдущее сообщение прерывается новым. Для создания очереди я создал класс GoogleHome
GoogleHome.txt
(2.4 КБ) 649 скачиваний
И 2 скрипта

sayaddqueue (добавление в очередь)

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

$nf=$params['file'];
$queue=gg('GoogleHome.queue');
if (strlen($queue)<5) {sg('GoogleHome.queue','');}
if ($nf<>"http://192.168.1.39/cms/cached/voice/dingdong.mp3")
{sg('GoogleHome.queue',gg('GoogleHome.queue').";".$nf);}
sayqueue (воспроизведение очереди)

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

require_once('/var/www/lib/getID3/getid3/getid3.php');
if (gg('GoogleHome.runscript')<>1) {
//while (!empty(gg('GoogleHome.queue')))
{
 sg('GoogleHome.runscript',1);
 setTimeout('googlehomerun',"sg('GoogleHome.runscript',0);",1200);
 $queue=gg('GoogleHome.queue');
$files=explode(';',$queue);
$fn=$files[0];

 $ready=gg('GoogleHome.ready');
for ($i = 1; $i <= 10; $i++)
{
 sleep(1);
 if (gg('GoogleHome.ready')==1) {break;};
 sg('GoogleHome.waitready',gg('GoogleHome.ready'));
} 

 $getID3 = new getID3; 
 $rfn='/var/www/cms/cached/voice/'.basename($fn);
  $ThisFileInfo = $getID3->analyze($rfn); 
getid3_lib::CopyTagsToComments($ThisFileInfo);
$filelength=@$ThisFileInfo['playtime_seconds'];
sg('GoogleHome.phraselength',$filelength);
echo $fn.":".$filelength."<br>";

sg('GoogleHome.ready',0);
setTimeout('googlehomeready',"sg('GoogleHome.ready',1);",$filelength+5);
 $cmd='curl -X GET http://192.168.1.39:8091/google-home-notifier?text='.urlencode($fn); 
echo $cmd."<br>";
$answ=shell_exec($cmd);
 
$queue=gg('GoogleHome.queue'); 
echo $answ."<br>";
echo "queue:". $queue."<br><br>"; 
//$newqueue=$queue;
$newqueue=mb_substr($queue,strlen($fn)+1); 
echo  "newqueue:". $newqueue."<br>";  

//$newqueue=ltrim($queue,$rfn);

sg('GoogleHome.queue',$newqueue);
}
 sg('GoogleHome.runscript',0);
clearTimeOut('googlehomerun'); 
}
else {echo "Скрипт уже запущен!!!!";}
Сам процесс добавления файла в очередь через Настройки - Общие настройки -> Обработчики -> Before PlaySound (code):

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

$url='http://192.168.1.39/cms/cached/voice/'.basename($filename); runScript('sayaddqueue', array('file' => $url));
Также библиотеку getid3 нужно положить по адресу /var/www/lib или другой ваш путь
getID3.zip
(1.46 МБ) 157 скачиваний
Есть проблемы, но про них завтра.

Re: Очередь голосовых сообщений

Добавлено: Пт май 18, 2018 6:44 am
directman66
В общем главная проблема, причину которой я понять не могу, когда включается цикл ожидания

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

for ($i = 1; $i <= 10; $i++)
{
 sleep(1);
 if (gg('GoogleHome.ready')==1) {break;};
 sg('GoogleHome.waitready',gg('GoogleHome.ready'));
} 
он отрабатывает весь свой период, т.е. выход по break не производится, так как в момент выполнения цикле gg('GoogleHome.ready') всегда равна 0 и условие if никогда не срабатывает. Даже когда физически gg('GoogleHome.ready') уже равна единице, в цикле оно все еще равно нулю. Пробовал аналогичную конструкцию через while (gg('GoogleHome.ready')==0) {} - результат тот же.

Re: Очередь голосовых сообщений

Добавлено: Пт май 18, 2018 5:35 pm
Logrus
кеширование ( про это на форуме где то писали, но когда сам с таким столкнулся были расхождения, так и не понял), наверное можно как то принудительно свойство обновлять, к примеру прямым запросом к бд
или цикл через секундный таймер с записью в свойство кол. попыток
и т.д.

Re: Очередь голосовых сообщений

Добавлено: Пт май 18, 2018 5:36 pm
lanket
Красава. Я давно писал про эту недоработку. Ее надо в систему внедрить. Помоему тут
/lib/common.class.php обработчики.


Отправлено с моего Redmi Note 4 через Tapatalk


Re: Очередь голосовых сообщений

Добавлено: Пт май 18, 2018 5:42 pm
skysilver
В getGlobal есть кеширование.

Пробуй так:

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

getObject('SomeOblect')->getProperty('SomeProperty'); // без кеширования
или

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

$this->getProperty('SomeProperty'); // без кеширования

Re: Очередь голосовых сообщений

Добавлено: Пт май 18, 2018 5:44 pm
Logrus
во в методах писали что есть а походу нет, через зис

Re: Очередь голосовых сообщений

Добавлено: Пн май 21, 2018 11:06 am
directman66
Сергей написал, что посмотрит и скорее всего дополнит подобным кодом терминалы МД.

Насколько я понимаю, потоковая трансляция должна прерываться отправкой файлов, тогда можно внедрять.

Re: Очередь голосовых сообщений

Добавлено: Пн май 21, 2018 12:20 pm
directman66
Просьба проголосовать за доработку в ядре системы https://connect.smartliving.ru/tasks/1.html за "приоритеты отправляемого на терминалы контента"

Re: Очередь голосовых сообщений

Добавлено: Пн май 21, 2018 12:37 pm
tarasfrompir
Да тут есть у меня такой порядок ....
Первый - необходимо брать уже проигрываемую ссылку в устройстве (толи тв толи какой то файл.) Что решаемо.
2. По идее необходим еще один цикл. - что хуже (как по мне) Но это не проблема. Решаемо. (Нагрузка системы циклами не очень и хорошо).
3. Создать в базе таблицу (ну скажем плейлист_месажес). Что тоже решаемо.
4. Циклом весь плейлист запускать на рендерустройства. Что тоже решаемо...
5. После окончания сообщений возвращать назад пункт 1 . Что тоже решаемо...

Но есть пока один нюанс - НЕОБХОДИМО иметь обратную связь от устройства воспроизведения. А вот это пока проблема...

Re: Очередь голосовых сообщений

Добавлено: Пн май 21, 2018 10:46 pm
directman66
В виду разнообразия устройств, обратная связь не реализуема. Остаётся только вычисляемый метод.
А как вы предлагаете забирать плейлист с устройства?