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

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

Ответить

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