Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Октябрь 22, 2012, 10:35



Название: [РЕШЕНО] Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 22, 2012, 10:35
Здравствуйте, добрый люди! :)
Если у кого нибудь завалялся проектик синтезации речи на с/с++ поделитесь пожалуйста!!! :)
Можно просто минимально рабочий вариант :)
Желательно чтобы он мог болтать на английском и русском :), работаю на виндоус

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

Спасибо :)


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Bepec от Октябрь 22, 2012, 10:42
Ня - заодно о впечатлениях расскажешь http://rutracker.org/forum/viewtopic.php?t=1842332

А так то голосовые движки дорогое удовольствие :)


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 22, 2012, 11:07
Он похоже очень хороший, но нужен движок в исходном виде, чтобы можно было пришить его в свою программу :)


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Igors от Октябрь 22, 2012, 11:36
[/offtop]
Не то чтобы "обнаглел", а хочется "лазить" (скользть, порхать) "по всему интересному". И, как итог - ничем не заниматься серьезно. Вот чего-то найти/прикрутить барахольщику интересно, а сделать самому - уже нет  :'(

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


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Fregloin от Октябрь 22, 2012, 11:55
ну можно прикруить через SAPI(SpeechAPI). Я так делал на делфях и все работало. Ну это только в винде будет работать, как в других ОС прикручивать - хз.
Читаете про SAPI и как прикрутить к С++ проекту и все должно получиться.
последовательность такая приблизительно:
устанавливаете голоса
находите описание API а также нужные заголовочные файлы
прикручиваете к проекту и вызываете что то типа speek(фраза). все.
на делфях это занимало не больше 5-10 минут.


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 22, 2012, 12:11
виндоусовое сапи вещь хорошая, да вот весит все таки многовато: в 5 раз больше самой моей программы, что не очень красиво :)
Мне вот подсказали, что могло быть проще и лучше, не код пришивать, а программу-tts с собой носить
Когда нужно текст озвучить запускать tts через QProcess, передавая файл или текст, который хотим услышать, да и QProcess вроде может отследить, когда "его" программа закрывается, или пытается контактировать с ос
А если при этом программа-tts будет скрыта от пользователя, то он может и не заметит хитрость :)

Как думаете, этот вариант лучше? :)


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Bepec от Октябрь 22, 2012, 12:14
По очереди:

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

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

3) gil9red % на 90 прав, по моему мнению. Ибо это наименее затратный по времени/усилиям/возможностям способ :)


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


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

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


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 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();
}

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

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


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Bepec от Октябрь 23, 2012, 18:48
Быгыгыгы. Весело талдычит. Можно ускорить чуть, на пару тонов выше -> голос пришельца готов :D


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 23, 2012, 20:18
Bepec, у вас на русском талдычит? :)


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Bepec от Октябрь 23, 2012, 22:22
Только цифры. Подозреваю дело в кодировке :)

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

update - а вот его утилитка вполне прилично талдычит на раше :) Хотя и не без прикольных моментов.

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

update2: стандартная кодировка для него - UTF8. В командной строке винды задать его чегой то не получается, но из файла читает нормально (флаг -f).


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 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\) - опять не работается, и только делая установку, удавалось запускать :(



Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: mitrich от Октябрь 24, 2012, 20:08
Так собери из исходников DLL-ку и используй её через соотв. API. Документация - в файле speak_lib.h


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 26, 2012, 02:15
Так собери из исходников DLL-ку и используй её через соотв. API. Документация - в файле speak_lib.h
Не умею :( никогда их не собирал вне IDE, да и на винде работаю, у нее вроде нету стандартной команды make


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: xokc от Октябрь 26, 2012, 08:31
Не умею :(
Научись :). Ну вот какого деяния ты от нас ждёшь? Чтобы мы собрали всем форумом тебе DLL?
никогда их не собирал вне IDE, да и на винде работаю, у нее вроде нету стандартной команды make
У нее вроде есть стандартный для MSVS nmake, не менее стандартный для Qt Creator jom и т.д. Создай, в конце-концов проект для своей IDE. Это кому надо-то нам, или тебе?


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 26, 2012, 09:54
эмммм...я вроде не писал, о помощи в сборке dll :)
Кроме того, в составе Qt Creator'a, на котором пишу, видел утилиты make (я не про qmake :)),
если нужно скачаю такую :)


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: xokc от Октябрь 26, 2012, 13:18
в составе Qt Creator'a, на котором пишу, видел утилиты make (я не про qmake :)),
make не входит в состав Qt Creator. make в том или ином виде (nmake, jom, mingw32-make и т.д. - это всё различные реализации make) входит в состав той системы сборки, которую использует QtCreator. Так что не надо ничего качать, make уже есть у тебя на компе, иначе QtСreator не смог бы собрать ни одного проекта. Просто возьми jom.exe из папки QtCreator\bin и считай, что это make и есть.


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: Igors от Октябрь 26, 2012, 13:37
А здесь солидарен с топик-стартером - тоже никогда не "собирал", потому что "не разбрасывал". IDE в котором я работаю показывает длинную соплю командной строки и для компилятора и для линкера, но я никогда не понимал какой (зверячий) кайф в знании всех этих "ключиков".

Кстати любая либа для Вындоуз идет с проектом(ами) MSVC. Если (почему-то) нет - можно сделать свой проект и компилять цивильно через F7


Название: Re: Синтезаторы речи (Text-to-speech)
Отправлено: gil9red от Октябрь 26, 2012, 14:45
xokc, спасибо за подробные пояснения :)

В исходниках библиотеки eSpeak, есть и make-файл, и файл проекта,
для виндовс - файлы *.dsp и *.dsw, так что у меня есть выбор, а это
уже не мало :)