Скрипты для Demagog

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

Модератор: flegont

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

Скрипты для Demagog

#201

Сообщение flegont » 02 дек 2018 20:40

Конвертер № 3 у меня не пашет. Хоть conv.bat полный путь, хоть без пути. Мгновенно мелькает черное окошко и все. mp3 не создан, исходный wav удален.

А первые 2 конвертера - работают прекрасно. Особенно 2-й. Смотрю, как всё это крутится, потом слушаю, и медленно обалдеваю, придерживая рукой отвисающую от изумления челюсть... :smile1:
Пример чтения :up:

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

Скрипты для Demagog

#202

Сообщение tonio_k » 02 дек 2018 21:09

balaamster писал(а):
25 ноя 2018 21:37
Для реверберации нужно прописать такие настройки:
-loglevel -8 -y -i %1 -af "aecho=0.8:0.6:20|40:0.2|0.2, atempo=1.1" -b:a 64k %2
conv.zip
реверберацию, думаю, тоже надо в отдельный пункт меню выделить "добавить реверберацию?"

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

Скрипты для Demagog

#203

Сообщение flegont » 02 дек 2018 21:12

Конвертер №2. Желательно также дать пользователю возможность выбирать в меню соотношение громкости фона и речи. А то бывает, музыка местами глушить диктора.

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

Скрипты для Demagog

#204

Сообщение tonio_k » 02 дек 2018 21:47

flegont писал(а):
02 дек 2018 20:40
Конвертер № 3 у меня не пашет
у меня работает хорошо.
► Показать
и да, - нужно указывать полный путь. Жаль, что нужно полный путь указывать. Не портабл :boy_crying:

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

Скрипты для Demagog

#205

Сообщение balaamster » 02 дек 2018 22:04

tonio_k писал(а):
02 дек 2018 21:09
реверберацию, думаю, тоже надо в отдельный пункт меню выделить "добавить реверберацию?"
flegont писал(а):
02 дек 2018 21:12
Желательно также дать пользователю возможность выбирать в меню соотношение громкости фона и речи.
Добавил выбор реверберации и уровня громкости фона. В архиве только обновлённый скрипт.
converter_lua.zip
(5.12 КБ) 15 скачиваний
flegont писал(а):
02 дек 2018 20:40
Конвертер № 3 у меня не пашет
Проверил скрипт ещё раз, поправил переменные, где могут потребоваться кавычки для путей с пробелами.

На досуге попробую для bat-конвертера добавить параметры для реверберации и громкости фона.
tonio_k писал(а):
02 дек 2018 21:47
и да, - нужно указывать полный путь. Жаль, что нужно полный путь указывать. Не портабл
Попробовал добавить "& pause", чтобы успеть прочитать, что пишется в окне, при вводе только conv.bat в CustomEncoder:
"conv.bat" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
не знаю, получится это побороть или нет.
Вложения
converter_bat.zip
(1.69 КБ) 12 скачиваний

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

Скрипты для Demagog

#206

Сообщение tonio_k » 02 дек 2018 22:18

flegont, такая мысль, может сделать консольную реализацию демагога в отношении своих скриптов?
Например demagog.exe confert.lua - ну а в confert.lua - все что душа программиста требует :loveboy: ?
Как вариант demagog.exe в качестве Custom encoder где все настройки в соответствующем скрипте

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

Скрипты для Demagog

#207

Сообщение balaamster » 02 дек 2018 22:24

upd.
Добавил в bat-конвертер
Теперь параметры
%1 %2 64 1.0 true 0.1
порядок параметров получается такой: путь_входного_файла путь_выходного_файла битрейт темп реверберация громкость_фона
реверберация - true или false
громкость_фона - 0.1 - 1.0
converter_bat(new).zip
(1.83 КБ) 16 скачиваний

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

Скрипты для Demagog

#208

Сообщение tonio_k » 02 дек 2018 22:31

balaamster,
converter_lua.zip "Выберите громкость фонового звука" - только ведь созрел, что бы поднять этот вопрос. А вы уже его решили :jokingly:

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

Скрипты для Demagog

#209

Сообщение flegont » 02 дек 2018 23:02

Конвертер №4 :ok: :victory: всё работает!

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

Скрипты для Demagog

#210

Сообщение flegont » 02 дек 2018 23:10

консольную реализацию демагога
Нет. Демагог всегда будет существовать в том виде, как он есть. Это - не какая-то там утилита, а довольно мощный текстовый редактор, который я использую, когда Блокнота мне уже мало, а Word'а - еще много. А то, что Демагог умеет читать вслух и записывать аудио - это приятный бонус :big_smile:
P.S. А то, что он еще и скрипты выполняет - так это был мой каприз, захотелось, чтобы программа, умеющая говорить, могла бы еще и считать. (Может, сказалось то, что я по образованию - математик). Первоначально опция так и называлась; "Калькулятор" :smile3:

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

Скрипты для Demagog

#211

Сообщение flegont » 03 дек 2018 07:44

При желании, можно, конечно запустить Демагог из командной строки, свернутым в значок.

Вызов программы из командной строки:
Demagog.exe имя_файла список_параметров. Список параметров - необязателен. Параметры в списке разделяются пробелами и могут следовать в любом порядке. Их значения следующие:

/m - запустить программу свернутой в значок
/r - открыть файл и начать чтение вслух
/s - открыть файл и сохранить текст в виде аудиофайла
/c - прочесть вслух текст из буфера обмена
/q - закрыть программу после окончания чтения
Например: Demagog "C:\Tests\Некий текст.txt" /m /r /q

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

Скрипты для Demagog

#212

Сообщение tonio_k » 03 дек 2018 12:34

flegont писал(а):
30 ноя 2018 13:56
Я точно не помню, надо глянуть в программе: как работает WText(). Возможно, там остался "артефакт"
из argo-interpreter:
WText(i) возвращает ansi-строку, содержащую текст (или его выделенный фрагмент) из вкладки i
Думаю, это не "артефакт", а нужная фишка. Присвоение переменной выделенный текст - тоже может пригодиться.

Для "чистого" присвоения переменной s содержимое вкладки хотел попробовать сделать через последовательность:

BufNew(s) -- очищаем буфер
r = BufAdd(1, s) -- присваиваем переменной r содержимое вкладки 1
ShowMessage(r)

но так почему то не работает...

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

Скрипты для Demagog

#213

Сообщение flegont » 03 дек 2018 14:06

или его выделенный фрагмент
Сам факт, что я когда-то такую нужную фишку сделал и напрочь о ней забыл, означает, что сделал не так, как надо. Поэтому будет переделано. WText(i) будет возвращать текст из вкладки i.
А уже существующая функция WSelText(i, z), заменяющая выделенный во вкладке i текст, строкой z, будет иметь дополнительный вариант. WSelText(i) с одним аргументом - номером вкладки, вернет выделенный текст в этой вкладке или '' если выделения нет.
По крайней мере, по названию функции будет ясно, с чем именно она работает - с выделенным текстом.
Для "чистого" присвоения
Функции Buf...() не возвращают значений. Они только оперируют с внутренним буфером. Единственный способ получить содержимое буфера: BufOpen(i) - открыть буфер в какой-нибудь вкладке.
И я не совсем понял, что имеется в виду под "чистым" присвоением? Сохранить содержащийся в буфере юникод? Ничего не выйдет, Lua все юникодные символы заменит знаком ?

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

s = "日本"  -- написать юникод в Lua-скрипте можем
ShowMessage(s)  -- работать с ним - нет
Поэтому я и придумал ВБ, чтобы выполнять конкатенацию текстов, НЕ обращаясь к работе со строками в Lua. Это - сохраняет юникод, т.к. с ВБ работает Демагог. По соответствующим командам, подаваемым из Lua-скрипта :wink:

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

Скрипты для Demagog

#214

Сообщение tonio_k » 03 дек 2018 15:21

flegont писал(а):
03 дек 2018 14:06
что имеется в виду под "чистым" присвоением?
я имел в виду содержимое окна без "выделения строк" - т.е. содержимое окна как оно есть. Не удачно выразился :dont_know:

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

Скрипты для Demagog

#215

Сообщение flegont » 04 дек 2018 17:53

RexRepl(s, r) - замены в строке s по массиву rex-правил r.
DicRepl(s, r, fastalg, fancy) - замены в строке s по массиву dic-правил r; fastalg = true/false - использовать быстрый алгоритм или прямой перебор, по умолчанию true; fancy = true/false - учитывать ли символы абзацев в результирующей строке, по умолчанию true.

Основное применение: оперативное тестирование правил rex и dic, не содержащих юникода.
Тестирование одиночного правила:

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

r = [[\bвсе\b\s+(\w+)\s+(\w+)ло\b=всё $1 $2ло]]
s = [[Мне все давно надоело...]]
s = RexRepl(s,{r})
ShowMessage(s)

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

r = [[все * *ло=всё ло]]
s = [[Мне все давно надоело...]]
s = DicRepl(s,{r})
ShowMessage(s)
Тестирование словаря:

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

d = LoadFromFile(HomeFolder('dic')..'Michel.dic',true)
s = WText(1)
z = os.clock()
s = DicRepl(s,d,true,true)
ShowMessage('Time = '..os.clock()-z)
WNew(0,s)

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

Скрипты для Demagog

#216

Сообщение tonio_k » 06 дек 2018 01:32

Скрипт для тестирования и сравнения между собой двух правил REX, в особенности - насколько "быстрее" или "медленнее" будет работать тот или иной вариант написания одного и того же правила. Создан на основе примера от flegont.

В теле скрипта находим:

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

-- СРАВНИТЬ СКОРОСТЬ РАБОТЫ ПРАВИЛ (ДА=1)
yes_no = 0
Для активации тестирования скорости, нужно указать yes_no = 1
Тогда создается "нагрузка" - будет умножен текст из переменной s в n=10000 раз.

Скрипт:

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

r0 = [[
(\bатласными\b)((\s(\w+)?){1,}(подушками)(\w+)?)=атлАсными $2
]]
r1 = [[
\b(атласными)\s+([^\.,!?-]*)\b(подушками)=атлАсными $2$3
]]
s = [[
атласными и всякими разными подушками
]]

-- СРАВНИТЬ СКОРОСТЬ РАБОТЫ ПРАВИЛ (ДА=1)
yes_no = 0

log_s = s
log_s0 = RexRepl(s,{r0})
log_s1 = RexRepl(s,{r1})

if yes_no == 1 then
n=10000 
k=''
for i = 1,n do
k=s..'\r'..k
end
s = k
end 

z = os.clock()
s0 = RexRepl(s,{r0})
log_r0 = 'Time = '..os.clock()-z

z = os.clock()
s1 = RexRepl(s,{r1})
log_r1 = 'Time = '..os.clock()-z

z = os.clock()
s0 = RexRepl(s,{r0})
log_r0 = log_r0..'\r'..'Time = '..os.clock()-z

z = os.clock()
s1 = RexRepl(s,{r1})
log_r1 = log_r1..'\r'..'Time = '..os.clock()-z

z = os.clock()
s0 = RexRepl(s,{r0})
log_r0 = log_r0..'\r'..'Time = '..os.clock()-z

z = os.clock()
s1 = RexRepl(s,{r1})
log_r1 = log_r1..'\r'..'Time = '..os.clock()-z

ShowMessage(log_s..'\r'..log_s0..'\r'..log_s1..'\r\r'..'Павило r0\r'..log_r0..'\r\r'..'Павило r1\r'..log_r1)



Отправлено спустя 18 минут 59 секунд:
При подсчете времени работы правила, делается прогон по 3 раза чередуясь между собой - что бы исключить влияние сторонних процессов на ПК и выявления среднего результата по каждому правилу.

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

Скрипты для Demagog

#217

Сообщение balaamster » 08 дек 2018 23:48

tonio_k писал(а):
06 дек 2018 01:51
Скрипт для тестирования и сравнения между собой двух правил REX
Чуть модифицировал скрипт.
  • добавлены запросы регулярных выражений через поля ввода
  • добавлен запрос строки, на которой проверяются выражения
  • добавлен запрос на тестирование скорости.
  • повторяющиеся действия (получение строк в переменные log_r0, log_r1) вынес в функцию и цикл

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

local yn_cap = 'СРАВНИТЬ СКОРОСТЬ РАБОТЫ ПРАВИЛ?'
local r0_cap = 'Регулярное выражение №1'
local r1_cap = 'Регулярное выражение №2'
local s_cap = 'Введите тестовую строку'

local r0_def = [[
(\bатласными\b)((\s(\w+)?){1,}(подушками)(\w+)?)=атлАсными$2
]]
local r1_def = [[
\b(атласными)\s+([^\.,!?-]*)\b(подушками)=атлАсными $2$3
]]
local s_def = [[
атласными и всякими разными подушками
]]

local r0 = Input(r0_cap,{string.format('rex #1=%s',r0_def)})
if not r0 or r0[1] == '' then
    ShowMessage('Необходимо зполнить "Регулярное выражение №1"')
    goto HALT
else
    r0 = r0[1]
end
local r1 = Input(r1_cap,{string.format('rex #2=%s',r1_def)})
if not r1 or r1[1] == '' then
    ShowMessage('Необходимо зполнить "Регулярное выражение №2"')
    goto HALT
else
    r1 = r1[1]
end
local s = Input(s_cap,{string.format('Строка=%s',s_def)})
if not s or s[1] == '' then
    ShowMessage('Необходимо зполнить тестовую строку')
    goto HALT
else
    s = s[1]
end


-- СРАВНИТЬ СКОРОСТЬ РАБОТЫ ПРАВИЛ (ДА=1)
local yes_no = Menu(yn_cap, {'Да','Нет'})
if yes_no == 0 then goto HALT end


function rex_time(str, rex)
    local z = os.clock()
    local s0 = RexRepl(str,{rex})
    return string.format('Time = %s\n', os.clock()-z)
end


local log_s = s
local log_s0 = RexRepl(s,{r0})
local log_s1 = RexRepl(s,{r1})

if yes_no == 1 then
    local n = 10000
    s = string.rep(s, n, '\n')
end


local log_r0 = ''
local log_r1 = ''


for i=1,3 do
    log_r0 = string.format('%s%s',log_r0,rex_time(s, r0))
    log_r1 = string.format('%s%s',log_r1,rex_time(s, r1))
end

out = string.format('%s\n%s\n%s\n\nПравило r0\n%s\n\nПравило r1\n%s',log_s, log_s0, log_s1, log_r0, log_r1)
ShowMessage(out)

::HALT::
Чуть сам не забыл, что повторить строку несколько раз можно через встроенную функцию

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

string.rep(s, n [, sep])
s - строка, которую нужно повторить
n - число повторений
sep - разделитель.

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

Скрипты для Demagog

#218

Сообщение tonio_k » 09 дек 2018 01:55

Обязательно возьму на вооружение технологию диалогов.
Однако лично мне удобнее работать не запуская сам скрипт, а работать со скриптом как с тестовым документом. Я даже сразу его сохранил как txt файл. Вношу изменения в строки с правилами держа их все перед глазами одновременно и имея возможность перескакивать с одного правила на другое копируя или делая замены. Нажимая на F2 для текущего окна что бы прямо на месте увидеть результат срабатывания. И при необходимости включать или отключать секундомер.

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

Скрипты для Demagog

#219

Сообщение flegont » 09 дек 2018 09:51

Нажимая на F2 для текущего окна
Я часто поступаю так же. Работаю со скриптом, как с текстом, в "отладочном режиме" по F2. Такой экспериментальный скрипт может состоять из разных частей, каждую из которых запускаю отдельно, меняя метку в первой строке.

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

-- блоки для разных экспериментов
goto B2  -- выполнить нужный блок

::B1::
-- блок 1
    ...
goto HALT

::B2::
-- блок 2
    ...
goto HALT

::B3::
-- блок 3
    ...
goto HALT
...
...
::HALT::

Ответить

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