ForcePilot/backend/package/yuxi/channels/policy/voice_policy.py
Kris 7a972055b7 feat: 新增渠道服务基础框架与核心工具类
新增大量渠道适配器相关的协议、策略、工具类与基础设施代码,包括:
1.  多协议定义:认证、消息、配置、网关等核心接口
2.  策略模块:上下文、群聊、去重、防抖等业务策略
3.  工具集:重试、去重、文本分块、消息格式化等SDK工具
4.  基础设施:外部进程管理、事件广播、熔断机制等
5.  账户与管道系统:账户管理、消息处理管道实现
6.  运行时服务:状态收集、维护任务、日志等后台服务
2026-05-12 00:53:57 +08:00

61 lines
1.6 KiB
Python

from abc import ABC, abstractmethod
from pydantic import BaseModel
from yuxi.utils.logging_config import logger
class VoiceSegment(BaseModel):
audio_data: bytes
sample_rate: int = 16000
channels: int = 1
encoding: str = "pcm_s16le"
duration_ms: int = 0
class STTResult(BaseModel):
text: str
confidence: float = 0.0
language: str | None = None
class STTProvider(ABC):
@abstractmethod
async def transcribe(self, segment: VoiceSegment) -> STTResult: ...
class TTSProvider(ABC):
@abstractmethod
async def synthesize(self, text: str, voice: str = "default") -> bytes: ...
class VoicePolicy:
def __init__(self):
self._stt_provider: STTProvider | None = None
self._tts_provider: TTSProvider | None = None
def configure_stt(self, provider: STTProvider) -> None:
self._stt_provider = provider
def configure_tts(self, provider: TTSProvider) -> None:
self._tts_provider = provider
async def process_voice(self, segment: VoiceSegment) -> str | None:
if not self._stt_provider:
return None
try:
result = await self._stt_provider.transcribe(segment)
except Exception as e:
logger.error(f"STT transcription failed: {e}")
return None
return result.text or None
async def text_to_speech(self, text: str) -> bytes | None:
if not self._tts_provider:
return None
try:
return await self._tts_provider.synthesize(text)
except Exception as e:
logger.error(f"TTS synthesis failed: {e}")
return None