73 lines
2.3 KiB
C
73 lines
2.3 KiB
C
|
|
#ifndef TTSMANAGER_H
|
|||
|
|
#define TTSMANAGER_H
|
|||
|
|
|
|||
|
|
#include <QObject>
|
|||
|
|
#include <QProcess>
|
|||
|
|
#include <QTimer>
|
|||
|
|
#include <QString>
|
|||
|
|
#include <QList>
|
|||
|
|
#include <QFile>
|
|||
|
|
|
|||
|
|
// 播放状态枚举
|
|||
|
|
enum class PlayState {
|
|||
|
|
Stopped, // 停止状态
|
|||
|
|
Playing, // 播放中
|
|||
|
|
Completed, // 播放完成
|
|||
|
|
Failed // 播放失败
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 语音任务结构体(支持优先级和重复播放)
|
|||
|
|
struct SpeechTask {
|
|||
|
|
QString text; // 待播放文本
|
|||
|
|
int repeatCount; // 重复播放次数(1=播放1次)
|
|||
|
|
int priority; // 优先级(0-3,3最高)
|
|||
|
|
int currentRepeat; // 当前已重复次数
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
class TTSManager : public QObject
|
|||
|
|
{
|
|||
|
|
Q_OBJECT
|
|||
|
|
public:
|
|||
|
|
explicit TTSManager(QObject *parent = nullptr);
|
|||
|
|
~TTSManager();
|
|||
|
|
|
|||
|
|
// 对外播放接口:text=播放文本,repeatCount=重复次数,priority=优先级
|
|||
|
|
PlayState speak(const QString &text, int repeatCount = 1, int priority = 1);
|
|||
|
|
// 停止所有播放任务
|
|||
|
|
void stopAll();
|
|||
|
|
// 获取当前播放状态
|
|||
|
|
PlayState getCurrentState() const { return m_currentState; }
|
|||
|
|
|
|||
|
|
signals:
|
|||
|
|
// 状态变化信号(供外部监听)
|
|||
|
|
void stateChanged(PlayState state);
|
|||
|
|
// 当前任务变化信号
|
|||
|
|
void currentTaskChanged(const SpeechTask &task);
|
|||
|
|
|
|||
|
|
private slots:
|
|||
|
|
// 播放进程完成回调
|
|||
|
|
void onPlayFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
|||
|
|
// 处理下一个任务(定时器触发)
|
|||
|
|
void processNextTask();
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
// 执行语音生成与播放(核心函数)
|
|||
|
|
bool executeVoiceTask(const QString &text);
|
|||
|
|
// 检查环境(edge-tts + ffplay 是否安装)
|
|||
|
|
bool checkEnvironment();
|
|||
|
|
// 入队任务(按优先级排序)
|
|||
|
|
void enqueueTask(const SpeechTask &task);
|
|||
|
|
// 处理高优先级任务(打断低优先级)
|
|||
|
|
bool handleHighPriorityTask(const SpeechTask &newTask);
|
|||
|
|
|
|||
|
|
// 成员变量
|
|||
|
|
QProcess *m_voiceProcess; // 执行 edge-tts + ffplay 的进程
|
|||
|
|
QTimer *m_taskTimer; // 任务调度定时器(避免进程阻塞)
|
|||
|
|
PlayState m_currentState; // 当前播放状态
|
|||
|
|
SpeechTask m_currentTask; // 当前正在执行的任务
|
|||
|
|
QList<SpeechTask> m_taskQueue; // 任务队列(按优先级排序)
|
|||
|
|
QString m_tempAudioPath; // 临时音频文件路径(用户目录下)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif // TTSMANAGER_H
|