Files

原生Gemini TTS功能

这个模块为Gemini Balance项目添加了原生Gemini TTSText-to-Speech功能支持单人和多人语音合成采用智能检测和继承模式设计保持与原始代码的完全兼容性。

🎯 设计原则

  • 智能检测自动检测所有原生Gemini TTS格式的请求包含responseModalities和speechConfig
  • 继承而非修改:所有扩展都继承自原始类,不修改源码
  • 完全兼容原有TTS功能OpenAI兼容TTS完全不受影响
  • 动态模型选择支持用户在请求URL中指定不同的TTS模型
  • 自动回退原生TTS处理失败时自动回退到标准服务
  • 完整日志记录:包含请求日志、错误日志和性能监控
  • 易于维护:更新原始代码时不会产生冲突

📁 文件结构

app/service/tts/
├── tts_service.py           # 原有的OpenAI兼容TTS服务
└── native/                  # 原生Gemini TTS扩展
    ├── __init__.py          # 模块初始化
    ├── README.md            # 使用说明(本文件)
    ├── tts_models.py        # TTS数据模型继承自原始模型
    ├── tts_response_handler.py  # TTS响应处理器继承自原始处理器
    ├── tts_chat_service.py  # TTS聊天服务继承自原始服务
    └── tts_routes.py        # TTS路由扩展和依赖注入

🚀 原生Gemini TTS功能

智能检测机制(当前实现)

原生Gemini TTS功能通过智能检测自动启用无需任何配置

  1. 自动启用
# 直接启动服务原生TTS功能自动可用
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
  1. 无需配置
  • 不需要环境变量
  • 不需要修改配置文件
  • 完全基于请求内容智能判断

工作原理

系统会智能检测请求内容:

  • 原生TTS请求:包含 responseModalities: ["AUDIO"]speechConfig → 使用TTS增强服务
    • 单人TTS:包含 voiceConfig.prebuiltVoiceConfig
    • 多人TTS:包含 multiSpeakerVoiceConfig
  • 普通请求非TTS模型 → 使用原有Gemini聊天服务
# app/router/gemini_routes.py 中的智能检测逻辑
if "tts" in model_name.lower() and request.generationConfig:
    # 直接从解析后的request对象获取TTS配置
    response_modalities = request.generationConfig.responseModalities or []
    speech_config = request.generationConfig.speechConfig or {}

    # 如果包含AUDIO模态和语音配置则认为是原生TTS请求
    if "AUDIO" in response_modalities and speech_config:
        # 使用TTS增强服务
        tts_service = await get_tts_chat_service(key_manager)
        return await tts_service.generate_content(...)
    # 否则使用原有服务

📝 使用示例

1. 原生Gemini单人TTS请求使用TTS增强服务

包含 voiceConfig.prebuiltVoiceConfig 的原生Gemini格式请求会自动使用TTS增强服务

curl -X POST "https://your-domain.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent" \
  -H "Content-Type: application/json" \
  -H "x-goog-api-key: your-token" \
  -d '{
    "contents": [{
      "parts": [{
        "text": "Hello, this is a single speaker test."
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {
          "prebuiltVoiceConfig": {
            "voiceName": "Kore"
          }
        }
      }
    }
  }'

2. 原生Gemini多人TTS请求使用TTS增强服务

包含 multiSpeakerVoiceConfig 的原生Gemini格式请求会自动使用TTS增强服务

curl -X POST "https://your-domain.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent" \
  -H "Content-Type: application/json" \
  -H "x-goog-api-key: your-token" \
  -d '{
    "contents": [{
      "parts": [{
        "text": "Alice: Hello everyone, welcome to our show today.\nBob: Hi Alice, and hello to all our listeners! Today we are talking about AI development."
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "multiSpeakerVoiceConfig": {
          "speakerVoiceConfigs": [
            {
              "speaker": "Alice",
              "voiceConfig": {
                "prebuiltVoiceConfig": {
                  "voiceName": "Puck"
                }
              }
            },
            {
              "speaker": "Bob",
              "voiceConfig": {
                "prebuiltVoiceConfig": {
                  "voiceName": "Kore"
                }
              }
            }
          ]
        }
      }
    }
  }'

3. OpenAI兼容TTS请求使用原有服务

OpenAI兼容格式的TTS请求使用不同的API路径不受本模块影响

curl -X POST "https://your-domain.com/v1/audio/speech" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-token" \
  -d '{
    "model": "tts-1",
    "input": "这是一个OpenAI兼容格式的TTS测试。",
    "voice": "alloy"
  }' \
  --output openai_tts_test.wav

注意OpenAI兼容TTS请求

  • 使用路径:/v1/audio/speech
  • 使用Authorization头而不是x-goog-api-key
  • 返回音频文件而不是JSON响应
  • 不受本模块的TTS增强服务影响

普通文本生成(使用原有服务)

非TTS模型的请求会使用原有的Gemini聊天服务完全不受影响

curl -X POST "https://your-domain.com/v1beta/models/gemini-2.5-flash:generateContent" \
  -H "Content-Type: application/json" \
  -H "x-goog-api-key: your-token" \
  -d '{
    "contents": [{
      "parts": [{
        "text": "请简单介绍一下人工智能的发展历程。"
      }]
    }],
    "generationConfig": {
      "maxOutputTokens": 200,
      "temperature": 0.7
    }
  }'

🔧 技术实现

继承关系

GeminiChatService
    ↓ (继承)
TTSGeminiChatService
    ├── 重写 generate_content() 方法
    ├── 添加 _handle_tts_request() 方法
    └── 集成完整的日志记录功能

GeminiResponseHandler
    ↓ (继承)
TTSResponseHandler
    └── 重写 handle_response() 方法

GenerationConfig (Pydantic模型)
    ↓ (扩展)
TTSGenerationConfig
    ├── responseModalities: List[str]
    └── speechConfig: Dict[str, Any]

工作流程

  1. 请求接收系统接收到API请求
  2. 智能检测
    • 检查模型名称是否包含 "tts"
    • 如果是TTS模型request.generationConfig 检查是否包含 responseModalities: ["AUDIO"]speechConfig
  3. 服务选择
    • 原生TTS请求:使用 TTSGeminiChatService 增强服务
    • 普通请求:使用原有 GeminiChatService
  4. 请求处理
    • 原生TTS:使用 _handle_tts_request() 特殊处理
    • 其他请求:使用标准 generate_content() 方法
  5. 字段处理:从 request.generationConfig 直接获取TTS字段responseModalities, speechConfig
  6. API调用构建优化的payload并调用Gemini API
  7. 自动回退如果原生TTS处理失败自动回退到标准服务
  8. 响应处理
    • TTS响应:检测音频数据,直接返回原始响应
    • 普通响应:使用标准处理方法
  9. 日志记录:记录请求时间、成功状态、错误信息到数据库

📊 功能特性

已实现功能

  • 智能原生TTS支持:支持单人和多人语音合成
    • 单人TTS:支持 voiceConfig.prebuiltVoiceConfig 配置
    • 多人TTS:支持 multiSpeakerVoiceConfig 配置
  • 智能检测机制自动检测所有原生Gemini TTS格式的请求
  • 动态模型选择支持用户在URL中指定不同TTS模型
  • 完全向后兼容原有TTS功能OpenAI兼容TTS完全不受影响
  • 自动回退机制原生TTS处理失败时自动使用标准服务
  • 完整日志记录:请求日志、错误日志、性能监控
  • API配额管理:自动重试和密钥轮换
  • 零配置启用:无需环境变量或配置文件修改
  • 错误处理:完整的异常捕获和错误记录

🎵 支持的语音配置

单人语音配置

{
  "responseModalities": ["AUDIO"],
  "speechConfig": {
    "voiceConfig": {
      "prebuiltVoiceConfig": {
        "voiceName": "Kore|Puck|其他预设语音"
      }
    }
  }
}

多人语音配置

{
  "responseModalities": ["AUDIO"],
  "speechConfig": {
    "multiSpeakerVoiceConfig": {
      "speakerVoiceConfigs": [
        {
          "speaker": "角色名称",
          "voiceConfig": {
            "prebuiltVoiceConfig": {
              "voiceName": "Kore|Puck|其他预设语音"
            }
          }
        }
      ]
    }
  }
}

⚠️ 注意事项

API要求

  • 确保API密钥有TTS权限
  • TTS功能需要 gemini-2.5-flash-preview-tts 模型
  • 注意API配额限制免费版每天15次

性能考虑

  • TTS响应通常比文本响应更大音频数据
  • 建议监控API调用频率和成功率
  • 扩展功能不影响原始功能的性能和稳定性

部署建议

  • 生产环境建议先测试普通功能
  • 逐步启用TTS功能并监控日志
  • 定期检查API配额使用情况

📈 监控和调试

日志查看

  • 服务器日志查看TTS请求处理过程
  • 管理界面:在"API 调用详情"中查看请求记录
  • 错误日志:查看失败请求的详细信息

调试技巧

# 启用详细日志
export LOG_LEVEL=DEBUG

# 查看实时日志
tail -f logs/app.log

# 多人TTS功能无需配置自动启用
# 可通过请求内容智能检测

🔄 TTS系统对比

项目中现在有三套TTS系统各自服务不同的用途

TTS类型 路径 模型选择 语音配置 使用场景 我们的影响
OpenAI兼容TTS /v1/audio/speech 固定配置文件 单人语音 OpenAI API兼容 无影响
Gemini单人TTS /v1beta/models/{model}:generateContent 用户指定 单人语音 原生Gemini TTS 我们的增强
Gemini多人TTS /v1beta/models/{model}:generateContent 用户指定 多人语音 对话场景 我们的增强

智能路由机制

flowchart TD
    A[API请求] --> B{路径检查}
    B -->|/v1/audio/speech| C[OpenAI兼容TTS服务]
    B -->|/v1beta/models/{model}:generateContent| D{模型名包含'tts'?}
    D -->|否| E[标准Gemini聊天服务]
    D -->|是| F{包含responseModalities和speechConfig?}
    F -->|否| G[标准Gemini聊天服务]
    F -->|是| H[原生TTS增强服务]
    H --> I{处理成功?}
    I -->|是| J[返回原生TTS响应]
    I -->|否| K[自动回退到标准服务]
    C --> L[完成]
    E --> L
    G --> L
    J --> L
    K --> L

🎉 成功案例

基于智能检测的原生Gemini TTS解决方案已经成功实现

  • 零配置启用:无需任何环境变量或配置修改
  • 智能检测自动检测所有原生Gemini TTS格式的请求
  • 完全向后兼容所有原有TTS功能零影响
  • 动态模型选择支持用户指定不同TTS模型
  • 自动回退机制:处理失败时自动使用标准服务
  • 单人和多人语音合成支持所有原生Gemini TTS场景
  • 完整日志记录:可在管理界面查看所有请求
  • 错误处理完善API配额和重试机制
  • 易于维护:更新原始代码无冲突

这个实现展示了如何在不修改原始代码的情况下,优雅地扩展复杂系统的功能,同时保持完美的向后兼容性。