Скрипты для Demagog

Говорящий текстовый редактор с открытым кодом, предназначенный для чтения вслух и записи в аудиофайл текстовых файлов с использованием пакетов речевых функций SAPI4\SAPI5.

Модератор: flegont

Ответить
Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#251

Сообщение tonio_k » 06 мар 2019 22:37

вопрос, есть ли принципиальная разница в механизме работы между:
WFilter (указываю путь к словарю rex) и RexRepl (правила считываю в переменную из того же словаря) в плане скорости между ними?
* проблему с кодировкой юникод в RexRepl при сравнении в расчет брать не будем.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#252

Сообщение flegont » 06 мар 2019 23:49

Теоретически, ощутимой разницы по времени работы быть не должно. Обе функции используют одну и ту же процедуру замены в тексте по заданному регулярному выражению.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#253

Сообщение tonio_k » 08 мар 2019 23:36

Немного модифицировал функции по применению словарей к сериалу
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)
здесь в глобальную переменную global_index_rex записывается поисковый индекс, который будет применяться к каждому открытому тексту сериала в поиске омографов.

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
на всякий случай все функции в одном файле
mylib_index.zip
(1.55 КБ) 51 скачивание



Отправлено спустя 11 часов 42 минуты 54 секунды:
Небольшое изменение:
tonio_k писал(а):
08 мар 2019 23:36
2) Что бы создать индекс к основному словарю (в примере 20_REX_Замены от waska.rex), нужно прописать один раз в начале скрипта:
можно прописать всего одну строку, а остальное перенести в функцию function SPEEDOMOREX_INDEX

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

global_index_rex = SPEEDOMOREX_INDEX(HomeFolder('dic')..'20_REX_Замены от waska.rex') -- переменная глобальная
tonio_k писал(а):
08 мар 2019 23:36
4) Дополнительно для работы этих функций нужно в калькуляторе или в личной библиотеке mylib_inex.lua (вызывается командой require "profiles/mylib_inex") добавить еще записи:
в функцию 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
файл
mylib_index.zip
(1.8 КБ) 39 скачиваний
mylib_inex с изменениями

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#254

Сообщение balaamster » 10 мар 2019 21:59

Решил набросать функцию для измерения времени выполнения других функций.

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

-- измерение времени выполнения функции за 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])
► Показать
parse_myst_json(json_dic)
► Показать
Пример использования: Выделяем слово или предложение во вкладке, запускаем 00_mystem_demo.lua по Ctrl+F2
Получаем во вкладке 0 разбор выделенного фрагмента в режиме вывода "text", плюс разбор, в режиме "JSON", записанной в скрипте str = 'привет, ребята'

Писал для просмотра информации по омографам (вероятность встречи конкретного омографа)
Например:
► Показать
И на будущее, вдруг научусь алгоритмам морфологического разбора и снятию омонимии по контексту :big_smile:
Вложения
mystem.zip
(2.73 КБ) 44 скачивания

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#255

Сообщение tonio_k » 11 мар 2019 12:45

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

s=WText(1) -- окно 1 в переменную s
s = table.sortuniq(s) -- удалить дубликаты
WNew(0,s)
на файле
боевой.txt
(841 байт) 132 скачивания
LUA выводит ошибку " bad argument #1 to 'sort' "

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#256

Сообщение flegont » 11 мар 2019 15:40

Потому что аргументом должна быть таблица, а не строка

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

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

#257

Сообщение tonio_k » 11 мар 2019 23:39

ИНДЕКСНЫЙ МЕТОД
Эксперимента ради, попробовал проиндексировать словарь при помощи запроса в виде:
\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

#258

Сообщение tonio_k » 14 мар 2019 16:05

из таблицы в текстовый формат я так делаю:

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

fnd = Input(header,{askname..'='..fnd})
--преобразуем fnd из таблицы в текстовый формат
WNew(0,fnd)
fnd_txt = WText(0)
WNew(0,fnd)
а как будет правильнее средствами LUA?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#259

Сообщение flegont » 14 мар 2019 16:23

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

-- таблица
fnd = {'однажды в студеную','зимнюю пору','я из лесу вышел'}
-- текст
s = table.concat(fnd,'\r')
-- печатаем, чтобы убедиться
print(s)

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#260

Сообщение tonio_k » 18 мар 2019 18:18

tonio_k писал(а):
18 мар 2019 14:37
"Добавить фразу в словарь"
а может это через скрипт можно сделать? К Выделеному тексту применить скрипт через горячую клавишу :suspect:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#261

Сообщение flegont » 18 мар 2019 18:40

Интересная мысль. Надо попробовать.


Отправлено спустя 7 минут 29 секунд:
Хотя, если в словаре используется транскрипция МФА ( а это - юникод!), то любые действия скрипта с таким словарем - словарь испортят.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#262

Сообщение tonio_k » 19 мар 2019 14:03

flegont писал(а):
18 мар 2019 18:47
то любые действия скрипта с таким словарем - словарь испортят.
Если поставить запрет на работу в окне статистики, то

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

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

#263

Сообщение tonio_k » 19 мар 2019 14:14

К стати, если бы помимо: BufNew, BufAdd, BufOpen
создать еще BufSave - тогда про необходимость в запрете на использование окна статистики можно забыть. И, теоретически, частично скрипты можно было бы подружить с кодировкой Юникод?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#264

Сообщение flegont » 19 мар 2019 14:51

Порча текста (в смысле потери юникодных символов) происходит при преобразовании текста в окне в строковую переменную интерпретатора. Например:
s = WText(0).
В строке s вместо юникодных символов будут знаки вопроса.
Аналогично, при прямом присвоении символов юникода строковой переменной:
s = [[こんにちは世界!]]
В этом случае текст скрипта - в кодировке юникод, но перед его выполнением он будет преобразован в кодировку ANSI. И опять юникодным символам - кирдык. То есть, в скрипте невозможно проводить замену/подстановку транскипции МФА напрямую.
В этом проблема.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#265

Сообщение tonio_k » 19 мар 2019 15:22

В данной ситуации можно создать в Демагоге специальное всплывающее текстовое окно, вызываемое средствами скрипта, в котором при нажатии на кнопку Ок содержимое окна передавалось в BufAdd - все это минуя переменные LUA. Но будет ли в этом смысл? Если это окно больше негде применить :suspect:
С тем же успехом, можно и в самом Демагоге внести исправления и к правой клавише привязать "Добавить фразу в словарь". Вопрос, на сколько она вообще нужна пользователям? Скрипт для частных ситуаций - вполне себе выход не для "серийного производства"
flegont писал(а):
19 мар 2019 14:51
невозможно проводить замену/подстановку транскипции МФА напрямую.
честно говоря, я себе с трудом представляю, что бы кто-то умел вводить с клавиатуры транскипции МФА напрямую. Так что "Добавить фразу в словарь" применим только к тексту обычного рода заменам типа: выгнул брови=выгнул брОви или выгнул брови=выгнул бро<ви. Нужно ввести в МФА? - тогда остается стандартный способ.
Что касается китайского - тут я пас :no:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#266

Сообщение flegont » 19 мар 2019 16:45

Ну, в таком случае, можно и скриптом. Это будет приемлемое решение для большинства случаев. И для транскрипции UPS тоже сгодится - она машиночитаемая, только латинские буквы + специальные знаки, которые есть на клавиатуре :ok:

P.S. Например, стандартый Win 10 голос Pavel имхо неплох, и понимает UPS.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#267

Сообщение tonio_k » 19 мар 2019 16:52

flegont писал(а):
19 мар 2019 16:45
стандартый Win 10 голос Pavel имхо неплох, и понимает UPS.
а можно, по возможности пример озвучки текста?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#268

Сообщение flegont » 19 мар 2019 18:14

Четкий, холодноватый, окончания не проглатывает. И, как я убедился, огрехи произношения легко исправляются через транскрипцию UPS.
Microsoft Pavel (пример звучания)
Запись аудио сделана скриптом для Demagog - converter.lua, написанным balaamster.

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#269

Сообщение balaamster » 21 мар 2019 22:01

Обновил conv.bat - конвертирование с возможностью изменения темпа, добавления реверберации и фоновой музыки.
  • Исправлена ошибка - затухание фонового звука не работало, если фоновый трек короче читаемого фрагмента.
  • Папку с фоновыми треками теперь можно не держать в папке с Demagog. В строке 5, в conv.bat, можно заменить "%~dp0fon" на свой путь к папке с фоновыми треками. Если путь содержит пробелы, то его нужно заключить в кавычки
  • Файл fon.mp3, в папке Demagog, более не требуется. Путь к фоновому треку передаётся ffmpeg напрямую.
  • В качестве фона могут быть mp3 и ogg-файлы.
► Показать
conv.zip
(1.26 КБ) 40 скачиваний

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#270

Сообщение flegont » 22 мар 2019 08:55

Очень удобно получилось! Я прописал в настройках Custom Encoder:
%~conv.bat %1 %2 64 1.0 true 0.1 mp3
:thank_you:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#271

Сообщение flegont » 28 мар 2019 17:54

Примеры работы с "внутренним буфером" (начиная с вер. 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

#272

Сообщение tonio_k » 28 мар 2019 18:39

Delay(msec) задерживает выполнение скрипта на msec миллисекунд
Не могу на форуме найти пример применения. Вроде бы выкладывали.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#273

Сообщение flegont » 28 мар 2019 18:51

Пример использования есть в скрипте Graphics demo.lua в папке _Tests_
Функция Delay() находится в библиотеке grafica.lua, поэтому надо так:

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

require "profiles/grafica"
ShowMessage('Жми!')
Delay(1500)
ShowMessage('Прошло полторы секунды!')
P.S. На самом деле - это функция Delphi - sleep(msec), сделанная доступной интерпретатору Демагога под другим именем :smile1:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#274

Сообщение tonio_k » 28 мар 2019 19:29

Спасибо!
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ʲɪ
Что бы избежать переменных типа: s=WText, которая убивает юникод,
Применил вот такой скрипт:

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

ind=WActive()
r0 = [[
\<phoneme ph=\"::
\"\/\>::
=::;
\$::
]]
SaveToFile({r0},'#rex.rex')
WFilter(ind,ind,'#rex.rex')
os.remove('#rex.rex')
#rex.rex - имя файла словаря с расширением rex
Юникод сохранен! :wink:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#275

Сообщение flegont » 28 мар 2019 19:45

Точно-точно, это - работает!
Нормальные герои всегда идут в обход (с) :ok:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#276

Сообщение tonio_k » 29 мар 2019 15:08

"Имена и аббревиатуры" Исключения
Мне очень нравилось Балаболке в поиске "Имена и аббревиатуры" отдельная опция "Не показывать слова из текстового файла".
Этот файл пополнялся собственными именами из предыдущих поисков. И от книги к книге за счет пополнения исключений в файле, выводимый список имен при последующих поисках становился относительно меньше и меньше.

Решил вопрос скриптом:

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

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)
Файл 'Исключения Имена.txt' создается в Demagog\profiles
Для работы скрипта в личную библиотеку с функциями (у меня 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 но не знаю как это сделать :pardon:


Отправлено спустя 7 минут 27 секунд:
В плане совершенствования скрипта, не плохо бы было, если бы список выводился в виде:
018|Альбуцин
005|Академия
003|Альбуцином
001|Альбуцина
где цифры - это сколько раз данное слово встречается в тексте
Отсортировав можно было бы прослушать только часто встречающиеся имена, а редкими можно пренебречь.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#277

Сообщение flegont » 29 мар 2019 20:35

что бы он в конце скрипта открывался параллельно в блокноте.

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

os.execute('notepad.exe ИмяФайла.txt')
Система сама найдет, где у нее лежит этот экзешник, и вызовет его.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#278

Сообщение tonio_k » 30 мар 2019 00:55

tonio_k писал(а):
29 мар 2019 15:16
В плане совершенствования скрипта, не плохо бы было, если бы список выводился в виде:
018|Альбуцин
005|Академия
003|Альбуцином
001|Альбуцина
в интернете нашел что-то "примерно" делающее это. Считает только количество совпадений:

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

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|мышь
В этом примере считает только "совпадения". Поэтому "каша" в результат не попадает - у нее совпадений =0. А нужно что бы считал именно количество слов в таблице.
Плюс я в упор не представляю, как выцепить print ( e .. "|" .. i) в переменную, что бы с ней можно было дальше работать как с таблицей либо в текстовый формат перевести.
Нужна помощь. :boy_blushed:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#279

Сообщение flegont » 30 мар 2019 09:59

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

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. Это, конечно, решение лобовое. Что-то подсказывает мне, что можно решить изящнее. Но, пока и так сойдет :pardon:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#280

Сообщение tonio_k » 30 мар 2019 14:38

Доработал скрипт. Спасибо flegont за помощь :thank: .

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

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' для записи исключений
Полученный в окне Статистики список Имен можно легко отсортировать. Правая клавиша: Сортировка строк - Цифровая по убыванию. Тогда список выстоится по частоте повторения слов в тексте:
► Показать
Для удобства добавил в скрипт "чистку от цифрового мусора" - что бы не вносить в блокнот каждое слово по отдельности, можно скопировать весь список (или его часть) из окна Статистики и вставить "как есть с цифрами" в блокнот с открытым файлом 'Исключения Имена.txt'.
Получится что то в роде:
► Показать
При каждом запуске скрипта, содержимое файла 'Исключения Имена.txt' будет автоматом очищено от цифрового мусора и отсортировано и сохранено по новому:
► Показать



Отправлено спустя 7 минут 22 секунды:
flegont писал(а):
29 мар 2019 20:35
os.execute('notepad.exe ИмяФайла.txt')
Система сама найдет, где у нее лежит этот экзешник, и вызовет его.

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

os.execute('start notepad.exe ИмяФайла.txt')
то же самое, но черный экран cmd.exe сразу закроется после запуска блокнота (мелькнет и исчезнет).


Отправлено спустя 1 час 11 минут 13 секунд:
Небольшой лайфхак как прослушивать скопом список Имён, если список сделан в стиле:
► Показать
можно в словарь rex добавить правило:

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

^\d+\|(\w+)$=$1  <speak><break time="100ms"/><speak>
тогда будут читаться только слова без цифр и делая паузу между словами.
Само же правило О-очень маловероятно сработает при чтении книги и что то сломает. Так что его наличием в словаре можно пренебречь.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#281

Сообщение tonio_k » 01 апр 2019 23:39

А есть возможность в calculator.lua как нибудь прописать require "profiles/mylib" ?
очень часто при попытке создать "по быстрому" скрипт, например, прямо в окне Демагога - забываешь про эту строку. Потом репу чешешь а почему у тебя твоя любимая функция не срабатывает... :tongue2:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#282

Сообщение flegont » 02 апр 2019 00:22

Нет. calculator.lua - не предназначен для пользователя. Это - служебный файл Демагога. Все свои собственные разработки пользователь должен хранить в отдельном файле и подключать его к своим скриптам :pardon:

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#283

Сообщение flegont » 05 апр 2019 10:07

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.

Скрипты для Demagog

#284

Сообщение flegont » 05 апр 2019 10:22

Сразу же поправил пару строк - переменная a не использовалась :pardon:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#285

Сообщение tonio_k » 05 апр 2019 10:33

А какое практическое применение, если в настройках Демагога и так указанно сохранение в utf8?
Вроде в рамках Демагога была проблема обратного направления utf8 в ANSI без потерь?

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#286

Сообщение flegont » 05 апр 2019 10:42

Ну, если нужен файл в кодировке utf8. но при этом без BOM. Демагог-то сохраняет все виды юникодных кодировок, автоматом добавляя BOM. Иногда лишние невидимые байты в начале файла мешают другим программам или онлайн-сервисам.

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#287

Сообщение flegont » 05 апр 2019 10:50

Кстати, utf8 можно направить в ansi без потерь. Вместо символа, который не может быть отображен в ansi, в строке можно оставлять его юникодный код. С каким-нибудь особым знаком-префиксом. Что-нибудь вроде #22899#12398#23376
Это же ansi-строка, разве нет? :big_smile:
А при сбросе этой строки в файл (нужна особая функция, разбирающая коды) получится:
女の子
В таких строках даже замены можно делать стандартным образом. Но, подобные строки тяжелы для восприятия пользователя - их истинный вид восстанавливался бы только после вывода в файл или окно Демагога.

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#288

Сообщение tonio_k » 05 апр 2019 11:17

flegont писал(а):
05 апр 2019 10:50
В таких строках даже замены можно делать стандартным образом.
т.е. #22899 можно поменять на #23376 но не 女 на 子 ?
В скрипте цифровой код будет неудобоварим для восприятия и контроля что на что меняешь

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#289

Сообщение flegont » 05 апр 2019 11:27

Да уж... удобоваримостью и не пахнет. Потому воздерживаюсь от подобных экспериментов :pardon:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#290

Сообщение tonio_k » 05 апр 2019 17:58

Продолжая тему кодировок:
Как можно через скрипт сохранить текст из окна Демагога в кодировке ANSI ? Игнорируя в настройках Демагога utf-8

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#291

Сообщение flegont » 05 апр 2019 21:08

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

s = WText(1)
f = io.open('proba.txt',"w") -- открыть файл для записи
f:write(s) -- записать в него строку s
f:close() -- закрыть файл
Так как запись делается исключительно средствами Lua, то файл будет в кодировке ansi.
В принципе, и файл utf8 можно условно считать файлом ansi - ведь он не содержит нулевых байтов, кроме последнего. Другое дело, что если язык - не английский, то такой текстовый файл будет нечитаемым без специальной обработки - хотя бы эвристического анализа, для распознания его "истинной" кодировки

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#292

Сообщение tonio_k » 06 апр 2019 23:40

что то не получается :boy_blushed:
► Показать
файл 0.txt создается, но выходит ошибка


Отправлено спустя 25 минут 31 секунду:
сообщение об ошибке более читабельно
► Показать

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#293

Сообщение flegont » 07 апр 2019 00:27

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

f:write(s) 
f:close()

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#294

Сообщение 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" с заменой существующего файла.
Вложения
Demagog+YandexTTS.zip
(10.63 КБ) 25 скачиваний

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#295

Сообщение tonio_k » 13 апр 2019 17:58

И сразу пожелание:
"Склеить MP3 файлы в один 5 минут 10 15 и т.д." желательно перенести в предварительные настройки YaTTS_configure.lua
Соответственно, при склеивании, информацию о размерах файла брать из uri.txt

Это для того, что бы YaTTS.lua можно было объединить со скриптом обрабатывающим словарями текст книги. Что бы с момента начала обработки словарями и до получения MP3 больше не было дополнительных диалогов. (Если, конечно, не возникло каких либо сбоев на Яндексе)

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#296

Сообщение flegont » 13 апр 2019 20:03

Версия Demagog обновлена до 370.
Исправлены мелкие ошибки, в т.ч. в функции встроенного интерпретатора Fragments()
(Из-за этого другая функция - WSeries() неправильно выдерживала заданный размер серии - в сторону завышения)

Аватара пользователя
wasyaka
V.I.P.

Скрипты для Demagog

#297

Сообщение wasyaka » 13 апр 2019 21:58

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 -обработка словарями Яндекс - ударение (+))
Video_2019-04-13_213536.rar
(2.12 МБ) 28 скачиваний
:thank:

Аватара пользователя
tonio_k
V.I.P.

Скрипты для Demagog

#298

Сообщение tonio_k » 13 апр 2019 23:06

wasyaka писал(а):
13 апр 2019 21:58
А в таком виде можно показать?
► Показать



Отправлено спустя 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 секунд:
Demagog-Yandex.zip
(24.19 МБ) 30 скачиваний
сборка для тестирования. Что бы все как на видео получилось.


Отправлено спустя 1 час 1 минуту 48 секунд:
tonio_k писал(а):
13 апр 2019 23:23
\Demagog\_Tests_\YaTTS_configure.lua
найдите строки:
ошибся правильно
\Demagog\_Tests_\YaTTS.lua

Аватара пользователя
balaamster
Обыватель

Скрипты для Demagog

#299

Сообщение balaamster » 14 апр 2019 02:07

tonio_k писал(а):
13 апр 2019 17:58
И сразу пожелание:
"Склеить MP3 файлы в один 5 минут 10 15 и т.д." желательно перенести в предварительные настройки YaTTS_configure.lua
Соответственно, при склеивании, информацию о размерах файла брать из uri.txt
Обновил скрипты.
Теперь количество потоков для скачивания и длительность аудиофрагментов задаются через диалоги в "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')
Скрипт применит словарь "70_Яндекс+ОМО.dic" к активной вкладке и запустит скачивание c Яндекса без диалоговых окон.
Demagog+YandexTTS.zip
(5.88 КБ) 42 скачивания

Аватара пользователя
flegont
V.I.P.

Скрипты для Demagog

#300

Сообщение flegont » 14 апр 2019 14:16

:thank_you:
Добавил эту ссылку на страничку Демагога

Ответить

Вернуться в «Demagog»