1. 新增内置TTS工具,支持OpenAI兼容语音合成服务 2. 新增ASR音频解析和视频解析处理器 3. 扩展文件解析支持范围,添加音视频格式支持 4. 新增ffmpeg音视频处理基础工具库 5. 补充相关单元测试用例
68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
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
|