Скрипты для Demagog
WFilter (указываю путь к словарю rex) и RexRepl (правила считываю в переменную из того же словаря) в плане скорости между ними?
* проблему с кодировкой юникод в RexRepl при сравнении в расчет брать не будем.
Код: Выделить всё
function IndexFilterToAll(folder, mask, diclist)
IgnoreDicPan()
local b, d, p, mode
local k = #folder
if string.sub(folder,k,k) ~= '/' and string.sub(folder,k,k) ~= '\\' then
folder = folder..'\\'
end
local a = AllFiles(folder,mask)
for i = 1,#a do
WOpen(0,folder..a[i])
--создание SPEEDOMOREX.rex
book_text = WText(0)
index_dicrex_text = SPEEDOMOREX_NEW_DICREX(book_text)
SaveToFile({index_dicrex_text},HomeFolder('dic')..'SPEEDOMOREX.rex') -- сохраним новый SPEEDOMOREX.rex
--
for j = 1,#diclist do
b = diclist[j]
if type(b) == 'table' then
d = b[1]
mode = b[2]
else
d = b
mode = true
end
WFilter(0,0,d,mode)
end
os.remove(HomeFolder('dic')..'SPEEDOMOREX.rex')
WSave(0,folder..a[i])
end
WNew(0)
return #a, #diclist
end
Код: Выделить всё
function IndexFilterAndAudioToAll(folder, mask, diclist, remsource)
IgnoreDicPan()
local b, d, p, mode
local k = #folder
if string.sub(folder,k,k) ~= '/' and string.sub(folder,k,k) ~= '\\' then
folder = folder..'\\'
end
local a = AllFiles(folder,mask)
GaugeInit(#a)
for i = 1,#a do
Gauge(i)
WOpen(0,folder..a[i])
--Создание укороченного словаря под именем SPEEDOMOREX.rex
book_text = WText(0)
index_dicrex_text = SPEEDOMOREX_NEW_DICREX(book_text)
SaveToFile({index_dicrex_text},HomeFolder('dic')..'SPEEDOMOREX.rex') -- сохраним новый SPEEDOMOREX.rex
--
for j = 1,#diclist do
b = diclist[j]
if type(b) == 'table' then
d = b[1]
mode = b[2]
else
d = b
mode = true
end
WFilter(0,0,d,mode)
end
-- удаление словаря после его применения
os.remove(HomeFolder('dic')..'SPEEDOMOREX.rex')
--
WSave(0,folder..'temp_'..a[i])
WOpen(0,folder..'temp_'..a[i])
WAudio(0,folder,false)
p = SplitFileName(a[i])[2]
os.rename (folder..'temp_'..p..'.mp3', folder..p..'.mp3')
os.remove(folder..'temp_'..a[i])
if remsource and i > 1 then os.remove(folder..a[i-1]) end
end
if remsource then os.remove(folder..a[#a]) end
WNew(0)
return #a, #diclist
end
Код: Выделить всё
WOpen(0,HomeFolder('dic')..'20_REX_Замены от waska.rex') -- открываем словарь для извлечения индекс слов.
dicrex_text = WText(0) -- переменная глобальная, в ней храним всё содержимое 20_REX_Замены от waska.rex, чтобы не открывать его каждый раз. Так как операции ввода/вывода на диск всегда медленнее работы с памятью.
global_index_rex = SPEEDOMOREX_INDEX(dicrex_text) -- переменная глобальная, в ней храним поисковую строку в виде: \b(адреса|ангара|бегу|дома)\b
WNew(0)
Код: Выделить всё
-- очистить список строк lines от дубликатов (спасибо balaamster)
function table.getuniq(lines)
local t = {} -- список без дубликатов
table.sort(lines)
t[1] = lines[1]
for i = 2, #lines do
if lines[i] ~= t[#t] then t[#t+1] = lines[i] end
end
return t
end
function nayti_vse_po_zaprosu(text, rex_zapros)
local s = text
local r = rex_zapros
local k = 1
local temp = ''
local fnd = ''
while k > 0 do
fnd, k = RexMatch(s,r,k)
temp=temp..fnd..'\r'
if k > 0 then k = k+#fnd+1 end
end
return temp
end
function SPEEDOMOREX_INDEX(dicrex_text)--создание индекса
-- найдем все индексы в словаре REX по шаблону: #\w.+$
global_index_rex = nayti_vse_po_zaprosu(dicrex_text, [[#\w.+$]])
--переводим полученный список в одну поисковую строку в виде: \b(адреса|ангара|бегу|дома)\b
global_index_rex = [[\b(]]..global_index_rex..[[)\b]]
global_index_rex = string.gsub(global_index_rex,",","|")
global_index_rex = string.gsub(global_index_rex,"#",'|')
global_index_rex = string.gsub(global_index_rex,"||",'|')
global_index_rex = string.gsub(global_index_rex,"%(|","(")
global_index_rex = string.gsub(global_index_rex,"|%)",")")
global_index_rex = string.gsub(global_index_rex,'\r','')
global_index_rex = string.gsub(global_index_rex,'\n','')
return global_index_rex
end
function SPEEDOMOREX_NEW_DICREX(book_text)
local s = book_text -- текст текущего участка книги
s = nayti_vse_po_zaprosu(s, global_index_rex) -- ищем в тексте книги омографы по поисковому запросу из ранее сохраненого global_index_rex
s = table.getuniq(string.split(s,'\r'))-- удаляем дубликаты
s = table.concat(s, '\r')
--переводим найденный список в одну поисковую строку вида: #(\w+,)*\b(адреса|ангара|бегу|дома)\b[^#]+
s = [[#(\w+,)*\b(]]..s..[[)\b[^#]+]]
s = string.gsub(s,'\r','|')
s = string.gsub(s,"||",'|')
s = string.gsub(s,"%(|","(")
s = string.gsub(s,"|%)",")")
s = string.gsub(s,'\r','')
s = string.gsub(s,'\n','')
local index_rex_from_text = s
--SaveToFile({index_rex_from_text},'indexZZ.@') -- для отладки сохраним полученный индекс в файл indexZZ.@
-- Вытаскиваем все правила из словаря rex
s = nayti_vse_po_zaprosu(dicrex_text, index_rex_from_text)
return s
end
можно прописать всего одну строку, а остальное перенести в функцию function SPEEDOMOREX_INDEX
Код: Выделить всё
global_index_rex = SPEEDOMOREX_INDEX(HomeFolder('dic')..'20_REX_Замены от waska.rex') -- переменная глобальная
в функцию function SPEEDOMOREX_INDEX исправить на
Код: Выделить всё
function SPEEDOMOREX_INDEX(index_dicrex_path)--создание индекса
WOpen(0,index_dicrex_path) -- открываем словарь для извлечения индекс слов. переменная dic глобальная, так как объявлена ранее в СПИСОК СЛОВАРЕЙ.lua без local
dicrex_text = WText(0) -- переменная глобальная, в ней храним всё содержимое 20_REX_Замены от waska.rex, чтобы не открывать его каждый раз. Так как операции ввода/вывода на диск всегда медленнее работы с памятью.
-- найдем все индексы в словаре REX по шаблону: #\w.+$
global_index_rex = nayti_vse_po_zaprosu(dicrex_text, [[#\w.+$]])
--переводим полученный список в одну поисковую строку в виде: \b(адреса|ангара|бегу|дома)\b
global_index_rex = [[\b(]]..global_index_rex..[[)\b]]
global_index_rex = string.gsub(global_index_rex,",","|")
global_index_rex = string.gsub(global_index_rex,"#",'|')
global_index_rex = string.gsub(global_index_rex,"||",'|')
global_index_rex = string.gsub(global_index_rex,"%(|","(")
global_index_rex = string.gsub(global_index_rex,"|%)",")")
global_index_rex = string.gsub(global_index_rex,'\r','')
global_index_rex = string.gsub(global_index_rex,'\n','')
SaveToFile({global_index_rex},'index.@') -- для отладки сохраним полученный индекс в файл indexZZ.@
WNew(0)
return global_index_rex
end
Код: Выделить всё
-- измерение времени выполнения функции за N раз.
-- func :: function -- функция, время работы которой мы измеряем
-- cnt :: number -- число повторений для выполняемой функции
-- ... :: args -- любое число аргументов любого типа, передаваемых тестируемой функции
function measure_ftime(func, cnt, ...)
if type(cnt) ~= 'number' or type(func) ~= 'function' then
return nil
end
local st = os.clock()
local res
for i = 1, cnt do
res = func(...)
end
local et = os.clock()
return (et-st), res
end
-- возвращает время выполнения в секундах, и результат тестируемой функции.
Код: Выделить всё
require 'lib/mylib' -- measure_ftime у меня записана в mylib.lua
str = 'проливала горькие слезы и вытирала их' -- тестовая строка
rex1 = [[(?<=(?:[кшщ]ие|ые|ть)\s)слезы\b::слёзы]] -- тестовое выражение 1
rex2 = [[(?<=(?:кие|шие|щие|ые|ть)\s)слезы\b::слёзы]] -- тестовое выражение 2
-- замеряем RexRepl, выполняем 10000 раз, передаем строку str и {rex1} для RexRep
local time, res = measure_ftime(RexRepl, 10000, str, {rex1})
WLog(time)
WLog(res)
time, res = measure_ftime(RexRepl, 10000, str, {rex2})
WLog(time)
WLog(res)
-- ещё, например, можно замерить время выполнения math.random(1,100) -- получение псевдослучайного числа от 1 до 100
-- time = measure_ftime(math.random, 10000, 1, 100)
Код: Выделить всё
require ''lib/mystem"
Код: Выделить всё
s=WText(1) -- окно 1 в переменную s
s = table.sortuniq(s) -- удалить дубликаты
WNew(0,s)
Код: Выделить всё
s = WText(1) -- окно 1 в длинную строку s
a = string.split(s,'\r') -- s в таблицу строк
b = table.sortuniq(a) -- сортировать с удалением дубликатов
s = table.concat(b,'\r') -- соединить оставшиеся отсортированные уникальные строки в длинную строку
print(s)
Код: Выделить всё
function SPEEDOMOREX_INDEX(index_dicrex_path)--создание индекса
WOpen(0,index_dicrex_path) -- открываем словарь для извлечения индекс слов.
dicrex_text = WText(0)
global_index_rex = nayti_vse_po_zaprosu(dicrex_text, [[#\w.+$]])
--переводим полученный список список правил в формат словарей DIC:
global_index_rex = RexRepl(global_index_rex,{[[,=\r]]})
global_index_rex = RexRepl(global_index_rex,{[[\#=]]})
global_index_rex = RexRepl(global_index_rex,{[[^(\w+)$::$1=fcgmlraseoce_$1]]}) --fcgmlraseoce_ уникальная комбинация символов для быстрого поиска
SaveToFile({global_index_rex},'index.txt') -- для отладки сохраним полученный индекс в файл indexZZ.@
WNew(0)
return global_index_rex
end
function SPEEDOMOREX_NEW_DICREX(book_text)
local s = book_text -- текст текущего участка книги
s = DicRepl(s,{global_index_rex},true,true) -- добавляем путем замен уникальную комбинацию ко всем найденым в тексте омографам
s = nayti_vse_po_zaprosu(s, [[fcgmlraseoce_\w+]]) -- выводим список всех омографов, помеченные уникальной комбинацией
s = RexRepl(s,{[[fcgmlraseoce_=]]}) -- удаляем уникальную комбинацию
s = string.split(s,'\r') -- преобразовываем список в таблицу
--s = table.getuniq(string.split(s,'\r'))
s = table.sortuniq(s) -- сортируем и удаляем дубликаты
s = table.concat(s, '\r')
--переводим найденный список в одну поисковую строку вида: #(\w+,)*\b(адреса|ангара|бегу|дома)\b[^#]+
s = [[#(\w+,)*\b(]]..s..[[)\b[^#]+]]
r01=[[
[\r\n]+=|
\|\|=\|
\(\|=\(
\|\)=\)
\+\|=\+
[\r\n]+=
]]
s = RexRepl(s,{r01})
local index_rex_from_text = s
--SaveToFile({index_rex_from_text},'indexZZ.txt') -- для отладки сохраним полученный индекс в файл indexZZ.@
-- Вытаскиваем все правила из словаря rex
s = nayti_vse_po_zaprosu(dicrex_text, index_rex_from_text)
return s
end
Код: Выделить всё
fnd = Input(header,{askname..'='..fnd})
--преобразуем fnd из таблицы в текстовый формат
WNew(0,fnd)
fnd_txt = WText(0)
WNew(0,fnd)
Код: Выделить всё
-- таблица
fnd = {'однажды в студеную','зимнюю пору','я из лесу вышел'}
-- текст
s = table.concat(fnd,'\r')
-- печатаем, чтобы убедиться
print(s)
Если поставить запрет на работу в окне статистики, то
Код: Выделить всё
s=[[выгнул брови=выгнул брОви]]
dic_paht = (HomeFolder('dic')..'70.ФОНЕМЫ Dopolneniya строчные.dic')
WOpen(0,dic_paht)
WLog(s,0)
WSave(0,dic_paht)
честно говоря, я себе с трудом представляю, что бы кто-то умел вводить с клавиатуры транскипции МФА напрямую. Так что "Добавить фразу в словарь" применим только к тексту обычного рода заменам типа: выгнул брови=выгнул брОви или выгнул брови=выгнул бро<ви. Нужно ввести в МФА? - тогда остается стандартный способ.
Код: Выделить всё
WOpen(-1,'SmallTest.dxt') -- прочесть файл в буфер
WAdd(0,-1) -- добавить в окно Статистики из буфера
s = WText(-1) -- текст из буфера в переменную (!юникод потеряется!)
ShowMessage(s)
Код: Выделить всё
WNew(-1) -- очистить буфер
WAdd(-1,7) -- добавить в буфер содержимое окна 7
WAdd(-1,'\r\rКонец текста\r\r') -- добавить в буфер строку в конце
WAdd(-1,4) -- добавить в буфер содержимое окна 4
WNew(0) -- очистить окно Статистики
WAdd(0,-1) -- добавить в Статистику содержимое буфера
Код: Выделить всё
WNew(-1) -- очистить буфер
WAdd(-1,5) -- добавить в буфер содержимое окна 5
-- применить к тексту в буфере словарь и результат положить туда же
WFilter(-1,-1,HomeFolder('dic')..'Michelangelo.dic')
-- операцию словарных замен в буфере можно повторить и с др.словарями
WSave(-1,'Измененный текст.txt') -- сохранить содержимое буфера в файл
Код: Выделить всё
require "profiles/grafica"
ShowMessage('Жми!')
Delay(1500)
ShowMessage('Прошло полторы секунды!')
Код: Выделить всё
function Pause(sec)
Grafica(251,sec*1000)
end
Код: Выделить всё
require "profiles/mylib_index"
ShowMessage('Жми!')
Pause(5)
ShowMessage('Прошло 5 сек.')
Код: Выделить всё
голубушки=<phoneme ph="ɡɐlˈubʊʂkʲɪ"/>
Код: Выделить всё
голубушки;ɡɐlˈubʊʂkʲɪ
Код: Выделить всё
ind=WActive()
r0 = [[
\<phoneme ph=\"::
\"\/\>::
=::;
\$::
]]
SaveToFile({r0},'#rex.rex')
WFilter(ind,ind,'#rex.rex')
os.remove('#rex.rex')
Код: Выделить всё
require "profiles/mylib_index" -- подгружаем личную библиотеку с функциями
ind = WActive()
is = HomeFolder('profiles')..'Исключения Имена.txt'
s = WText(ind)
s = nayti_vse_po_zaprosu(s, [[@([a-zа-яё])([,: -]*)\s[А-ЯЁФ-Я]\w+]])
s = nayti_vse_po_zaprosu(s, [[@\b[А-ЯЁA-Z]\w+]])
s = string.split(s,'\r') -- преобразовываем список в ТАБЛИЦУ
s = table.sortuniq(s) -- сортируем и удаляем дубликаты
s = table.concat(s, '\r') -- преобразовываем список в ТЕКСТ
r0 = [[^(.+)$::$$$&=]]
SaveToFile({r0},'#rex.rex')
WOpen(-1,is)
WFilter(-1,-1,'#rex.rex')
os.remove('#rex.rex')
WSave(-1,'#iskl.dic')
WNew(-1,s)
WFilter(-1,-1,'#iskl.dic')
os.remove('#iskl.dic')
r0 = [[^\s*::]]
SaveToFile({r0},'#rex.rex')
WFilter(-1,-1,'#rex.rex')
os.remove('#rex.rex')
WNew(0)
WAdd(0,-1)
WActive(0)
Код: Выделить всё
function nayti_vse_po_zaprosu(text, rex_zapros)
local s = text
local r = rex_zapros
local k = 1
local temp = ''
local fnd = ''
while k > 0 do
fnd, k = RexMatch(s,r,k)
temp=temp..fnd..'\r'
if k > 0 then k = k+#fnd+1 end
end
return temp
end
что бы он в конце скрипта открывался параллельно в блокноте.
Код: Выделить всё
os.execute('notepad.exe ИмяФайла.txt')
в интернете нашел что-то "примерно" делающее это. Считает только количество совпадений:
Код: Выделить всё
local t = {"мышь","аврора","аврора","аврора","аврора","аврора","мышь","аврора","каша","аврора"}
-- сортируем таблицу
local t1 = {}
table.sort(t)
for i = 1, #t do
t1[i] = t[i]
end
t = t1
--подсчитываем количество совпадений
local t2 = {}
for _,e in ipairs(t) do
if e == last_e then
t2[e] = t2[e] ~= nil and t2[e] + 1 or 1
end
last_e = e
end
for i,e in pairs(t2) do
print ( e .. "|" .. i)
end
Код: Выделить всё
# Script>
6|аврора
1|мышь
Код: Выделить всё
local t = {"мышь", "аврора", "аврора", "аврора", "аврора", "аврора", "мышь", "аврора", "каша", "аврора"}
u = table.sortuniq(t) -- только уникальные
q = {}
for i = 1,#u do -- сколько раз уникальные встречаются в основной таблице
q[i] = 0
for j = 1,#t do
if t[j] == u[i] then
q[i] = q[i]+1
end
end
end
for i = 1,#u do -- объединяем каждый уникальный с его количеством
u[i] = q[i]..'|'..u[i]
end
print(table.concat(u,'\r'))
Код: Выделить всё
7|аврора
1|каша
2|мышь
Код: Выделить всё
require "profiles/mylib_index" -- подгружаем личную библиотеку с функциями
ind = WActive()
is = HomeFolder('profiles')..'Исключения Имена.txt' -- путь к файлу с исключениями имён
--Чистка 'Исключения Имена.txt' от цифрового мусора
WOpen(-1,is) -- открываем файл 'Исключения Имена.txt'
s_is = WText(-1) -- текст в переменную
s_is = RexRepl(s_is,{[[^\d+\|(\w+)$::$1]]}) -- создаем rex правило для чистки списка имен
s_is = string.split(s_is,'\r') -- преобразовываем список в ТАБЛИЦУ
s_is = table.sortuniq(s_is) -- сортируем и удаляем дубликаты
s_is = table.concat(s_is, '\r') -- преобразовываем список в ТЕКСТ
SaveToFile({s_is},is)
WNew(-1)
--Создание списка Имен с их подсчётом:
s = WText(ind)
s = nayti_vse_po_zaprosu(s, [[@([a-zа-яё])([,: -]*)\s[А-ЯЁФ-Я]\w+]])
s = nayti_vse_po_zaprosu(s, [[@\b[А-ЯЁA-Z]\w+]])
s = string.split(s,'\r') -- преобразовываем список в ТАБЛИЦУ
u = table.sortuniq(s) -- только уникальные
q = {}
for i = 1,#u do -- сколько раз уникальные встречаются в основной таблице
q[i] = 0
for j = 1,#s do
if s[j] == u[i] then
q[i] = q[i]+1
end
end
end
for i = 1,#u do -- объединяем каждый уникальный с его количеством
u[i] = q[i]..'|'..u[i]
end
s=table.concat(u,'\r')
-- Удаляем из полученного списка Имен все исключения взятых из файла 'Исключения Имена.txt'
WOpen(0,is) -- открываем файл 'Исключения Имена.txt'
s_is = WText(0) -- текст в переменную
r1 = RexRepl(s_is,{[[^.+::\\d\+\\|$&\\b=]]}) -- создаем rex правило
s = RexRepl(s,{r1}) -- удаляем из списка Имен слова исключения (при помощи r1 rex-правила)
s = RexRepl(s,{[[\s*$::]]}) -- удаляем пустые строки
WNew(0,s)
WActive(0)
os.execute('start notepad.exe '..is) -- открываем файл 'Исключения Имена.txt' для записи исключений
Код: Выделить всё
os.execute('start notepad.exe ИмяФайла.txt')
Код: Выделить всё
^\d+\|(\w+)$=$1 <speak><break time="100ms"/><speak>
Код: Выделить всё
function AnsiToUtf8(s,hasbom)
local q = {}
local bom = '\239\187\191'
local u, a, b, k
-- russian unicode table
q['А'] = 1040
q['Б'] = 1041
q['В'] = 1042
q['Г'] = 1043
q['Д'] = 1044
q['Е'] = 1045
q['Ж'] = 1046
q['З'] = 1047
q['И'] = 1048
q['Й'] = 1049
q['К'] = 1050
q['Л'] = 1051
q['М'] = 1052
q['Н'] = 1053
q['О'] = 1054
q['П'] = 1055
q['Р'] = 1056
q['С'] = 1057
q['Т'] = 1058
q['У'] = 1059
q['Ф'] = 1060
q['Х'] = 1061
q['Ц'] = 1062
q['Ч'] = 1063
q['Ш'] = 1064
q['Щ'] = 1065
q['Ъ'] = 1066
q['Ы'] = 1067
q['Ь'] = 1068
q['Э'] = 1069
q['Ю'] = 1070
q['Я'] = 1071
q['Ё'] = 1025
--
q['а'] = 1072
q['б'] = 1073
q['в'] = 1074
q['г'] = 1075
q['д'] = 1076
q['е'] = 1077
q['ж'] = 1078
q['з'] = 1079
q['и'] = 1080
q['й'] = 1081
q['к'] = 1082
q['л'] = 1083
q['м'] = 1084
q['н'] = 1085
q['о'] = 1086
q['п'] = 1087
q['р'] = 1088
q['с'] = 1089
q['т'] = 1090
q['у'] = 1091
q['ф'] = 1092
q['х'] = 1093
q['ц'] = 1094
q['ч'] = 1095
q['ш'] = 1096
q['щ'] = 1097
q['ъ'] = 1098
q['ы'] = 1099
q['ь'] = 1100
q['э'] = 1101
q['ю'] = 1102
q['я'] = 1103
q['ё'] = 1105
--
u = ''
for i = 1,#s do
b = string.sub(s,i,i)
if string.byte(b) < 128 then
u = u..b
else
k = q[b]
if k == nil then a = '?' else a = utf8.char(k) end
u = u..a
end
end
if hasbom then u = bom..u end
return u
end
Код: Выделить всё
s = WText(6)
s = string.gsub(s,'\r','\r\n')
u = AnsiToUtf8(s,true)
SaveToFile({u},'uuu.txt')
Код: Выделить всё
s = WText(1)
f = io.open('proba.txt',"w") -- открыть файл для записи
f:write(s) -- записать в него строку s
f:close() -- закрыть файл
А в таком виде можно показать?balaamster писал(а): ↑13 апр 2019 17:24Набор скриптов для озвучивания книги через сервис Yandex TTS
За идею и тестирование спасибо tonio_k, без его идеи и помощи скриптов могло и не быть :) Также спасибо flegont за помощь в исправлении алгоритма деления на сериал.
Способ работы со скриптами.
1. Для настройки голоса запускаем через Ctrl+F2 "YaTTS_configure.lua" выбираем голос, темп речи, эмоциональную окраску.
2. Для получения mp3-файлов
открываем книгу во вкладке.
запускаем через Ctrl+F2 "YaTTS.lua"
выбираем число потоков для скачивания озвученных фрагментов текста
указываем папку для сохранения mp3-файлов озвученной книги
ожидаем, пока закроется чёрное окно консоли (завершится процесс скачивания)
выбираем желаемую примерную длительность фрагмента аудио-сериала.
В ранее выбранном каталоге находим озвученную книгу.
Если процесс скачивания необходимо прервать, в окне консоли нажимаем ctrl+c. (временные txt- mp3-файлы сохранятся в каталоге "%temp%\имя_файла_книги\", в каталоге для готовых mp3-файлов при этом ничего не появится.
Если в процессе скачивания возникнут ошибки - сетевой сбой, ошибка работы моего скрипта, то
в конце работы скрипта появится сообщение, о несоответствии количества текстовых файлов сериала и полученных mp3-файлов, в проводнике откроется каталог, в котором находятся временные txt-файлы сериала, полученные mp3-файлы (подкаталог "audio") и лог-файл (подкаталог "log")
Процесс скачивания можно будет продолжить, заново запустив скрипт на вкладке с книгой и ответив на запрос "ДА - продолжить преобразование с последнего необработанного файла"
3. Для озвучивания слова/фразы/текстового фрагмента(не более 1000 символов)
во вкладке с книгой выделяем фрагмент текста, который необходимо озвучить
запускаем через Ctrl+F2 "YaTTS_speak.lua"
ожидаем, пока закроется чёрное окно консоли (завершится процесс скачивания)
Откроется Windows Media Player, который воспроизведёт выделенный фрагмент.
Если выделенный фрагмент не изменён и его надо прослушать повторно, то можно запустить скрипт ещё раз, при этом повторное скачивание производиться не будет. (или можно самостоятельно открыть файл "%temp%\speak_tmp\audio\speak.mp3")
Для использования скрипта необходимо наличие ffmpeg.exe в папке с Demagog. Скачать можно тут
Содержимое архива "Demagog+YandexTTS.zip" распаковать в папку с Demagog
До обновления версии Demagog выше 7.29.369, необходимо скопировать "calculator.lua" из папки temp в папку "profiles" с заменой существующего файла.
Код: Выделить всё
local r0 = [[
\.\.\.:: / /.
\+=%2b
,= /
\.= /.
(?<=\w)\?(?=\w)::
( )+=$1
\s{2,}$::
]]
s = RexRepl(s,{r0})
ошибся правильно
Обновил скрипты.
Код: Выделить всё
ind = WActive()
WFilter(ind, ind, HomeFolder('dic').."70_Яндекс+ОМО.dic")
destination = 'D:\\audiobook\\book1\\'
delete_source = true
dofile(HomeFolder('_Tests_')..'YaTTS.lua')