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 МБ) 59 скачиваний

Аватара пользователя
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:

Ответить

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