Скрипты для Demagog
Модератор: flegont
- tonio_k
- V.I.P.
Скрипты для Demagog
вопрос, есть ли принципиальная разница в механизме работы между:
WFilter (указываю путь к словарю rex) и RexRepl (правила считываю в переменную из того же словаря) в плане скорости между ними?
* проблему с кодировкой юникод в RexRepl при сравнении в расчет брать не будем.
WFilter (указываю путь к словарю rex) и RexRepl (правила считываю в переменную из того же словаря) в плане скорости между ними?
* проблему с кодировкой юникод в RexRepl при сравнении в расчет брать не будем.
- flegont
- V.I.P.
Скрипты для Demagog
Теоретически, ощутимой разницы по времени работы быть не должно. Обе функции используют одну и ту же процедуру замены в тексте по заданному регулярному выражению.
- tonio_k
- V.I.P.
Скрипты для Demagog
Немного модифицировал функции по применению словарей к сериалу
FilterToAll(folder, mask, diclist, remsource) и FilterAndAudioToAll(folder, mask, diclist, remsource) под индексный метод. Большое спасибо balaamster за помощь.
По новому переименованные функции будут выглядеть так:
Для работы этих функций нужно в скрипте, вызывающего эти функции прописать:
1) в переменной diclist в списке последовательности применения словарей вместо основного словаря с омографами указать имя 'SPEEDOMOREX.rex',
пример:
dic = HomeFolder('dic')
diclist =
{
dic..'10_REX_стандартные замены.rex',
dic..'SPEEDOMOREX.rex', -- (было 20_REX_Замены от waska.rex)
dic..'30_REX_Замены пополнение.rex',
dic..'40.1_звезды подготовка.rex,
}
2) Что бы создать индекс к основному словарю (в примере 20_REX_Замены от waska.rex), нужно прописать один раз в начале скрипта:здесь в глобальную переменную global_index_rex записывается поисковый индекс, который будет применяться к каждому открытому тексту сериала в поиске омографов.
3) Теперь можно применять функции IndexFilteToAll(folder, mask, diclist, remsource) или IndexFilterAndAudioToAll(folder, mask, diclist, remsource)
4) Дополнительно для работы этих функций нужно в калькуляторе или в личной библиотеке mylib_inex.lua (вызывается командой require "profiles/mylib_inex") добавить еще записи:
на всякий случай все функции в одном файле
Отправлено спустя 11 часов 42 минуты 54 секунды:
Небольшое изменение:
файл mylib_inex с изменениями
FilterToAll(folder, mask, diclist, remsource) и FilterAndAudioToAll(folder, mask, diclist, remsource) под индексный метод. Большое спасибо balaamster за помощь.
По новому переименованные функции будут выглядеть так:
Код: Выделить всё
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
1) в переменной diclist в списке последовательности применения словарей вместо основного словаря с омографами указать имя 'SPEEDOMOREX.rex',
пример:
dic = HomeFolder('dic')
diclist =
{
dic..'10_REX_стандартные замены.rex',
dic..'SPEEDOMOREX.rex', -- (было 20_REX_Замены от waska.rex)
dic..'30_REX_Замены пополнение.rex',
dic..'40.1_звезды подготовка.rex,
}
2) Что бы создать индекс к основному словарю (в примере 20_REX_Замены от waska.rex), нужно прописать один раз в начале скрипта:
Код: Выделить всё
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)
3) Теперь можно применять функции IndexFilteToAll(folder, mask, diclist, remsource) или IndexFilterAndAudioToAll(folder, mask, diclist, remsource)
4) Дополнительно для работы этих функций нужно в калькуляторе или в личной библиотеке mylib_inex.lua (вызывается командой require "profiles/mylib_inex") добавить еще записи:
Код: Выделить всё
-- очистить список строк 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
Отправлено спустя 11 часов 42 минуты 54 секунды:
Небольшое изменение:
можно прописать всего одну строку, а остальное перенести в функцию 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
- balaamster
- Обыватель
Скрипты для Demagog
Решил набросать функцию для измерения времени выполнения других функций.
пример использования:
Ещё на досуге адаптировал Яндексовский MyStem для работы с Demagog
1 распаковываем содержимое приложенного архива в папку с Demagog.
2 Скачиваем Mystem и копируем mystem.exe в папку к Demagog
3 подключаем библиотеку в скрипте:
Функции:
get_mystem_out(str, [format], [copyall])
parse_myst_json(json_dic)
Пример использования: Выделяем слово или предложение во вкладке, запускаем 00_mystem_demo.lua по Ctrl+F2
Получаем во вкладке 0 разбор выделенного фрагмента в режиме вывода "text", плюс разбор, в режиме "JSON", записанной в скрипте str = 'привет, ребята'
Писал для просмотра информации по омографам (вероятность встречи конкретного омографа)
Например:
И на будущее, вдруг научусь алгоритмам морфологического разбора и снятию омонимии по контексту
Код: Выделить всё
-- измерение времени выполнения функции за 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)
► Показать
Ещё на досуге адаптировал Яндексовский MyStem для работы с Demagog
1 распаковываем содержимое приложенного архива в папку с Demagog.
2 Скачиваем Mystem и копируем mystem.exe в папку к Demagog
3 подключаем библиотеку в скрипте:
Код: Выделить всё
require ''lib/mystem"
get_mystem_out(str, [format], [copyall])
► Показать
► Показать
Получаем во вкладке 0 разбор выделенного фрагмента в режиме вывода "text", плюс разбор, в режиме "JSON", записанной в скрипте str = 'привет, ребята'
Писал для просмотра информации по омографам (вероятность встречи конкретного омографа)
Например:
► Показать
- Вложения
-
- mystem.zip
- (2.73 КБ) 691 скачивание
- tonio_k
- V.I.P.
Скрипты для Demagog
Код: Выделить всё
s=WText(1) -- окно 1 в переменную s
s = table.sortuniq(s) -- удалить дубликаты
WNew(0,s)
- flegont
- V.I.P.
Скрипты для Demagog
Потому что аргументом должна быть таблица, а не строка
Код: Выделить всё
s = WText(1) -- окно 1 в длинную строку s
a = string.split(s,'\r') -- s в таблицу строк
b = table.sortuniq(a) -- сортировать с удалением дубликатов
s = table.concat(b,'\r') -- соединить оставшиеся отсортированные уникальные строки в длинную строку
print(s)
- tonio_k
- V.I.P.
Скрипты для Demagog
ИНДЕКСНЫЙ МЕТОД
Эксперимента ради, попробовал проиндексировать словарь при помощи запроса в виде:
\b(адреса|ангара|бегу|дома)\b
вставив в запрос список почти всех встречающихся омографов (файлall_omographs.hmg), взятых из архива программы Homograph. Демагог вышибает. (28500 вариантов слов - еще бы!) Даже половину не тянет. То есть существует некий теоретический потолок, после которого такой длинный запрос восприниматься не будет. С ростом словаря такой потолок может оказаться не за горами. Что бы это обойти, можно запрос разбить на строки:
\b(адреса)\b
\b(ангара)\b
\b(бегу)\b
и запустить перебор правил. Но тут то я вспомнил про быстрый алгоритм Демагога и немного изменил алгоритм индексации:
вместо одной строки в виде:
\b(адреса|ангара|бегу|дома)\b
я создаю список правил в виде:
адреса=fcgmlraseoce_адреса
ангара=fcgmlraseoce_ангара
бЕгу=fcgmlraseoce_бЕгу
(где fcgmlraseoce_ - это от винта набранная уникальная комбинация символов, которая точно в тексте не встретится)
Произвожу замены в тексте быстрым алгоритмом DicRepl(s, r, fastalg, fancy).
Таким образом все омографы в тексте, (если они есть в индекс запросе), получают приставку-связку fcgmlraseoce_ - по которой одним поисковым запросом затем и выуживаются. Далее простой заменой эта приставка удаляется и вот у нас на руках список омографов найденных по индексу. Далее - уже стандартно: список приводим в поисковый запрос
#(\w+,)*\b(адреса|ангара|бегу|дома)\b[^#]+
и по нему вытаскиваем правила из словаря rex и применяем только эти правила для данного отрезка текста.
Под этот алгоритм изменились только две функции:
Эксперимента ради, попробовал проиндексировать словарь при помощи запроса в виде:
\b(адреса|ангара|бегу|дома)\b
вставив в запрос список почти всех встречающихся омографов (файлall_omographs.hmg), взятых из архива программы Homograph. Демагог вышибает. (28500 вариантов слов - еще бы!) Даже половину не тянет. То есть существует некий теоретический потолок, после которого такой длинный запрос восприниматься не будет. С ростом словаря такой потолок может оказаться не за горами. Что бы это обойти, можно запрос разбить на строки:
\b(адреса)\b
\b(ангара)\b
\b(бегу)\b
и запустить перебор правил. Но тут то я вспомнил про быстрый алгоритм Демагога и немного изменил алгоритм индексации:
вместо одной строки в виде:
\b(адреса|ангара|бегу|дома)\b
я создаю список правил в виде:
адреса=fcgmlraseoce_адреса
ангара=fcgmlraseoce_ангара
бЕгу=fcgmlraseoce_бЕгу
(где fcgmlraseoce_ - это от винта набранная уникальная комбинация символов, которая точно в тексте не встретится)
Произвожу замены в тексте быстрым алгоритмом DicRepl(s, r, fastalg, fancy).
Таким образом все омографы в тексте, (если они есть в индекс запросе), получают приставку-связку fcgmlraseoce_ - по которой одним поисковым запросом затем и выуживаются. Далее простой заменой эта приставка удаляется и вот у нас на руках список омографов найденных по индексу. Далее - уже стандартно: список приводим в поисковый запрос
#(\w+,)*\b(адреса|ангара|бегу|дома)\b[^#]+
и по нему вытаскиваем правила из словаря rex и применяем только эти правила для данного отрезка текста.
Под этот алгоритм изменились только две функции:
Код: Выделить всё
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
- tonio_k
- V.I.P.
Скрипты для Demagog
из таблицы в текстовый формат я так делаю:
а как будет правильнее средствами LUA?
Код: Выделить всё
fnd = Input(header,{askname..'='..fnd})
--преобразуем fnd из таблицы в текстовый формат
WNew(0,fnd)
fnd_txt = WText(0)
WNew(0,fnd)
- flegont
- V.I.P.
Скрипты для Demagog
Код: Выделить всё
-- таблица
fnd = {'однажды в студеную','зимнюю пору','я из лесу вышел'}
-- текст
s = table.concat(fnd,'\r')
-- печатаем, чтобы убедиться
print(s)
- tonio_k
- V.I.P.
Скрипты для Demagog
а может это через скрипт можно сделать? К Выделеному тексту применить скрипт через горячую клавишу
- flegont
- V.I.P.
Скрипты для Demagog
Интересная мысль. Надо попробовать.
Отправлено спустя 7 минут 29 секунд:
Хотя, если в словаре используется транскрипция МФА ( а это - юникод!), то любые действия скрипта с таким словарем - словарь испортят.
Отправлено спустя 7 минут 29 секунд:
Хотя, если в словаре используется транскрипция МФА ( а это - юникод!), то любые действия скрипта с таким словарем - словарь испортят.
- tonio_k
- V.I.P.
Скрипты для Demagog
Если поставить запрет на работу в окне статистики, то
Код: Выделить всё
s=[[выгнул брови=выгнул брОви]]
dic_paht = (HomeFolder('dic')..'70.ФОНЕМЫ Dopolneniya строчные.dic')
WOpen(0,dic_paht)
WLog(s,0)
WSave(0,dic_paht)
надо ведь только "Добавить фразу в словарь" больше ничего
- tonio_k
- V.I.P.
Скрипты для Demagog
К стати, если бы помимо: BufNew, BufAdd, BufOpen
создать еще BufSave - тогда про необходимость в запрете на использование окна статистики можно забыть. И, теоретически, частично скрипты можно было бы подружить с кодировкой Юникод?
создать еще BufSave - тогда про необходимость в запрете на использование окна статистики можно забыть. И, теоретически, частично скрипты можно было бы подружить с кодировкой Юникод?
- flegont
- V.I.P.
Скрипты для Demagog
Порча текста (в смысле потери юникодных символов) происходит при преобразовании текста в окне в строковую переменную интерпретатора. Например:
s = WText(0).
В строке s вместо юникодных символов будут знаки вопроса.
Аналогично, при прямом присвоении символов юникода строковой переменной:
s = [[こんにちは世界!]]
В этом случае текст скрипта - в кодировке юникод, но перед его выполнением он будет преобразован в кодировку ANSI. И опять юникодным символам - кирдык. То есть, в скрипте невозможно проводить замену/подстановку транскипции МФА напрямую.
В этом проблема.
s = WText(0).
В строке s вместо юникодных символов будут знаки вопроса.
Аналогично, при прямом присвоении символов юникода строковой переменной:
s = [[こんにちは世界!]]
В этом случае текст скрипта - в кодировке юникод, но перед его выполнением он будет преобразован в кодировку ANSI. И опять юникодным символам - кирдык. То есть, в скрипте невозможно проводить замену/подстановку транскипции МФА напрямую.
В этом проблема.
- tonio_k
- V.I.P.
Скрипты для Demagog
В данной ситуации можно создать в Демагоге специальное всплывающее текстовое окно, вызываемое средствами скрипта, в котором при нажатии на кнопку Ок содержимое окна передавалось в BufAdd - все это минуя переменные LUA. Но будет ли в этом смысл? Если это окно больше негде применить
С тем же успехом, можно и в самом Демагоге внести исправления и к правой клавише привязать "Добавить фразу в словарь". Вопрос, на сколько она вообще нужна пользователям? Скрипт для частных ситуаций - вполне себе выход не для "серийного производства"
Что касается китайского - тут я пас
С тем же успехом, можно и в самом Демагоге внести исправления и к правой клавише привязать "Добавить фразу в словарь". Вопрос, на сколько она вообще нужна пользователям? Скрипт для частных ситуаций - вполне себе выход не для "серийного производства"
честно говоря, я себе с трудом представляю, что бы кто-то умел вводить с клавиатуры транскипции МФА напрямую. Так что "Добавить фразу в словарь" применим только к тексту обычного рода заменам типа: выгнул брови=выгнул брОви или выгнул брови=выгнул бро<ви. Нужно ввести в МФА? - тогда остается стандартный способ.
Что касается китайского - тут я пас
- flegont
- V.I.P.
Скрипты для Demagog
Ну, в таком случае, можно и скриптом. Это будет приемлемое решение для большинства случаев. И для транскрипции UPS тоже сгодится - она машиночитаемая, только латинские буквы + специальные знаки, которые есть на клавиатуре
P.S. Например, стандартый Win 10 голос Pavel имхо неплох, и понимает UPS.
P.S. Например, стандартый Win 10 голос Pavel имхо неплох, и понимает UPS.
- tonio_k
- V.I.P.
- flegont
- V.I.P.
Скрипты для Demagog
Четкий, холодноватый, окончания не проглатывает. И, как я убедился, огрехи произношения легко исправляются через транскрипцию UPS.
Microsoft Pavel (пример звучания)
Запись аудио сделана скриптом для Demagog - converter.lua, написанным balaamster.
Microsoft Pavel (пример звучания)
Запись аудио сделана скриптом для Demagog - converter.lua, написанным balaamster.
- balaamster
- Обыватель
Скрипты для Demagog
Обновил conv.bat - конвертирование с возможностью изменения темпа, добавления реверберации и фоновой музыки.
- Исправлена ошибка - затухание фонового звука не работало, если фоновый трек короче читаемого фрагмента.
- Папку с фоновыми треками теперь можно не держать в папке с Demagog. В строке 5, в conv.bat, можно заменить "%~dp0fon" на свой путь к папке с фоновыми треками. Если путь содержит пробелы, то его нужно заключить в кавычки
- Файл fon.mp3, в папке Demagog, более не требуется. Путь к фоновому треку передаётся ffmpeg напрямую.
- В качестве фона могут быть mp3 и ogg-файлы.
► Показать
- flegont
- V.I.P.
Скрипты для Demagog
Очень удобно получилось! Я прописал в настройках Custom Encoder:
%~conv.bat %1 %2 64 1.0 true 0.1 mp3
%~conv.bat %1 %2 64 1.0 true 0.1 mp3
- flegont
- V.I.P.
Скрипты для Demagog
Примеры работы с "внутренним буфером" (начиная с вер. 368)
Код: Выделить всё
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') -- сохранить содержимое буфера в файл
- tonio_k
- V.I.P.
Скрипты для Demagog
Delay(msec) задерживает выполнение скрипта на msec миллисекунд
Не могу на форуме найти пример применения. Вроде бы выкладывали.
Не могу на форуме найти пример применения. Вроде бы выкладывали.
- flegont
- V.I.P.
Скрипты для Demagog
Пример использования есть в скрипте Graphics demo.lua в папке _Tests_
Функция Delay() находится в библиотеке grafica.lua, поэтому надо так:
P.S. На самом деле - это функция Delphi - sleep(msec), сделанная доступной интерпретатору Демагога под другим именем
Функция Delay() находится в библиотеке grafica.lua, поэтому надо так:
Код: Выделить всё
require "profiles/grafica"
ShowMessage('Жми!')
Delay(1500)
ShowMessage('Прошло полторы секунды!')
- tonio_k
- V.I.P.
Скрипты для Demagog
Спасибо!
1)
Добавил к себе в mylib_index.lua функцию под себя:
на практике удобнее в секундах указывать, поэтому:
2)
Возвращаясь к вопросу работы с текстом в Юникод
Моя ситуация:
Возникла необходимость превратить словарь DIC с фонемами:
в вид:
Что бы избежать переменных типа: s=WText, которая убивает юникод,
Применил вот такой скрипт:
#rex.rex - имя файла словаря с расширением rex
Юникод сохранен!
1)
Добавил к себе в mylib_index.lua функцию под себя:
Код: Выделить всё
function Pause(sec)
Grafica(251,sec*1000)
end
Код: Выделить всё
require "profiles/mylib_index"
ShowMessage('Жми!')
Pause(5)
ShowMessage('Прошло 5 сек.')
2)
Возвращаясь к вопросу работы с текстом в Юникод
Моя ситуация:
Возникла необходимость превратить словарь DIC с фонемами:
Код: Выделить всё
голубушки=<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')
Юникод сохранен!
- flegont
- V.I.P.
- tonio_k
- V.I.P.
Скрипты для Demagog
"Имена и аббревиатуры" Исключения
Мне очень нравилось Балаболке в поиске "Имена и аббревиатуры" отдельная опция "Не показывать слова из текстового файла".
Этот файл пополнялся собственными именами из предыдущих поисков. И от книги к книге за счет пополнения исключений в файле, выводимый список имен при последующих поисках становился относительно меньше и меньше.
Решил вопрос скриптом:
Файл 'Исключения Имена.txt' создается в Demagog\profiles
Для работы скрипта в личную библиотеку с функциями (у меня mylib_index.lua) надо добавить:
Нужна помощь
В скрипте Не хватает строчки вызова файла Исключения Имена.txt - что бы он в конце скрипта открывался параллельно в блокноте. Скорее всего через os.execute но не знаю как это сделать
Отправлено спустя 7 минут 27 секунд:
В плане совершенствования скрипта, не плохо бы было, если бы список выводился в виде:
018|Альбуцин
005|Академия
003|Альбуцином
001|Альбуцина
где цифры - это сколько раз данное слово встречается в тексте
Отсортировав можно было бы прослушать только часто встречающиеся имена, а редкими можно пренебречь.
Мне очень нравилось Балаболке в поиске "Имена и аббревиатуры" отдельная опция "Не показывать слова из текстового файла".
Этот файл пополнялся собственными именами из предыдущих поисков. И от книги к книге за счет пополнения исключений в файле, выводимый список имен при последующих поисках становился относительно меньше и меньше.
Решил вопрос скриптом:
Код: Выделить всё
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)
Для работы скрипта в личную библиотеку с функциями (у меня mylib_index.lua) надо добавить:
Код: Выделить всё
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
В скрипте Не хватает строчки вызова файла Исключения Имена.txt - что бы он в конце скрипта открывался параллельно в блокноте. Скорее всего через os.execute но не знаю как это сделать
Отправлено спустя 7 минут 27 секунд:
В плане совершенствования скрипта, не плохо бы было, если бы список выводился в виде:
018|Альбуцин
005|Академия
003|Альбуцином
001|Альбуцина
где цифры - это сколько раз данное слово встречается в тексте
Отсортировав можно было бы прослушать только часто встречающиеся имена, а редкими можно пренебречь.
- flegont
- V.I.P.
Скрипты для Demagog
что бы он в конце скрипта открывался параллельно в блокноте.
Код: Выделить всё
os.execute('notepad.exe ИмяФайла.txt')
- tonio_k
- V.I.P.
Скрипты для Demagog
в интернете нашел что-то "примерно" делающее это. Считает только количество совпадений:
Код: Выделить всё
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|мышь
Плюс я в упор не представляю, как выцепить print ( e .. "|" .. i) в переменную, что бы с ней можно было дальше работать как с таблицей либо в текстовый формат перевести.
Нужна помощь.
- flegont
- V.I.P.
Скрипты для Demagog
Код: Выделить всё
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|мышь
Отправлено спустя 9 минут 28 секунд:
P.S. Это, конечно, решение лобовое. Что-то подсказывает мне, что можно решить изящнее. Но, пока и так сойдет
- tonio_k
- V.I.P.
Скрипты для Demagog
Доработал скрипт. Спасибо flegont за помощь .
Полученный в окне Статистики список Имен можно легко отсортировать. Правая клавиша: Сортировка строк - Цифровая по убыванию. Тогда список выстоится по частоте повторения слов в тексте:
Для удобства добавил в скрипт "чистку от цифрового мусора" - что бы не вносить в блокнот каждое слово по отдельности, можно скопировать весь список (или его часть) из окна Статистики и вставить "как есть с цифрами" в блокнот с открытым файлом 'Исключения Имена.txt'.
Получится что то в роде:
При каждом запуске скрипта, содержимое файла 'Исключения Имена.txt' будет автоматом очищено от цифрового мусора и отсортировано и сохранено по новому:
Отправлено спустя 7 минут 22 секунды:
то же самое, но черный экран cmd.exe сразу закроется после запуска блокнота (мелькнет и исчезнет).
Отправлено спустя 1 час 11 минут 13 секунд:
Небольшой лайфхак как прослушивать скопом список Имён, если список сделан в стиле:
можно в словарь rex добавить правило:
тогда будут читаться только слова без цифр и делая паузу между словами.
Само же правило О-очень маловероятно сработает при чтении книги и что то сломает. Так что его наличием в словаре можно пренебречь.
Код: Выделить всё
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' для записи исключений
► Показать
Получится что то в роде:
► Показать
► Показать
Отправлено спустя 7 минут 22 секунды:
Код: Выделить всё
os.execute('start notepad.exe ИмяФайла.txt')
Отправлено спустя 1 час 11 минут 13 секунд:
Небольшой лайфхак как прослушивать скопом список Имён, если список сделан в стиле:
► Показать
Код: Выделить всё
^\d+\|(\w+)$=$1 <speak><break time="100ms"/><speak>
Само же правило О-очень маловероятно сработает при чтении книги и что то сломает. Так что его наличием в словаре можно пренебречь.
- tonio_k
- V.I.P.
Скрипты для Demagog
А есть возможность в calculator.lua как нибудь прописать require "profiles/mylib" ?
очень часто при попытке создать "по быстрому" скрипт, например, прямо в окне Демагога - забываешь про эту строку. Потом репу чешешь а почему у тебя твоя любимая функция не срабатывает...
очень часто при попытке создать "по быстрому" скрипт, например, прямо в окне Демагога - забываешь про эту строку. Потом репу чешешь а почему у тебя твоя любимая функция не срабатывает...
- flegont
- V.I.P.
Скрипты для Demagog
Нет. calculator.lua - не предназначен для пользователя. Это - служебный файл Демагога. Все свои собственные разработки пользователь должен хранить в отдельном файле и подключать его к своим скриптам
- flegont
- V.I.P.
Скрипты для Demagog
AnsiToUtf8(s, hasbom) - преобразует строку s в кодировке ansi в кодировку utf-8. Если hasbom = true, то в строку добавляется Byte Order Mark. (По умолчанию hasbom = false).
Пример использования:
Код: Выделить всё
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')
- flegont
- V.I.P.
- tonio_k
- V.I.P.
Скрипты для Demagog
А какое практическое применение, если в настройках Демагога и так указанно сохранение в utf8?
Вроде в рамках Демагога была проблема обратного направления utf8 в ANSI без потерь?
Вроде в рамках Демагога была проблема обратного направления utf8 в ANSI без потерь?
- flegont
- V.I.P.
Скрипты для Demagog
Ну, если нужен файл в кодировке utf8. но при этом без BOM. Демагог-то сохраняет все виды юникодных кодировок, автоматом добавляя BOM. Иногда лишние невидимые байты в начале файла мешают другим программам или онлайн-сервисам.
- flegont
- V.I.P.
Скрипты для Demagog
Кстати, utf8 можно направить в ansi без потерь. Вместо символа, который не может быть отображен в ansi, в строке можно оставлять его юникодный код. С каким-нибудь особым знаком-префиксом. Что-нибудь вроде #22899#12398#23376
Это же ansi-строка, разве нет?
А при сбросе этой строки в файл (нужна особая функция, разбирающая коды) получится:
女の子
В таких строках даже замены можно делать стандартным образом. Но, подобные строки тяжелы для восприятия пользователя - их истинный вид восстанавливался бы только после вывода в файл или окно Демагога.
Это же ansi-строка, разве нет?
А при сбросе этой строки в файл (нужна особая функция, разбирающая коды) получится:
女の子
В таких строках даже замены можно делать стандартным образом. Но, подобные строки тяжелы для восприятия пользователя - их истинный вид восстанавливался бы только после вывода в файл или окно Демагога.
- tonio_k
- V.I.P.
Скрипты для Demagog
т.е. #22899 можно поменять на #23376 но не 女 на 子 ?
В скрипте цифровой код будет неудобоварим для восприятия и контроля что на что меняешь
- flegont
- V.I.P.
Скрипты для Demagog
Да уж... удобоваримостью и не пахнет. Потому воздерживаюсь от подобных экспериментов
- tonio_k
- V.I.P.
Скрипты для Demagog
Продолжая тему кодировок:
Как можно через скрипт сохранить текст из окна Демагога в кодировке ANSI ? Игнорируя в настройках Демагога utf-8
Как можно через скрипт сохранить текст из окна Демагога в кодировке ANSI ? Игнорируя в настройках Демагога utf-8
- flegont
- V.I.P.
Скрипты для Demagog
Код: Выделить всё
s = WText(1)
f = io.open('proba.txt',"w") -- открыть файл для записи
f:write(s) -- записать в него строку s
f:close() -- закрыть файл
В принципе, и файл utf8 можно условно считать файлом ansi - ведь он не содержит нулевых байтов, кроме последнего. Другое дело, что если язык - не английский, то такой текстовый файл будет нечитаемым без специальной обработки - хотя бы эвристического анализа, для распознания его "истинной" кодировки
- tonio_k
- V.I.P.
Скрипты для Demagog
что то не получается
файл 0.txt создается, но выходит ошибка
Отправлено спустя 25 минут 31 секунду:
сообщение об ошибке более читабельно
► Показать
Отправлено спустя 25 минут 31 секунду:
сообщение об ошибке более читабельно
► Показать
- balaamster
- Обыватель
Скрипты для Demagog
Набор скриптов для озвучивания книги через сервис Yandex TTS
За идею и тестирование спасибо tonio_k, без его идеи и помощи скриптов могло и не быть :) Также спасибо flegont за помощь в исправлении алгоритма деления на сериал.
Способ работы со скриптами.
1. Для настройки голоса запускаем через Ctrl+F2 "YaTTS_configure.lua" выбираем голос, темп речи, эмоциональную окраску.
2. Для получения mp3-файлов
Если процесс скачивания необходимо прервать, в окне консоли нажимаем ctrl+c. (временные txt- mp3-файлы сохранятся в каталоге "%temp%\имя_файла_книги\", в каталоге для готовых mp3-файлов при этом ничего не появится.
Если в процессе скачивания возникнут ошибки - сетевой сбой, ошибка работы моего скрипта, то
в конце работы скрипта появится сообщение, о несоответствии количества текстовых файлов сериала и полученных mp3-файлов, в проводнике откроется каталог, в котором находятся временные txt-файлы сериала, полученные mp3-файлы (подкаталог "audio") и лог-файл (подкаталог "log")
Процесс скачивания можно будет продолжить, заново запустив скрипт на вкладке с книгой и ответив на запрос "ДА - продолжить преобразование с последнего необработанного файла"
3. Для озвучивания слова/фразы/текстового фрагмента(не более 1000 символов)
Если выделенный фрагмент не изменён и его надо прослушать повторно, то можно запустить скрипт ещё раз, при этом повторное скачивание производиться не будет. (или можно самостоятельно открыть файл "%temp%\speak_tmp\audio\speak.mp3")
Для использования скрипта необходимо наличие ffmpeg.exe в папке с Demagog. Скачать можно тут
Содержимое архива "Demagog+YandexTTS.zip" распаковать в папку с Demagog
До обновления версии Demagog выше 7.29.369, необходимо скопировать "calculator.lua" из папки temp в папку "profiles" с заменой существующего файла.
За идею и тестирование спасибо 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"
- ожидаем, пока закроется чёрное окно консоли (завершится процесс скачивания)
Если выделенный фрагмент не изменён и его надо прослушать повторно, то можно запустить скрипт ещё раз, при этом повторное скачивание производиться не будет. (или можно самостоятельно открыть файл "%temp%\speak_tmp\audio\speak.mp3")
Для использования скрипта необходимо наличие ffmpeg.exe в папке с Demagog. Скачать можно тут
Содержимое архива "Demagog+YandexTTS.zip" распаковать в папку с Demagog
До обновления версии Demagog выше 7.29.369, необходимо скопировать "calculator.lua" из папки temp в папку "profiles" с заменой существующего файла.
- Вложения
-
- Demagog+YandexTTS.zip
- (10.63 КБ) 577 скачиваний
- tonio_k
- V.I.P.
Скрипты для Demagog
И сразу пожелание:
"Склеить MP3 файлы в один 5 минут 10 15 и т.д." желательно перенести в предварительные настройки YaTTS_configure.lua
Соответственно, при склеивании, информацию о размерах файла брать из uri.txt
Это для того, что бы YaTTS.lua можно было объединить со скриптом обрабатывающим словарями текст книги. Что бы с момента начала обработки словарями и до получения MP3 больше не было дополнительных диалогов. (Если, конечно, не возникло каких либо сбоев на Яндексе)
"Склеить MP3 файлы в один 5 минут 10 15 и т.д." желательно перенести в предварительные настройки YaTTS_configure.lua
Соответственно, при склеивании, информацию о размерах файла брать из uri.txt
Это для того, что бы YaTTS.lua можно было объединить со скриптом обрабатывающим словарями текст книги. Что бы с момента начала обработки словарями и до получения MP3 больше не было дополнительных диалогов. (Если, конечно, не возникло каких либо сбоев на Яндексе)
- flegont
- V.I.P.
Скрипты для Demagog
Версия Demagog обновлена до 370.
Исправлены мелкие ошибки, в т.ч. в функции встроенного интерпретатора Fragments()
(Из-за этого другая функция - WSeries() неправильно выдерживала заданный размер серии - в сторону завышения)
Исправлены мелкие ошибки, в т.ч. в функции встроенного интерпретатора Fragments()
(Из-за этого другая функция - WSeries() неправильно выдерживала заданный размер серии - в сторону завышения)
- wasyaka
- V.I.P.
Скрипты для Demagog
А в таком виде можно показать?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" с заменой существующего файла.
(для справки 02 тхт - обработанный словарями текст с ударением на выходе заглавной буквой. тхт 2 -обработка словарями Яндекс - ударение (+))
- tonio_k
- V.I.P.
Скрипты для Demagog
► Показать
Отправлено спустя 8 минут 47 секунд:
YaTTS_configure.lua - достаточно 1 раз запустить. Настройки сохранятся для всех последующих запусков YaTTS.lua
\Demagog\_Tests_\YaTTS_configure.lua
найдите строки:
Код: Выделить всё
local r0 = [[
\.\.\.:: / /.
\+=%2b
,= /
\.= /.
(?<=\w)\?(?=\w)::
( )+=$1
\s{2,}$::
]]
s = RexRepl(s,{r0})
синтаксис - привычные правила для словарей в формате REX
Отправлено спустя 8 минут 30 секунд: сборка для тестирования. Что бы все как на видео получилось.
Отправлено спустя 1 час 1 минуту 48 секунд:
ошибся правильно
\Demagog\_Tests_\YaTTS.lua
- balaamster
- Обыватель
Скрипты для Demagog
Обновил скрипты.
Теперь количество потоков для скачивания и длительность аудиофрагментов задаются через диалоги в "YaTTS_configure.lua".
В "YaTTS.lua" переменные destination и delete_source сделал глобальными. Это позволит запускать "YaTTS.lua" из других скриптов совсем без диалоговых окон.
Например:
Код: Выделить всё
ind = WActive()
WFilter(ind, ind, HomeFolder('dic').."70_Яндекс+ОМО.dic")
destination = 'D:\\audiobook\\book1\\'
delete_source = true
dofile(HomeFolder('_Tests_')..'YaTTS.lua')