для тех, кто использует модуль Win TTS

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

Модератор: immortal

Ответить
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

для тех, кто использует модуль Win TTS

Сообщение xor » Вс май 20, 2018 4:42 pm

Вызов говорилки происходит из файла windows_tts.class.php

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

   174:         safe_exec('cscript ' . DOC_ROOT . '/rc/sapi.js ' . $message, 1, $level);
видим, что вызывается скрипт sapi.js с параметром, представляющим собой сообщение, которое и нужно проговорить
Смотрим скрипт, избавляемся от лишнего.
У меня получилось так:

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

if (WScript.Arguments.length == 0) {
    WScript.Arguments.ShowUsage();
    WScript.Quit();
}
var text = new Array();
for (var i=0; i<WScript.Arguments.Unnamed.Count; i++){
      text.push(WScript.Arguments.Unnamed(i));
    }
     var sv = WScript.CreateObject("SAPI.SpVoice");
     sv.WaitUntilDone(-1); 
     sv.speak(text.join(' '),0);

Как я понял, вся лишняя шняга в этом скрипте из-за попытки сохранения голоса в файлы mp3. Хвосты перекочевали в sapi.js из sapi_cached.js.
Логика там, видимо, такая:
пришла фраза проговорить, от нее считается хэш и ищется готовый файл, в имени которого этот хэш содержится.
Если такого файла нет,
1.говорим фразу
2.говорим эту фразу в файл с именем хэша (sapi_07cc694b9b3fc636710fa08b6922c42b.wav)
3.конвертим wav в mp3
Чтобы этот механизм заработал, нужно поменять имя скрипта sapi_cached.js на sapi.js (чтобы не править windows_tts.class.php, хотя и так, и так продержится до первого обновления)
Сейчас в sapi_cached.js не удаляются wav и присутствуют не понятные мне команды типа
strCommand = "@copy /B \"" + strMp3FileName + "\" + ,, \"" + strMp3FileName + "\"";

зы. в гит отписал
ззы. win7 IVONA 2 Tatyana - Russian female voice [22kHz] sapi5
Последний раз редактировалось xor Сб май 26, 2018 10:03 am, всего редактировалось 1 раз.
За это сообщение автора xor поблагодарил:
tarasfrompir (Ср май 23, 2018 9:37 pm)
Рейтинг: 1.16%
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: для тех, кто использует модуль Win TTS

Сообщение Gelezako » Пн май 21, 2018 9:16 pm

не хочет почему-то у меня в папке htdocs\cms\cached\voice сохранять файлы :(
платформа венда, ТТС тоже Ивона
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: для тех, кто использует модуль Win TTS

Сообщение xor » Вт май 22, 2018 11:06 pm

Поправил скрипт для кэширования:

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

///// фрагмент с основной логикой без вспомогательных функций
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;
 fnMD5 = MD5(text.join(' ')); //найдем хэш
 strWavFileName = scriptPath+'/../cms/cached/voice/sapi_'+fnMD5+'.wav';
 strMp3FileName = scriptPath+'/../cms/cached/voice/sapi_'+fnMD5+'.mp3';
 //WScript.Echo(strWavFileName);
 var wShell = WScript.CreateObject("Wscript.Shell");
   if (!fso.FileExists(strMp3FileName)) {//no cached file, make it!

    var sv = WScript.CreateObject("SAPI.SpVoice");
    var oFilestream = WScript.CreateObject("SAPI.SpFileStream");
                  
    sv.WaitUntilDone(-1);    // Don't be loud
 
    WScript.Echo("speak to file");

    //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
    fso.DeleteFile(strWavFileName,true);

   } 
    //play mp3  -- общая часть 
    WScript.Echo("play file");
    var strCommand = scriptPath+"/madplay.exe \"" + strMp3FileName+"\"";
    wShell.run(strCommand, 0, true); //WaitUntilDone

Можно приложенным файлом заменить текущий sapi.js и попробовать что-то сказать Алисой два раза. После первого раза должен появиться файлик в кэше вида sapi_XXX..md5..XXXXXX.mp3

Можно сначала потренироваться в консоли:

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

C:\_majordomo\htdocs\rc>cscript.exe  c:\_majordomo\htdocs\rc\sapi_cached_my.js привет валет 0
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

speak to file
play file

C:\_majordomo\htdocs\rc>cscript.exe  c:\_majordomo\htdocs\rc\sapi_cached_my.js привет валет 0
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

play file

C:\_majordomo\htdocs\rc>
Вложения
sapi_cached_my.js
(9.26 КБ) 512 скачиваний
Ответить