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
|