Files
EJM_Display/PublicFunctions/TTSManager.h

73 lines
2.3 KiB
C
Raw Permalink Normal View History

2025-09-15 22:28:43 +08:00
#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-33最高
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