"""语音层:STT / TTS。 TTS 有两个后端,接口一致(synthesize / synthesize_sentences), 切换只需改配置 AI_TTS_BACKEND: local — sherpa-onnx vits-zh-ll,RTF 0.09,很快但音色用户不满意 remote — Qwen3-TTS 独立服务,RTF 0.55–0.94,音质是另一档 为什么 remote 要走 HTTP 而不是进程内:qwen-tts 与助手/vllm-omni 的依赖互斥 (transformers 4.57 vs 5.14、hf_hub 0.36 vs 1.31),同 venv 会互相破坏。 模型文件不随代码走(体积大、可重新下载),由 VoiceConfig.model_dir 指向。 缺失时构造对象直接报错并提示下载脚本,不静默降级——静默降级会让 "没声音"变成一个很难查的问题。 """ from .stt import STTError, STTStream, StreamingSTT from .tts import MAX_CHARS_PER_SEGMENT, LocalTTS, TTSError, split_sentences from .remote_tts import RemoteTTS, RemoteTTSError def create_tts(cfg): """按配置造 TTS。返回对象统一提供 synthesize / synthesize_sentences。""" if cfg.tts_backend == "remote": return RemoteTTS(cfg.tts_service_url, voice=cfg.tts_speaker, instructions=cfg.tts_instructions, language=cfg.tts_language) return LocalTTS(cfg) __all__ = [ "StreamingSTT", "STTStream", "STTError", "LocalTTS", "TTSError", "split_sentences", "MAX_CHARS_PER_SEGMENT", "RemoteTTS", "RemoteTTSError", "create_tts", ]