Source code

Revision control

Copy as Markdown

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QTEXTTOSPEECHPROCESSOR_FLITE_H
#define QTEXTTOSPEECHPROCESSOR_FLITE_H
#include "qtexttospeechengine.h"
#include "qvoice.h"
#include <QtCore/qabstracteventdispatcher.h>
#include <QtCore/qbasictimer.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qdatetime.h>
#include <QtCore/qlibrary.h>
#include <QtCore/qlist.h>
#include <QtCore/qmutex.h>
#include <QtCore/qprocess.h>
#include <QtCore/qstring.h>
#include <QtCore/qthread.h>
#include <QtMultimedia/qaudiosink.h>
#include <QtMultimedia/qmediadevices.h>
#include <flite/flite.h>
#include <optional>
QT_BEGIN_NAMESPACE
class QFliteSynthesisProcess;
class QTextToSpeechProcessorFlite : public QObject
{
Q_OBJECT
public:
QTextToSpeechProcessorFlite(QAudioDevice audioDevice);
~QTextToSpeechProcessorFlite();
struct VoiceInfo
{
int id;
cst_voice *vox;
void (*unregister_func)(cst_voice *vox);
QString name;
QString locale;
QVoice::Gender gender;
QVoice::Age age;
};
Q_INVOKABLE void say(const QString &text, int voiceId, double pitch, double rate, double volume);
Q_INVOKABLE void synthesize(const QString &text, int voiceId, double pitch, double rate, double volume);
Q_INVOKABLE void pause(QTextToSpeech::BoundaryHint boundaryHint);
Q_INVOKABLE void resume();
Q_INVOKABLE void stop(QTextToSpeech::BoundaryHint boundaryHint);
const QList<QTextToSpeechProcessorFlite::VoiceInfo> &voices() const;
private:
bool init();
bool checkVoice(int voiceId);
void setError(QTextToSpeech::ErrorReason err, const QString &errorString = QString());
void updateState(QTextToSpeech::State);
Q_SIGNALS:
void errorOccurred(QTextToSpeech::ErrorReason error, const QString &errorString);
void stateChanged(QTextToSpeech::State);
void sayingWord(const QString &word, qsizetype begin, qsizetype length);
void synthesized(const QAudioFormat &format, const QByteArray &array);
private:
QTextToSpeech::State m_state = {};
std::unique_ptr<QAudioSink> m_audioSink;
const QAudioDevice m_audioDevice;
float m_volume = 1.f;
std::optional<QAudioFormat> m_synthesisFormat;
QList<VoiceInfo> m_voices;
// synthesis process
friend class QFliteSynthesisProcess;
std::unique_ptr<QFliteSynthesisProcess> m_synthesisProcess;
void prepareAudioSink(QAudioFormat);
};
QT_END_NAMESPACE
#endif