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

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Пт май 18, 2018 12:26 am

Разработал очередь сообщений, вроде работает но есть некоторые проблемы. Может коллективно допилим скрипт.
Зачем это нужно: при воспроизведении голоса Алисы через сетевые сервисы (dnla, chromecast, google home) предыдущее сообщение прерывается новым. Для создания очереди я создал класс GoogleHome
GoogleHome.txt
(2.4 КБ) 646 скачиваний
И 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 МБ) 156 скачиваний
Есть проблемы, но про них завтра.
За это сообщение автора directman66 поблагодарил:
lanket (Пт май 18, 2018 5:34 pm)
Рейтинг: 1.16%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Пт май 18, 2018 6:44 am

В общем главная проблема, причину которой я понять не могу, когда включается цикл ожидания

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

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) {} - результат тот же.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Пт май 18, 2018 5:35 pm

кеширование ( про это на форуме где то писали, но когда сам с таким столкнулся были расхождения, так и не понял), наверное можно как то принудительно свойство обновлять, к примеру прямым запросом к бд
или цикл через секундный таймер с записью в свойство кол. попыток
и т.д.
Последний раз редактировалось Logrus Пт май 18, 2018 5:41 pm, всего редактировалось 2 раза.
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
lanket
Сообщения: 1168
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 260 раз
Поблагодарили: 163 раза

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

Сообщение lanket » Пт май 18, 2018 5:36 pm

Красава. Я давно писал про эту недоработку. Ее надо в систему внедрить. Помоему тут
/lib/common.class.php обработчики.


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

Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: gitHub 2й версии терминала
:arrow: GitHub модуля для МД
gitHub сырого модуля 2й версии
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Пт май 18, 2018 5:42 pm

В getGlobal есть кеширование.

Пробуй так:

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

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

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

$this->getProperty('SomeProperty'); // без кеширования
За это сообщение автора skysilver поблагодарили (всего 4):
Logrus (Пт май 18, 2018 5:45 pm) • fandaymon (Пт май 18, 2018 6:04 pm) • directman66 (Сб май 19, 2018 10:20 am) • VAndrey (Вт май 22, 2018 10:29 pm)
Рейтинг: 4.65%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Пт май 18, 2018 5:44 pm

во в методах писали что есть а походу нет, через зис
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Пн май 21, 2018 11:06 am

Сергей написал, что посмотрит и скорее всего дополнит подобным кодом терминалы МД.

Насколько я понимаю, потоковая трансляция должна прерываться отправкой файлов, тогда можно внедрять.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Пн май 21, 2018 12:20 pm

Просьба проголосовать за доработку в ядре системы https://connect.smartliving.ru/tasks/1.html за "приоритеты отправляемого на терминалы контента"
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

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

Сообщение tarasfrompir » Пн май 21, 2018 12:37 pm

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

Но есть пока один нюанс - НЕОБХОДИМО иметь обратную связь от устройства воспроизведения. А вот это пока проблема...
Спасибо нам ПОМОЖЕТ..!
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Пн май 21, 2018 10:46 pm

В виду разнообразия устройств, обратная связь не реализуема. Остаётся только вычисляемый метод.
А как вы предлагаете забирать плейлист с устройства?
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Ответить