一个基于Microsoft Edge文本转语音服务的现代C++库,提供高质量的语音合成功能。
Edge TTS C++是一个功能完整的文本转语音(TTS)库,利用Microsoft Edge浏览器内置的语音合成服务。该项目使用现代C++20标准开发,提供了同步和异步的API接口,支持多种语音、语言和音频参数调节。
- 🎯 高质量语音合成 - 基于Microsoft Edge的神经网络语音引擎
- 🌍 多语言支持 - 支持数百种不同语言和地区的语音
- ⚡ 异步流式处理 - 支持实时音频流和回调处理
- 📝 字幕生成 - 自动生成SRT格式的字幕文件
- 🎛️ 音频参数调节 - 支持语速、音量、音调的精细调节
- 🔧 现代C++设计 - 使用C++20标准,提供类型安全的API
- 📦 易于集成 - 提供库和可执行文件两种使用方式
- Communicate - WebSocket通信核心,负责与Microsoft服务交互
- VoicesManager - 语音管理器,获取和筛选可用语音
- SubMaker - 字幕生成器,处理时间边界信息生成SRT字幕
- TTSConfig - 配置管理,验证和存储TTS参数
- Utility Functions - 工具函数集,包含XML处理、文件操作等
- Boost (JSON, URL, Beast) - 网络通信和数据处理
- OpenSSL - SSL/TLS加密通信
- CMake - 构建系统
- C++20兼容的编译器 (GCC 10+, Clang 10+, MSVC 2019+)
- CMake 3.19+
- Boost库 (JSON, URL组件)
- OpenSSL
# 克隆项目
git clone <repository-url>
cd edge_tts
# 创建构建目录
mkdir build && cd build
# 配置和编译
cmake ..
make -j$(nproc)# 基本文本转语音
./edge_tts -t "Hello, world!" --write-media output.mp3
# 指定语音和参数
./edge_tts -t "你好,世界!" -v "zh-CN-XiaoxiaoNeural" \
  --rate "+20%" --volume "+10%" --pitch "+5Hz" \
  --write-media chinese.mp3 --write-subtitles chinese.srt
# 从文件读取文本
./edge_tts -f input.txt --write-media output.mp3
# 列出所有可用语音
./edge_tts --list-voices#include "communicate.hpp"
#include "voices.hpp"
using namespace edge_tts;
// 基本使用
Communicate tts("Hello, world!", "en-US-EmmaMultilingualNeural");
tts.save_to_file("output.mp3", "output.srt");
// 自定义参数
Communicate tts_custom(
    "你好,世界!",
    "zh-CN-XiaoxiaoNeural",  // 语音
    "+20%",                   // 语速
    "+10%",                   // 音量
    "+5Hz",                   // 音调
    BoundaryType::WordBoundary // 边界类型
);
// 异步流式处理
tts_custom.stream_async([](const TTSChunk& chunk) {
    if (std::holds_alternative<AudioChunk>(chunk)) {
        auto audio = std::get<AudioChunk>(chunk);
        // 处理音频数据
    } else {
        auto metadata = std::get<MetadataChunk>(chunk);
        // 处理元数据(字幕信息)
    }
});主要的TTS通信类,负责与Microsoft服务交互。
class Communicate {
public:
    // 构造函数
    Communicate(const std::string& text,
                const std::string& voice = "en-US-EmmaMultilingualNeural",
                const std::string& rate = "+0%",
                const std::string& volume = "+0%",
                const std::string& pitch = "+0Hz",
                BoundaryType boundary = BoundaryType::SentenceBoundary);
    
    // 异步流式接口
    void stream_async(ChunkCallback callback);
    
    // 同步接口
    std::vector<TTSChunk> stream_sync();
    
    // 保存到文件
    void save_to_file(const std::string& audio_filename, 
                     const std::string& subtitle_filename = "");
};语音管理和查询类。
class VoicesManager {
public:
    // 获取所有语音
    void fetch_voices();
    const std::vector<Voice>& get_voices() const;
    
    // 按条件查找语音
    std::vector<Voice> find_voices(
        const std::unordered_map<std::string, std::string>& criteria) const;
    
    // 打印语音列表
    void print_voices() const;
};字幕生成器,处理时间边界信息。
class SubMaker {
public:
    // 添加元数据块
    void feed(const MetadataChunk& chunk);
    
    // 获取SRT格式字幕
    std::string get_srt() const;
    
    // 清空字幕
    void clear();
    
    // 获取字幕数量
    size_t size() const;
};- voice: 语音名称 (如: "en-US-EmmaMultilingualNeural", "zh-CN-XiaoxiaoNeural")
- rate: 语速调节 (范围: -100% 到 +200%, 如: "+20%", "-50%")
- volume: 音量调节 (范围: -100% 到 +100%, 如: "+10%", "-20%")
- pitch: 音调调节 (范围: -50Hz 到 +50Hz, 如: "+5Hz", "-10Hz")
- WordBoundary: 按单词生成字幕边界
- SentenceBoundary: 按句子生成字幕边界
该库支持Microsoft Edge TTS服务提供的所有语音,包括但不限于:
- zh-CN-XiaoxiaoNeural (女声)
- zh-CN-YunxiNeural (男声)
- zh-CN-YunjianNeural (男声)
- zh-CN-XiaoyiNeural (女声)
- en-US-EmmaMultilingualNeural (女声)
- en-US-AndrewMultilingualNeural (男声)
- en-US-AvaMultilingualNeural (女声)
- en-US-BrianMultilingualNeural (男声)
支持日语、韩语、法语、德语、西班牙语等数十种语言的语音。
使用 ./edge_tts --list-voices 命令查看完整的语音列表。
edge_tts/
├── CMakeLists.txt          # CMake构建配置
├── README.md               # 项目文档
├── .gitignore             # Git忽略文件
├── include/               # 头文件目录
│   ├── communicate.hpp    # 通信核心
│   ├── constants.hpp      # 常量定义
│   ├── data_classes.hpp   # 数据结构
│   ├── drm.hpp           # DRM相关
│   ├── exceptions.hpp     # 异常处理
│   ├── submaker.hpp      # 字幕生成
│   ├── util.hpp          # 工具函数
│   └── voices.hpp        # 语音管理
└── src/                  # 源文件目录
    ├── communicate.cpp   # 通信实现
    ├── constants.cpp     # 常量实现
    ├── data_classes.cpp  # 数据结构实现
    ├── drm.cpp          # DRM实现
    ├── exceptions.cpp    # 异常实现
    ├── main.cpp         # 主程序入口
    ├── submaker.cpp     # 字幕生成实现
    ├── util.cpp         # 工具函数实现
    └── voices.cpp       # 语音管理实现
#include "communicate.hpp"
int main() {
    try {
        edge_tts::Communicate tts("Hello, this is a test.");
        tts.save_to_file("hello.mp3");
        std::cout << "音频已保存到 hello.mp3" << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    return 0;
}#include "communicate.hpp"
int main() {
    try {
        edge_tts::Communicate tts(
            "这是一个中文语音合成的测试。",
            "zh-CN-XiaoxiaoNeural",
            "+10%",  // 语速加快10%
            "+5%",   // 音量增加5%
            "+2Hz"   // 音调提高2Hz
        );
        
        tts.save_to_file("chinese_test.mp3", "chinese_test.srt");
        std::cout << "中文音频和字幕已生成" << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    return 0;
}#include "communicate.hpp"
#include <fstream>
int main() {
    try {
        std::ofstream audio_file("stream_output.mp3", std::ios::binary);
        std::ofstream subtitle_file("stream_output.srt");
        edge_tts::SubMaker sub_maker;
        
        edge_tts::Communicate tts("This is streaming TTS example.");
        
        tts.stream_async([&](const edge_tts::TTSChunk& chunk) {
            if (std::holds_alternative<edge_tts::AudioChunk>(chunk)) {
                auto audio = std::get<edge_tts::AudioChunk>(chunk);
                audio_file.write(reinterpret_cast<const char*>(audio.data.data()), 
                               audio.data.size());
            } else {
                auto metadata = std::get<edge_tts::MetadataChunk>(chunk);
                sub_maker.feed(metadata);
            }
        });
        
        subtitle_file << sub_maker.get_srt();
        std::cout << "流式处理完成" << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    return 0;
}#include "voices.hpp"
#include <iostream>
int main() {
    try {
        edge_tts::VoicesManager vm;
        vm.fetch_voices();
        
        // 查找所有中文女声
        auto chinese_female = vm.find_voices({
            {"Locale", "zh-CN"},
            {"Gender", "Female"}
        });
        
        std::cout << "找到 " << chinese_female.size() << " 个中文女声:" << std::endl;
        for (const auto& voice : chinese_female) {
            std::cout << "- " << voice.short_name << ": " << voice.name << std::endl;
        }
    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    return 0;
}项目提供了完整的异常处理机制:
try {
    edge_tts::Communicate tts("test text");
    tts.save_to_file("output.mp3");
} catch (const edge_tts::EdgeTTSException& e) {
    // Edge TTS特定错误
    std::cerr << "TTS错误: " << e.what() << std::endl;
} catch (const std::exception& e) {
    // 其他标准异常
    std::cerr << "系统错误: " << e.what() << std::endl;
}- 使用异步I/O避免阻塞
- 支持文本分块处理大文本
- 内存高效的流式音频处理
- 连接复用减少网络开销
- 网络连接: 需要稳定的互联网连接访问Microsoft服务
- 文本长度: 单次请求建议不超过4KB文本
- 速率限制: Microsoft服务可能有使用频率限制
- 字符编码: 确保输入文本使用UTF-8编码
- SSL证书: 需要有效的SSL证书进行HTTPS通信
本项目采用开源许可证,具体许可证信息请查看LICENSE文件。
欢迎提交Issue和Pull Request来改进项目:
- Fork项目仓库
- 创建功能分支 (git checkout -b feature/AmazingFeature)
- 提交更改 (git commit -m 'Add some AmazingFeature')
- 推送到分支 (git push origin feature/AmazingFeature)
- 创建Pull Request
如有问题或建议,请通过以下方式联系:
- 提交GitHub Issue
- 发送邮件至项目维护者
Edge TTS C++ - 让文本转语音变得简单而强大!