Xor

 
<<< Назад

Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений

Из коробки winTTS не кэширует голосовые сообщения, чем, как я думаю, выбивается из мейнстрима Мажордомо. Предлагается решение, устраняющее эту несправедливость.
ps. Устарело, всё внедрено Сергеем в штатный функционал

Небольшая правка нескольких файлов позволяет создавать пользователям winTTS кэш голосовых сообщений, позволяющий так же как и обладателям Яндекса, Гугла и RHVoice, например, слать аудиофайлы на терминалы и т.п.

При установке на Вин-систему для работы с winTTS устанавливаются два файла c:\_majordomo\htdocs\rc\sapi.js и c:\_majordomo\htdocs\rc\sapi_cached.js.
Первый из которых "тупо" проговаривает все фразы, а второй - более сложный -- кэширует новый файл в '/cms/cached/voice/sapi_md5($message).mp3 и повторяющиеся фразы проговаривает уже из кэша.

Обидно, что в windows_tts.class.php, отвечающем за winTTS-говорилку, жёстко прописана ссылка только на файл sapi.js:

 safe_exec('cscript ' . DOC_ROOT . '/rc/sapi.js ' . $message, 1, $level);

Я сначала просто переименовывал sapi_cached.js в sapi.js и winTTS начинала кэшировать файлы.
Спустя какое-то время стали приходить всякие дурацкие мысли насчет того, как улучшить то, что и так работает:
скрипт на js сам считал md5($message), мучительно и на трех страницах эмулируя пхпшную функцию. Заставил считать это в windows_tts.class.php и передавать в скрипт параметром.

Вот измененный файл sapi.js:

if (WScript.Arguments.length == 0) {
    WScript.Quit();
 }
var fnMD5 = '';
if (WScript.Arguments.Named.Exists("md5"))
  fnMD5 = WScript.Arguments.Named("md5"); 
  var text = new Array();
for (var i=0; i<WScript.Arguments.Unnamed.Count; i++)
    text.push(WScript.Arguments.Unnamed(i));
 var fso = new ActiveXObject("Scripting.FileSystemObject"); 
 var scriptPath = fso.GetFile(WScript.ScriptFullName).ParentFolder;
 strWavFileName = scriptPath+'/../cms/cached/voice/sapi_'+fnMD5+'.wav';
 strMp3FileName = scriptPath+'/../cms/cached/voice/sapi_'+fnMD5+'.mp3';
 var wShell = WScript.CreateObject("Wscript.Shell");
   if (!fso.FileExists(strMp3FileName)) {//no cached file
    var sv = WScript.CreateObject("SAPI.SpVoice");
    var oFilestream = WScript.CreateObject("SAPI.SpFileStream");
      sv.WaitUntilDone(-1);    // Don't be loud
     //save to wav
    oFilestream.Open(strWavFileName, 3, false);
    sv.AudioOutputStream = oFilestream;
    sv.speak(text.join(' '),0);
    oFilestream.close();
    //convert wav to mp3
    var strCommand = scriptPath+"/lame.exe -V0 "+strWavFileName+" "+strMp3FileName;
    wShell.run(strCommand, 0, true); //WaitUntilDone
    //delete wav
    if(fso.FileExists(strWavFileName)){
     fso.DeleteFile(strWavFileName,true);
    }
   } 
//play mp3 
var strCommand = scriptPath+"/madplay.exe \"" + strMp3FileName+"\"";
wShell.run(strCommand, 0, true);

А вот изменения в windows_tts.class.php:

function processSubscription($event, &$details)
{
    $this->getConfig();

    if ($event == 'SAY' && !$this->config['DISABLED'] && (!$details['ignoreVoice']))
    {
         $level = $details['level'];
         $message = $details['message'];
         $mmd5 = md5($message); //добавили сюда расчет md5 сообщения
         if ($level >= (int)getGlobal('minMsgLevel') && IsWindowsOS())
         {
                //safe_exec('cscript ' . DOC_ROOT . '/rc/sapi.js ' . $message, 1, $level); //закомментим то, что было
                safe_exec('cscript ' . DOC_ROOT . '/rc/sapi.js /md5:' .$mmd5.' ' . $message, 1, $level); //добавим вызов нашего скрипта с новым параметром md5
                $details['ignoreVoice'] = 1;
         }
    }
}

У меня это работает уже месяц. Полёт нормальный.
Если народу понравится, буду оформлять пулл реквест.

ps. Устарело, всё внедрено Сергеем в штатный функционал

Обсуждение (6) (6)

Смотрите так же:
12.02.2024 Китайская панель в подрозетник с экраном 480*480
29.10.2023 MQTT в МДМ - способ обработки топика через метод
03.04.2023 Todoer: обмен данными с Яндекс календарём
31.03.2023 Todoer: календарь на год
30.03.2023 Todoer: анонс + программное создание задачи
08.05.2022 Глобальный поиск - добавление своих сущностей. Upd Внедрено
05.01.2022 Яндекс Лампочка в Yandex Devices - добавление сцен
18.04.2021 Переезд на мастер спустя год
24.03.2021 Ещё о старте/остановке МДМ в Винде
18.02.2021 Модуль Todoer
06.01.2021 Для виндузятников - перенос бд на рам-диск
22.11.2020 Календарь-планировщик
01.08.2020 Irbis как терминал
18.05.2020 Китайская камера rtsp + vlc как перекодировщик для html
12.05.2020 Опыт интеграции МДМ с Я.Алисой ещё одним способом - без белого адреса, москита, ПУ.(дополнено)
07.05.2020 Поправим формат даты в Панели управления
11.04.2020 Баловство с шаблонами
26.03.2020 Простые правила - вариант модуля. ч. 2
25.03.2020 Простые правила - вариант модуля
20.12.2019 расширение средств работы с events updated
20.11.2019 По следам наших выступлений - сколько мы наэкономили?
04.11.2019 Группа как объект - экономим на коде - 2
26.10.2019 Прикручиваем Grafana к Мажордому
11.10.2019 Группа как объект - экономим на коде
25.09.2019 Если у вас нет телеги...
11.09.2019 Датчик присутствия из ип камеры
30.07.2019 Win-платформа-замена ffmpeg для получения скриншотов из rstp - потока
24.06.2019 Форматированный отчет в телеграм - имитация таблицы
30.04.2019 Используем зомбо-ящик в Мажордомо
24.03.2019 О среднем в Мажордомо
16.09.2018 Перезагрузка Мажордомо в Win-системах

Домодедово, Россия

На форуме: xor