В.в.1 Алгоритм подключения и работы с festival

В этом статье рассмотрим как можно подключиться к внешнему приложению.

В стандартной библиотеке  #include <stdlib.h> имеется функция system("");
которая выполняет внешнюю команду. Однако результатом ее выполнения будет запуск или выполнение команды в консоли.

По задумке автора проекта Golos запуск festival должен происходить в фоновом режиме  – т.е. в режиме демона. Для этих целей подходит набор функция класса QProcess из библиотеки #include <QProcess>. Используя этот класс можно запустить процесс, передать (записать) управляющие команды, и перехватить (прочитать) стандартный вывод и вывод ошибок.

Рассмотрим схему реализации. Добавим

1.  библиотеку содержащую интересующие нас функции:

#include <QProcess>

2. глобальные  переменные

QProcess Ozvuchit; //для запуска и управления процессом
QString Fp = "";   // для хранения пути к Festival (Festival path)
bool Futt1 = false;//характеризует был ли пользователем изменен текст после синтеза
QString Flang = "(language_russian)";//Объявление переменной языка.

глобальность потребуется при использовании переменной в других функциях.

3. Строки запуска «демона», которые производятся при запуске программы.

//формируем строку запуска Festival
QString Zapusk = Fp.trimmed()+"festival.exe ";
Ozvuchit.start(Zapusk.trimmed());

4. Модуль воспроизведения располагается в сокете, который связан с  сигнал исходящим от  кнопки «Голос» после нажатия.

//Проверка запущен ли процесс
if (Ozvuchit.state() == QProcess::Running) {
//если текстовое поле менялось после синтеза то меняем содержимое переменной произношения
if (!Futt1) {
Futt1 = true; //присваиваем переменной значение 1, чтобы не синтезировать по второму разу
ui->pushButton_2->setEnabled(true);  //делаем активной кнопку сохранить фонему.
ui->Save_fonem_act->setEnabled(true);//и соответствующий пункт меню
//команда для Фестивал определяющая переменную произношения
QString text = "(set! utt1 (Utterance Text \""
+ui->RechText->toPlainText().trimmed()+"\"))";
//производится выбор языка для синтеза
Ozvuchit.write(Flang.trimmed().toUtf8());
//Отправка процессу Festival информации для синтеза
Ozvuchit.write(text.toUtf8());
//команда для Фестивал синтезирующая из текста речь utt1
Ozvuchit.write("(utt.synth utt1)");
}
//воспроизводим синтезированную речь;
Ozvuchit.write("(utt.play utt1)");
}
//если процесс не запустился выводится сообщение о невозможности запуска
else {
QMessageBox msgBox;
QString msg =QString::fromUtf8(
"festival не запущен, программа не может синтезировать речь");
msgBox.setText(msg);
msgBox.exec();
}
}
//часть, которая формирует сообщение о не введенном тексте см. в тексте программы

6. Выполнение закрытия канала связи и завершения процесса при завершении программы.

//Проверка запущен ли процесс
if (Ozvuchit.state() == QProcess::Running) {
Ozvuchit.closeWriteChannel();
//ожидается завершение запущенного процесса
Ozvuchit.waitForFinished(10);}

Добавить комментарий