Результат в окне Статистка выводится вперемешку - без сохранения порядка строк, который был в оригинале. Можно как то сделать "последовательный" вывод строк сверху вниз.
Demagog TTS
Добавлено: 27 ноя 2018 09:51
flegont
"Все подходящие" выводятся в окно Статистики в алфавитном порядке, с игнорирование дубликатов. Если какое-то подходящее слово встречается в тексте 100500 раз, то нет смысла выдавать его столько же раз в Статистику. А алфавитный порядок - это необходимое условие, чтобы программа могла исключать дубликаты.
Но, возникла проблема: голос "товарища Адама Селена" звучал "мертво", т.к. отсутствовал звуковой фон.
Эта цитата натолкнула меня на идею: "А что, если сделать синтезированную речь с посторонним фоном или музыкальной подложкой (типа 'Модель для сборки')?"
Начал изучать возможности FFmpeg. И, конечно же, он позволил реализовать задуманное.
У FFmpeg есть замечательный обработчик "-filter_complex", который позволяет на вход отдельных фильтров подавать сразу несколько потоков (аудио или видео, в зависимости от фильтра)
У фильтров общий вид такой:
индекс_файла - 0, 1 и т.д. То есть первый "-i путь_к_файлу" будет иметь ндекс 0, второй - 1
определитель потока - указатаель на поток из входного файла. Может быть a - аудио v - видео. Если потоков больше двух, то можно по порядку 0, 1 и т.д.
метка_выходного_потока - просто "бирка" которую мы присваиваем потоку, как имя переменной.
- поток с меткой "b" и файл с индексом 1 направляем в фильтр-микшер (amix). inputs=2 - количество входных потоков. duration=first - длительность выхода определяется длительностью первого потока. Первым потоком у нас в параметрах идёт синтезированная речь. Файл "подложки" выбираю заведомо больше минимальной длительности читаемого отрывка. Есть ещё варианты longest и shortest - обрезка по самой длинной и короткой дорожке соответственно. weights=1 0.3 - вес потока в миксе. Условно говоря - громкость. По умолчанию всеп потоки имеют равный вес. 1 - голосовой поток, 0.3 - "подложка".
Пример результата:
20181128-213108.mp3
(1.01 МБ) 605 скачиваний
Demagog TTS
Добавлено: 28 ноя 2018 21:44
flegont
ААААААА!!!!!! Вот это да! Прекрасный пример Custom encoder. Я даже не подозревал, что такое возможно
Demagog TTS
Добавлено: 28 ноя 2018 22:37
tonio_k
balaamster, отличная находка! Я сам противник посторонних фоновых мелодий. Но знаю, насколько для других это оживляет произведение. И книги я записываю не только для себя.
Поэтому возникли такие перспективные идеи:
Я так понял, мелодия одна на всё произведение. Есть мысль разнообразить репертуар путем добавления в FilterAndAudioToAll(folder, mask, diclist, remsource) счетчик времени или (правильнее счетчик файлов), который будет через каждый, например, третий файл менять содержимое C:\temp\fon.mp3 - путем копирования с переименованием в fon.mp3 из заранее подготовленной папки с подборкой mp3 файлов фоновых мелодий. - Тут еще надо реализовать эту подстановку "по кругу"
Тут нужно что то придумать, что бы при каждом накладывании C:\temp\fon.mp3 было затухание фоновой мелодии к концу каждого аудио файла книги - что бы избежать резких переходов между файлами.
Отправлено спустя 2 часа 16 минут 22 секунды:
Как отловить fnd, если в диалоговом содержимое строки fnd вручную удалили через Ctrl+A, Del ?
-- печать всех строк текста из окна 1, отвечающих заданному регулярному выражению
-- поиск идет с учетом регистра (символ @ в начале РВ)
ind = WActive()
s = WText(ind)
header = 'Поиск фрагментов с заданными словами'
askname = 'Регулярное выражение (REX):'
defname = [[^(.)*=(.)*шаблОн(.)*$]]
if FileExists('#rexFind.@') then
fnd = LoadFromFile('#rexFind.@')[1]
else
fnd = defname
end
fnd = Input(header,{askname..'='..fnd})
if not fnd then goto HALT end
fnd = fnd[1]
if fnd == '' then
fnd = defname
SaveToFile({fnd},'#rexFind.@')
goto HALT
end
SaveToFile({fnd},'#rexFind.@')
WNew(0)
r = fnd
k = 1
while k > 0 do
fnd, k = RexMatch(s,r,k)
print(fnd)
if k > 0 then k = k+#fnd+1 end
end
WActive(0)
-- установить курсор на первой позиции найденного
s = WText(ind)
fnd, k = RexMatch(s,r,1)
if k > 0 then WSel(ind,k-1,#fnd) end
::HALT::
При первом запускаем выходит окно с шаблоном текста ^(.)*=(.)*шаблОн(.)*$ встаю на него курсором - выделяю всю строку. Нажимаю Del и Оk. - надеюсь, что if fnd == '' then поймает пустое значение и даст команду сохранить файл со строкой fnd = defname и прервет выполнение скрипта (goto HALT). Но по факту if fnd == '' then этот момент не отлавливает - скрипт продолжает работать дальше
Отправлено спустя 17 минут 5 секунд:
Еще момент. fnd = Input(header,{askname..'='..fnd}) если нажать "Отмена" то скрипт прерывается, однако если нажать крестик (закрыть окно) то скрипт работает дальше. Крестик тоже как то бы отлавливать
Demagog TTS
Добавлено: 29 ноя 2018 13:19
flegont
1) Глюк No 1 в функции Input(). Если в форме ввода только одна строка и эта строка ничем не заполнена, то вместо правильного результата {''} - массив из одного элемента, равного пустой строке, возвращается пустой массив без элементов {}
В следующей версии исправлю.
Как его обойти сейчас?
Вместо fnd = fnd[1] написать if #fnd == 0 then fnd = '' else fnd = fnd[1] end
2) Глюк No 2 в функции Input(). Не понимает, что закрытие формы ввода крестиком - это то же самое, что отказ от выбора кнопкой "Отменить".
Аналогично - исправлю в следующей версии.
Есть мысль разнообразить репертуар путем добавления в FilterAndAudioToAll(folder, mask, diclist, remsource) счетчик времени или (правильнее счетчик файлов), который будет через каждый, например, третий файл менять содержимое C:\temp\fon.mp3 - путем копирования с переименованием в fon.mp3 из заранее подготовленной папки с подборкой mp3 файлов фоновых мелодий. - Тут еще надо реализовать эту подстановку "по кругу"
function rnd_fon(fdir, ftype)
local fon_home = HomeFolder(fdir)
local fon_files = AllFiles(fon_home,'*.'..ftype)
local fon_count = #fon_files
return fon_home..fon_files[math.random(1,fon_count)]
end
function FilterAndAudioToAllMod(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)
for i = 1,#a do
WOpen(0,folder..a[i])
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
WSave(0,folder..'temp_'..a[i])
WOpen(0,folder..'temp_'..a[i])
-- modification
local cmd = string.format('CHCP 1251 | COPY /Y %q %q', rnd_fon('fon', 'mp3'), HomeFolder()..'fon.mp3')
os.execute(cmd)
-- end
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
Необходимо создать в папке с Demagog папку fon. В неё поместить mp3-файлы с фоновым звуком. Функция rnd_fon возвращает случайный файл фона для каждого элемента серии.
Этот файл копируется в файл fon.mp3, в папке Demagog (передать фильтру абсолютные и относительные пути у меня не получилось) и подмешивается к речи.
Фильтр, подсказанный balabolka, создаёт зацикленный фон. Даже если речевой файл длиннее фона, отрывка без заполнения не останется.
Тут нужно что то придумать, что бы при каждом накладывании C:\temp\fon.mp3 было затухание фоновой мелодии к концу каждого аудио файла книги
Плавное нарастание громкости в начале реализуется легко. Затухание можно будет реализовать только в скрипте с перекодировкой и использованием внешней утилиты mp3info, 66kb для определения длительности mp3-файла.
Так как речевой трек будет иметь разную длительность, то время (в секундах), с которого нужно начинать затухание нужно подбирать для каждого фрагмента отдельно и передавать его конвертеру.
Или можно определиться со средним временем звучания фрагмента и задать время начала затухания жёстко в строке настройки (самый последний короткий фрагмент останется без затухания)
[+] Возможность выполнять до 9 скриптов "по умолчанию", через горячие клавиши Shift+Ctrl+1 .. Shift+Ctrl+9. Настройка в "Сервис - Статистика - Выполнить скрипт - По умолчанию".
Пытаюсь повесить на комбинацию Ctrl+Shift+9 скрипт CtrlQuit.lua - экстренное прерывание работы демагога
_Tests_\CtrlQuit.lua
Иначе скрипт ищется в корневой папке Демагога. И вообще, скрипты по горячим клавишам к конкретному месту не привязаны, и могут находиться в любом месте на компьютере. В таком случае - указывать полный путь вместе с диском.
P.S. А у меня аналогичный скрипт называется HaltDemagog.lua
-- Экстренное прерывание программы
--(в случае мертвого цикла - не поможет)
os.exit()
Demagog TTS
Добавлено: 06 дек 2018 23:05
tonio_k
Единственный момент.
Горячие клавиши вполне себе работают при открытых словарях dic, rex - что немного выбивается из принятой в Демагоге традиционной защиты словарей от несанкционированных изменений.
С другой стороны, оооочень нужна возможность вызвать os.exit() при любом активном окне.
Если все же решите "включить защиту", то может стоит os.exit() - жестко вшить либо в саму программу Демагог - подарить ей горячую клавишу, либо повесить ее "навсегда" к комбинации, например Ctrl+Shift+0 или Ctrl+Shift+9 и запретить редактирование этой клавиши. - главное что бы она срабатывала при любых открытых окнах (в т.ч. со словарями)
Demagog TTS
Добавлено: 07 дек 2018 00:19
flegont
1) Защиту не планирую. Назначение скриптов на горячие клавиши - полностью прерогатива пользователя. Под его ответственность
2) Клавиша Shift+Ctrl+0 - весьма красива своей некоторой уникальностью. Наверное, поэтому Майрософт, начиная с Windows Vista зарезервировала ее для нужд операционной системы. Так что, увы...
Demagog TTS
Добавлено: 20 янв 2019 19:52
tonio_k
flegont, Небольшое замечание. Формат - Фоновая картинка.
После выбора нового рисунка фон окна сразу не меняется. Нужно щелкнуть любое другое окно-вкладку. Только тогда изменения срабатывают.
Demagog TTS
Добавлено: 20 янв 2019 22:13
flegont
Спасибо за сообщение.
На 10-ке у меня фон.картинка обновляется нормально - сразу; (похоже, 10-ка шибко умная ) , а на XP - возникает указанный глюк. Подумаю над этим.
Demagog TTS
Добавлено: 12 фев 2019 22:01
tonio_k
flegont, Сервис – Чтение - Читать текст последовательными блоками с количеством символов.
хотел поднять вопрос на счет пауз в озвучке текста с экрана Демагога возникающих в результате затрат времени на обработку текста словарями.
Если все словари отключить, то чтение текста начинается практически мгновенно... (ну или с небольшой заминкой самого голосового движка) и между блоками паузы не заметны.
По идее, указание размера блока - это то же что и разбиение на сериалы.
Может немного поменять алгоритм?
Такие варианты: 1)
Запускаем чтение вслух содержимое окна.
На основании настроек создается первый файл сериала и он отправляется на озвучку голосовому движку - начинается чтение в слух (при этом на экран сам файл сериала не выводится – все выглядит так будто читается текущее окно). Т.е. первый запуск в любом случае предпологает паузу на обработку словарями – тут ничего не поделаешь.
С момента начала чтения голосом первого файла сериала запускается таймер который приостанавливает обработку словарями следующий файл сериала примерно на минуту меньше чем среднее время на прочтение соответствующего размера блока (или несколько минут в зависимости от размера блока и времени необходимого на его обработку). Или пользователь сам устанавливает необходимую ему паузу которую выяснит для себя экспериментальным путем.
При завершении чтения первого файла сериала Демагог кидает голосовому движку следующий уже обработанный следующий файл сериала и запускает таймер.
Получается что сериал создается не на всю книгу, а на текущий блок. Следующий блок начинает обрабатываться словарем в процессе чтения за некоторое время до его окончания.
2)
А можно вообще сделать по принципу шаг+1
Т.е. в начале обработать первый файл словарями, кидаем его на чтение голосовому движку.
Начинается чтение первого фала сериала и сразу параллельно запустить обработку второго файла сериала словарями.
Как только Заканчивается чтение первого файла, сразу кидается на чтение подготовленный второй файл голосовому движку. Начинается чтение и сразу параллельно запустить обработку третьего файла сериала
И т.д. до конца текста или нажатия кнопки стоп.
Немного (скорее пиково) будет возрастать нагрузка на ЦП при одновременном чтении и обработки текста словарями, но зато практически не будет пауз между блоками при чтении вслух с экрана.
Demagog TTS
Добавлено: 13 фев 2019 00:20
flegont
Указание размера читаемого блока - это совсем НЕ то же самое, что разбиение файла книги на сериал - т.е. множество мелких файлов. Массив блоков для чтения существует лишь в памяти Демагога. Каждому очередному блоку НЕ соответствует никакой файл.
Массив блоков обрабатывается в цикле.
Обработка блока состоит из двух действий:
1. Применить словари к блоку - блок в памяти Демагога соответственно изменяется.
2. Прочесть (уже измененный) блок вслух
Пока чтение вслух очередного блока не закончится, следующий не начнет обрабатываться.
Сделать обработку многопоточной? Один поток обрабатывает блоки словарями; другой проверяет, какие готовы и читает их вслух. Останавливаясь автоматически каждый раз, когда готовых для чтения блоков еще нет.
Довольно хлопотливая задача - организация взаимодействия потоков. Программа усложняется и становится менее надежной. А выигрыш по времени выполнения, скажем так, не всегда очевидный.
Пока к таким радикальным изменениям в программе я не готов. Хотя иногда задумываюсь о них.
Размер блока чтения в Демагоге по умолчанию 8192 символов (примерно 4 книжных страницы). Если обработка словарями приводит к слишком заметной паузе перед началом чтения очередного блока, то можно уменьшить в настройках, например, до 4096 символов.
P.S. Я заметил, что часто пользователи, в Настройках сериалов указывают желаемый размер серии примерно 5000 .. 7000 символов. Это - меньше принятого по умолчанию размера блока чтения 8192. Поэтому такие маленькие файлы-серии читаются вслух как один блок. Это и создает иллюзию, что серия и блок чтения - одно и тоже.
а может этот размер альтернативно определять автоматически в привязке к главам? Большая пауза перед началом чтения следующей главы выглядит довольно логично
Demagog TTS
Добавлено: 14 фев 2019 00:16
flegont
Алгоритм разбиения текста на блоки никак не связан с его версткой по главам.
Только с версткой по абзацам или предложениям.
1) Если в настройках указано "Целое число абзацев в блоке", то абзацы добавляются в блок до тех пор, пока количество символов в блоке не станет равно или больше заданного в настройках размера блока
2) Иначе блок составляется из предложений, до тех пор, пока размер блока не станет равен или больше... см. выше.
Когда-то давно, в Демагоге использовался только метод 1. Я даже проводил исследование на большом количестве художественных текстов. Если книга сверстана правильно, с грамотной разбивкой текста на абзацы, то метод 1 дает хорошие результаты. Размер абзаца в среднем выходит ~ 250 символов. Блоки получаются почти одинаковых размеров.
Но... однажды мне написал пользователь: почему на некоем тексте программа не начинает чтение, а молча висит?! Текст был приложен к письму - целая книга ~ 1 мб. Стал разбираться, и... о ужас - оказалось, вся книга состояла из одного единственного абзаца, размером в этот самый 1 мб. В тексте вообще не было символов с кодом #13 - обозначающего концы абзацев.
А в программе был подключен один словарь типа rex - очень большой и медленно работающий. Блок в 1 мб он бы обрабатывал бог весть сколько... Так что, это было не зависание! А огромная пауза перед началом чтения!
Именно тогда был добавлен метод 2 - набор блока чтения из предложений. Он используется, когда снята галочка "Целое число абзацев в блоке". При этом, размеры блоков получаются гораздо более одинаковыми и близкими к заданному в Настройках размеру. Соответственно, как бы не различались в книге размеры глав, а текст разделится на практически одинаковые блоки. И пауза перед началом чтения очередного блока будет практически такая же, как и для других.
Насколько я помню, разборку текста по предложениям, для составления блоков, Демагог делает по символам: . ? ! ; и еще нескольким, обозначающим точку в азиатских языках.
Остается еще один, последний вариант. Что, если в тексте нет не только абзацев, но и предложений? Что произойдет, если Демагогу дать большой текст, не содержащий переводов строки #13 и знаков препинания? Т.е. одну огромную строку - месиво из букв?
Надо проверить
Demagog TTS
Добавлено: 14 фев 2019 23:59
tonio_k
Подсветка Омографов.
Обратил внимание, что при выделеном тексте нажатие на кнопку "показать Омографы" - подсветка не срабатывает. Нужно обязательно убрать выделение и немного прокрутить текст. Только тогда подсветка включается
Отправлено спустя 3 минуты 40 секунд:
Соответственно, если Омографы подсвечены, то при промотке экрана, Омографы больше не будут подсвечиваться, пока не уберёшь выделение.
Demagog TTS
Добавлено: 15 фев 2019 09:44
flegont
Совершенно верно. Если в тексте есть выделенный фрагмент, то подсветка автоматически отключается. Это сделано во избежание конфликта подсветки с выделением текста.
Попросту говоря, подсветка заново отображает весь видимый в окне текст - уже красиво раскрашенный При этом, выделение текста, хочешь-не хочешь, а будет сброшено.
Поэтому, когда делаем выделение в тексте, то подсветка автоматически отключается. Т.о. выделение текста имеет приоритет перед подсветкой.
Ну, а когда выделение снято, то подсветка снова включается и отобразиться при любой мало-мальской прокрутке текста. Или входе курсора мыши в окно редактирования. (Провел мышью за пределы и обратно - и подсветка обновилась).
В общем, пока будет так, как есть. А дальше... может, что-нибудь не придумаю
Demagog TTS
Добавлено: 15 фев 2019 11:31
tonio_k
А можно сделать так, что бы при выделении текста отключалась и уже сработавшая подсветка омографов? У меня было так, что выделил текст, проработал с ним и давай крутит экран дальше с полной уверенностью, что не подсвечиваются Омографы потому что их нет. Т.е. выделил текст, и сразу видно что подсветка отключена.
Отправлено спустя 21 минуту 12 секунд:
Поясню.
Как только началось выделение текста все подкрашенные омографы на данном участке экрана должны исчезнуть. А то получается, что без снятия выделения с текста, как только я начал крутить мышкой вниз, У меня все ранее подсвеченные омографы так и остались подсвеченными на открытом участке экрана и прокручивая мышкой вниз новые омографы уже не подсвечиваются. Создаётся впечатление что их ниже попросту нет.
Demagog TTS
Добавлено: 15 фев 2019 17:38
flegont
Подумаю над этим.
Demagog TTS
Добавлено: 17 фев 2019 17:49
tonio_k
Начиная примерно с 7.29.363 не работает Collection of texts.lua - редко применяю. Только сейчас обнаружил.
Отправлено спустя 1 минуту 46 секунд:
Еще заметил, что изменилось окно ShowMessage - добавились кнопки Yes No
Demagog TTS
Добавлено: 17 фев 2019 19:32
flegont
_Tests_\Collection of texts.lua
3278 bytes
23.11.2018
12:37
Должны быть файлы с этими размерами и временем создния.
На моем экземпляре Демагога (скачанном с моего же сайта ) скрипт работает, а у ShowMessages() - одна кнопка, как и положено.
Demagog TTS
Добавлено: 17 фев 2019 22:22
tonio_k
flegont, Спасибо за подсказку!
Оказывается, кроме обновления Demagog.exe, нужно еще обновлять \Demagog\profiles\calculator.lua
Demagog TTS
Добавлено: 17 фев 2019 22:34
flegont
Да. calculator.lua содержит описание функций интерпретатора, и от версии к версии его содержание может, в определенной степени, меняться. Например, если я в какой-то функции добавил дополнительный параметр(ы). Или вовсе добавил новую функцию (функции).
Проще всего обновлять версию, копируя целиком папку Demagog из дистрибутива поверх папки Demagog на компьютере. Система спросит: заменять ли файлы с одинаковыми именами? Ответ: да.
Тогда уж точно ничего не потеряется
Файлов в дистрибутиве немного и процесс копирования проходит быстро.
Demagog TTS
Добавлено: 18 фев 2019 13:35
tonio_k
Тем, кто пользуется Демагог, рекомендую содержимое своих словарей DIC прогнать через поиск:
Найти , по шаблону REX, Все подходящие
Для выявления ошибок типа: с другой стороны=c другой сторонЫ
где c на латинице
Demagog TTS
Добавлено: 18 фев 2019 19:52
flegont
И я несколько раз попадался в ловушки с "буквами-оборотнями"
Так что, лишняя заручка с помощью предложенного РВ (или каких-то его вариций) - не помешает
Demagog TTS
Добавлено: 21 фев 2019 23:08
wasyaka
Вопрос:
Pronunciation adjustment.lua - запускается, включается, начинает работать... и вдруг перестаёт видеть словари - в куче, по одному.. в любой очерёдности... в новых версиях так задумано?
И почему через скрипт.. было можно, а в проге нельзя? - порядок обработки словарей по номеру, а не по расширению?
Создать набор пустых пронумерованных (в порядке применения) контейнеров в папке dic ...
А туда пользователь вложит словари?
а потому и сделали акцент на скрипты что бы обойти ограничение.
Автор решил (это его законное право ) оставить базовым и ключевым традиционное правило: В первую очередь обрабатываются словари REX во вторую - DIC. А вот между собой файлы словарей rex или (между собой) файлы словарей dic уже можно сортировать по номеру.
Предлагаю попробовать воспользоваться очень простым скриптом:
оба файла из архива надо поместить в папку Demagog\_Tests_ (там же где и Pronunciation adjustment.lua лежит)
00_Показать ИЗМЕНЕННЫЙ ТЕКСТ.lua - это запускаемый скрипт.
Применяет словари к тексту в активном окне Демагога в последовательности, указанной в файле СПИСОК СЛОВАРЕЙ.lua.
В файле СПИСОК СЛОВАРЕЙ.lua отредактируйте под свои названия словарей в нужной вам последовательности.
Один важный момент, если без фигурных скобок, то применяется быстрый алгоритм для словаря DIC! Если нужен алгоритм прямого перебора, то словарь нужно заключить в скобки (в архиве пример заключения в скобки есть)
Demagog TTS
Добавлено: 22 фев 2019 00:17
flegont
Pronunciation ajustment.lua исправлен, начиная с версии 364.
Demagog TTS
Добавлено: 25 фев 2019 10:54
flegont
PlsToDic(f, folder, casesens, tag)
Функция встроенного интерпретатора. Включена в программу, начиная с версии 365. Преобразует словарь произношения формата .pls в словарь .dic или .hmg
Параметры: f - полное имя pls-словаря folder - папка, куда поместить готовый dic/hmg-словарь; по умолчанию - пустая строка - соответствует корневой папке программы casesens - учитывать (true) или не учитывать (false) регистр; по умолчанию - false tag - шаблон pls-тега; по умолчанию [[<phoneme alphabet="%1" ph="%2"/>]]
Тип результата: .dic / .hmg определяется автоматически, исходя из структуры pls-файла.
-- пример 2
PlsToDic('Dopolneniya.pls')
-- обрабатывается файл в корневой папке программы
-- результат будет там же
Demagog TTS
Добавлено: 27 фев 2019 18:58
tonio_k
Пожелания: Сервис\ Статистика\ Сравнение файлов Хотелось бы чуть расширить этот функционал:
1) Добавить для всех пунктов возможность сравнить между собой содержимое окон (вместо указания местоположения файла 1 и файла 2, вручную (указываем цифру) или через выводимый список, указывать номер окна Демагога в которых открыт текст для сравнения.
2) Сервис\ Статистика\ Сравнение файлов\ Точка расхождения
После выявления первого расхождения, результат выводится в окно статистики и процесс прерывается. А хотелось бы некоторого продолжения - "Точка расхождения в каждом абзаце"
Т.Е.: реализовать "по-абзацевый" поиск расхождений до 1 точки расхождения.
В первом абзаце находим первое расхождение, результат - точка расхождения и окружающие его, допустим, по 5 слов слева и права (ограничение начало и конец абзаца) - выводим в окно статистики.
Переходим к следующему абзацу.
Понятно, что если в сравниваемом абзаце более одного расхождения, то последующие расхождения в этом абзаце не будут выявлены. Или того хуже - вообще отсутствует какой-то абзац - тогда дальнейшие расхождения вывалится в единую кашу.
Однако Точка расхождения в каждом абзаце - вполне применим и удобен для текстов ожидаемая разница, в которых в несколько десятков слов статистически раскиданных по всему тексту.
Demagog TTS
Добавлено: 27 фев 2019 20:51
flegont
Подумаю над этим. Возможность сравнивать тексты, уже открытые в разных окнах - была бы полезной. А с "точкой расхождения" - после первой найденной, должен быть выбор: завершить ли процесс сравнения, или указать новую стартовую позицию в сравниваемых текстах.
Т.е. пользователь отмечает кликом мышки в обоих текстах, где они вновь начали совпадать - оттуда искать новое расхождение. И т.д. до конца.
Demagog TTS
Добавлено: 28 фев 2019 11:57
balaamster
Появилась мысль, относительно омографов.
Суть идеи:
Создаётся некий dic-словарь со словами-омографами. После знака "=" ставится не словарная замена, а имя rex-словаря с регулярными выражениями (лежащего в спец.папке, например dic\hrex) только для этого омографа.
Словарь homo.hdic:
году=году.rex
В папке dic\hrex словарь году.rex:
\b(в \d+)(-о?м)? году\b=$1$2 годУ
При разборе блока текста встречаем слово "году", по словарю "homo.hdic" получаем ссылку на словарь "году.rex" и производим замены, в случае совпадений производим замену.
Теоретически, это позволит не перебирать весь rex-словарь с выражениями для остальных омографов. А как на практике, насколько сложна реализация и позволит ли это получить прирост, с учётом обработки подкаталога с дополнительными словарями?
речь идёт про ручной поиск омографов или про автоматическая замена по словарям ускоренный за счёт введения своеобразного индекса?
Отправлено спустя 22 минуты 26 секунд:
Если как альтернатива стандартной работы rex словарей, то я бы не стал плодить много файлов, а всё поместил в один изменив вид строки схематично:
index:году
\b(в \d+)(-о?м)? году\b=$1$2 годУ
\b(в \d+)(-о?м)? году\b=$1$2 годУ
end index
Или так:
году::\b(в \d+)(-о?м)? году\b=$1$2 годУ
году::\b(в \d+)(-о?м)? году\b=$1$2 годУ
речь идёт про ручной поиск омографов или про автоматическая замен
Про автоматическую замену. Чтобы и в сценариях обработать такими словарями можно было.
Demagog TTS
Добавлено: 28 фев 2019 14:57
tonio_k
Провел такой эксперимент:
1) взял текст Милое семейство.txt - произвел в нем замену, что бы все слова состояли из строчных букв.
2) применил к этому тексту словарь 20_REX_Замены от waska.rex
3) в полученном измененном тексте вывел все подходящие по шаблону rex @\w*[А-Я]\w*
4) полученный список слов добавил в поисковый запрос по шаблону rex ^.+=.*(бЕрегу|глазА|годА|дЕла|дОма|дОму|дорОги|лесУ|местА|нОги|пЕред|пЕтли|пОлу|рукИ|рУки|самОй|сАмой|сАмом|сОсны|темнО|тЕни|томУ|узнАет).*$ и вытащил все правила из словаря 20_REX_Замены от waska.rex
т.е. получил все правила подходящие под индекс слов: бЕрегу|глазА|годА|дЕлаи.... т.д.
5) в скрипте
-- \s+([^\.,:!?-]*)\s+ >100>
-- \s+(\s*\w*\s*)\s+ 1, 2, 3,
-- ^(.)*$=_
r0 = [[#1) правило REX:
здесь вводим правила REX
]]
r1 = [[#2) правило REX:
здесь вводим правила REX
]]
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
GaugeInit(n)
k=''
for i = 1,n do
Gauge(i)
k=s..'\r'..k
end
s = k
end
Gauge(0)
GaugeInit(6)
Gauge(1)
z = os.clock()
s0 = RexRepl(s,{r0})
log_r0 = 'Time = '..os.clock()-z
Gauge(2)
z = os.clock()
s1 = RexRepl(s,{r1})
log_r1 = 'Time = '..os.clock()-z
Gauge(3)
z = os.clock()
s0 = RexRepl(s,{r0})
log_r0 = log_r0..'\r'..'Time = '..os.clock()-z
Gauge(4)
z = os.clock()
s1 = RexRepl(s,{r1})
log_r1 = log_r1..'\r'..'Time = '..os.clock()-z
Gauge(5)
z = os.clock()
s0 = RexRepl(s,{r0})
log_r0 = log_r0..'\r'..'Time = '..os.clock()-z
Gauge(6)
z = os.clock()
s1 = RexRepl(s,{r1})
log_r1 = log_r1..'\r'..'Time = '..os.clock()-z
Gauge(0)
ShowMessage(log_s..'\r1)\r'..log_s0..'\r2)\r'..log_s1..'\r\r'..'Павило r0\r'..log_r0..'\r\r'..'Павило r1\r'..log_r1)
в графе r0 = [[#1) правило REX: ввел все правила из словаря 20_REX_Замены от waska.rex в графе r1 = [[#2) правило REX: ввел все правила найденные по индексу в графе s = [[ ввел текст из Милое семейство.txt, где все слова строчными буквами
Эксперимент грубоват по причине что при поиске в 20_REX_Замены от waska.rex поисковый запрос дОма|дОму| не поймает правило содержащее, например, =дом$2
но на общую картину эксперимента такие исключения особо не повлияют.
Demagog TTS
Добавлено: 02 мар 2019 21:22
wasyaka
1. Правка/Найти омографы Ctrl+H Находит первый и все последущие варианты для него и т. д.
2. Теже, но списком: Необработанные омографы ... согласно алфавиту ,
Привести список в соответствии с пунктом 1 ??? - быстро можно понять, что делать всегда,...
Инструкция: открываем книгу в Демагоге. К текущему окну Запускаем один из скриптов:
9999.ИЗМЕНЕННЫЙ ТЕКСТ 1.обычная обработка словарем.lua стандартная обработка текста словарем 20_REX_Замены от waska.rex
9999.ИЗМЕНЕННЫЙ ТЕКСТ 2.индексация всего текста.lua - индексный метод. Индексирует словарь 20_REX_Замены от waska.rex. Полученный индекс применяет ко всему тексту. Найденные омографы находит правила по индексу в словаре 20_REX_Замены от waska.rex. Переносит найденные правила во временный файл SPEEDOMOREX.rex, который и применяется к текущему окну с открытой книгой
9999.ИЗМЕНЕННЫЙ ТЕКСТ 3.индекс по сериалам.lua - индексный метод с разбитием на сериалы. Разбивает текст на сериалы в папку Demagog\dic\temp_serials. Индексирует словарь 20_REX_Замены от waska.rex. Открывает первый сериал, Полученный индекс применяет к тексту сериала. Найденные слова по индексу находит в правилах в словаре 20_REX_Замены от waska.rex. Переносит найденные правила во временный файл SPEEDOMOREX.rex, который применяется к файлу с сериалом. И т.д. ... Склеивает все файлы сериала в один
Напоминаю, это экспериментальная сборка - возможны ошибки и не стыковки в работе
Отправлено спустя 3 часа 1 минуту 35 секунд:
так как правила rex все->всё, всем->всём и так применяются к каждому сериалу, имеет смысл эти правила перенести в индексируемый файл с rex омографами. Статистически есть вероятность, что в данном файле сериала ни разу не встретится все/всем - вот вам еще небольшой прирост в скорости.
Demagog TTS
Добавлено: 04 мар 2019 15:33
balaamster
tonio_k,
я провёл испытания у себя, вот что получилось:
В качестве текста - фрагмент книги, 4876 строк, 1 272 744 символа.
9999.ИЗМЕНЕННЫЙ ТЕКСТ 1.обычная обработка словарем.lua - 22м. 44с.
9999.ИЗМЕНЕННЫЙ ТЕКСТ 2.индексация всего текста.lua - 17м. 53с.
9999.ИЗМЕНЕННЫЙ ТЕКСТ 3.индекс по сериалам.lua - 06м. 41с.
Индексирование даёт ощутимый прирост в скорости обработки, особенно при создании сериалов (в 3,4 раза ).
Для обработки не поделенного на сериал текста можно будет применять обработку книги построчно. В моей коллекции книг, чаще всего, одна строка - один абзац. На досуге попробую поэкспериментировать с этим.
Demagog TTS
Добавлено: 04 мар 2019 16:06
tonio_k
В итоге - чем меньше файл, тем быстрее его обработка.
В шапке файла скрипта 9999.ИЗМЕНЕННЫЙ ТЕКСТ 3.индекс по сериалам.lua можно поиграть с параметром:
simbol = 4800 -- количество символов в одной серии
- попробовать его уменьшить. может это даст улучшенный результат?
А еще надо сравнить полученные на выходе файлы по 1.обычная обработка словарем и 3.индекс по сериалам между собой. Только так можно выявить какие то несрабатывания правил и выяснить причину.
Скорее всего возможная причина расхождения - неправильное составление словаря.
Ошибки в словаре которые могут спровоцировать расхождение:
1) Пробел в строке с индексными словами
2) Любой другой разделитель кроме запятой в строке с индексными словами
3) Не указаны в строке с индексными словами все варианты вождения в правиле. Пример:
Как я понял, предлагается создать к найденному омографу правило. Но вот ее реализация не до конца мне понятна.
Сначала выбираем словарь, куда нужно правило добавить. Ок выбрали.
Открывается окно "Введите правило"
А как таковой фразы то нет, а есть только найденное слово омограф, получается, правило можно только ручками вбивать. Потому что, пока включен режим поиска омографов, сам текст книги для копирования недоступен.
Как то это не очень удобно да и смысла не имеет. Проще остановить процедуру скопировать фразу и самому в словаре все откорректировать.
Поэтому есть такое пожелание.
К любому выделенному тексту книги через правую клавишу мыши добавить пункт меню:
"Добавить фразу в словарь" И что бы после выбора словаря, открывающееся окно "Введите правило" уже содержало в первой графе выделенный текст сообщения - доступный для редактирования.
Этот функционал удобен как для работы в режиме "Найти омографы"
(Нашли омограф. Надо ввести фразу в словарь? Отменяем поиск. Выделяем текст. Правая клавиша "Добавить фразу в словарь". Заносим правило в словарь. Дальше продолжаем поиск.
Так и в режиме работы с текстом в режиме чтения вслух. Услышали неправильное произношение, остановили чтение, выделили фразу. Правая клавиша "Добавить фразу в словарь". Заносим правило в словарь. Слушаем дальше.