Files
EJM_Display/PublicFunctions/TTSManager.h
2025-09-15 22:28:43 +08:00

73 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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