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.
Если вы знаете простой способ для извлечения текста из pdf или djv файлов напишите в ответе.
Лично я простого не знаю способа. В обоих случаях понадобится использовать сторонние библиотеки.