Russian Qt Forum
Апрель 29, 2024, 13:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Синтезаторы речи (Text-to-speech)  (Прочитано 13017 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Октябрь 22, 2012, 10:35 »

Здравствуйте, добрый люди! Улыбающийся
Если у кого нибудь завалялся проектик синтезации речи на с/с++ поделитесь пожалуйста!!! Улыбающийся
Можно просто минимально рабочий вариант Улыбающийся
Желательно чтобы он мог болтать на английском и русском Улыбающийся, работаю на виндоус

Не подумайте, что я обнаглел - неделю мучился с синтезаторами, и не добился ничего,
только замучился

Спасибо Улыбающийся
« Последнее редактирование: Ноябрь 11, 2012, 20:33 от gil9red » Записан

Bepec
Гость
« Ответ #1 : Октябрь 22, 2012, 10:42 »

Ня - заодно о впечатлениях расскажешь http://rutracker.org/forum/viewtopic.php?t=1842332

А так то голосовые движки дорогое удовольствие Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Октябрь 22, 2012, 11:07 »

Он похоже очень хороший, но нужен движок в исходном виде, чтобы можно было пришить его в свою программу Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 22, 2012, 11:36 »

[/offtop]
Не то чтобы "обнаглел", а хочется "лазить" (скользть, порхать) "по всему интересному". И, как итог - ничем не заниматься серьезно. Вот чего-то найти/прикрутить барахольщику интересно, а сделать самому - уже нет  Плачущий

Ладно, не обращайте внимания на стариковское брюзжание, продолжайте пришивать рукав к..
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Октябрь 22, 2012, 11:55 »

ну можно прикруить через SAPI(SpeechAPI). Я так делал на делфях и все работало. Ну это только в винде будет работать, как в других ОС прикручивать - хз.
Читаете про SAPI и как прикрутить к С++ проекту и все должно получиться.
последовательность такая приблизительно:
устанавливаете голоса
находите описание API а также нужные заголовочные файлы
прикручиваете к проекту и вызываете что то типа speek(фраза). все.
на делфях это занимало не больше 5-10 минут.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Октябрь 22, 2012, 12:11 »

виндоусовое сапи вещь хорошая, да вот весит все таки многовато: в 5 раз больше самой моей программы, что не очень красиво Улыбающийся
Мне вот подсказали, что могло быть проще и лучше, не код пришивать, а программу-tts с собой носить
Когда нужно текст озвучить запускать tts через QProcess, передавая файл или текст, который хотим услышать, да и QProcess вроде может отследить, когда "его" программа закрывается, или пытается контактировать с ос
А если при этом программа-tts будет скрыта от пользователя, то он может и не заметит хитрость Улыбающийся

Как думаете, этот вариант лучше? Улыбающийся
Записан

Bepec
Гость
« Ответ #6 : Октябрь 22, 2012, 12:14 »

По очереди:

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

2) to Igors: Русскоязычный голосовой движок своими руками - пытался я сделать, ан нет, не всё так просто. Одних только сочетаний фонем дох... фига скажем так. Да и ещё отсутствие легкодоступной информации Улыбающийся

3) gil9red % на 90 прав, по моему мнению. Ибо это наименее затратный по времени/усилиям/возможностям способ Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 22, 2012, 14:42 »

2) to Igors: Русскоязычный голосовой движок своими руками - пытался я сделать, ан нет, не всё так просто. Одних только сочетаний фонем дох... фига скажем так. Да и ещё отсутствие легкодоступной информации Улыбающийся
Я к этому не призывал. Просто copy/paste в TextEdit, там нажал в менюшке - вот и speech. Насколько я знаю уже неск лет. Наверно можно и прямо из клипборды, но и так неплохо. Конечно можно всегда сказать "мне это необходимо, такая задача" - и это не обсуждается. Но есть верная примета - если так тянет "в прибамбасы", значит основной ф-ционал слаб, вот и пытаются добавить привлекательности
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Октябрь 23, 2012, 00:11 »

2) to Igors: Русскоязычный голосовой движок своими руками - пытался я сделать, ан нет, не всё так просто. Одних только сочетаний фонем дох... фига скажем так. Да и ещё отсутствие легкодоступной информации Улыбающийся
Я к этому не призывал. Просто copy/paste в TextEdit, там нажал в менюшке - вот и speech. Насколько я знаю уже неск лет. Наверно можно и прямо из клипборды, но и так неплохо. Конечно можно всегда сказать "мне это необходимо, такая задача" - и это не обсуждается. Но есть верная примета - если так тянет "в прибамбасы", значит основной ф-ционал слаб, вот и пытаются добавить привлекательности

Приходится мучится с синтезом речи, потому что:
  • Основная задача программы: хранение информации в текстовом виде, для не зрячих понимание такой информации будет проблематичной
  • Напоминания от программы хочется сделать удобными: захочет пользователь и в определенную дату/время по выбору будет какой то звуковой сигнал/открытие директорий/сайтов/запуск программ/воспроизведение музыки и к этому "безобразию" можно будет добавить прочтение содержимого напоминания Улыбающийся
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Октябрь 23, 2012, 15:45 »

Нашел программу, которая подходит по условиям: мало весит, многоязычная, бесплатная
называется eSpeak, вот ссылка на нее: http://espeak.sourceforge.net/download.html
В этой сборке есть консольная версия, находится в директории "command_line"

Минимальный код запуска через свою программу:
Код:
#include <QApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTime>

QString textInDoubleQuotes(QString text)
{
    return QString('"' + text + '"');
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForTr(QTextCodec::codecForName("windows-1251"));

    QString pathToTTS = QApplication::applicationDirPath()
            + QDir::separator()
            + "espeak.exe";
    QString lang;
    QString text;
    lang = " -ven ";
    text = textInDoubleQuotes("Current time: "
                              + QTime::currentTime().toString("h") + " hours "
                              + QTime::currentTime().toString("m") + " minutes "
                              + QTime::currentTime().toString("s") + " seconds");
/*
    lang = " -vru ";
    text = textInDoubleQuotes(QObject::tr("Текущее время:")
                              + QTime::currentTime().toString("h") + QObject::tr(" часов ")
                              + QTime::currentTime().toString("m") + QObject::tr(" минут ")
                              + QTime::currentTime().toString("s") + QObject::tr(" секунд"));
*/
    QProcess proc;
    proc.start(pathToTTS + lang + text,
               QIODevice::WriteOnly);

    if(!proc.waitForStarted())
    {
        qDebug() << "Error starting process: " << proc.errorString();
        return -1;
    }

    proc.waitForReadyRead();
    proc.close();
}

Для английского все работает, для русского - не совсем
Цифры он прочтет на русском, а вот символы кирилицы...такое ощущение что он их код читает

Может кто нибудь сталкивался с такой проблемой, или знаешь решение этой проблемы? Улыбающийся
Записан

Bepec
Гость
« Ответ #10 : Октябрь 23, 2012, 18:48 »

Быгыгыгы. Весело талдычит. Можно ускорить чуть, на пару тонов выше -> голос пришельца готов Веселый
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #11 : Октябрь 23, 2012, 20:18 »

Bepec, у вас на русском талдычит? Улыбающийся
Записан

Bepec
Гость
« Ответ #12 : Октябрь 23, 2012, 22:22 »

Только цифры. Подозреваю дело в кодировке Улыбающийся

Зато оч весело ему задавать что-то типа УУУУУУУУУУУУ!!!

update - а вот его утилитка вполне прилично талдычит на раше Улыбающийся Хотя и не без прикольных моментов.

PS файлик вав(расширение поменяйте) в комплекте - хороший стишок получился Веселый

update2: стандартная кодировка для него - UTF8. В командной строке винды задать его чегой то не получается, но из файла читает нормально (флаг -f).
« Последнее редактирование: Октябрь 23, 2012, 22:47 от Bepec » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #13 : Октябрь 24, 2012, 14:10 »

Смог с этой консольной программой продвинуться, но пришлось сильно поизвращаться (что раздражает), потому что, если запускать ее через QProcess::start она не будет показываться, но во время выполнения будет блокировать главный поток, а если запустить через QProcess::startDetach то блокировки не будет, но ее консольное окно будет видно, сделал так:
Создал второй проект, нужный только для запуска консольки espeak:
Код:
#include <QtGui/QApplication>
#include <QProcess>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString pathToTTS = QApplication::applicationDirPath()
            + "\\"
            + "espeak.exe";

    QString text = QString(argv[1])
            + " "
            + QString(argv[2])
            + " "
            + QString(argv[3]);

    QProcess *processSpeak = new QProcess();
    processSpeak->start(pathToTTS + " " + text,
                       QIODevice::WriteOnly);
    processSpeak->waitForReadyRead();

    return 0;
}
этот код будет запускать ее, и будет поддерживать передачу 3 аргументов: язык (-vru, -ven,  и т.д.),
и флаг и значением, например: -f "Путь к файлу..."

а второй проект, будет запускать первый, который называется "ServiceEspeak.exe" и запускать
будет так чтобы не блокировать свой поток:
Код:
void Widget::speak()
{
    // если textedit не пуст
    if(!textEdit->toPlainText().isEmpty())
    {
        QString pathToTTS = QApplication::applicationDirPath()
                + QDir::separator()
                + "ServiceEspeak.exe ";

        QString text;
        // если есть выделенный текст
        if(!textEdit->textCursor().selectedText().isEmpty())
            text = textInDoubleQuotes(textEdit->textCursor().selectedText());
        else // иначе весь текст
            text = textInDoubleQuotes(textEdit->toPlainText());

        QString pathToFile = QApplication::applicationDirPath()
                + QDir::separator()
                + "temp.txt";

        QFile::remove(pathToFile);

        QFile file(pathToFile);
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        QTextStream out(&file);
        out.setCodec("utf-8");
        out << text;
        file.close();

        processSpeak = new QProcess(this);
        processSpeak->startDetached(pathToTTS + " -vru -f " + pathToFile);

        processSpeak->waitForReadyRead();
        processSpeak->close();

        delete processSpeak;
        processSpeak = 0;       
    }
}

Но мне этот код жутко не нравится, потому что это говнокод не красиво получается
По крайней мере, он работает, и может и по русский и по английски болтать, главное указать язык русский и тогда кирилицу он скажет на русском, а латиницу - на английском, даже если кирилица и латиница есть в одном файле, который синтезатор обрабатывает

Да вот, еще заметил, что консолька espeak не хочет работать на рабочем столе (наверное из-за русских символов в пути), но если скинуть в корень дисков (хоть флешек, то все ок), да и понять бы как эту программку, переносить на другие компы, ведь ей для работы нужны несколько папок, я их кидал к ней - не получается, кидал в те же директории где они должны находиться при установке (C:\Program Files\eSpeak\) - опять не работается, и только делая установку, удавалось запускать Грустный

Записан

mitrich
Гость
« Ответ #14 : Октябрь 24, 2012, 20:08 »

Так собери из исходников DLL-ку и используй её через соотв. API. Документация - в файле speak_lib.h
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.