[Модуль] DLNA (app_dlna)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

fandaymon
Сообщения: 1555
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: [Модуль] DLNA

Сообщение fandaymon » Вт мар 27, 2018 9:01 pm

Hold писал(а):Заработало!
Но есть одно но.
Если в кеше уже есть файл из текстов ранее произнесенных, то четко срабатывает, если нет, то молчит. И в свойство sg('MultiCastKitchen.playUrl',$url); не передает. Например спросил какая погода, в ответ написала Алиса и молчит в DLNA. Тут же опять спрашиваю какая погода, все произносит.

Остался один шаг к победе
А что сейчас стоит в HOOK_EVENT_SAY?
По идее если файла нет, то RHVoice его должен сгенерировать и произнести, а потом обработка голоса должна передаться dlnavoice и тот должен отправить уже существующий файл dlna устройству
Аватара пользователя
lanket
Сообщения: 1168
Зарегистрирован: Вт окт 14, 2014 11:27 pm
Откуда: Санкт-Петербург
Благодарил (а): 260 раз
Поблагодарили: 163 раза

Re: [Модуль] DLNA

Сообщение lanket » Ср мар 28, 2018 8:19 am

Hold писал(а):... .


И еще, если подряд 2 сообщения, то не успев договорить начинает следующее.
А это уже проблема устройств которые воспроизводят аудио файлы. Им подряд приходит команда проиграть вот они и выполняют данную задачу. Они же не знают что играет, например : играет трек длиной в час и вы попросили сменить музыку. В ветке kodi было решение.

вот Нашел


Отправлено с моего Redmi Note 4 через Tapatalk
За это сообщение автора lanket поблагодарили (всего 2):
directman66 (Ср мар 28, 2018 9:41 am) • Hold (Ср мар 28, 2018 7:52 pm)
Рейтинг: 2.33%
Разработка голосового асистента для Мажордомо по любому ключевому слову.
:arrow: Обсужение
:arrow: gitHub 2й версии терминала
:arrow: GitHub модуля для МД
gitHub сырого модуля 2й версии
:arrow: Connect
Rasberry Pi 2, MDM, MySensors. И говорящий апельсин.
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

Re: [Модуль] DLNA

Сообщение directman66 » Ср мар 28, 2018 9:42 am

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

Пока я вручную вставляю паузу, но это точно не наше решение.

Сохраню код на будущее:

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

if (!file_exists($cachedFileName.'.wav'))
{
exec('ffmpeg -i "'.$cachedFileName.'.mp3" -acodec pcm_u8 -ar 22050 "'.$cachedFileName.'.wav"');
// получить инфо об файле
$info = exec('ffmpeg -i "'.$cachedFileName.'.wav"');
$startpos= stripos($info, 'Duration: ');
$time = substr($info,$startpos,8 ); 
$hor = substr($time,0,2);
$min= substr($time,3,5);
$sec= substr($time,6,8);
$long = $hor*3600+$min*60+$sec;
}

А после этого 
//registerError('kodi_notify', $req);
$contents = getURL($req, 0, $login, $password);
sleep($long); 
За это сообщение автора directman66 поблагодарил:
Hold (Ср мар 28, 2018 7:52 pm)
Рейтинг: 1.16%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Ср мар 28, 2018 10:34 am

fandaymon писал(а): А что сейчас стоит в HOOK_EVENT_SAY?
По идее если файла нет, то RHVoice его должен сгенерировать и произнести, а потом обработка голоса должна передаться dlnavoice и тот должен отправить уже существующий файл dlna устройству

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

{"windows_tts":{"filter":""},"telegram":{"filter":"","priority":10},"rhvoice":{"filter":"","priority":50},"dlnavoice":{"filter":""}}
Такое ощущение, что когда dlnavoice ищет файл, он еще не успел записаться в директорию.
directman66 писал(а):Да, по сути этот код нужно добавлять куда-то в обработчик терминала с приоритетами.
Если терминал воспроизводит звук с высшим приоритетом, но нужно дождаться окончания и только после этого выполнять. Вернее обработчик терминала должен понимать, стоит ли прерывать текущий файл.
Моя реализация чуть проще подразумевает.
У меня 4 шт audiocast m5, 3 шт гонят поток в 3 разных помещения, а четвертый как раз для Алисы, на отдельные маленькие колонки сразу в 3 помещения. И даже если что то играет в помещение, Алиса просто воспроизведется через отдельную акустику. Удобно тем, что ее всегда можно заткнуть со сцены одним пальцем. Так же планирую радио реле на разрыв провода к акустике в ней, что бы можно было отключать Алису в любом из трех помещений.
fandaymon
Сообщения: 1555
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: [Модуль] DLNA

Сообщение fandaymon » Ср мар 28, 2018 9:39 pm

Hold писал(а): Такое ощущение, что когда dlnavoice ищет файл, он еще не успел записаться в директорию.
Так и есть - поскольку генерация wav в RHVoice делается в safe_exec, то обработчик продолжает работу и в dlnavoice попадает до возникновения wav. 8-( Можно наверное сделать костыль в модуле RHVoice, если вставить вызов баш-файла \home\pi\voice.sh между генерацией и проигрыванием

safe_exec('echo "' . $message . '" | RHVoice-test -p ' . $voice . ' -o '.$cached_filename . ' && \home\pi\voice.sh ' . '.$cached_filename . ' && mplayer '.$cached_filename, 1, $out);

А в нём установка нужного свойства.

#!/bin/bash

LINE="http://192.168.2.74/$1"

wget -q -T 5 -O - "http://192.168.2.74/objects/?op=set&obj ... l&v=${LINE}"

Т.е. если звук закеширован, то playURL установится в dnlavoice, а если нет - то после генерации установится при помощи баш-файла

Но это всё умозрительно - надо пробовать и смотреть, если какие-то ошибки вылезут
За это сообщение автора fandaymon поблагодарил:
Hold (Ср мар 28, 2018 10:00 pm)
Рейтинг: 1.16%
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Ср мар 28, 2018 9:44 pm

С задержкой воспроизведения след файла на время длительности текущего файла почти получилось. Куда вот теперь sleep($total_seconds); правильно воткнуть? Так как ниже не работает. Сама переменная работает четко и вычисляет время в секундах.

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

function processSubscription($event, &$details) {
        $this->getConfig();
        if ($event == 'SAY' ) {
            $level = $details['level'];
            $message = $details['message'];
            if ($level >= (int) getGlobal('minMsgLevel'))  {
                    $cached_filename = 'cached/voice/rh_' . md5($message) . '.wav';
                    
                   if (file_exists(ROOT . $cached_filename)) {
                          $time = exec("ffmpeg -i " . $cached_filename . " 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");
                        list($hms, $milli) = explode('.', $time);
                        list($hours, $minutes, $seconds) = explode(':', $hms);
                        $total_seconds = ($hours * 3600) + ($minutes * 60) + $seconds;
                        $url='http://192.168.2.74/'.$cached_filename; 
                        sg('MultiCastKitchen.playUrl',$url);
                        sleep($total_seconds);
            DebMes($url,'googlenotifier');
                        
                    } 
             }
          }
     } 
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Ср мар 28, 2018 9:58 pm

Тут понятно.
fandaymon писал(а): safe_exec('echo "' . $message . '" | RHVoice-test -p ' . $voice . ' -o '.$cached_filename . ' && \home\pi\voice.sh ' . '.$cached_filename . ' && mplayer '.$cached_filename, 1, $out);
А тут темный лес для меня, кто такой баш и как его сделать да еще и с свойствами :shock:
fandaymon писал(а): А в нём установка нужного свойства.

#!/bin/bash

LINE="http://192.168.2.74/$1"

wget -q -T 5 -O - "http://192.168.2.74/objects/?op=set&obj ... l&v=${LINE}"
fandaymon
Сообщения: 1555
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: [Модуль] DLNA

Сообщение fandaymon » Ср мар 28, 2018 10:06 pm

баш это аналог виндосовского bat файла

под ssh надо сделать nano /home/pi/voice.sh и скропировать туда 3 строчки. Затем сделать Ctrl+O, подтвердить созранение и Ctrl+X чтобы выйти. Ну или воспользоватся графической оболочкой raspbian и сделать всё тоже самое при помощи редактора текста

Потом надо сделать файлик исполняемым chmod +x /home/pi/voice.sh ну и попробовать запустить

/home/pi/voice.sh полный путь и название wav файла...
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

Re: [Модуль] DLNA

Сообщение directman66 » Чт мар 29, 2018 1:17 pm

Добавил в список задач основного модуля добавление приоритетов файлам, отправляемым в терминалы. https://connect.smartliving.ru/tasks/1.html

"приоритеты отправляемого на терминалы контента"

Голосуйте.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
Hold
Сообщения: 57
Зарегистрирован: Пн окт 16, 2017 4:11 pm
Благодарил (а): 81 раз
Поблагодарили: 5 раз

Re: [Модуль] DLNA

Сообщение Hold » Чт мар 29, 2018 4:00 pm

Hold писал(а): Куда вот теперь sleep($total_seconds); правильно воткнуть?
Спасибо Егору, удалось победить прерывание воспроизведения, когда следует сразу за первым, второе сообщение.

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

function processSubscription($event, &$details) {
    $this->getConfig();
    if ($event == 'SAY' ) {
        if (gg('MultiCastKitchen.doneState') == 0) {
            $level = $details['level'];
            $message = $details['message'];
            if ($level >= (int) getGlobal('minMsgLevel'))  {
                $cached_filename = 'cached/voice/rh_' . md5($message) . '.wav';        
                if (file_exists(ROOT . $cached_filename)) {
                    $time = exec("ffmpeg -i " . $cached_filename . " 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");
                    list($hms, $milli) = explode('.', $time);
                    list($hours, $minutes, $seconds) = explode(':', $hms);
                    $total_seconds = ($hours * 3600) + ($minutes * 60) + $seconds;
                    $url='http://192.168.2.74/'.$cached_filename;
                    sg('MultiCastKitchen.playUrl',$url);
                    DebMes($url,'googlenotifier');
                    sg('MultiCastKitchen.doneState',1);
                sleep($total_seconds);
                    sg('MultiCastKitchen.doneState',0);
                }
            }
            
        }
    }
}
 
Ответить