Demagog TTS

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

Модератор: flegont

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

Demagog TTS

#151

Сообщение flegont » 18 ноя 2018 11:13

Понятно, попробую.

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

Demagog TTS

#152

Сообщение tonio_k » 26 ноя 2018 23:25

Поиск. Все подходящие.
критерий поиска:

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

@^[^\=]*\=[^\=]*вОрон\b[^\=]*$
сам текст:
► Показать
Результат в окне Статистка выводится вперемешку - без сохранения порядка строк, который был в оригинале. Можно как то сделать "последовательный" вывод строк сверху вниз.

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

Demagog TTS

#153

Сообщение flegont » 27 ноя 2018 09:51

"Все подходящие" выводятся в окно Статистики в алфавитном порядке, с игнорирование дубликатов. Если какое-то подходящее слово встречается в тексте 100500 раз, то нет смысла выдавать его столько же раз в Статистику. А алфавитный порядок - это необходимое условие, чтобы программа могла исключать дубликаты.

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

Demagog TTS

#154

Сообщение balaamster » 28 ноя 2018 21:32

flegont писал(а):
25 ноя 2018 12:30
Но, возникла проблема: голос "товарища Адама Селена" звучал "мертво", т.к. отсутствовал звуковой фон.
Эта цитата натолкнула меня на идею: "А что, если сделать синтезированную речь с посторонним фоном или музыкальной подложкой (типа 'Модель для сборки')?"

Начал изучать возможности FFmpeg. И, конечно же, он позволил реализовать задуманное.

У FFmpeg есть замечательный обработчик "-filter_complex", который позволяет на вход отдельных фильтров подавать сразу несколько потоков (аудио или видео, в зависимости от фильтра)
У фильтров общий вид такой:
► Показать
Настройка принимает такой вид

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

-loglevel -8 -y -i %1 -i C:\temp\fon.mp3 -filter_complex "[0]aecho=0.8:0.6:20|40:0.2|0.2[b];[b][1]amix=inputs=2:duration=first:weights=1 0.3" -b:a 128k %2
► Показать
Пример результата:
20181128-213108.mp3
(1.01 МБ) 71 скачивание

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

Demagog TTS

#155

Сообщение flegont » 28 ноя 2018 21:44

ААААААА!!!!!! Вот это да! Прекрасный пример Custom encoder. Я даже не подозревал, что такое возможно :thank_you: :bayan:

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

Demagog TTS

#156

Сообщение tonio_k » 28 ноя 2018 22:37

balaamster, отличная находка! Я сам противник посторонних фоновых мелодий. Но знаю, насколько для других это оживляет произведение. И книги я записываю не только для себя.
Поэтому возникли такие перспективные идеи:
Я так понял, мелодия одна на всё произведение. Есть мысль разнообразить репертуар путем добавления в FilterAndAudioToAll(folder, mask, diclist, remsource) счетчик времени или (правильнее счетчик файлов), который будет через каждый, например, третий файл менять содержимое C:\temp\fon.mp3 - путем копирования с переименованием в fon.mp3 из заранее подготовленной папки с подборкой mp3 файлов фоновых мелодий. - Тут еще надо реализовать эту подстановку "по кругу"
balaamster писал(а):
28 ноя 2018 21:32
Настройка принимает такой вид

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

-loglevel -8 -y -i %1 -i C:\temp\fon.mp3 -filter_complex "[0]aecho=0.8:0.6:20|40:0.2|0.2[b];[b][1]amix=inputs=2:duration=first:weights=1 0.3" -b:a 128k %2
Тут нужно что то придумать, что бы при каждом накладывании C:\temp\fon.mp3 было затухание фоновой мелодии к концу каждого аудио файла книги - что бы избежать резких переходов между файлами.


Отправлено спустя 2 часа 16 минут 22 секунды:
Как отловить fnd, если в диалоговом содержимое строки fnd вручную удалили через Ctrl+A, Del ?

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

fnd = Input(header,{askname..'='..fnd})
if not fnd then goto HALT end
fnd = fnd[1]
так ошибку дает:

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

if fnd = '' then goto HALT end

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

Demagog TTS

#157

Сообщение flegont » 29 ноя 2018 09:45

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

...
fnd = fnd[1]  -- присваивание это знак равенства
if fnd == '' then goto HALT end  -- сравнение на равенство это двойной знак равенства

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

Demagog TTS

#158

Сообщение tonio_k » 29 ноя 2018 10:25

не хочет ловить. Вот пример скрипта по поиску в словаре rex.
► Показать
При первом запускаем выходит окно с шаблоном текста ^(.)*=(.)*шаблОн(.)*$ встаю на него курсором - выделяю всю строку. Нажимаю Del и Оk. - надеюсь, что if fnd == '' then поймает пустое значение и даст команду сохранить файл со строкой fnd = defname и прервет выполнение скрипта (goto HALT). Но по факту if fnd == '' then этот момент не отлавливает - скрипт продолжает работать дальше


Отправлено спустя 17 минут 5 секунд:
Еще момент. fnd = Input(header,{askname..'='..fnd}) если нажать "Отмена" то скрипт прерывается, однако если нажать крестик (закрыть окно) то скрипт работает дальше. Крестик тоже как то бы отлавливать :boy_blushed:

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

Demagog TTS

#159

Сообщение flegont » 29 ноя 2018 13:19

1) Глюк No 1 в функции Input(). Если в форме ввода только одна строка и эта строка ничем не заполнена, то вместо правильного результата {''} - массив из одного элемента, равного пустой строке, возвращается пустой массив без элементов {}
В следующей версии исправлю.

Как его обойти сейчас?
Вместо fnd = fnd[1] написать if #fnd == 0 then fnd = '' else fnd = fnd[1] end

2) Глюк No 2 в функции Input(). Не понимает, что закрытие формы ввода крестиком - это то же самое, что отказ от выбора кнопкой "Отменить".
Аналогично - исправлю в следующей версии.

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

Demagog TTS

#160

Сообщение tonio_k » 29 ноя 2018 17:53

Правило:
стоящего_ в_ *_ шагах_=стоЯщего в_ шагах
Текст:
стоящего_ в_ пяти_ шагах_ от_ противника_
почему на выходе склеивает пяти_ шагах
стоЯщего в_ пятишагах от_ противника_


Отправлено спустя 34 минуты 22 секунды:
все, сам понял! Должно быть так:
стоящего_ в_ *_ шагах_=стоЯщего в_ _ шагах

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

Demagog TTS

#161

Сообщение balaamster » 29 ноя 2018 22:01

tonio_k писал(а):
29 ноя 2018 00:53
Есть мысль разнообразить репертуар путем добавления в FilterAndAudioToAll(folder, mask, diclist, remsource) счетчик времени или (правильнее счетчик файлов), который будет через каждый, например, третий файл менять содержимое C:\temp\fon.mp3 - путем копирования с переименованием в fon.mp3 из заранее подготовленной папки с подборкой mp3 файлов фоновых мелодий. - Тут еще надо реализовать эту подстановку "по кругу"
Благодаря подсказке:
balabolka писал(а):
28 ноя 2018 23:39
Зациклить фоновый файл можно и таким способом:

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

ffmpeg -i speech.wav -filter_complex "amovie=background.wav:loop=100[s];[0][s]amix=duration=shortest" output.wav
Реализовал такую версию FilterAndAudioToAllMod - работает аналогично FilterAndAudioToAll, но с дополнением.
► Показать
Необходимо создать в папке с Demagog папку fon. В неё поместить mp3-файлы с фоновым звуком. Функция rnd_fon возвращает случайный файл фона для каждого элемента серии.
Этот файл копируется в файл fon.mp3, в папке Demagog (передать фильтру абсолютные и относительные пути у меня не получилось) и подмешивается к речи.
Фильтр, подсказанный balabolka, создаёт зацикленный фон. Даже если речевой файл длиннее фона, отрывка без заполнения не останется.

Параметры для CustomEncoder

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

-loglevel -8 -y -i %1 -filter_complex "amovie=fon.mp3:loop=10[s];[0]aecho=0.8:0.6:20|40:0.2|0.2[b];[s]afade=t=in:ss=0:d=15[s];[b][s]amix=inputs=2:duration=first:weights=1 0.3" -ac 1 -b:a 64k %2
tonio_k писал(а):
29 ноя 2018 00:53
Тут нужно что то придумать, что бы при каждом накладывании C:\temp\fon.mp3 было затухание фоновой мелодии к концу каждого аудио файла книги
Плавное нарастание громкости в начале реализуется легко. Затухание можно будет реализовать только в скрипте с перекодировкой и использованием внешней утилиты mp3info, 66kb для определения длительности mp3-файла.
Так как речевой трек будет иметь разную длительность, то время (в секундах), с которого нужно начинать затухание нужно подбирать для каждого фрагмента отдельно и передавать его конвертеру.
Или можно определиться со средним временем звучания фрагмента и задать время начала затухания жёстко в строке настройки (самый последний короткий фрагмент останется без затухания)

Пример:

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

-loglevel -8 -y -i %1 -filter_complex "amovie=fon.mp3:loop=10[s];[0]aecho=0.8:0.6:20|40:0.2|0.2[b];[s]afade=t=in:ss=0:d=15[s];[s]afade=t=out:st=585:d=15[s];[b][s]amix=inputs=2:duration=first:weights=1 0.3" -ac 1 -b:a 64k %2
Затухание регулируется этим фильтром:
afade=t=out:st=585:d=15
st=585 - начало затухания с 585-й секунды, d=15 - длительность затухания 15 секунд. (рассчитано для файла длительностью 10 минут)

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

Demagog TTS

#162

Сообщение flegont » 29 ноя 2018 22:12

Отлично вышло :thank_you: Уже можно фабрику по изготовлению аудиокниг открывать :smile1:

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

Demagog TTS

#163

Сообщение tonio_k » 06 дек 2018 19:22

flegont писал(а):
26 июн 2018 18:52
[+] Возможность выполнять до 9 скриптов "по умолчанию", через горячие клавиши Shift+Ctrl+1 .. Shift+Ctrl+9. Настройка в "Сервис - Статистика - Выполнить скрипт - По умолчанию".
Пытаюсь повесить на комбинацию Ctrl+Shift+9 скрипт CtrlQuit.lua - экстренное прерывание работы демагога
► Показать
Что то не запускается.

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

Demagog TTS

#164

Сообщение flegont » 06 дек 2018 20:34

_Tests_\CtrlQuit.lua
Иначе скрипт ищется в корневой папке Демагога. И вообще, скрипты по горячим клавишам к конкретному месту не привязаны, и могут находиться в любом месте на компьютере. В таком случае - указывать полный путь вместе с диском.
P.S. А у меня аналогичный скрипт называется HaltDemagog.lua :big_smile:

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

-- Экстренное прерывание программы
--(в случае мертвого цикла - не поможет)
os.exit()

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

Demagog TTS

#165

Сообщение tonio_k » 06 дек 2018 23:05

Единственный момент.
Горячие клавиши вполне себе работают при открытых словарях dic, rex - что немного выбивается из принятой в Демагоге традиционной защиты словарей от несанкционированных изменений.
С другой стороны, оооочень нужна возможность вызвать os.exit() при любом активном окне.
Если все же решите "включить защиту", то может стоит os.exit() - жестко вшить либо в саму программу Демагог - подарить ей горячую клавишу, либо повесить ее "навсегда" к комбинации, например Ctrl+Shift+0 или Ctrl+Shift+9 и запретить редактирование этой клавиши. - главное что бы она срабатывала при любых открытых окнах (в т.ч. со словарями)

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

Demagog TTS

#166

Сообщение flegont » 07 дек 2018 00:19

1) Защиту не планирую. Назначение скриптов на горячие клавиши - полностью прерогатива пользователя. Под его ответственность :oldtimer:
2) Клавиша Shift+Ctrl+0 - весьма красива своей некоторой уникальностью. Наверное, поэтому Майрософт, начиная с Windows Vista зарезервировала ее для нужд операционной системы. Так что, увы... :cry_baby:

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

Demagog TTS

#167

Сообщение tonio_k » 20 янв 2019 19:52

flegont, Небольшое замечание. Формат - Фоновая картинка.
После выбора нового рисунка фон окна сразу не меняется. Нужно щелкнуть любое другое окно-вкладку. Только тогда изменения срабатывают.

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

Demagog TTS

#168

Сообщение flegont » 20 янв 2019 22:13

Спасибо за сообщение.
На 10-ке у меня фон.картинка обновляется нормально - сразу; (похоже, 10-ка шибко умная :wink:) , а на XP - возникает указанный глюк. Подумаю над этим.

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

Demagog TTS

#169

Сообщение tonio_k » 12 фев 2019 22:01

flegont,
Сервис – Чтение - Читать текст последовательными блоками с количеством символов.
хотел поднять вопрос на счет пауз в озвучке текста с экрана Демагога возникающих в результате затрат времени на обработку текста словарями.
Если все словари отключить, то чтение текста начинается практически мгновенно... (ну или с небольшой заминкой самого голосового движка) и между блоками паузы не заметны.
По идее, указание размера блока - это то же что и разбиение на сериалы.
Может немного поменять алгоритм?

Такие варианты:
1)
Запускаем чтение вслух содержимое окна.
На основании настроек создается первый файл сериала и он отправляется на озвучку голосовому движку - начинается чтение в слух (при этом на экран сам файл сериала не выводится – все выглядит так будто читается текущее окно). Т.е. первый запуск в любом случае предпологает паузу на обработку словарями – тут ничего не поделаешь.
С момента начала чтения голосом первого файла сериала запускается таймер который приостанавливает обработку словарями следующий файл сериала примерно на минуту меньше чем среднее время на прочтение соответствующего размера блока (или несколько минут в зависимости от размера блока и времени необходимого на его обработку). Или пользователь сам устанавливает необходимую ему паузу которую выяснит для себя экспериментальным путем.
При завершении чтения первого файла сериала Демагог кидает голосовому движку следующий уже обработанный следующий файл сериала и запускает таймер.
Получается что сериал создается не на всю книгу, а на текущий блок. Следующий блок начинает обрабатываться словарем в процессе чтения за некоторое время до его окончания.

2)
А можно вообще сделать по принципу шаг+1
Т.е. в начале обработать первый файл словарями, кидаем его на чтение голосовому движку.
Начинается чтение первого фала сериала и сразу параллельно запустить обработку второго файла сериала словарями.
Как только Заканчивается чтение первого файла, сразу кидается на чтение подготовленный второй файл голосовому движку. Начинается чтение и сразу параллельно запустить обработку третьего файла сериала
И т.д. до конца текста или нажатия кнопки стоп.

Немного (скорее пиково) будет возрастать нагрузка на ЦП при одновременном чтении и обработки текста словарями, но зато практически не будет пауз между блоками при чтении вслух с экрана.

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

Demagog TTS

#170

Сообщение flegont » 13 фев 2019 00:20

Указание размера читаемого блока - это совсем НЕ то же самое, что разбиение файла книги на сериал - т.е. множество мелких файлов. Массив блоков для чтения существует лишь в памяти Демагога. Каждому очередному блоку НЕ соответствует никакой файл.

Массив блоков обрабатывается в цикле.
Обработка блока состоит из двух действий:

1. Применить словари к блоку - блок в памяти Демагога соответственно изменяется.
2. Прочесть (уже измененный) блок вслух

Пока чтение вслух очередного блока не закончится, следующий не начнет обрабатываться.

Сделать обработку многопоточной? Один поток обрабатывает блоки словарями; другой проверяет, какие готовы и читает их вслух. Останавливаясь автоматически каждый раз, когда готовых для чтения блоков еще нет.
Довольно хлопотливая задача - организация взаимодействия потоков. Программа усложняется и становится менее надежной. А выигрыш по времени выполнения, скажем так, не всегда очевидный.
Пока к таким радикальным изменениям в программе я не готов. Хотя иногда задумываюсь о них.

Размер блока чтения в Демагоге по умолчанию 8192 символов (примерно 4 книжных страницы). Если обработка словарями приводит к слишком заметной паузе перед началом чтения очередного блока, то можно уменьшить в настройках, например, до 4096 символов.

P.S. Я заметил, что часто пользователи, в Настройках сериалов указывают желаемый размер серии примерно 5000 .. 7000 символов. Это - меньше принятого по умолчанию размера блока чтения 8192. Поэтому такие маленькие файлы-серии читаются вслух как один блок. Это и создает иллюзию, что серия и блок чтения - одно и тоже.

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

Demagog TTS

#171

Сообщение tonio_k » 13 фев 2019 22:23

flegont писал(а):
13 фев 2019 00:20
Указание размера читаемого блока
а может этот размер альтернативно определять автоматически в привязке к главам? Большая пауза перед началом чтения следующей главы выглядит довольно логично :suspect:

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

Demagog TTS

#172

Сообщение flegont » 14 фев 2019 00:16

Алгоритм разбиения текста на блоки никак не связан с его версткой по главам.
Только с версткой по абзацам или предложениям.

1) Если в настройках указано "Целое число абзацев в блоке", то абзацы добавляются в блок до тех пор, пока количество символов в блоке не станет равно или больше заданного в настройках размера блока
2) Иначе блок составляется из предложений, до тех пор, пока размер блока не станет равен или больше... см. выше.

Когда-то давно, в Демагоге использовался только метод 1. Я даже проводил исследование на большом количестве художественных текстов. Если книга сверстана правильно, с грамотной разбивкой текста на абзацы, то метод 1 дает хорошие результаты. Размер абзаца в среднем выходит ~ 250 символов. Блоки получаются почти одинаковых размеров.
Но... однажды мне написал пользователь: почему на некоем тексте программа не начинает чтение, а молча висит?! Текст был приложен к письму - целая книга ~ 1 мб. Стал разбираться, и... о ужас - оказалось, вся книга состояла из одного единственного абзаца, размером в этот самый 1 мб. В тексте вообще не было символов с кодом #13 - обозначающего концы абзацев.
А в программе был подключен один словарь типа rex - очень большой и медленно работающий. Блок в 1 мб он бы обрабатывал бог весть сколько... Так что, это было не зависание! А огромная пауза перед началом чтения! :smile3:

Именно тогда был добавлен метод 2 - набор блока чтения из предложений. Он используется, когда снята галочка "Целое число абзацев в блоке". При этом, размеры блоков получаются гораздо более одинаковыми и близкими к заданному в Настройках размеру. Соответственно, как бы не различались в книге размеры глав, а текст разделится на практически одинаковые блоки. И пауза перед началом чтения очередного блока будет практически такая же, как и для других.

Насколько я помню, разборку текста по предложениям, для составления блоков, Демагог делает по символам: . ? ! ; и еще нескольким, обозначающим точку в азиатских языках.

Остается еще один, последний вариант. Что, если в тексте нет не только абзацев, но и предложений? Что произойдет, если Демагогу дать большой текст, не содержащий переводов строки #13 и знаков препинания? Т.е. одну огромную строку - месиво из букв?
Надо проверить :sad:

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

Demagog TTS

#173

Сообщение tonio_k » 14 фев 2019 23:59

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


Отправлено спустя 3 минуты 40 секунд:
Соответственно, если Омографы подсвечены, то при промотке экрана, Омографы больше не будут подсвечиваться, пока не уберёшь выделение.

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

Demagog TTS

#174

Сообщение flegont » 15 фев 2019 09:44

Совершенно верно. Если в тексте есть выделенный фрагмент, то подсветка автоматически отключается. Это сделано во избежание конфликта подсветки с выделением текста.
Попросту говоря, подсветка заново отображает весь видимый в окне текст - уже красиво раскрашенный :smile1: При этом, выделение текста, хочешь-не хочешь, а будет сброшено.

Поэтому, когда делаем выделение в тексте, то подсветка автоматически отключается. Т.о. выделение текста имеет приоритет перед подсветкой.
Ну, а когда выделение снято, то подсветка снова включается и отобразиться при любой мало-мальской прокрутке текста. Или входе курсора мыши в окно редактирования. (Провел мышью за пределы и обратно - и подсветка обновилась).

В общем, пока будет так, как есть. А дальше... может, что-нибудь не придумаю :suspect:

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

Demagog TTS

#175

Сообщение tonio_k » 15 фев 2019 11:31

А можно сделать так, что бы при выделении текста отключалась и уже сработавшая подсветка омографов? У меня было так, что выделил текст, проработал с ним и давай крутит экран дальше с полной уверенностью, что не подсвечиваются Омографы потому что их нет. Т.е. выделил текст, и сразу видно что подсветка отключена.


Отправлено спустя 21 минуту 12 секунд:
Поясню.
Как только началось выделение текста все подкрашенные омографы на данном участке экрана должны исчезнуть. А то получается, что без снятия выделения с текста, как только я начал крутить мышкой вниз, У меня все ранее подсвеченные омографы так и остались подсвеченными на открытом участке экрана и прокручивая мышкой вниз новые омографы уже не подсвечиваются. Создаётся впечатление что их ниже попросту нет.

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

Demagog TTS

#176

Сообщение flegont » 15 фев 2019 17:38

Подумаю над этим.

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

Demagog TTS

#177

Сообщение tonio_k » 17 фев 2019 17:49

:surprise2: Начиная примерно с 7.29.363 не работает Collection of texts.lua - редко применяю. Только сейчас обнаружил.


Отправлено спустя 1 минуту 46 секунд:
Еще заметил, что изменилось окно ShowMessage - добавились кнопки Yes No

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

Demagog TTS

#178

Сообщение flegont » 17 фев 2019 19:32

_Tests_\Collection of texts.lua
3278 bytes
23.11.2018
12:37

profiles\calculator.lua
15455 bytes
19.01.2019
16:29

Demagog.exe
1161728 bytes
30.01.2019
10:29

Должны быть файлы с этими размерами и временем создния.
На моем экземпляре Демагога (скачанном с моего же сайта :smile1: ) скрипт работает, а у ShowMessages() - одна кнопка, как и положено.

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

Demagog TTS

#179

Сообщение tonio_k » 17 фев 2019 22:22

flegont, Спасибо за подсказку!
Оказывается, кроме обновления Demagog.exe, нужно еще обновлять \Demagog\profiles\calculator.lua

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

Demagog TTS

#180

Сообщение flegont » 17 фев 2019 22:34

Да. calculator.lua содержит описание функций интерпретатора, и от версии к версии его содержание может, в определенной степени, меняться. Например, если я в какой-то функции добавил дополнительный параметр(ы). Или вовсе добавил новую функцию (функции).

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

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

Demagog TTS

#181

Сообщение tonio_k » 18 фев 2019 13:35

Тем, кто пользуется Демагог, рекомендую содержимое своих словарей DIC прогнать через поиск:
Найти , по шаблону REX, Все подходящие

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

[^\r\n]*(a|o|c|p|e|x)[^\r\n]*
► Показать
Для выявления ошибок типа:
с другой стороны=c другой сторонЫ
где c на латинице

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

Demagog TTS

#182

Сообщение flegont » 18 фев 2019 19:52

И я несколько раз попадался в ловушки с "буквами-оборотнями" :cry_baby:
Так что, лишняя заручка с помощью предложенного РВ (или каких-то его вариций) - не помешает :thank_you:

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

Demagog TTS

#183

Сообщение wasyaka » 21 фев 2019 23:08

Вопрос:
Pronunciation adjustment.lua - запускается, включается, начинает работать... и вдруг перестаёт видеть словари - в куче, по одному.. в любой очерёдности... в новых версиях так задумано?
И почему через скрипт.. было можно, а в проге нельзя? - порядок обработки словарей по номеру, а не по расширению?
Создать набор пустых пронумерованных (в порядке применения) контейнеров в папке dic ...
А туда пользователь вложит словари?

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

Demagog TTS

#184

Сообщение tonio_k » 22 фев 2019 00:05

wasyaka писал(а):
21 фев 2019 23:08
Pronunciation adjustment.lua
хм, у меня он тоже не работает!
Словари выбираются, обработка словарями происходит подозрительно быстро, файл result.txt - пустой
wasyaka писал(а):
21 фев 2019 23:08
по номеру, а не по расширению?
а потому и сделали акцент на скрипты что бы обойти ограничение.
Автор решил (это его законное право :howdoyoudo: ) оставить базовым и ключевым традиционное правило: В первую очередь обрабатываются словари REX во вторую - DIC. А вот между собой файлы словарей rex или (между собой) файлы словарей dic уже можно сортировать по номеру.

Предлагаю попробовать воспользоваться очень простым скриптом:
Показать измененный текст.zip
(1.19 КБ) 11 скачиваний
оба файла из архива надо поместить в папку Demagog\_Tests_ (там же где и Pronunciation adjustment.lua лежит)

00_Показать ИЗМЕНЕННЫЙ ТЕКСТ.lua - это запускаемый скрипт.
Применяет словари к тексту в активном окне Демагога в последовательности, указанной в файле СПИСОК СЛОВАРЕЙ.lua.

В файле СПИСОК СЛОВАРЕЙ.lua отредактируйте под свои названия словарей в нужной вам последовательности.

Один важный момент, если без фигурных скобок, то применяется быстрый алгоритм для словаря DIC! Если нужен алгоритм прямого перебора, то словарь нужно заключить в скобки (в архиве пример заключения в скобки есть)

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

Demagog TTS

#185

Сообщение flegont » 22 фев 2019 00:17

Pronunciation ajustment.lua исправлен, начиная с версии 364.

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

Demagog TTS

#186

Сообщение flegont » 25 фев 2019 10:54

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-файла.

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

-- пример 1
folder = [[d:\~tmp\etc\gen]]
casesens = true
tag = [[<phoneme ph="%2"/>]]
PlsToDic([[d:\Demagog\work\Dopolneniya.pls]], folder, casesens, tag)

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

-- пример 2
PlsToDic('Dopolneniya.pls')
-- обрабатывается файл в корневой папке программы
-- результат будет там же

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

Demagog TTS

#187

Сообщение tonio_k » 27 фев 2019 18:58

Пожелания:
Сервис\ Статистика\ Сравнение файлов Хотелось бы чуть расширить этот функционал:
1) Добавить для всех пунктов возможность сравнить между собой содержимое окон (вместо указания местоположения файла 1 и файла 2, вручную (указываем цифру) или через выводимый список, указывать номер окна Демагога в которых открыт текст для сравнения.

2) Сервис\ Статистика\ Сравнение файлов\ Точка расхождения
После выявления первого расхождения, результат выводится в окно статистики и процесс прерывается. А хотелось бы некоторого продолжения - "Точка расхождения в каждом абзаце"
Т.Е.: реализовать "по-абзацевый" поиск расхождений до 1 точки расхождения.
В первом абзаце находим первое расхождение, результат - точка расхождения и окружающие его, допустим, по 5 слов слева и права (ограничение начало и конец абзаца) - выводим в окно статистики.
Переходим к следующему абзацу.

Понятно, что если в сравниваемом абзаце более одного расхождения, то последующие расхождения в этом абзаце не будут выявлены. Или того хуже - вообще отсутствует какой-то абзац - тогда дальнейшие расхождения вывалится в единую кашу.

Однако Точка расхождения в каждом абзаце - вполне применим и удобен для текстов ожидаемая разница, в которых в несколько десятков слов статистически раскиданных по всему тексту.

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

Demagog TTS

#188

Сообщение flegont » 27 фев 2019 20:51

Подумаю над этим. Возможность сравнивать тексты, уже открытые в разных окнах - была бы полезной. А с "точкой расхождения" - после первой найденной, должен быть выбор: завершить ли процесс сравнения, или указать новую стартовую позицию в сравниваемых текстах.
Т.е. пользователь отмечает кликом мышки в обоих текстах, где они вновь начали совпадать - оттуда искать новое расхождение. И т.д. до конца.

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

Demagog TTS

#189

Сообщение balaamster » 28 фев 2019 11:57

Появилась мысль, относительно омографов.

Суть идеи:
Создаётся некий dic-словарь со словами-омографами. После знака "=" ставится не словарная замена, а имя rex-словаря с регулярными выражениями (лежащего в спец.папке, например dic\hrex) только для этого омографа.

Словарь homo.hdic:
году=году.rex

В папке dic\hrex словарь году.rex:
\b(в \d+)(-о?м)? году\b=$1$2 годУ

При разборе блока текста встречаем слово "году", по словарю "homo.hdic" получаем ссылку на словарь "году.rex" и производим замены, в случае совпадений производим замену.

Теоретически, это позволит не перебирать весь rex-словарь с выражениями для остальных омографов. А как на практике, насколько сложна реализация и позволит ли это получить прирост, с учётом обработки подкаталога с дополнительными словарями?

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

Demagog TTS

#190

Сообщение tonio_k » 28 фев 2019 13:05

balaamster писал(а):
28 фев 2019 11:57
Появилась мысль, относительно омографов
речь идёт про ручной поиск омографов или про автоматическая замена по словарям ускоренный за счёт введения своеобразного индекса?


Отправлено спустя 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 годУ

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

Demagog TTS

#191

Сообщение balaamster » 28 фев 2019 13:43

tonio_k писал(а):
28 фев 2019 13:05
речь идёт про ручной поиск омографов или про автоматическая замен
Про автоматическую замену. Чтобы и в сценариях обработать такими словарями можно было.

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

Demagog TTS

#192

Сообщение tonio_k » 28 фев 2019 14:57

Провел такой эксперимент:
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, где все слова строчными буквами

Результат сравнения скорости:
2019-02-28_14-31-52.png
2019-02-28_14-31-52.png (2.81 КБ) 527 просмотров
Разница в скорости в разы.

Эксперимент грубоват по причине что при поиске в 20_REX_Замены от waska.rex поисковый запрос дОма|дОму| не поймает правило содержащее, например, =дом$2
но на общую картину эксперимента такие исключения особо не повлияют.

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

Demagog TTS

#193

Сообщение wasyaka » 02 мар 2019 21:22

1. Правка/Найти омографы Ctrl+H Находит первый и все последущие варианты для него и т. д.
2. Теже, но списком: Необработанные омографы ... согласно алфавиту :scratch: ,
Привести список в соответствии с пунктом 1 ??? - быстро можно понять, что делать всегда,...

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

Demagog TTS

#194

Сообщение flegont » 02 мар 2019 22:07

Хм... надо подумать :suspect:

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

Demagog TTS

#195

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

tonio_k писал(а):
28 фев 2019 14:57
Разница в скорости в разы.
Выкладываю сборку с готовыми скриптами для экспериментов по выявлению затрат времени на обработку текста словарем rex обычным и индексным методом Инструкция: открываем книгу в Демагоге. К текущему окну Запускаем один из скриптов:

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, который применяется к файлу с сериалом. И т.д. ... Склеивает все файлы сериала в один

Напоминаю, это экспериментальная сборка - возможны ошибки и не стыковки в работе :boy_blushed:


Отправлено спустя 3 часа 1 минуту 35 секунд:
так как правила rex все->всё, всем->всём и так применяются к каждому сериалу, имеет смысл эти правила перенести в индексируемый файл с rex омографами. Статистически есть вероятность, что в данном файле сериала ни разу не встретится все/всем - вот вам еще небольшой прирост в скорости.

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

Demagog TTS

#196

Сообщение balaamster » 04 мар 2019 15:33

tonio_k,
я провёл испытания у себя, вот что получилось:

В качестве текста - фрагмент книги, 4876 строк, 1 272 744 символа.

9999.ИЗМЕНЕННЫЙ ТЕКСТ 1.обычная обработка словарем.lua - 22м. 44с.
9999.ИЗМЕНЕННЫЙ ТЕКСТ 2.индексация всего текста.lua - 17м. 53с.
9999.ИЗМЕНЕННЫЙ ТЕКСТ 3.индекс по сериалам.lua - 06м. 41с.

Индексирование даёт ощутимый прирост в скорости обработки, особенно при создании сериалов (в 3,4 раза ).

Для обработки не поделенного на сериал текста можно будет применять обработку книги построчно. В моей коллекции книг, чаще всего, одна строка - один абзац. На досуге попробую поэкспериментировать с этим.

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

Demagog TTS

#197

Сообщение tonio_k » 04 мар 2019 16:06

В итоге - чем меньше файл, тем быстрее его обработка.
В шапке файла скрипта 9999.ИЗМЕНЕННЫЙ ТЕКСТ 3.индекс по сериалам.lua можно поиграть с параметром:

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

simbol = 4800     -- количество символов в одной серии 
- попробовать его уменьшить. может это даст улучшенный результат?

А еще надо сравнить полученные на выходе файлы по 1.обычная обработка словарем и 3.индекс по сериалам между собой. Только так можно выявить какие то несрабатывания правил и выяснить причину.
Скорее всего возможная причина расхождения - неправильное составление словаря.

Ошибки в словаре которые могут спровоцировать расхождение:
1) Пробел в строке с индексными словами
2) Любой другой разделитель кроме запятой в строке с индексными словами
3) Не указаны в строке с индексными словами все варианты вождения в правиле. Пример:
► Показать
4) Ну и человеческий фактор - ошибка когда в строке с индексными словами указал одно слово а правила относятся к другому.

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

Demagog TTS

#198

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

Сервис - Статистика - Выполнить по умолчанию
Раньше это окно выглядело так:
► Показать
Стало так:
► Показать

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

Demagog TTS

#199

Сообщение flegont » 14 мар 2019 17:21

Поправил и перезалил дистрибутив.

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

Demagog TTS

#200

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

Правка - Найти омографы.
Не совсем понял функцию меню "Добавить фразу в словарь".
► Показать
Как я понял, предлагается создать к найденному омографу правило. Но вот ее реализация не до конца мне понятна.
Сначала выбираем словарь, куда нужно правило добавить. Ок выбрали.
Открывается окно "Введите правило"
► Показать
А как таковой фразы то нет, а есть только найденное слово омограф, получается, правило можно только ручками вбивать. Потому что, пока включен режим поиска омографов, сам текст книги для копирования недоступен.
Как то это не очень удобно да и смысла не имеет. Проще остановить процедуру скопировать фразу и самому в словаре все откорректировать.
Поэтому есть такое пожелание.
К любому выделенному тексту книги через правую клавишу мыши добавить пункт меню:
"Добавить фразу в словарь" И что бы после выбора словаря, открывающееся окно "Введите правило" уже содержало в первой графе выделенный текст сообщения - доступный для редактирования.
Этот функционал удобен как для работы в режиме "Найти омографы"
(Нашли омограф. Надо ввести фразу в словарь? Отменяем поиск. Выделяем текст. Правая клавиша "Добавить фразу в словарь". Заносим правило в словарь. Дальше продолжаем поиск.
Так и в режиме работы с текстом в режиме чтения вслух. Услышали неправильное произношение, остановили чтение, выделили фразу. Правая клавиша "Добавить фразу в словарь". Заносим правило в словарь. Слушаем дальше.

Ответить

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