Страница 18 из 26
Re: [Модуль] DLNA
Добавлено: Вт мар 27, 2018 9:01 pm
fandaymon
Hold писал(а):Заработало!
Но есть одно но.
Если в кеше уже есть файл из текстов ранее произнесенных, то четко срабатывает, если нет, то молчит. И в свойство sg('MultiCastKitchen.playUrl',$url); не передает. Например спросил какая погода, в ответ написала Алиса и молчит в DLNA. Тут же опять спрашиваю какая погода, все произносит.
Остался один шаг к победе
А что сейчас стоит в HOOK_EVENT_SAY?
По идее если файла нет, то RHVoice его должен сгенерировать и произнести, а потом обработка голоса должна передаться dlnavoice и тот должен отправить уже существующий файл dlna устройству
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 8:19 am
lanket
Hold писал(а):... .
И еще, если подряд 2 сообщения, то не успев договорить начинает следующее.
А это уже проблема устройств которые воспроизводят аудио файлы. Им подряд приходит команда проиграть вот они и выполняют данную задачу. Они же не знают что играет, например : играет трек длиной в час и вы попросили сменить музыку. В ветке kodi было решение.
вот Нашел
Отправлено с моего Redmi Note 4 через Tapatalk
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 9:42 am
directman66
Да, по сути этот код нужно добавлять куда-то в обработчик терминала с приоритетами.
Если терминал воспроизводит звук с высшим приоритетом, но нужно дождаться окончания и только после этого выполнять. Вернее обработчик терминала должен понимать, стоит ли прерывать текущий файл.
Пока я вручную вставляю паузу, но это точно не наше решение.
Сохраню код на будущее:
Код: Выделить всё
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);
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 10:34 am
Hold
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 помещения. И даже если что то играет в помещение, Алиса просто воспроизведется через отдельную акустику. Удобно тем, что ее всегда можно заткнуть со сцены одним пальцем. Так же планирую радио реле на разрыв провода к акустике в ней, что бы можно было отключать Алису в любом из трех помещений.
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 9:39 pm
fandaymon
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, а если нет - то после генерации установится при помощи баш-файла
Но это всё умозрительно - надо пробовать и смотреть, если какие-то ошибки вылезут
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 9:44 pm
Hold
С задержкой воспроизведения след файла на время длительности текущего файла почти получилось. Куда вот теперь 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');
}
}
}
}
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 9:58 pm
Hold
Тут понятно.
fandaymon писал(а):
safe_exec('echo "' . $message . '" | RHVoice-test -p ' . $voice . ' -o '.$cached_filename . ' && \home\pi\voice.sh ' . '.$cached_filename . ' && mplayer '.$cached_filename, 1, $out);
А тут темный лес для меня, кто такой баш и как его сделать да еще и с свойствами
Re: [Модуль] DLNA
Добавлено: Ср мар 28, 2018 10:06 pm
fandaymon
баш это аналог виндосовского bat файла
под ssh надо сделать nano /home/pi/voice.sh и скропировать туда 3 строчки. Затем сделать Ctrl+O, подтвердить созранение и Ctrl+X чтобы выйти. Ну или воспользоватся графической оболочкой raspbian и сделать всё тоже самое при помощи редактора текста
Потом надо сделать файлик исполняемым chmod +x /home/pi/voice.sh ну и попробовать запустить
/home/pi/voice.sh полный путь и название wav файла...
Re: [Модуль] DLNA
Добавлено: Чт мар 29, 2018 1:17 pm
directman66
Добавил в список задач основного модуля добавление приоритетов файлам, отправляемым в терминалы.
https://connect.smartliving.ru/tasks/1.html
"приоритеты отправляемого на терминалы контента"
Голосуйте.
Re: [Модуль] DLNA
Добавлено: Чт мар 29, 2018 4:00 pm
Hold
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);
}
}
}
}
}