Happy__pomelo 2024-03-08 13:57 采纳率: 0%
浏览 3

TTS,文本转语音多线程

eSpeak不能支持多线程调用,有人知道还有类似的免费开源小体积的TTS库吗? 能够支持多线程、中文,小体积,非大模型生成语音

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 13:57
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,虽然eSpeak不直接支持多线程调用,但您可以设计一个系统以实现多线程TTS转换。通过队列管理和线程同步机制,可以在不同的线程上分别处理文本转语音任务,即使底层的TTS引擎(如eSpeak)本身不是线程安全的。

    针对您的需求,推荐您尝试使用flite库,这是一个轻量级且开源的TTS引擎,由Carnegie Mellon University开发,它支持多种语言包括中文,并且可以更好地适应多线程环境。不过请注意,尽管flite比eSpeak在并发处理上友好一些,但在实际应用中仍需确保对实例和资源的正确管理来避免冲突。

    以下是一个简化的示例,展示如何在一个多线程环境中使用flite:

    #include <pthread.h>
    #include <queue>
    #include <string>
    #include "flite/flite.h"
    
    // 队列用于存放待合成的文本
    std::queue<std::string> textQueue;
    
    // 线程函数,负责执行TTS转换
    void* TTSWorker(void* arg) {
        cst_voice* voice = register_cst_voice(NULL, "cmu_us_slt");
        
        while (true) {
            std::unique_lock<std::mutex> lock(queueMutex);
            if (textQueue.empty()) {
                // 若队列为空,则等待通知
                conditionVariable.wait(lock);
            }
    
            if (!textQueue.empty()) {
                std::string text = textQueue.front();
                textQueue.pop();
    
                // 创建utterance并设置文本内容
                cst_utterance* u = flite_text_to_speech(text.c_str(), voice);
    
                // 执行语音合成
                flite_synthesize(u, "play");
    
                // 清理utterance
                delete_u(u);
            }
        }
    
        unregister_cst_voice(voice);
        return NULL;
    }
    
    int main() {
        // 初始化互斥锁、条件变量等同步工具
        std::mutex queueMutex;
        std::condition_variable conditionVariable;
        
        // 创建工作线程
        pthread_t threadId;
        pthread_create(&threadId, NULL, TTSWorker, NULL);
    
        // 往队列添加文本任务
        textQueue.push("你好,世界!");
        textQueue.push("这是第二个语音片段...");
    
        // 唤醒等待中的线程
        conditionVariable.notify_one();
    
        // 主线程等待子线程完成所有任务(此处为简化示例,实际应考虑线程结束条件)
        pthread_join(threadId, NULL);
    
        return 0;
    }
    
    

    注意:上述代码仅作为概念性演示,并未包含错误检查和其他必要的线程安全措施。在实际项目中,请根据需要进行适当的修改和扩展,例如增加错误处理机制,以及当不再有新的文本输入时终止工作线程等。

    另外,为了编译这段代码,您需要下载并安装flite库,将其头文件路径和库路径添加到编译器选项中。同时,别忘了链接所需的库文件,例如 -lflite_cmu_us_slt -lflite_cmu_time_awb -lflite_cmulex -lflite 等。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址