Автор Тема: Хотелось бы немного доработать прогу Universal Interface для синтеза речи (TTS)  (Прочитано 1695 раз)

Оффлайн artenaki

  • Давно тут
  • **
  • Сообщений: 184
Есть ли на форуме спецы по Lazarus? Хотелось бы немного доработать прогу Universal Interface https://github.com/artenax/ui чтобы она больше походила на Балаболку, которая используется для преобразования текста в речь.
Т.е. расширить входное поле (туда копируется текст), убрать выходное хотя бы.
« Последнее редактирование: 21.12.2023 13:09:12 от artenaki »

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972

Zenity?

#!/bin/sh

if zenity --entry \
--title="Say semething :)" \
--text="Enter text:" \
--entry-text ""
  then
    echo $?
  else
    echo "No text"
fi

Оффлайн NickM

  • Завсегдатай
  • *
  • Сообщений: 901
расширить входное поле (туда копируется текст), убрать выходное хотя бы.
Размеры контролов изменить на форме что ли?

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
если вместо зенити яд применить, дак там мультилайн есть с возможностью загрузки из файла

https://yad-guide.ingk.se/text/yad-text.html#_editable
https://yad-guide.ingk.se/text/yad-text.html#_file_op_2

Оффлайн artenaki

  • Давно тут
  • **
  • Сообщений: 184
Размеры контролов изменить на форме что ли?
Да. И убрать необходимость указывания выходного файла (сейчас вместо него указываю пробел, чтобы сработало, что довольно костыльно, хоть и один раз при запуске). Вроде мелочь, а вот поди-ка измени. Еще не помешала бы кнопка "стереть форму" и "вставить из буфера обмена".

Zenity?
А как сохранить текст в файл? Чтобы с ним в дальнейшем работала вайновская консольная утилита balcon.exe.
Ну и UI (Universal Interface) удобнее в том плане, что показывает статус работы в терминале. Потому что большие тексты не так уж и быстро обрабатываются (сохраняются в wav, который потом читает aplay или vlc). Я уже привык видеть статус в процентах. Их выводит balcon в терминал.

если вместо зенити яд применить, дак там мультилайн есть с возможностью загрузки из файла
yad --text-info --editable > ivona.txt
Вот тут уже интересней. Правда, неудобно, что окно ввода текста потом закрывается, надо заново вызывать. UI же остается открытым и можно вставлять новый текст.

Приветствуются любые решения (в том числе и готовые). И на Qt, например. Ориентируйтесь на удобство Балаболки. Ее, конечно, можно запустить под wine (тем более голосовой движок под ним работает), но как-то тяжеловато.
Удобство в мелочах. Экономия каждого клика делает использование комфортнее. UI работает вполне нормально, но довольно много лишних кликов.
« Последнее редактирование: 19.12.2023 01:58:08 от artenaki »

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
окно можно зациклить и оно никогда не закроется

и в зенити и в яде есть прогресс-бар
https://help.gnome.org/users/zenity/stable/progress.html.en
https://yad-guide.ingk.se/progress/yad-progress.html


в альте 100 лет назад были менестрель и скоромох
https://menestrel.sourceforge.net/
https://menestrel.sourceforge.net/skomoroh.html

« Последнее редактирование: 19.12.2023 10:38:04 от YYY »

Оффлайн artenaki

  • Давно тут
  • **
  • Сообщений: 184
К сожалению, я не программист, иначе бы давно сварганил что-нибудь. Умею только компилировать. В скоромохе проблема с движками, rhvoice не очень-то качественный по современным меркам.

Оффлайн alxl

  • Давно тут
  • **
  • Сообщений: 128
К сожалению, я не программист
Для того, чтобы поменять размеры элементов формы или передвинуть их на другое место вообще не нужно быть программистом. Всё это делается мышкой.

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
я тоже не пограммист, но разве это смягчающее обстоятельство?

вот попробуйте

только замените
"программа1"  на программу которая должна TXT в WAV перегнать
"программа2"  на программу которая WAV проиграть должна

#!/bin/bash

if [ "$#" -ne 2 ]; then

    echo "start wo 2 args"

    rnd=$RANDOM
    rfnt="/tmp/saysf$rnd.txt"
    rfns="/tmp/saysf$rnd.waw"

    if yad --text-info --editable  --file-op \
    --title="Сейчас скажу! :)" \
    --text="Введите текст:" \
    --entry-text "" \
    --width=600 --height=240 > $rfnt
      then
        echo "RUN $0 $rfnt $rfns"
        $0 $rfnt $rfns
      else
        echo "EXIT"
        exit 0
    fi

else
       
    echo "start with 2 args $1 $2"
       
    for ((i=1; i<=3; i++)) {
        echo "# $((i*33))%"
        echo $i
        #sleep 1
        if [ "$i" -eq 1 ]; then
               программа1 $1 $2
        fi
        if [ "$i" -eq 2 ]; then
               программа2 $2
        fi
    } | yad --progress \
  --text="Прогресс..." \
  --width=300 \
  --auto-kill \
  --auto-close
 
    echo "start new scrip and exit"
 
    $0 &
 
fi

exit 0



Оффлайн artenaki

  • Давно тут
  • **
  • Сообщений: 184
я тоже не пограммист, но разве это смягчающее обстоятельство?

вот попробуйте

только замените
"программа1"  на программу которая должна TXT в WAV перегнать
"программа2"  на программу которая WAV проиграть должна

#!/bin/bash

if [ "$#" -ne 2 ]; then

    echo "start wo 2 args"

    rnd=$RANDOM
    rfnt="/tmp/saysf$rnd.txt"
    rfns="/tmp/saysf$rnd.waw"

    if yad --text-info --editable  --file-op \
    --title="Сейчас скажу! :)" \
    --text="Введите текст:" \
    --entry-text "" \
    --width=600 --height=240 > $rfnt
      then
        echo "RUN $0 $rfnt $rfns"
        $0 $rfnt $rfns
      else
        echo "EXIT"
        exit 0
    fi

else
       
    echo "start with 2 args $1 $2"
       
    for ((i=1; i<=3; i++)) {
        echo "# $((i*33))%"
        echo $i
        #sleep 1
        if [ "$i" -eq 1 ]; then
               программа1 $1 $2
        fi
        if [ "$i" -eq 2 ]; then
               программа2 $2
        fi
    } | yad --progress \
  --text="Прогресс..." \
  --width=300 \
  --auto-kill \
  --auto-close
 
    echo "start new scrip and exit"
 
    $0 &
 
fi

exit 0

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

Пара небольших придирок:
1. Можно ли, чтобы окно ввода текста было с переносом строк? Только при отображении, конечно. Потому что бывает копирую длинные предложения и они не влезают в это поле, появляется горизонтальная панель прокрутки. В этом нет ничего страшного, я же их не редактирую. Но поскольку не весь текст отображается в окне, это не позволяет примерно прикинуть насколько его много. Как долго будет преобразовываться и играться. Хотя, я же когда копирую из браузера или текстового редактора, там видно сколько. Но все равно, не отказался бы от переносов строк в окне текста.
2. progress по факту не работает. Всегда 33%. Тут надо бы показать окно терминала, что выплевывает в терминал "программа 1". Там будет прогресс. Прогресс в общем-то необязателен (особенно для небольших текстов), я могу и подождать декода не видя его. Но если бы как-нибудь вывести не --progress, а окно терминала с программой 1, было бы, наверное, нагляднее. Или как-то интегрировать вывод терминала в окно YAD. Ну, про полноценный перехват прогресса, конвертирование процентов, которые показывает программа 1 и перенос их в окно YAD, я и не говорю. Понятно, что это сложно.

В целом, скрипт юзабельней, чем программа UI. Нет прогресса, зато меньше лишних кликов в начале и текст старый не мешает.

Кстати, о горячих клавишах в окне теста. Я понял, что Enter - новая строка, а Ctrl+Enter - выполнение (аналог кнопки OK). Можно ли их поменять местами, чтобы по Enter было выполнение?
Потому что не всегда практично мышкликать (на кнопку OK), а, наверное, бывает проще нажать клавишу. И Enter проще, чем Ctrl+Enter.

В общем, у меня
программа 1:
wine32 balcon.exe -f $1 -w $2 -n "IVONA 2 Tatyana OEM" -s 0 -v 100 -enc utf8 -iu -dpпрограмма 2:
vlc $2Я там еще запилил rm says*.wav, чтобы временные файлы удалялись. Они и так удалятся при перезагрузке, но я перезагружаюсь крайне редко. Иногда месяцами комп включен.
« Последнее редактирование: 20.12.2023 01:59:48 от artenaki »

Оффлайн artenaki

  • Давно тут
  • **
  • Сообщений: 184
Я кстати скомпилировал Skomoroh 1.0 2012 года. Ему нужна Qt4 и старая версия zlib (я использовал 1.2.8 static, с новой не собирается). В нем можно использовать произвольные команды для движка. Я указал такую:
wine32 balcon.exe -f $1/$2.txt -w $1/$2.wav -n "IVONA 2 Tatyana OEM" -s 0 -v 100 -enc utf8 -dp$1 - путь (используется директория запуска)
$2 - имя без расширения

В общем-то работает, но есть недостатки.
1. Как только он сохранит настройки (в папку .skomoroh) при следующем запуске происходит segfault. Папку .skomoroh надо удалять, но тогда придется заново вбивать команду и выбирать скорость 0 при запуске. Пытался удалять только некоторые файлы конфига, добился того, что происходит не segfault, а зависание с жором одного ядра. Надо бы скомпилировать в debug (в QtCreator), посмотреть детальные логи.

2. Нет команды очистки окна от старого текста. Вернее, она есть, но лишние клики (надо подтвердить создание пустой формы). Или же Ctrl+A - Del, что довольно хлопотно.

3. Несколько странный способ работы. Опять же лишние клики. Вставляешь текст, потом надо нажать "стоп" наверху (если это следующий текст), потом "вторую кнопку снизу" (завершить создание и подготовиться к чтению), потом "озвучить" сверху.
И так далее с новым текстом. Еще старый текст (в промежутках между действиями выше) надо сначала удалить (Ctrl+A - Del) или создать новую форму (т.е. четвертый клик уже).

4. Зато в программе есть статус процесса выполнения (progress bar) и подсветка читаемого текста. Даже с custom движком. Потому что прога разбивает текст на предложения. Для каждого предложения создается текстовый файл и wav файл (потом это чистится). Неудобство в том, что каждое предложение в тексте вызывает wine (а он у меня к тому же в виде appimage, монтируется), что снижает скорость создания (зато с прогрессом) и вызывает лишнее чтение с диска (при монтировании appimage в /tmp реальной записи не происходит). Но каждое предложение дергает appimage.

В общем, такие дела. Доработать бы Скоморох. Но это совсем трудно, т.к. Qt4. В некоторых дистрибутивах Qt4 уже и нет. В Ubuntu 22.04 я ставил через ppa. Конечно, было очень много варнингов при компиляции, прога 2012 года.

Menestrel тоже скомпилировал (ему, кстати zlib не нужен). Это видимо приложение на котором основывался Скоморох. В Menestrel указывать custom движок нельзя (только Festival). На втором старте тоже не запускается, пока не удалишь конфиг. Так что это не из-за wine движка. Какая-то несовместимость. Тестировал в Ubuntu 22.04 2022 года, проги 2012 года.

UPD: Прогресс есть, а время чтения не показывает, как VLC. Разбивка на предложения слишком замедляет создание.
« Последнее редактирование: 20.12.2023 05:12:18 от artenaki »

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
1. Можно ли, чтобы окно ввода текста было с переносом строк? Только при отображении, конечно.

можно через ключ --wrap
https://yad-guide.ingk.se/text/yad-text.html#_wrap

    if yad --text-info --editable  --file-op --wrap \
Тут надо бы показать окно терминала, что выплевывает в терминал "программа 1". Там будет прогресс.

https://askubuntu.com/questions/851895/yad-progress-bar-with-terminal-output

т.е. должно быть что-то типа или около того

wine32 balcon.exe  бла-бла-бла  | while read -r line; do echo "# ${line}"; done
и в коде при запуске прогресса яда добавить лог
https://yad-guide.ingk.se/progress/yad-progress.html#_log_expanded
типа

    } | yad --progress \
  --text="Прогресс..." \
  --width=300 \
  --auto-kill \
  --enable-log="Прогресс" \
  --log-expanded \
  --auto-close
« Последнее редактирование: 20.12.2023 12:12:21 от YYY »

Оффлайн artenaki

  • Давно тут
  • **
  • Сообщений: 184
С --wrap получилось, а вот прогресс не хочет. UI прога выводит вот так:
[................................] 1%
[##..............................] 6%
[####............................] 11%
[#####......
.....................] 17%
[######..........................] 20%
[#######.........................] 22%
[########..............
..........] 26%
[#########.......................] 28%
[##########......................] 30%
[##########......................]
31%
[############....................] 39%
[#############...................] 40%
[###############.................] 47%
[#####
############...............] 52%
[#################...............] 53%
[##################..............] 55%
[################
###.............] 59%
[#######################.........] 71%
[#######################.........] 73%
[########################...
.....] 74%
[########################........] 75%
[########################........] 76%
[#########################.......] 77%
[#########################.......] 78%
[##########################......] 80%
[###########################.....] 83%
[##########
##################....] 86%
[############################....] 89%
[#############################...] 91%
[#####################
#########..] 94%
[###############################.] 96%
[###############################.] 97%
[################################
] 100%
с автопрокруткой. Если как из пакетного файла, а из обычного терминала красивее в одну строчку цифры бегут.
А в YAD 33%. Модификация привела к тому, что теперь перед открытием плеера появляется 66%. Это не ведь не цифры balcon.exe.

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
в окне прогресса лог работы программы есть?

типа как здесь
https://yad-guide.ingk.se/progress/img/yad-progress-log-1.png
?



Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
в окне прогресса лог работы программы есть?
Там только цифры. 33% и в самом конце 66%.


Надо включить  через 
--enable-log="Прогресс"  --log-expanded
дополнительное окно и там, в теории, смотреть уже вывод...