Дмитрий
Дмитрий10. Juli 2017 03:19

Verwenden von QtTextToSpeech für die Sprachsynthese

Die Qt 5.8.0-Bibliothek bot Programmierern die Möglichkeit, einen systemischen Sprachsynthesizer zu verwenden. Ein Sprachsynthesizer ist ein Programm, das Text in Sprache umwandelt. Sprachsynthesizer sind aus jedem modernen Betriebssystem nicht mehr wegzudenken: Windows (ab Version 7), Mac OS, Linux, iOS und Android. Die plattformübergreifende Schnittstelle zum Verwalten der Sprachsynthese bietet das QtTextToSpeech-Modul Qt-Bibliothek.

Um mit dem QtTextToSpeech-Modul unter Windows OS zu arbeiten, müssen Sie:

  • Installieren Sie die Qt-Bibliothek mit dem QtTextToSpeech-Modul für den Visual Studio 2015-Compiler oder älter (mingw funktioniert nicht);
  • Installieren Sie den Visual Studio 2015-Compiler;
  • Installieren Sie die Bibliothek SAPI 5.1 , falls sie sich aus irgendeinem Grund nicht auf Ihrem Computer befindet;
  • Installieren Sie Stimmen für Sprachsynthesizer (falls Sie sie nicht haben).
  • Beim Erstellen eines Projekts müssen Sie einen Schatten-Build verwenden.

Beschreibung

Wenn Sie das Programm kompilieren, sehen Sie eine Meldung

Error loading text-to-speech plug-in "sapi"

dann hast du was falsch gemacht.

dann hast du was falsch gemacht.

Wenn Sie Android verwenden, haben Sie standardmäßig einen Online-Synthesizer. Dafür zahlen Sie eine Verzögerung bei der Synthese und verbrauchten Verkehr. Wenn Ihnen das nicht passt, dann installieren Sie die Offline-Version. Unter Android 5.1 müssen Sie dazu zu "Einstellungen" - "Sonderfunktionen" - "Sprachsynthese" - "Google-Sprachsynthesizer" - "Sprachdateninstallation" - "Russisch (Russland)" gehen und auf "Installieren" klicken und auf den Abschluss warten . Darüber hinaus bereiten wir Qt Creator für die Erstellung von Android-Anwendungen vor.

Jetzt können Sie mit dem Schreiben des Programms beginnen. Unter dem Link können Sie das Projekt mit dem Quellcode des unten beschriebenen Programms herunterladen . Erstellen Sie ein neues qtwidget-Projekt. Verbinden Sie in der Projektdatei das erforderliche Modul

QT += texttospeech

Wir verbinden die Synthesizer-Bibliothek der Sprache

#include <QtTextToSpeech>

Erstellen Sie einen Zeiger auf ein QTextToSpeech-Klassenobjekt

QTextToSpeech* speech;

Und dann das Objekt selbst

speech = new QtextToSpeech;

Nun können Sie mit der Funktion say() Sprachsignale erzeugen, als deren Argument Sie den gesprochenen Text übermitteln müssen. Die von Qt Creator-Entwicklern erstellten Beispiele enthalten ein einfaches helloSpeech-Beispiel. Betrachten Sie es, um die Fähigkeiten des betreffenden Moduls besser zu verstehen.

Ich werde zu einigen komplizierteren Dingen übergehen. Das Programm, das Sie als Referenz herunterladen können, enthält ein Widget der Klasse Q TextEdit zum Abspielen von Text, Steuerschaltflächen: Start, Stopp, Vorwärts, ..., ein Fenster zum Auswählen von Dateien und Fenster zum Einstellen des Synthesizers.

void MainWindow::start(bool geprüft)

Sie können auch große Textfragmente zur Wiedergabe abspielen. Dies führt jedoch zu unnötigen Verzögerungen und im Falle des Online-Synthesizers auf Android auch zum Hängenbleiben des Programms. Deshalb zerlegen wir den Text in Fragmente, je weniger, desto besser. Zuerst wähle ich den Absatz (int activeBlock) aus dem Text aus und unterbreche dann die Zeile in ein Zeilenblatt (QStringList readList), wobei ich die Punkte als Trennzeichen verwende.

void MainWindow::start(bool checked)
{
    if(checked)
    {
        if(readList.isEmpty())
        {
            readList = ui->textEdit->document()->findBlockByNumber( activeBlock ).text().split(".");
        }
        if(!readList.isEmpty())
        {
            readString = readList.first();
            readList.removeFirst();
            if(!readString.contains(QRegularExpression("[A-Z]|[a-z]|[0-9]|[А-Я]|[а-я]")))
            {
                readString = ".";
                if(QSysInfo::productType() == "android")
                    readString = " ";
            }
            speech->say( readString );
            scrollTo();
            ui->textEdit->setReadOnly(true);
        }
    }
    else
    {
        readList.prepend(readString);//
        speech->stop();
        ui->textEdit->setReadOnly(false);
    }
}

void MainWindow::speechStateChange(QTextToSpeech::State state)

Eine Zeile wird an den Synthesizer gesendet. Nach Abschluss ihrer Wiedergabe erzeugt die Sprache ein stateChanged-Signal. Der damit verbundene SpeechStateChange-Slot ist für das Abspielen der nächsten Zeile zuständig.

void MainWindow::speechStateChange( QTextToSpeech::State state)
{
    QString mes;
    switch(state)
    {
    case QTextToSpeech::Ready:
        if(ui->pushButtonStart->isChecked())
        {
            textBlockSelection(colorClean);
            if(readList.isEmpty())
            {
                if( setActiveBlock( activeBlock+1 ) )
                    start();
                else
                    stop();
            }
            else
            {
                start();
            }
        }
        mes = "ready";
        break;
    case QTextToSpeech::Speaking:
        textBlockSelection(Qt::green);
        mes = "speaking";
        break;
    case QTextToSpeech::Paused:
        mes = "paused";
        break;
    case QTextToSpeech::BackendError:
        mes = "error";
        break;
    }
}

Sekundäre Funktionen

Um das Programm bequem als Reader verwenden zu können, wurden zwei Hilfsfunktionen scrollTo () geschrieben, um den Text zum ausgewählten Absatz zu scrollen, und textBlockSelection (QColor), um den lesbaren Absatz mit der Hintergrundfarbe hervorzuheben. Unten ist ihr Quellcode.

void MainWindow::scrollTo()

void MainWindow::scrollTo()
{
    if(ui->textEdit->verticalScrollBar()->maximum() == 0)
        return;
    QTextDocument *textDoc = ui->textEdit->document();
    int value = 0;
    for(int i = 0; i < activeBlock; i++)
    {
        value +=textDoc->findBlockByNumber(i).layout()->lineCount()
                * textDoc->findBlockByNumber(i).layout()->lineAt(0).height()
                + textDoc->findBlockByNumber(i).blockFormat().bottomMargin();
    }
    if(value <= ui->textEdit->verticalScrollBar()->maximum())
        ui->textEdit->verticalScrollBar()->setValue(value);
}

bool MainWindow::setActiveBlock(int blockNumber, bool scroll)

bool MainWindow::setActiveBlock(int blockNumber, bool scroll)
{
    readList.clear();
    textBlockSelection(colorClean);
    if(blockNumber < 0)
    {
        activeBlock = 0;
        if(scroll)
            scrollTo();
        return false;
    }
    if(blockNumber >= ui->textEdit->document()->blockCount())
    {
        activeBlock = ui->textEdit->document()->blockCount()-1;
        if(scroll)
            scrollTo();
        return false;
    }
    else
    {
        activeBlock = blockNumber;
        if(scroll)
            scrollTo();
        return true;
    }
}

Hervorhebung und Homographen

Ein wichtiges Problem für einen Sprachsynthesizer ist Stress. Besonders in Fällen, in denen zwei Wörter gleich geschrieben sind, aber unterschiedliche Betonungen haben (Omogramme). In diesem Fall kann Stress ohne die Verwendung komplexer semantischer Algorithmen nur manuell gesetzt werden. Und Windows (im Gegensatz zu Android) ermöglicht Ihnen dies. Setzen Sie dazu ein "` "(auf eine Taste mit dem Buchstaben e). Es war jedoch nicht möglich, den genauen Funktionsmechanismus dieses Tools zu ermitteln.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Дмитрий
  • 23. Juli 2017 02:52

Если вы знаете простой способ для извлечения текста из pdf или djv файлов напишите в ответе.

Evgenii Legotckoi
  • 23. Juli 2017 06:10

Лично я простого не знаю способа. В обоих случаях понадобится использовать сторонние библиотеки.

В случае с pdf - это будет либа, которая работает с pdf, какой-нибудь poppler-qt.
В случае же с djvu - это уже либа по распознаванию текста в изображениях.
Но за пример такой работы ничего не скажу, не занимался таким.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken