ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从终端到AI员工:用Claude Code打造语音控制助手TARS

从终端到AI员工:用Claude Code打造语音控制助手TARS 如果你在终端里见过 Claude Code 自动读完一个项目目录、然后自己改代码、跑命令你可能会跟我一样产生一个想法能不能让它别只待在终端里而是成为一个能听、能说、能干活的 AI 员工我利用业余时间搭了一个叫 TARS 的实验项目——用中文语音下达指令它负责接活、拆任务、操作屏幕必要时从零构建一个能跑起来的应用。这篇文章不是完整源码解析而是把第一版的搭建思路、模块设计、踩过的坑和落地边界整理出来。先说我的核心判断TARS 并不能证明 AI 已经无所不能它真正证明的是AI Agent 的工程化已经可以组合起来了。Claude Code 在这里扮演的是“执行大脑”语音模块和屏幕控制模块是它的耳朵、嘴巴和手脚。真正决定这个项目能不能长期用下去的不是模型能力而是你怎么设计输入、怎么约束操作、怎么处理错误、怎么把一次跑通变成一套可复用的流程。1. 先搞清楚TARS 真正替代的不是程序员而是一套重复劳动流程很多人第一次接触 Claude Code会把它理解成“能写更多代码的对话助手”。但用了几次之后你会发现它更接近一个终端里的执行者你能让它读文件、改文件、运行命令、查看输出再根据输出继续调整。它不是在给你建议而是真的在做事。我之所以想把它包装成 TARS是因为日常开发里有不少任务本质上不是“不会做”而是“重复做且占注意力”。比如新项目要初始化装依赖跑到本地报错信息太长要粘给模型分析一个测试失败了要看日志、定位代码、尝试修复文件结构调整后涉及多个文件的引用路径需要同步修改写完代码要跑构建检查有没有遗漏。这些事情单独拎出来都不难但会打断心流。过去我会写一堆脚本去批量处理但脚本的问题是需求一变脚本就得跟着改。而 Claude Code 不一样它可以根据你的一句话动态地把任务拆成步骤结合实时反馈去调整。这是它和传统脚本最大的区别。所以 TARS 真正替代的不是“程序员坐在电脑前思考方案”这件事而是“把已经明确的重复流程交给一个能听懂指令、能观察环境、能自我修正的执行者”这件事。但我也要先泼一盆冷水动态调整天然带不确定性。Claude Code 可能这次正确下次换个目录结构就判断错误可能在修改文件时动了不该动的地方也可能在执行命令时缺少权限直接卡住。所以 TARS 的定位不是“无人值守的全自动员工”而是“一个需要你审核和兜底的执行层”。这个定位决定了后面所有的设计。2. 第一版架构五个模块里最容易被低估的是“胶水层”TARS 第一版我没有做一个完整的 GUI也没有把它集成到某个编辑器里而是用最朴素的模块组合。整体流程是这样的语音输入(ASR) - 指令文本 - 任务分发 - Claude Code 执行 | v 语音输出(TTS) —— 结果整理 —— 屏幕/命令行反馈如果只为了实现语音对话那很轻量。但如果要让它“接管屏幕”“自动构建应用”就必须把执行模块做得更清晰。我把它拆成了五个模块模块职责输入输出语音识别ASR把中文人声转成文本指令麦克风音频指令文本指令分发判断是闲聊还是任务并转换成可执行上下文指令文本任务描述执行引擎核心 agent负责读文件、写代码、跑命令任务描述执行结果屏幕控制截图、理解 UI、模拟鼠标键盘操作屏幕图像/任务操作结果语音合成TTS把结果用中文读出来结果文本音频这里我想强调一个容易被低估的点真正让 TARS 能跑起来的不是 AI 模型而是中间的“胶水层”——也就是把语音转文本、文本转任务、任务结果转语音、执行日志转下一步操作的那段代码。很多人一开始会觉得模型都这么强了直接让模型自己干活不就行了但实际做下来你会发现模型负责的是“理解”和“生成”而胶水层负责的是“让这些能力在一个可控流程里被调用”。语音识别错了后面全错任务描述没有约束Claude Code 就很容易跑偏执行结果没有结构化你就没法判断下一步是继续修还是停止。所以我的建议是第一版先别想着做一个全自动的智能体先把每个模块的输入输出定死。比如“语音识别输出纯文本”“Claude Code 执行完输出一段结构化结果”“屏幕控制模块只负责执行指定坐标的操作”模块之间不要互相渗透。后面任何一个环节出了问题你都能快速定位。3. 搭一条中文语音对话链路从命令行到开口说话先不聊屏幕接管和自动构建我们先做一个最小闭环用中文对它说一句话它听懂了用 Claude Code 处理再用中文念出结果。这个闭环看起来简单但里面有几个关卡必须一个一个过。3.1 环境准备先确认 Claude Code 能跑起来第一步是先让 Claude Code 在本地终端里正常工作。不同环境下安装和认证方式可能不一样最稳妥的方式是翻阅官方文档确认你的账号有 Claude Code 的访问权限。我的建议是先在当前项目目录里跑一条最简单的指令看它能不能读文件、能不能输出结果。只有这一步稳定了后面接入语音才有意义。这一步有几个容易踩的坑当前目录没有正确的环境变量或认证信息调用会直接失败Node.js 等运行时版本不一致Claude Code 的安装或执行会报错终端输入中文时出现编码问题任务描述可能变成乱码。所以环境验证不能跳过。至少要让这样一条指令成功让 Claude Code 列出当前目录下的文件并用自己的话总结。3.2 语音识别先不管模型把“中文转文本”跑通语音识别部分我第一版没有自己训练任何东西而是选了一个成熟的中文 ASR 方案。开源的可以用 Whisper 系列也可以选择其他支持中文的语音识别服务关键是要支持流式或本地文件转写方便后续接管线。这里有一个经验不要在项目一开始就追求“实时”。先做“按下录音键 - 生成音频文件 - 转写文本”这种离线流程等逻辑稳定后再做流式。我写了一个最简结构# tars_asr.py # 示例结构获取音频 - 返回中文文本 def recognize(audio_path: str) - str: # 调用你选择的 ASR 库或服务 # 输入是音频文件输出是中文文本 return 帮我创建一个 demo 项目如果你用的是本地模型注意中文专有名词、多音字很容易被识别错。比如“Claude”可能被识别成“克劳德”项目名可能被改成莫名其妙的名字。我的做法是在转写之后加一层简单的关键词纠错映射表比如把“克劳德 Code”统一成“Claude Code”。3.3 把文本交给 Claude Code 执行执行模块是整个 TARS 的心脏。我的做法是在 Python 里通过子进程调用 Claude Code把语音转出来的文本作为任务描述传进去然后捕获它的标准输出作为结果。这里要特别注意不要直接在所有任务后面都加“执行”两个字也不要让 Claude Code 无限制地跑长任务。建议在任务描述里说清楚边界比如“只创建项目骨架不要启动服务器”“不要删除任何文件”。一个简单示例# tars_executor.py # 示例结构通过子进程调用 Claude Code传入任务描述 import subprocess def run_task(task: str) - str: # 在真实场景里要根据你的 Claude Code 调用方式调整参数 result subprocess.run( [claude, --print, task], # 具体命令以你安装的版本为准 capture_outputTrue, textTrue, encodingutf-8, timeout120, ) return result.stdout更稳妥的方式是先进入 Claude Code 的交互模式再通过脚本把任务内容写入会话。但第一版为了快速验证直接用命令行一次性传入任务就够了。3.4 语音合成让 TARS 能把结果念出来TTS 部分同样不需要自己训练。选择你熟悉的中文语音合成方案即可可能是本地库也可能是云服务。这里的关键是“别让 TTS 成为主流程的瓶颈”。TTS 要放在 Claude Code 执行完之后再调用不要边执行边朗读否则执行日志会打断语音反馈。跑通之后我的验证方式是对它说“你好”它转文本后丢给 Claude Code 随便处理再把返回结果用中文语音播出来。第一次听到 TARS 用中文回答的时候体验确实有点不一样——但我也马上意识到这背后全是胶水代码不是什么黑魔法。3.5 先文本后语音这个顺序建议不要跳如果你也想复刻我强烈建议先做一个纯文本版本你手动输入中文指令它用 Claude Code 执行并返回文本。等这个版本稳定了再接入 ASR 和 TTS。原因很简单一旦加入语音错误来源会翻倍。指令转错、回声、嘈杂环境、麦克风权限等问题会把 Claude Code 本身的执行问题掩盖掉。先文本你才能快速判断是“任务执行错了”还是“语音输入错了”。4. 接管屏幕给 Claude Code 装上眼睛和手但请先上锁语音对话只是第一步。标题里更吸引人的是“接管屏幕”。这里我要先明确边界TARS 的屏幕接管不是让你远程控制一台机器也不是让你绕过任何安全限制而是在用户显式授权、操作范围受限、有急停机制的前提下让 AI 辅助完成 GUI 操作。4.1 为什么需要屏幕控制能力不是所有任务都能在终端里完成。比如打开浏览器进入一个本地项目的页面截图验证首页是否正常操作某个 GUI 软件输入表单、点击按钮查看某个图表或者图片内容判断界面是否符合预期。这些场景下Claude Code 本身看不见屏幕所以需要给它增加“眼睛”和“手”。4.2 实现思路截图 - 理解 - 操作 - 验证我的实现思路是做成一个循环获取当前屏幕截图把截图交给一个多模态模型或 Claude Code 结合图像能力理解输出 UI 元素坐标或操作序列通过自动化工具模拟鼠标键盘操作再次截图确认是否达到目标。这里的关键不是“点击”本身而是“如何决定点击哪里”。我第一版的做法是先用屏幕截图让模型描述当前界面再让它输出最合理的操作步骤再由 Python 解析这些步骤并逐条执行。示例框架# tars_screen.py # 示例结构截图 - 交给模型理解 - 执行操作 def take_screenshot(path: str): # 使用系统截图能力保存图片到 path pass def understand_screen(image_path: str) - list: # 调用多模态模型返回类似 [click 800 450, type demo] 的操作列表 pass def execute_actions(actions: list): # 根据操作类型调用 pyautogui 等库执行 pass注意这个循环不能跑得太快。每执行一步最好都停顿一下让界面稳定之后再截图判断。否则窗口还没加载出来模型就已经判断“没有变化”容易误判。4.3 安全措施先上锁再让 TARS 接管屏幕接管的风险比终端执行高得多因为误点击可能影响正在运行的其他软件。所以我的建议是只在虚拟机、测试机或专用窗口里测试设置一个“急停”热键比如 ESC 或 CtrlAltQ一旦发现异常立刻终止默认开启“确认模式”每次模拟点击前询问你是否继续不要把手放到生产环境里无人值守操作。如果你要做更精细的控制可以用窗口句柄代替全屏坐标。比如按住某个浏览器窗口先把窗口激活再在窗口坐标范围内操作。这样能减少因为鼠标移动到其他窗口造成的误操作。4.4 常见问题模型给出的坐标不靠谱屏幕接管最常见的坑是模型“脑补坐标”。模型看到一张截图可能会给出一个看似合理的坐标但实际界面因为窗口大小、缩放比例、DPI 等原因坐标就是不对。我的排查顺序是先看截图分辨率确认模型是在哪张图上做的判断再看操作坐标范围是否越过了当前窗口区域再看执行后的截图结果是否跟预期一致如果连续失败就退回到“人指定坐标”模式让模型只做辅助。屏幕接管的能力更像是一个“演示功能”和“受限场景自动化工具”而不是一个可以随便放出去的全能助手。这一点越早接受越好。5. 自动构建应用让“需求-构建-验证”变成一个循环第二个让人兴奋的点是“自动构建应用”。我一开始觉得这不就是让 Claude Code 写代码吗但真正做之后发现最难的并不是“写代码”而是让整个构建流程自己转起来。5.1 场景一句话创造一个新项目我的目标是对 TARS 说“帮我创建一个 React 项目名字叫 demo带一个计数器页面启动后能在本地 3000 端口访问。”理想情况下TARS 会去做这些事创建项目目录使用脚手架初始化项目安装依赖修改页面代码加入计数器逻辑启动开发服务器检查日志确认服务正常打开浏览器截图验证。这个流程里每一步背后都有对应的命令。Claude Code 的优势在于它可以把“意图”转成“命令”再在报错时读日志、改代码、重新执行。5.2 实现方式别让 Claude Code 每次都从零思考我知道有一些做法是直接把整个需求丢给模型让它一口气写完项目。这在简单 demo 里可以但只要项目稍微复杂一点就会出现结构混乱、依赖冲突、代码文件之间引用不正确的问题。我更推荐的做法是“分阶段执行”阶段 A用脚手架生成干净的项目基础结构阶段 B让 Claude Code 修改指定文件加入业务逻辑阶段 C运行构建命令收集日志阶段 D如果有报错把错误反馈给 Claude Code让它继续修改阶段 E构建成功后用脚本启动服务再做一次页面验证。这样一个阶段一个阶段走每步都有明确的输入输出出问题能定位。如果一上来就让模型“自由发挥”最后失败了你很难判断是哪一步产生的 bug。5.3 核心把“检查-修复-验证”循环自动化自动构建和人工构建最大的区别在于人工构建看到报错会自己读日志自动构建则需要脚本替你做这件事。我实现了一个简单循环# tars_build.py # 示例结构构建 - 检查日志 - 修复 - 重新构建 def build(): result run_build_command() logs collect_logs(result) if error in logs.lower(): feedback 构建失败请根据以下日志修复 logs run_task(feedback) # 调用 Claude Code 修复 return build() # 重新构建但要注意设置最大重试次数 return logs这里必须加一个“最大重试次数”比如 3 次。否则模型可能在一个问题上反复横跳浪费大量 token 和时间。比较好的策略是第一次失败给模型看完整日志第二次失败不仅给日志还要给当前目录的文件列表第三次失败就停止把问题转给人工。5.4 不要忽略“资源边界”自动构建应用会在本地装依赖、跑服务器、占用端口。TARS 在无人监督时可能会长时间运行一个任务也可能在某个端口被占用时反复尝试。所以需要提前做几个限制每条构建任务的超时时间最大重试次数允许运行的命令白名单磁盘空间和内存阈值检查。有一次我让 TARS 自动构建一个项目它卡在“安装依赖”那一步原因是没有配置好镜像源网络超时。这在脚本里很容易处理只要把超时时间设短一点重试前先 ping 一下网络就行。但如果你是让模型“自由操作”它可能就一直在那里重试。6. 排查与边界TARS 出错时我从哪一层开始查TARS 这类系统最大的特点就是链路长。语音识别、任务理解、文件读写、命令执行、屏幕操作任何一个环节出错都会表现为“TARS 没有干对活”。所以不能只盯着模型看要从输入到输出逐层排查。6.1 五层排查链路我一般按下面这个顺序排查层检查内容典型现象输入层语音转写文本是否正确专有名词有没有被改错指令是“创建 demo”结果被识别成“创建呆毛”理解层Claude Code 是否准确理解了任务是否擅自扩大范围让它创建页面结果它把整个目录结构都重构了执行层当前用户是否有权限目录是否可写命令是否存在于 PATH提示权限不足 / 找不到命令依赖层Node、Python、浏览器等版本是否匹配端口是否被占用构建失败、服务起不来工具边界当前任务是否超出了 Claude Code 或屏幕控制模块的能力范围需要操作某个没有提供接口的内部系统这个顺序背后的逻辑是先看“输入对不对”再看“理解对不对”再看“环境允不允许”最后才怀疑“工具能不能做”。很多时候问题不在模型而是 TARS 传给模型的文本就是错的。6.2 一个真实排查案例我遇到过一次“TARS 没有创建项目反而只输出了一段文字”的情况。当时我以为 Claude Code 没有执行权限于是调整了参数但它还是只输出建议。后来我翻日志才发现是语音识别把“创建项目”识别成了“介绍项目”模型自然就只给了说明没有执行。这个案例说明链路越长前端的错误越容易被误判成后端的 bug。所以 log 里一定要记录三个关键信息ASR 转写结果、传给 Claude Code 的最终任务文本、Claude Code 的原始输出。只要这三个字段齐全排查效率会高很多。6.3 明确边界什么场景不适合 TARSTARS 不是万能的。以下场景我不建议用它涉及敏感数据的操作比如处理账密、私钥、个人隐私文件需要严格审计的高风险生产环境部署用户界面操作没有明确坐标、没有窗口句柄支持的场景需要大量并行、任务间存在复杂依赖的批处理作业需要模型“创造全新创意方案”的开放式任务而不是执行明确流程。边界不是限制而是保护。TARS 这类系统越强大越需要知道自己不该做什么。你可以在任务模板里直接写清楚“禁止删除文件”“禁止修改权限”“禁止访问外部网络”让 Claude Code 在执行时有所约束。7. 从玩具到工具让 TARS 真正可落地的五个建议最后想聊聊怎么把这个实验项目推进到“能日常用”的程度。因为从“能跑”到“敢用”中间还隔着很多工程细节。7.1 先做最小闭环再做演示我最开始直接想把语音、屏幕、自动构建全部一次接通结果折腾很久最后发现每个模块都不稳。后来我改成先做纯文本 Claude Code 执行的最小闭环稳定之后再加语音再加屏幕再加自动构建。建议的推进顺序文本指令 - Claude Code 执行 - 返回文本接入语音识别和语音合成加入屏幕截图和模型理解加入自动构建和日志反馈循环最后再考虑复杂的任务编排。每一步都要有验证标准。比如第一步的标准是“让 Claude Code 根据指令创建一个文件”第二步的标准是“中文语音转文本后能执行同一个指令”第三步的标准是“能通过截图判断一个窗口是否打开”。7.2 任务白名单比自由度更重要TARS 自由度太高不是好事。我建议给执行引擎配置一个“权限清单”允许执行的命令比如npm run build、git status禁止执行的命令比如rm -rf、git push、sudo允许修改的目录比如当前项目目录禁止修改的目录比如系统目录、其他项目。这个清单可以写在任务模板里也可以做成脚本里的硬编码规则。效果是Claude Code 提出一个操作但真正执行前会有一个“门卫”判断这个操作是否被允许。7.3 所有操作都要留痕TARS 的每一步动作都应该有日志。包括语音转写文本传给 Claude Code 的任务描述模型输出的计划实际执行的命令命令输出结果屏幕截图操作坐标手动干预记录。这些日志不仅用于排查问题还能帮你复盘模型的行为模式。比如你会慢慢发现这个模型在哪些任务上会“自作主张”在哪些任务上又过度保守然后你就能针对性地加提示词约束。7.4 人工审核不是拖后腿而是安全底座如果你做了“确认模式”会感觉 TARS 好像不够酷。但我可以负责任地说对于一个有能力执行命令、控制屏幕的 AI Agent“事前确认”和“急停机制”不是可选项是必需品。我的做法是普通查询不需要确认但以下操作必须确认删除文件安装或卸载依赖修改系统配置启动或停止服务任何涉及网络请求的操作。确认的方式也很简单在终端里输入y或点击“允许”即可。它不会拖慢太多但能防止很多毁灭性操作。7.5 长期来看要把 TARS 当成一套流程来维护TARS 不是一次性开发的脚本而是一套需要持续维护的流程。模型的版本会更新ASR 服务的接口会变你常用的任务模板也会随着项目变化而变化。所以一开始就要把配置和代码分离比如把“允许执行的命令”“常用任务模板”“ASR/TTS 服务的接入参数”放在配置文件里不要写死在核心逻辑中。TARS 真正让我觉得值得记录的不是某一次演示有多惊艳而是它让我看到AI Agent 的能力边界正在从“模型能回答什么”转移到“工程上能控制什么”。模型越强越需要一个清晰的流程来约束它、引导它、验证它。这大概也是所有 AI 工具落地的共同路径先跑通再上锁再迭代最后变成你顺手就用的那套工具。
返回列表