Skip to content

linuxliu/edge-tts-cpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Edge TTS C++

一个基于Microsoft Edge文本转语音服务的现代C++库,提供高质量的语音合成功能。

项目简介

Edge TTS C++是一个功能完整的文本转语音(TTS)库,利用Microsoft Edge浏览器内置的语音合成服务。该项目使用现代C++20标准开发,提供了同步和异步的API接口,支持多种语音、语言和音频参数调节。

主要特性

  • 🎯 高质量语音合成 - 基于Microsoft Edge的神经网络语音引擎
  • 🌍 多语言支持 - 支持数百种不同语言和地区的语音
  • 异步流式处理 - 支持实时音频流和回调处理
  • 📝 字幕生成 - 自动生成SRT格式的字幕文件
  • 🎛️ 音频参数调节 - 支持语速、音量、音调的精细调节
  • 🔧 现代C++设计 - 使用C++20标准,提供类型安全的API
  • 📦 易于集成 - 提供库和可执行文件两种使用方式

技术架构

核心组件

  1. Communicate - WebSocket通信核心,负责与Microsoft服务交互
  2. VoicesManager - 语音管理器,获取和筛选可用语音
  3. SubMaker - 字幕生成器,处理时间边界信息生成SRT字幕
  4. TTSConfig - 配置管理,验证和存储TTS参数
  5. 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);
        // 处理元数据(字幕信息)
    }
});

API 文档

Communicate 类

主要的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 = "");
};

VoicesManager 类

语音管理和查询类。

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;
};

SubMaker 类

字幕生成器,处理时间边界信息。

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       # 语音管理实现

使用示例

示例1: 基本文本转语音

#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;
}

示例2: 中文语音合成

#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;
}

示例3: 异步流式处理

#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;
}

示例4: 语音查询和选择

#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避免阻塞
  • 支持文本分块处理大文本
  • 内存高效的流式音频处理
  • 连接复用减少网络开销

注意事项

  1. 网络连接: 需要稳定的互联网连接访问Microsoft服务
  2. 文本长度: 单次请求建议不超过4KB文本
  3. 速率限制: Microsoft服务可能有使用频率限制
  4. 字符编码: 确保输入文本使用UTF-8编码
  5. SSL证书: 需要有效的SSL证书进行HTTPS通信

许可证

本项目采用开源许可证,具体许可证信息请查看LICENSE文件。

贡献指南

欢迎提交Issue和Pull Request来改进项目:

  1. Fork项目仓库
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 创建Pull Request

联系方式

如有问题或建议,请通过以下方式联系:

  • 提交GitHub Issue
  • 发送邮件至项目维护者

Edge TTS C++ - 让文本转语音变得简单而强大!

About

edge-tts-cpp

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published