如下代码中,是不是llm不仅做了视觉识别,也把tts也完成了呢,但puck对中文不友好,有没有其他的方案呢?
# 导入必要的库
import logging
import asyncio
import base64
from dotenv import load_dotenv
# 导入 LiveKit 代理相关模块
from livekit.agents import (
Agent,
AgentSession,
JobContext,
RoomInputOptions,
WorkerOptions,
cli,
get_job_context,
)
from livekit.agents.llm import ImageContent
from livekit.plugins import google, noise_cancellation
from livekit.plugins import openai
# 创建日志记录器
logger = logging.getLogger("vision-assistant")
# 加载环境变量
load_dotenv()
class VisionAssistant(Agent):
"""视觉助手类,继承自 Agent 基类"""
def __init__(self) -> None:
# 初始化任务列表,用于管理异步任务
self._tasks = []
super().__init__(
instructions="""
你是一个有用的语音助手。""",
llm=google.beta.realtime.RealtimeModel(
voice="Puck",
# 设置语音模型
temperature=0.8,
# 设置创造性参数
),
)
async def on_enter(self):
"""当代理进入房间时调用的方法"""
def _image_received_handler(reader, participant_identity):
"""图像接收处理器,创建异步任务处理接收到的图像"""
task = asyncio.create_task(
self._image_received(reader, participant_identity)
)
# 将任务添加到任务列表中进行管理
self._tasks.append(task)
# 任务完成后从列表中移除
task.add_done_callback(lambda t: self._tasks.remove(t))
# 注册字节流处理器,用于接收图像数据
get_job_context().room.register_byte_stream_handler("test", _image_received_handler)
# 生成初始回复,简要问候用户并提供帮助
self.session.generate_reply(
instructions="简要问候用户并提供你的帮助。"
)
async def _image_received(self, reader, participant_identity):
"""处理接收到的图像数据"""
logger.info("从 %s 接收到图像: '%s'", participant_identity, reader.info.name)
try:
# 初始化字节数组来存储图像数据
image_bytes = bytes()
# 异步读取图像数据块
async for chunk in reader:
image_bytes += chunk
# 复制当前聊天上下文
chat_ctx = self.chat_ctx.copy()
# 向聊天上下文添加图像消息
chat_ctx.add_message(
role="user",
content=[
ImageContent(
# 将图像数据编码为 base64 格式
image=f"data:image/png;base64,{base64.b64encode(image_bytes).decode('utf-8')}"
)
],
)
# 更新聊天上下文
await self.update_chat_ctx(chat_ctx)
print("图像已接收", self.chat_ctx.copy().to_dict(exclude_image=False))
except Exception as e:
logger.error("处理图像时出错: %s", e)
async def entrypoint(ctx: JobContext):
"""应用程序入口点函数"""
# 连接到 LiveKit 房间
await ctx.connect()
# 创建代理会话
session = AgentSession()
# 启动会话,配置视觉助手代理
await session.start(
agent=VisionAssistant(),
# 使用视觉助手实例
room=ctx.room,
# 指定房间
room_input_options=RoomInputOptions(
video_enabled=True,
# 启用视频输入
noise_cancellation=noise_cancellation.BVC(),
# 启用噪声消除
),
)
if
name == "__main__":
# 运行应用程序,使用指定的入口点函数
cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))