☰
本地多模态语音助手搭建:Ollama+VLM+AgentScope+edge_tts全解析
2026/10/20 17:26:48 网站建设 项目流程

最近在折腾一个本地多模态语音助手,技术栈就四个词:ollama + edge_tts + vlm + agentscope。这套组合解决的是一个非常具体且常见的问题——让你自己机器上的大模型既能“看懂”图片,又能用自然流畅的中文把它的理解“说”出来。整个过程不需要申请任何云端 API,图片和文本都在本地流转,非常适合做离线智能体、桌面语音助手,或者智能硬件里那个“看得见又会说话”的中枢。

平时大家玩大模型,要么只做纯文本对话,要么调云端付费的视觉接口,要么自己拿几百行代码手动打通“模型调用 + 工具编排 + 语音合成”这条链路。ollama 负责把视觉大模型跑在本地并暴露标准化接口,vlm 负责真正理解图片内容,agentscope 负责把整个智能体的逻辑和消息流组织起来,edge_tts 负责把最终文本变成有语气、有停顿的中文语音。四样东西各管一段,组合出来的效果是:你丢一张照片进去,它能像朋友一样跟你说出它的观察,而且是真能听到的那种。

这篇文章我会把完整的示例代码、选型时的考量、运行中的参数调优和踩坑记录都整理出来,对想搭本地 AI 助手、研究多模态智能体,或者做语音交互原型的开发者都适用。

1. 整体设计思路与选型考量

1.1 四件技术各自扮演的角色

先说清楚这套组合里每一样东西到底是干什么的,不然很多人一开始就绕晕了。

Ollama 是本地大模型运行时。你可以把它理解成一个“模型超市 + 灶台”:它负责下载模型、管理模型版本、把模型加载进显存,然后对外提供一个统一的 HTTP 接口。你不需要关心模型权重文件放在哪、怎么启动推理进程,ollama 全部包了。

VLM(Vision Language Model,视觉语言模型)承担的是“看懂图片”这一步。它和普通大模型的区别在于,它多了一个视觉编码器,能把图片像素转成模型能理解的视觉特征,再和文本特征一起放进语言模型里生成回答。我在这个项目里用 Qwen2.5VL 系列作为主力,因为它对中文场景的细节捕捉和描述明显比同体量的其他开源模型更稳。

AgentScope 是一个面向多智能体应用的开源框架。它的核心价值在于把“模型调用”“消息传递”“多轮记忆”“工具调用”这些脏活累活封装成标准化组件。你不用自己手写一堆 if-else 来管理模型返回结果,只需要定义消息、定义组件,框架帮你把整条链路串起来。

edge_tts 则是微软 Edge 浏览器内置语音合成服务的非官方 Python 封装,它做的事情很简单:把一段文字转成 mp3 音频文件,支持几十种中文音色和语速音调调节。相比传统的 pyttsx3 或 espeak,它的发音自然度高得多,而且完全不需要本地安装额外的语音包。

用一个生活化的类比来解释整套架构:Ollama 是厨房里的灶台,负责把食材烧熟;VLM 是掌勺大厨,负责决定这道菜怎么做、放什么料;AgentScope 是前厅调度员,负责把顾客的订单准确传给后厨,再把菜品端到正确的桌上;edge_tts 是传菜员,负责把最终做好的菜用最合适的方式送到顾客面前。各自职责清晰,替换任何一环都不影响其他部分。

1.2 为什么不用“全家桶”方案

选这套组合之前,我其实对比过几类方案,也踩过一些弯路。

第一种是全云端方案:调付费的视觉理解接口,再配合云端的 TTS 接口。优点当然是效果稳定、几乎不占本地资源,但问题也很明显——图片和文本都要上传到第三方服务器,对于本地智能体这类场景感官上总是隔着一层,而且每次调用都要计费,做原型阶段无所谓,一旦要高频测试,费用完全不可控。

第二种是纯手写方案:直接用 Python 调 Ollama 的原始 HTTP API,拿到文本再调 edge_tts。这种方式最透明,代码也不难写,但问题出在扩展性——一旦你后面想让多个角色协作、加工具调用、维护多轮上下文,手写的消息路由代码就会越滚越大,最后变成一个没人敢改的毛线团。

AgentScope 存在的意义正是补上这一段“粘合层”。它本身不提供模型能力,也不提供语音能力,它帮你把“模型输出结果怎么流转到下一步”这件事规范化。我第一次用它时最大的感受是:代码结构被明显地理顺了,所有消息都走统一的 Message 对象,模型响应不再是随手 dict 到处传,而是有迹可循的结构化数据。

我们的目标是做一个“本地优先”的智能体闭环:模型推理在本地,数据不上云;语音合成借助公开服务的封装,换取远高于本地语音库的自然度;而所有流程编排交给框架来管理。这样每层都是可替换的:你今天想换一个更强的 VLM,只需要改一个模型名;明天想换一套 TTS,只需要改 speak 函数的实现;后天想加一个 OCR 工具,也不会动到主链路。

1.3 整条调用链拆解

在写任何代码之前,先搞清楚数据是怎么流动的。

用户提供一张图片,通常是一个本地文件路径,也可能是一段 base64 编码的字节流。这个图片被包装进 AgentScope 的消息对象里——注意,是作为一个特殊字段传给模型,而不是直接塞进 content 文本里。AgentScope 负责把这个消息翻译成后端模型的输入格式,然后通过 HTTP 转发给 Ollama 的接口。Ollama 把视觉编码器和语言模型串联起来,执行一次推理,输出一段纯文本描述。这段文本回到 AgentScope 的消息管道中,再被提取出来传给 edge_tts,合成 mp3 文件,最后用本地播放器播放出来。

这条链路里最容易忽略的一点是:整条链路的最大耗时瓶颈不在语音合成,而在模型推理。edge_tts 合成一段 50 字的描述通常只要一两秒,而 VLM 加载图片 + 生成 80 个 token 可能要五到十秒,具体取决于你的显卡。明白这一点之后,所有优化工作的重心都应该放在模型推理这侧,而不是在语音那侧瞎使劲。

2. 环境准备:十分钟装好本地视觉底座

2.1 Ollama 安装与视觉模型选型

Ollama 的安装没什么难度,到官网下载对应操作系统安装包,或者用包管理器一行命令装好。装完先确认服务已经在跑:默认监听 11434 端口,浏览器访问http://localhost:11434能看到提示就说明正常。

接下来是拉取视觉模型。当前 ollama 支持多款 VLM,我实测比较推荐的是 Qwen2.5VL 系列,原因很直接:中文视觉描述质量好,上下文窗口大,而且 ollama 官方库里有对应标签,不用折腾转换格式。

ollama pull qwen2.5vl:7b

拉取完成后,先用命令行快速验证一下模型能不能跑通:

ollama run qwen2.5vl:7b "用中文描述这张图片的主要内容" --images /home/user/pictures/test.jpg

这一步如果正常输出了自然的中文描述,说明模型本身没问题,后续接入框架只是调用方式的问题。

关于模型尺寸选择,不同显存配置有不同建议。7B 量化版是我日常用的主力,整体表现均衡。3B 适合低显存设备或纯 CPU 推理,图片理解能力弱一档,但速度快很多。如果你追求更强的视觉细节理解,可以考虑 32B 甚至更大的版本,但显存需求会直线上涨。我用一张对比表列一下大致需求:

模型版本显存需求(量化后约)适用场景中文视觉理解
qwen2.5vl:3b4G 以上轻量原型、低端机器基础描述够用
qwen2.5vl:7b6G~8G日常使用、通用任务细节丰富,推荐
qwen2.5vl:32b20G+高要求深度理解明显更强

注意:显存需求还取决于图片分辨率。如果经常输入大尺寸高分辨率图片,视觉编码器会额外占用几百 MB 到 1G 以上显存,7B 模型建议留足 8G 显存空间才不慌。

2.2 Python 依赖安装与服务验证

Python 侧需要安装两个核心依赖,另外我推荐装一个万能音频播放器 mpv,后面播语音会省很多事。

pip install agentscope edge_tts

装完后验证三个关键点。第一,确认 ollama 的 OpenAI 兼容接口能访问:

curl -s http://localhost:11434/v1/models

这个/v1路径很关键,很多框架都支持 OpenAI 格式的接口,ollama 从较新版本开始内置了兼容层,返回模型列表就说明 AgentScope 可以直接用它。

第二,验证 edge_tts 能正常合成语音。用一个最短的异步脚本来测:

import asyncio import edge_tts async def test_tts(): tts = edge_tts.Communicate("你好,我是本地语音助手", "zh-CN-XiaoxiaoNeural") await tts.save("test.mp3") print("ok") asyncio.run(test_tts())

如果生成了一个能正常播放的 test.mp3,说明 TTS 链路通了。经常在这个环节报错的朋友,一般是网络问题或使用的音色名拼写不正确,后面我会专门写排查表。

第三,确认显存状态。Linux 下用nvidia-smi看显卡占用,确保 ollama 已经把模型加载进去了。

3. 核心代码:从“看图”到“开口说话”

3.1 第一步:先单独验证 VLM 的接口格式

在写 AgentScope 代码之前,我强烈建议先用最原始的 HTTP 方式摸一遍接口格式,这样后面框架报错时你能判断是框架层的问题还是模型层的问题。

Ollama 的多模态接口是/api/chat,请求格式是标准的 chat 结构,图片放在 messages 里作为images字段:

curl http://localhost:11434/api/chat -d '{ "model": "qwen2.5vl:7b", "messages": [ { "role": "user", "content": "用中文描述这张图片", "images": ["/home/user/pictures/test.jpg"] } ] }'

返回的 response 里有一栏,前面带个content字段,就是最终生成的描述文本。

这一步的意义在于:它确认了图片输入路径能被 ollama 正确读到。如果这里就报错,大概率是路径写错了或者模型本身没拉全,和后续框架代码无关。我见过太多人在 AgentScope 里排了半天错,最后发现是 ollama 模型没加载好。

3.2 AgentScope 接入本地模型

AgentScope 支持通过 OpenAI 兼容方式接入各种模型服务,ollama 正好就在支持范围内。核心思路是:把 ollama 的地址当作一个 OpenAI 兼容的服务端点,给一个任意 api_key(本地服务不做鉴权),模型名保持不变。

from agentscope.model import OpenAIChatWrapper model = OpenAIChatWrapper( model_name="qwen2.5vl:7b", api_key="EMPTY", base_url="http://localhost:11434/v1", )

这里有一个容易踩坑的点:不同 AgentScope 版本的类名和导入路径可能有变化。我第一次用的时候也遇到过找不到类的报错,解决方法是进到安装目录的agentscope/model/目录下,看看里面具体有哪些文件,找到对应的 OpenAI 兼容类再导入。

3.3 图片消息如何包装

AgentScope 的消息对象是Msg,它和普通 OpenAI 消息的差别是支持一个image_urls字段,专门用来放图片路径列表。这句话是理解整个链路的关键:AgentScope 不是在 content 字符串里拼图片路径,而是用结构化字段来传递图片,再由框架负责转义成后端模型需要的格式。

from agentscope.message import Msg msg = Msg( name="user", role="user", content="请描述这张图片", image_urls=["/home/user/pictures/test.jpg"], ) resp = model(msg) description = resp.content.strip()

resp.content是模型生成的文本。这个 msg 对象返回后还可以继续塞回对话历史里,形成多轮交互,这也是我用 AgentScope 而不是手写 call 的原因之一——消息结构天然支持多轮。

提示:image_urls在部分旧版本里可能叫image_url,如果报参数错误,检查一下当前版本的Msg支持哪些字段,以官方文档或 IDE 自动提示为准。

3.4 edge_tts 文字转语音

edge_tts 的使用方式非常简洁。核心类是Communicate,参数分别是文本内容、音色、语速等选项。保存文件用save方法,它是 async 的,所以调用处要放进异步函数里。

import asyncio import edge_tts import subprocess async def speak(text: str, voice: str = "zh-CN-XiaoxiaoNeural"): tts = edge_tts.Communicate(text, voice, rate="+10%") await tts.save("output.mp3") subprocess.run(["mpv", "output.mp3"], check=False)

这里我用了rate="+10%"来微调语速,让语音听起来更有活力一些。edge_tts 支持rate、volume、pitch三个参数,分别控制语速、音量和音调,格式都是带正负号的百分比或 Hz 值。后面专门有一节讲这些参数的调法。

3.5 完整示例代码

把上面的模块拼起来,就是一个完整可复用的视觉语音助手脚本:

import asyncio import subprocess import edge_tts from agentscope.model import OpenAIChatWrapper from agentscope.message import Msg MODEL_NAME = "qwen2.5vl:7b" BASE_URL = "http://localhost:11434/v1" IMAGE_PATH = "/home/user/pictures/test.jpg" TARGET_VOICE = "zh-CN-XiaoxiaoNeural" # 1. 初始化模型 model = OpenAIChatWrapper( model_name=MODEL_NAME, api_key="EMPTY", base_url=BASE_URL, ) def describe_image(image_path: str, prompt: str) -> str: """调用 VLM 生成图片描述""" msg = Msg( name="user", role="user", content=prompt, image_urls=[image_path], ) resp = model(msg) return resp.content.strip() async def speak_text(text: str) -> None: """调用 edge_tts 合成语音并播放""" tts = edge_tts.Communicate(text, TARGET_VOICE, rate="+10%") await tts.save("output.mp3") subprocess.run(["mpv", "output.mp3"], check=False) if __name__ == "__main__": user_prompt = "请详细描述这张图片的内容,包括主体、背景、颜色和整体氛围。" result = describe_image(IMAGE_PATH, user_prompt) print(f"[模型回复] {result}") # 音色选择:小晓(女声,活泼自然) asyncio.run(speak_text(result))

假设你手里有一张室内照片,模型可能输出类似“这是一个简约风格的客厅,浅灰色沙发位于画面中央,背景是白色墙面和木质书架,整体氛围干净明亮”,然后这句话会被 edge_tts 用自然的中文女声念出来。整个流程干净利落,没有云 API、没有复杂的前后端对接。

如果你对 AgentScope 的包装方式还不放心,或者想加一层调试兜底,下面这段直接用 requests 调用 Ollama 原始接口的代码也值得留着:

import requests import base64 def describe_image_via_api(image_path: str, prompt: str) -> str: with open(image_path, "rb") as f: encoded = base64.b64encode(f.read()).decode("utf-8") resp = requests.post( f"http://localhost:11434/api/chat", json={ "model": "qwen2.5vl:7b", "messages": [ { "role": "user", "content": prompt, "images": [encoded], } ], "stream": False, }, ) return resp.json()["message"]["content"].strip()

这段代码的本质逻辑和 AgentScope 底层做的事情是一样的,区别在于手动处理了图片 base64 编码和请求内容。平时排查问题时用这个方式十分透明,能一眼看出错误发生在哪一环。

4. 实际运行效果与关键参数调优

4.1 延迟分析:时间都花在哪了

整套链路跑通之后,你会发现响应时间是一个不可忽略的体验问题。我实际测试下来的延迟分布大概是这样的:

阶段耗时预估说明
AgentScope 消息包装10ms 以内几乎可以忽略
图片加载与视觉编码1~3 秒图片越大越慢,7B 模型尤其明显
LLM 推理(生成 token)3~8 秒取决于显卡和生成长度
edge_tts 合成0.5~2 秒字数越多越慢
mpv 播放启动0.5 秒左右播放器冷启动耗时,可以提前常驻

热点全在“视觉编码 + 推理”这一大段。要优化,主要有两个方向。

第一个方向是控制图片尺寸。VLM 处理大图时会把图片切成多个视觉 patch,一个 4000x3000 的图相比 800x600 的图,视觉编码时间可能翻好几倍。实际使用时,可以在传图之前用 Pillow 做一次等比缩放:

from PIL import Image def resize_for_vlm(path: str, max_side: int = 1280): img = Image.open(path) ratio = max_side / max(img.size) if ratio < 1: img = img.resize((int(img.width * ratio), int(img.height * ratio))) img.save("resized.jpg", quality=90)

第二个方向是让模型“少说话”。描述类任务生成 50 个 token 和 150 个 token,体验差异非常明显。可以在提示词里加上“控制在三句话以内”之类的约束,直接砍掉一半推理时间。

4.2 音色、语速、音调微调技巧

edge_tts 的中文音色非常丰富,同一个文本在不同音色下输出的语气完全不同。我整理了几个常用的音色:

音色名性别/风格适合场景
zh-CN-XiaoxiaoNeural女声,温暖自然日常助手,最常用
zh-CN-YunxiNeural男声,沉稳清晰科技播报、知识讲解
zh-CN-YunyangNeural男声,新闻感公告、新闻播报
zh-CN-XiaoyiNeural女声,活泼明亮儿童向、活泼对话
zh-CN-liaoning-XiaobeiNeural东北口音趣味演示、特定场景

除了音色,三个最常用的调节参数也值得记住:

  • rate:语速,取值范围建议在-50%到+50%之间。我日常用+5%到+15%,太慢容易催眠,太快又显慌张。
  • volume:音量,默认是+0%。这个参数在合成时就有用,比播放器调音量更优先。
  • pitch:音调,单位是 Hz,比如pitch="+5Hz"会让声音更亮,-5Hz会更低沉。注意这里不是百分比,我见过有人写+10%报错的情况。

一个实操小技巧:如果你希望语音里带停顿,可以让模型在输出文本中适当使用逗号、句号、省略号。edge_tts 会对标点做停顿处理,句号和省略号后的停顿明显比逗号长,可以利用这一点让语音节奏更自然。

4.3 模型量化与内存占用调整

Ollama 默认会使用量化后的模型文件,这是它比直接跑原始权重更省显存的原因。但如果你打算长时间常驻服务,还有几个环境变量值得关注。

OLLAMA_NUM_PARALLEL控制同时处理请求的数量,默认是 1。如果你有个人主页或简单 web 界面同时接待多个请求,可以设为 2 或 4,但并发增加会让单个请求的响应速度变慢,这是显存带宽和算力决定的,不是软件问题。

OLLAMA_MAX_LOADED_MODELS控制同时驻留几个模型实例。如果你只用一个模型,保持默认 1 即可。

在模型运行参数层面,num_ctx(上下文长度)是最值得调的地方。ollama 默认上下文窗口较小,VLM 处理图片加上较长的对话历史容易超出限制导致报错。在交互模式下直接设置:

/ set parameter num_ctx 8192

或者调用 API 时在请求体里加对应参数:

resp = requests.post("http://localhost:11434/api/chat", json={ "model": "qwen2.5vl:7b", "messages": [...], "options": { "num_ctx": 8192, "temperature": 0.7, } })

num_ctx增大后会增加显存占用,不太建议盲目拉到 32000 以上。7B 模型配 8192 是一个性价比很高的配置,既给了足够空间容纳图片的视觉 token,又不会明显挤压显存余量。

5. 新手最容易踩的坑:问题排查实录

5.1 高频报错与解决方案

把常见问题整理成一张表,照着查比翻堆栈快得多。

症状可能原因解决方案
模型返回 404/model not found模型没拉全或没写标签ollama pull qwen2.5vl:7b,并检查标签拼写
请求超时报错模型还在加载中,首次推理很慢提前用ollama run预热模型,或增加客户端超时时间
图片路径报找不到文件AgentScope 相对路径解析有问题使用绝对路径,或者先读成 base64 传 bytes 字段
Msg创建时报参数错误AgentScope 版本 API 有调整检查当前版本Msg的字段名,使用image_urls或最新写法
edge_tts 报 403/426同一时间请求过于频繁,被服务端限流降低并发,或者连续请求之间加一个短延时
音频文件生成为空或只有几字节文本为空或全是特殊符号检查resp.content是否为空,打印一下中间结果
播放时没有声音缺播放器或设备被占用确认 mpv/ffplay 已安装,用系统音频播放器直接测试 output.mp3
中文描述夹杂英文模型受提示词影响输出在提示词里明确写“必须使用简体中文回答”

第一行的“model not found”我踩过不止一次。原因通常是手动改过 ollama 的模型名,然后在 AgentScope 里忘了保持一致。检查时先执行ollama list,把实际输出的模型名原封不动复制到配置里,不要手敲,这个细节能省下很多时间。

5.2 AgentScope 和 Ollama 版本适配

AgentScope 迭代速度很快,我在不同机器上装到过 API 差异很大的版本。最直观的表现是:官方文档的示例代码在旧版本上跑不通,或者反过来在新版本上报 DeprecationWarning。

我的经验是三条:

  • 重要的类名优先从agentscope.model、agentscope.message模块里导入,这两个模块是核心,变化相对少。
  • OpenAIChatWrapper 这个类本质上是把“打开一个聊天模型包装器”这件事规范化了,如果你发现新版本里找不到,直接搜索安装目录下agentscope/model/内的文件,看有没有带openai字样的同类。
  • AgentScope 的底层仍然走 OpenAI 格式,遇到任何 API 冲突,先抓网络请求看发出去的格式,再决定改哪边。

5.3 图片输入格式的“隐形坑”

VLM 对图片输入格式比普通模型敏感得多。常见报错是图片太大、格式不受支持(比如 WebP 在某些视觉编码器上表现不稳定)、或者 RGBA 通道问题。

最稳妥的处理方式是统一转成 RGB JPEG:

from PIL import Image def normalize_image(path: str, output="normalized.jpg"): img = Image.open(path).convert("RGB") img.thumbnail((1280, 1280)) # 等比缩到长边 1280 img.save(output, "JPEG", quality=90) return output

另外,千万不要把图片路径和 Prompt 拼在同一个字符串里传给 AgentScope,那样模型只会看到文本,不会看到图像。图片必须单独放在消息的图片字段里,这是所有 VLM 使用的基础常识,但也是咨询中出现频率最高的问题。

6. 扩展方向:从“看图说话”升级为完整语音助手

6.1 接上语音识别,打通双向对话闭环

目前这套方案能“听”图片的语音描述,但用户输入还是文字。如果想要一个真正能对话的助手,再接一个本地语音识别模块就完整了。

可以在speak_text函数同一个脚本里加入基于本地小模型的语音识别服务(比如 faster-whisper 的 small 或 base 模型)。用户按住按键说话,识别成文本,走 AgentScope + Ollama 链路生成回复,再走 edge_tts 播出来,形成一个完整的端到端语音交互闭环。整个链路中除 edge_tts 外全部在本地运行,语音识别模型加载后也只需要一两个 GB 内存。

我在实际测试中的体会是:识别模型用 base 级别就能识别中文日常口语,small 级别在嘈杂环境下更稳。用 base 的话,10 秒以内的语音通常 1 秒内就能识别完,体验完全可以接受。

6.2 多智能体协作场景

AgentScope 真正的强项是管理多个智能体之间的消息流转。扩展一下这个项目,可以很自然地变成三个角色协作:

  • 观察员智能体:接收图片,负责客观描述画面细节,不加入主观判断
  • 分析员智能体:接收观察员的描述,结合问题做推理,比如“这种场景下应该注意什么风险”
  • 播报员智能体:把分析结果整理成适合朗读的文本,交给 edge_tts 播放

三个智能体用 AgentScope 的消息管道串起来,观察员的输出自动变成分析员的输入。这个架构只在主链路上加了一条消息传递,但能力边界被大大拓宽了。原本“看图说话”是单模型输出,现在可以通过分工让一个模型专注细节,另一个模型专注推理,输出质量往往比单个大模型一步到位更好。

6.3 加入工具调用与记忆

另一个自然的方向是在 AgentScope 里注册一些工具函数,让 VLM 不仅会看图,还会“动手处理图”。比如注册一个 OCR 工具,模型识别到图片里有文字密度较高的区域时,可以主动调用工具做文本提取,再结合视觉描述给出一份完整报告。

多轮对话记忆也一样,把每一轮 Msg 都追加进一个 MemoryBank,这样模型可以对同一个图片进行连续追问:“刚才你说的书架第三层左数第二本书,能再描述一下颜色和大小吗?” AgentScope 内置了多种记忆库封装,直接配置即可使用,不需要自己手写历史管理逻辑。

最后说几点真实感受

这套组合我在实际项目里跑了半个多月,最大的体会是:它远没有想象中脆弱。一开始以为把这么多层串起来会频繁出问题,但把每层的边界理清楚之后,稳定性出乎意料地高。瓶颈几乎总是集中在硬件上——显存不足导致模型加载失败,以及 VLM 推理速度不够快,这两点是所有体验问题的根源。

另外有个小细节想提醒大家:图片路径一定要用绝对路径,别用相对路径。AgentScope 对于相对路径的解析在不同平台上表现不一致,我用 Windows 测试时一切正常,换到 Linux 环境就偶发找不到文件,排查了很长时间才发现是这个原因。

还有一点,edge_tts 的网络依赖是不可忽略的。它虽然不需要 API Key,但合成时必然要访问服务端。如果你的部署环境是完全离线的,这个环节就需要替换成本地的 TTS 模型。做一个真正完全离线的版本时,可以把整个链路拆成“模型侧”和“语音侧”两个独立服务,语音侧单独做成可插拔的模块。

如果你也想搭一个本地多模态语音助手,我的建议是:先复制上面那 50 行核心代码跑通,再一步步加东西。先有能用的东西,再考虑好用,这条路比一开始就想设计一个完美框架要走得快得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询