
在 LiveKit Agents 中接入 Resemble AIREST 一次性合成与 WebSocket 实时流式 TTS 实战指南【免费下载链接】agentsA framework for building realtime voice AI agents ️项目地址: https://gitcode.com/GitHub_Trending/agen/agents本指南围绕开源仓库 livekit-plugins-resemble 展开完整讲解如何在 LiveKit Agents 语音 Agent 中集成 Resemble AI 的语音合成能力。文章以插件 README 为主干结合 tts.py 源码逐层剖析 REST 一次性合成与 WebSocket 实时流式合成两条调用链、全部构造参数与资源管理方式。读完你将能独立安装、配置并写出可复用的 Resemble TTS 代码同时理解其底层实现原理。插件定位一个 TTS 类两条合成通道livekit-plugins-resemble是 LiveKit Agents 生态中的 TTS 插件负责将文本合成为语音核心入口是livekit.plugins.resemble.TTS类。它同时支持 Resemble AI 的两种接口见 READMEOne-off Synthesis一次性合成——调用 Resemble 的 REST API把整段文本一次性转成完整音频适合短文本、非实时场景Streaming Synthesis实时流式合成——通过 Resemble 的 WebSocket API 边发文本边收音频分片适合对话式语音 Agent 的低延迟场景。这两条路径在源码中被明确定义为两个端点常量tts.pyRESEMBLE_WEBSOCKET_URL wss://websocket.cluster.resemble.ai/stream RESEMBLE_REST_API_URL https://f.cluster.resemble.ai/synthesize DEFAULT_VOICE_UUID 55592656其中DEFAULT_VOICE_UUID是源码内置的默认语音 UUID即使你不传voice_uuid插件也会用它兜底详见下文参数说明。需要特别注意的是WebSocket 流式接口仅对 Resemble AI 的 Business 计划用户开放README 与 SynthesizeStream 类注释 均明确说明免费或低阶套餐只能使用 REST 一次性合成。安装与前置条件通过 pip 安装插件READMEpip install livekit-plugins-resemble从 pyproject.toml 可以看到该包的环境要求Python3.10.0核心依赖livekit-agents1.8.0TTS 基类、tokenize、utils.ConnectionPool等均来自该包许可证Apache-2.0。运行前需要准备两项凭据API Key在 Resemble AI 控制台申请通过环境变量RESEMBLE_API_KEY注入。插件在构造时读取该变量见 tts.py如果既没传api_key参数也没有该环境变量会直接抛出ValueErrorVoice UUID从 Resemble AI 账户中获取你想要的音色 UUID作为voice_uuid参数传入。插件还实现了 LiveKit Agents 的插件自动注册机制导入包时init.py 中的ResemblePlugin会通过Plugin.register_plugin()自动注册因此只需安装即可被框架发现。快速上手推荐的上下文管理器用法README 推荐使用 Python 异步上下文管理器async with创建 TTS 实例由插件自动完成资源释放。以下代码在原文档示例基础上补充了逐段注释与两种音频消费方式import asyncio from livekit.plugins.resemble import TTS async def run_tts_example(): # 使用 async with 自动管理资源连接池、WebSocket 等 async with TTS( api_keyyour_api_key, # 或设置 RESEMBLE_API_KEY 环境变量 voice_uuidyour_voice_uuid, # 可选参数 sample_rate44100, # 采样率单位 Hz默认 44100 modelchatterbox, # 可选chatterbox / chatterbox-turbo ) as tts: # 一次性合成走 REST API返回异步音频流 audio_stream tts.synthesize(Hello, world!) # 方式一逐块消费处理到达的每个音频分片 async for chunk in audio_stream: # 音频数据位于 SynthesizedAudio 对象的 frame.data 属性 audio_data chunk.frame.data print(fReceived chunk: {len(audio_data)} bytes) # 方式二一次性收集整段音频为单个 AudioFrame audio_stream tts.synthesize(Another example sentence.) audio_frame await audio_stream.collect() print(fCollected complete audio: {len(audio_frame.data)} bytes) # 实时流式合成走 WebSocket API仅 Business 计划 stream tts.stream() await stream.synthesize_text(Hello, world!) # 全部文本推送完毕后结束输入等待音频流收尾 await stream.end_input() asyncio.run(run_tts_example())代码要点tts.synthesize(text)返回ChunkedStream异步流对象支持async for逐块迭代与await collect()一次性聚合两种消费模式tts.stream()返回SynthesizeStream实时流对象synthesize_text()把文本推入输入通道之后应调用end_input()关闭输入对应源码_tokenize_input对输入通道的收尾逻辑音频数据统一从SynthesizedAudio.frame.data读取README 特别强调这是唯一正确的取数方式。TTS 构造参数详解以源码为准TTS.__init__的完整签名位于 tts.py参数含义整理如下参数类型默认值说明api_keystr \| NoneRESEMBLE_API_KEY环境变量Resemble API Key两者都不提供时抛ValueErrorvoice_uuidstr \| None55592656源码常量目标音色 UUIDmodelTTSModels \| str \| NoneNone使用服务端默认合成模型可选chatterbox或chatterbox-turbosample_rateint44100输出音频采样率Hztokenizertokenize.SentenceTokenizer \| Noneblingfire.SentenceTokenizer流式路径的句子分词器决定文本如何切分成请求http_sessionaiohttp.ClientSession \| None内部自动创建复用外部 HTTP 会话use_streamingboolTrue是否声明支持流式能力直接写入TTSCapabilities.streaming其中模型可选值由 models.py 的类型别名定义TTSModels Literal[chatterbox, chatterbox-turbo]需要提醒的一点README 示例中出现的precisionPCM_16与output_formatwav参数在当前源码的构造函数签名中并不存在。从实现看precision在 REST 请求里被硬编码为PCM_16tts.pyoutput_format在 WebSocket 请求里被硬编码为mp3tts.py因此这两项目前由插件固定无需也无法通过构造参数调整——使用时应以源码签名为准。此外插件提供运行时动态更新配置的能力tts.pytts.update_options(voice_uuidnew_voice_uuid, modelchatterbox-turbo)该方法可在不重建 TTS 实例的情况下切换音色与模型适合多音色轮播场景。一次性合成REST 调用链源码解析ChunkedStreamtts.py继承自livekit.agents.tts.ChunkedStream基类见 livekit-agents/livekit/agents/tts/tts.py其核心逻辑在_run方法中1. 构造请求体tts.pypayload { voice_uuid: self._opts.voice_uuid, data: self._input_text, sample_rate: self._opts.sample_rate, precision: PCM_16, } if self._opts.model is not None: payload[model] self._opts.model2. 发送 POST 请求携带Authorization: Bearer api_key请求头声明 JSON 内容类型超时配置为total30秒、连接超时取自conn_options.timeouttts.py。3. 校验响应若success字段为假将服务端返回的issues列表拼装成错误消息并抛出APIError成功后用utils.shortuuid()生成request_id以audio/wavMIME 类型初始化输出发射器单声道、采样率与构造时一致。4. 解码并推送音频音频内容以 base64 编码存放在响应 JSON 的audio_content字段中插件base64.b64decode后一次性推入output_emitter并flush()tts.py。异常处理遵循 LiveKit Agents 的统一规范超时抛APITimeoutErrorHTTP 4xx/5xx 抛APIStatusError携带状态码其余网络异常统一转为APIConnectionErrortts.py。调用方可以按这三类异常分别处理重试、告警与降级逻辑。实时流式合成WebSocket 全流程剖析SynthesizeStreamtts.py实现流式路径内部结构清晰分为三个阶段阶段一输入分词_tokenize_input协程tts.py监听输入通道普通字符串被推给分词器的SentenceStreamFlushSentinel即flush()产生的冲刷标记结束当前句段流并开启新句段。这正是synthesize_text()与flush()配合使用的底层依据——每个句段对应一次独立的 WebSocket 合成请求。阶段二句子级 WebSocket 会话每个句段通过_run_wstts.py独立完成一次合成内部起两个并发任务发送任务逐 token 构造 JSON 消息并通过ws.send_str()发送。每个 token 的消息体为voice_uuid、datatoken 文本、递增的request_id、sample_rate、precisionPCM_16、output_formatmp3可选附带modeltts.py接收任务循环读取 WebSocket 消息处理两类业务消息tts.pytype audio解码audio_contentbase64并推入输出发射器type audio_end携带request_id当该 ID 等于最后发送的 token 索引且输入已结束时end_segment()收尾本句段并跳出循环。WebSocket 意外关闭CLOSED/CLOSING会被识别并抛出APIStatusError携带关闭码与消息体便于排查。阶段三连接池复用TTS 实例内部维护一个utils.ConnectionPool实现见 livekit-agents/livekit/agents/utils/connection_pool.pyWebSocket 连接按需建立并复用prewarm()可提前建立连接降低首包延迟tts.py。连接建立时通过Authorization: Bearer api_key完成鉴权tts.py。资源管理的三种方式README 单独成节强调在 LiveKit Agent 框架之外独立使用该插件时必须妥善管理 TTS 实例生命周期。方式一推荐async 上下文管理器async with TTS(api_key..., voice_uuid...) as tts: ... # 退出时自动释放连接池与流方式二手动管理tts TTS(api_key..., voice_uuid...) try: audio_stream tts.synthesize(Hello, world!) async for chunk in audio_stream: process_audio(chunk.frame.data) finally: await tts.aclose() # 务必在 finally 中清理aclose()的实现tts.py会先关闭所有存活的SynthesizeStream通过weakref.WeakSet跟踪再关闭整个 WebSocket 连接池。方式三注入自定义 HTTP 会话import aiohttp async def with_custom_session(): async with aiohttp.ClientSession() as session: async with TTS( api_keyyour_api_key, voice_uuidyour_voice_uuid, http_sessionsession, # 复用外部会话无需手动关闭 ) as tts: ...当http_session未提供时插件内部通过utils.http_context.http_session()获取框架级共享会话tts.py三层上下文管理器各司其职无需手动关闭任何对象。在完整 LiveKit Agent 中集成除独立使用外该插件最常见的场景是作为 LiveKit Agent 的语音管线一部分。TTS继承自livekit.agents.tts.TTS基类定义见 livekit-agents/livekit/agents/tts/tts.py通过capabilitiestts.TTSCapabilities(streaminguse_streaming)向框架声明其流式能力tts.py并固定输出单声道num_channels1。这意味着它可以无缝接入 Agent 的voice.tts配置与 STT、LLM 组成完整的听—想—说链路而synthesize/stream方法则保持与框架内部调用约定一致供 AgentSession 直接调度。版本、日志与延伸阅读版本当前仓库中该插件版本为1.8.0见 version.py与依赖约束livekit-agents1.8.0对应日志插件使用独立的livekit.plugins.resembleloggerlog.py可通过标准 logging 配置按模块调整日志级别导出包的公开 API 为TTS、TTSModels、ChunkedStream、SynthesizeStream与__version__init.py。如需进一步深入可继续阅读插件源码 tts.py 全文以及 LiveKit Agents 的 TTS 抽象基类 livekit-agents/livekit/agents/tts/tts.py 与连接池实现 livekit-agents/livekit/agents/utils/connection_pool.py从而完整理解插件与框架的协作边界。官方更多集成说明可参考 LiveKit 文档中关于 Resemble TTS 集成的章节。【免费下载链接】agentsA framework for building realtime voice AI agents ️项目地址: https://gitcode.com/GitHub_Trending/agen/agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考