使用LiveKit+Qwen2.5+Deepgram搭建智能语音助手
公司什么都想做,前几天领导想做一个语音问答助手,通过语音问问题后,可以语音回答问题。
然后就开始折腾了,最开始想自己搭一套语音识别工具,然后调用ollama的llm模型,最后再搭一套tts的服务,来实现。
悲催的第一步就卡住了,本地测试的语音识别效果还行,部署到服务器上测试就各种识别不准确,不是少识别就是乱识别,很烦人。后来换了个思路,在往上找找有没有开源的直接可以使用的框架。
额,赶巧了,LiveKit Agents最近刚发布,就是提供在线语音视频智能体的。
就试了下,效果还可以。只是有个缺点,现在调用的stt和tts模型只有第三方服务商的,我使用的deepgram的,模型调用的本地ollama的qwen2.5:latest。
接下来就是折腾步骤了。
一、部署LiveKit服务
打开Livekit github地址
我是在电脑商测试的,所以下载这个,按服务器和cpu类型选择对应的包。
下载下来解压
在安装目录运行以下命令启动服务
livekit-server --dev
有报错不影响,能正常显示以下内容就行
二、安装客户端
我使用的python代码,打开python sdk 的 GitHub地址
下载下来以后,安装环境。这个在GitHub上有详细说明,按步骤来就行。
安装好以后用他给的示例代码,创建token
from livekit import api
import os
token = api.AccessToken('devkey','secret') \
.with_identity("identity") \
.with_name("user1") \
.with_grants(api.VideoGrants(
room_join=True,
room="my-room",
)).to_jwt()
print(token)
创建房间
from livekit import api
import asyncio
async def main():
lkapi = api.LiveKitAPI("http://127.0.0.1:7880", "devkey", "secret")
room_info = await lkapi.room.create_room(
api.CreateRoomRequest(name="my-room"),
)
print(room_info)
results = await lkapi.room.list_rooms(api.ListRoomsRequest())
print(results)
await lkapi.aclose()
asyncio.run(main())
输出结果,房间名字是 my-room
sid: "RM_jYvSNCHDhc9n"
name: "my-room"
empty_timeout: 300
creation_time: 1743989876
turn_password: "WIAbJXQeI7GLpc6nFxFY556S28HBFj3XYQvhl9M3zTV"
enabled_codecs {
mime: "audio/opus"
}
enabled_codecs {
mime: "audio/red"
}
enabled_codecs {
mime: "video/VP8"
}
enabled_codecs {
mime: "video/H264"
}
enabled_codecs {
mime: "video/VP9"
}
enabled_codecs {
mime: "video/AV1"
}
enabled_codecs {
mime: "video/rtx"
}
departure_timeout: 20
creation_time_ms: 1743989876781
rooms {
sid: "RM_jYvSNCHDhc9n"
name: "my-room"
empty_timeout: 300
creation_time: 1743989876
turn_password: "WIAbJXQeI7GLpc6nFxFY556S28HBFj3XYQvhl9M3zTV"
enabled_codecs {
mime: "audio/opus"
}
enabled_codecs {
mime: "audio/red"
}
enabled_codecs {
mime: "video/VP8"
}
enabled_codecs {
mime: "video/H264"
}
enabled_codecs {
mime: "video/VP9"
}
enabled_codecs {
mime: "video/AV1"
}
enabled_codecs {
mime: "video/rtx"
}
departure_timeout: 20
creation_time_ms: 1743989876781
}
如果有以上结果就表示服务创建成功了。
三、网站测试
这一步主要是为了可以直观的看到运行结果,并且为后续语音聊天做准备
打开 测试网站
把第二部创建的token和访问地址放到对应位置,注意地址是ws开头,不要按提示的来。点击连接,如果出现以下内容,说明通了。
四、Agents准备工作
这一步是准备需要的环境,Ollama安装就不介绍了,网上很多,有个需要注意的点是,在选模型的时候需要有tools的。就像下面这样的。因为调用需要。
我选的是qwen2.5 7b的的也可以选择其他的,看你电脑配置。
准备 deepgram 的 api_key ,因为stt和tts都使用的第三方服务的,所以需要申请api_key
支持的所有stt和tts的服务都在这儿,也可以选择其他的。我为了方便选的deepgram。
登录deepgram 官网
点API Keys,创建新的api key。
五、搭建Live Agents
我还是使用python,git地址.,按照git文档安装环境就行。
以下是我写的一个示例 csagtnes.py,修改对应的apikey就行。
from livekit.agents import (
JobContext,
RunContext,
WorkerOptions,
cli,
function_tool,
)
from livekit.agents.voice import AgentSession, Agent, room_io
from livekit.plugins import deepgram, openai, silero,cartesia
@function_tool
async def lookup_weather(
context: RunContext,
location: str,
):
"""Used to look up weather information."""
return {"weather": "sunny", "temperature": 70}
async def entrypoint(ctx: JobContext):
await ctx.connect()
agent = Agent(
instructions="You are a friendly voice assistant built by LiveKit.",
tools=[lookup_weather],
)
session = AgentSession(
vad=silero.VAD.load(),
stt=deepgram.STT(model="nova-2-finance",api_key='aaaaaaaa',language='zh-CN'),
llm=openai.LLM.with_ollama(model="qwen2.5:latest",base_url='http://127.0.0.1:11434/v1'),
tts=deepgram.TTS(api_key='aaaaaaaa'),
)
await session.start(agent=agent, room=ctx.room,room_input_options=room_io.RoomInputOptions())
await session.generate_reply()
if __name__ == "__main__":
cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))
然后在命令行执行以下代码。
python csagtnes.py connect --url="ws://localhost:7880" --api-key="devkey" --api-secret="secret" --room="my-room" --log-level="DEBUG"
执行完以后的效果
然后就可以在上面那个测试的网站看到又有新用户加进来了,接下来就可以你一句他一句的愉快聊天了。
在命令行可以看到实时转中文的记录,当然看不懂,他是base64的。
到此,还有最后一个问题没解决,就是他回答用的是英文语音,我找了下,deepgram目前对接的tts模型都是英文的,还没有中文,有兴趣的小伙伴可以找找其他服务商的tts服务,看有没有支持中文语音的。