ForcePilot/backend/package/yuxi/agents/toolkits/buildin/tts/provider.py
Kris b3bdb4fa2f feat: 新增TTS语音合成、音视频解析能力
1. 新增内置TTS工具,支持OpenAI兼容语音合成服务
2. 新增ASR音频解析和视频解析处理器
3. 扩展文件解析支持范围,添加音视频格式支持
4. 新增ffmpeg音视频处理基础工具库
5. 补充相关单元测试用例
2026-06-13 20:33:40 +08:00

68 lines
1.8 KiB
Python
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.

from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass
_TTS_PROVIDERS: dict[str, type[TTSProvider]] = {}
@dataclass(frozen=True)
class SpeechSynthesisResult:
audio_data: bytes
content_type: str = "audio/mpeg"
class TTSProvider(ABC):
"""TTS 提供者抽象基类"""
@property
@abstractmethod
def provider_id(self) -> str: ...
@property
@abstractmethod
def display_name(self) -> str: ...
@abstractmethod
async def synthesize(self, text: str, voice: str = "default") -> SpeechSynthesisResult: ...
@abstractmethod
async def list_voices(self) -> list[dict]: ...
@abstractmethod
def is_configured(self) -> bool: ...
def register_tts_provider(provider_id: str | None = None):
"""装饰器工厂:将 TTSProvider 子类注册到全局注册表
可显式指定 provider_id否则通过临时实例获取。
"""
def decorator(cls: type[TTSProvider]) -> type[TTSProvider]:
key = provider_id or cls().provider_id
_TTS_PROVIDERS[key] = cls
return cls
return decorator
def get_tts_provider(provider_id: str | None = None) -> TTSProvider | None:
"""获取已配置的 TTS 提供者实例
- 指定 provider_id 时,查找对应提供者并检查是否已配置
- 未指定时,返回第一个已配置的提供者
- 无可用提供者时返回 None
"""
if provider_id is not None:
cls = _TTS_PROVIDERS.get(provider_id)
if cls is None:
return None
provider = cls()
return provider if provider.is_configured() else None
for cls in _TTS_PROVIDERS.values():
provider = cls()
if provider.is_configured():
return provider
return None