如何用Claude Code构建语音控制自动构建的AI助手TARS 如果你已经习惯了在对话框里问 AI “这段代码哪里有问题”那最近半年最值得关注的变量可能不是对话效果又好了多少而是 AI 开始从“给你建议”切换到“替你执行”。Claude Code 就是这条路线里走得比较靠前的一类工具它跑在你的终端里能自己读文件、改代码、执行命令、跑测试再把结果用自然语言汇报回来。换句话说它不再是一个“回答者”而更像一个“执行者”。这篇文章的起点是一个演示项目把一个具备语音对话能力、能在屏幕上展示执行过程、还能自动构建应用的 AI 开发助手命名为 TARS致敬《星际穿越》里的那个靠谱机器人。我们会把 Claude Code 作为 TARS 的执行内核给它接上语音识别和语音合成再让它接手一个完整的开发任务。读完以后你能得到一个可以自己扩展的最小框架也能理解这类工具真实的强项、边界和风险。1. “AI 员工”到底解决什么问题很多人第一次接触 Claude Code会把它当作“终端里的 ChatGPT”。这个理解不能说错但会低估它。ChatGPT 这类聊天工具的核心流程是你提问它回答你复制代码自己粘到项目里自己跑自己修。整个闭环里AI 只承担了“出主意”这一环剩下的体力活还是你的。Claude Code 则把闭环往前推了一大步它可以直接在终端里执行命令可以读取项目文件可以修改代码可以运行测试可以基于报错继续排查。它不再只输出“建议”而是直接产出“结果”。AI 员工这个词本质指的就是这种从“顾问”到“执行者”的转变。传统开发流程里一个需求从提出到落地大概要经过拆解需求、搜索方案、写代码、跑构建、修 bug、回归验证这几个环节。前几步依赖经验和检索能力后几步依赖机械执行能力。Claude Code 真正降低的是后几步的成本那些“我已经知道怎么改但就是要花时间改”的活可以交给它。这篇文章最值得读的人有三类已经知道 Claude Code 能做什么但只在命令行里玩过“问答式”交互想把它接入真实开发流程的人。想做一个能听懂自然语言、能自动执行构建任务的内部工具或团队机器人的人。想弄清楚这类 AI Agent 的安全边界、权限控制、常见坑和工程化落地方式的人。如果你只是想找一个“更聪明的代码补全插件”Claude Code 不一定是最合适的选择。它的价值不在“补全”而在“执行”。2. Claude Code 的核心概念与适用场景2.1 Claude Code 是什么Claude Code 是 Anthropic 推出的终端编程 Agent。它最典型的交互方式是你在终端里启动它给它一个自然语言目标它会自己规划步骤调用工具完成操作然后汇报结果。和普通 CLI 工具不同Claude Code 不是一个“执行单一命令”的程序而是一个“会持续判断下一步做什么”的 Agent。它可以在你的授权范围内读取工程结构、搜索关键字、修改文件、执行 shell 命令并根据命令输出决定下一步动作。这类工具之所以最近讨论度高是因为它把一个长期存在的需求真正产品化了让 AI 从“理解代码”变成“操作系统”。2.2 几个容易混淆的概念使用 Claude Code 之前有几个概念值得先理清楚。Agent指的是能够自主规划并调用工具完成任务的人工智能程序。Claude Code 本身就是一个 Agent 形态的产品它不满足于一次性生成答案而是会循环执行“观察结果 → 决策 → 行动”。Skill技能可以理解为给 Agent 配置的“可复用工作流”。比如“发布版本”“跑全量测试”“生成数据库迁移脚本”这些如果每次都要重新写一遍提示词会很累。把类似流程固化为一个 SkillAgent 以后遇到对应场景就按标准流程执行。MCPModel Context ProtocolAnthropic 提出的开放协议用于让 AI 应用接入外部工具和数据源。通过 MCPClaude Code 可以连接内部 API、数据库、文件系统、浏览器工具等。MCP 的价值在于统一了“AI 如何调用外部工具”的接口。2.3 和 Codex、Cursor 这类工具有什么差别很多读者会拿 Claude Code 和 OpenAI Codex、Cursor 对比。它们都属于 AI 编程助手但侧重点不一样。对比维度Claude CodeOpenAI CodexCursor主要形态终端 CLI也有桌面/IDE 集成终端 CLI也有编辑器扩展AI 代码编辑器模型Anthropic Claude 系列OpenAI 模型可切换多种模型执行能力在终端执行命令、读写文件在终端执行命令、读写文件以编辑器交互为主适合场景自动化任务、构建流程、CI自动化任务、构建流程日常编码、代码理解、重构扩展能力Skill、MCP、环境变量配置依赖 OpenAI 生态编辑器生态和插件从实际使用感受看Claude Code 和 Codex 更接近它们都强调“在终端里干活”而不是“在编辑器里给你提建议”。Cursor 的优势在于把 AI 无缝嵌进了编辑器的日常操作里但对“自动执行构建流程”这类任务它并不是为这个场景设计的。2.4 它适合做什么不适合做什么从目前的实践看Claude Code 很适合这类任务生成项目骨架比如创建一个 Flask 或 Spring Boot 应用。在已有项目中实现某个明确的功能并补齐测试。根据报错日志自动修 bug反复运行验证。执行构建、生成代码、重构、批量替换。在 CI 流程里作为自动化开发工具接收任务并提交代码。它不适合的任务也很明显需要复杂人工审批的正式发布流程尤其是生产环境部署。需求本身模糊、需要大量业务判断的项目。需要访问内部敏感数据或生产数据库的场景。完全无人值守的“给个需求自动做完”的幻想场景。Claude Code 是一个执行力很强的辅助者但还不是一个能独立承担业务责任的员工。这个边界实操的时候越早认清越好。3. 环境准备与安装开始搭建 TARS 之前先准备一个干净的 Claude Code 环境。下面这些步骤不依赖具体操作系统Windows、macOS、Linux 都适用差异主要在 PATH 配置和终端类型上。3.1 安装前提Claude Code 基于 Node.js 运行所以第一步是确认本机有可用的 Node 环境。建议使用最新的 LTS 版本避免老版本产生的兼容性问题。node -v npm -v如果命令输出版本号说明 Node.js 环境正常。如果提示command not found需要先安装 Node.js再继续后面的步骤。3.2 安装 Claude Code通过 npm 全局安装anthropic-ai/claude-codenpm install -g anthropic-ai/claude-code安装完成后验证版本claude --version如果能看到版本号说明安装成功。如果报command not found最可能的原因是 npm 全局 bin 目录没有加入系统 PATH。3.3 认证与登录Claude Code 是连接 Anthropic 模型服务的客户端使用前必须通过认证。常见认证方式有三种第一种直接运行claude按提示完成交互式登录。这种方式适合个人开发环境。第二种使用 API Key。在服务器、CI 或自动化脚本里交互式登录不方便建议用环境变量。export ANTHROPIC_API_KEY你的API Key设置后运行claude -p 你好请用一句话介绍你自己-p表示 print 模式也就是非交互模式。它把 prompt 作为参数传入执行完直接输出结果适合被脚本调用。第三种企业 SSO 登录。如果你的组织统一管理账号需要联系管理员开通权限并按企业文档完成认证。这里要特别提醒很多开发者在安装这一步遇到问题并不是因为代码写错而是账号或网络环境不在服务支持范围内。如果你运行claude时看到区域可用性相关提示应该先确认自己的账号和网络环境是否符合官方支持条件通过合规渠道解决而不是用非官方方式绕过限制。3.4 在 VSCode 中使用 Claude CodeVSCode 集成是很多国内开发者关心的点。实际使用中最简单的做法其实是在 VSCode 的终端里直接运行claude让 Claude Code 使用当前打开的文件夹作为工作目录。如果你希望看到 Agent 修改文件的 diff 过程可以配合 Git 的变更面板观察。Claude Code 每改一个文件VSCode 的源代码管理面板都会显示变更这样你不需要盯着终端也能“看见”它在屏幕上的操作轨迹。这是很多团队实际采用的观察方式比黑盒执行要安全得多。4. 模型配置与第三方兼容接口安装完成只是第一步真正影响使用体验的是模型配置。这里经常出现两个问题一是模型名配置错误二是想接第三方模型但协议不兼容。4.1 通过环境变量控制模型Claude Code 支持用环境变量指定默认模型。常见的是export ANTHROPIC_MODEL你的模型ID export ANTHROPIC_BASE_URLhttps://api.anthropic.comANTHROPIC_MODEL指定默认使用的模型。ANTHROPIC_BASE_URL指定 API 端点一般不需要修改只有接第三方兼容服务时才需要动它。模型 ID 一定要填当前版本认识的名称否则启动时会报类似这样的错误your-model-name is not a model this version of claude code recognizes遇到这个错误第一件事不是查代码而是检查ANTHROPIC_MODEL的拼写和这个版本支持的模型列表。官方支持的模型 ID 以官方文档为准不要凭记忆写。4.2 接第三方模型的判断原则网上经常看到“把 Claude Code 接入 DeepSeek”这类教程。这件事能不能做取决于一个重要原则Claude Code 依赖 Anthropic Messages API 的语义第三方模型必须提供一个“能兼容这个协议”的端点或者有一个适配层把请求转成自己模型能理解的形式。如果你的内部网关或第三方供应商提供了兼容端点可以设置export ANTHROPIC_BASE_URL你的兼容API地址 export ANTHROPIC_API_KEY你的API Key export ANTHROPIC_MODEL对方支持的模型名然后运行一个最简单的请求验证claude -p 你好如果返回了正常回答说明协议兼容如果卡住、报错或返回异常说明该端点并不完全兼容 Anthropic Messages API需要换方案。这里给一个更稳妥的建议生产项目优先使用官方模型和官方 API第三方接入作为技术验证可以但要充分评估稳定性、隐私和成本。不要因为“看起来很酷”就把核心开发流程押在一个不稳定的兼容层上。4.3 配置管理的工程规范模型配置涉及 API Key、模型名、端点地址这些内容不应该散落在团队成员的本地环境里。推荐的做法是项目级配置用.claude/settings.json这类文件固化提交到仓库保证团队成员行为一致。API Key 一律通过环境变量或密钥管理服务注入绝不写进代码仓库。如果团队经常切换不同模型供应商可以用社区常见的配置切换工具本质上它们就是把不同环境变量组合管理起来但使用时要注意工具本身的安全性和维护状态。5. TARS 架构设计语音、屏幕与自动构建现在进入正题。我们要把 Claude Code 升级成一个具备三种能力的 AI 员工 TARS。“AI 员工的三种能力”分别对应三个模块语音对话让用户能“说”任务TARS 能“答”结果。屏幕接管让开发者能看到 TARS 正在执行什么以及必要的时候让 TARS 操作浏览器、打开页面、截图验证。自动构建应用让 TARS 根据自然语言指令直接生成代码、安装依赖、运行测试。整体架构可以用下面这张图理解麦克风/键盘 ↓ 语音识别Vosk / Whisper 等 ↓ 指令文本 ↓ [TARS 调度器] → Claude Code CLIclaude -p ↓ ↓ TTS 语音播报 执行命令/读写文件/运行测试 ↓ 开发者屏幕通过终端、VSCode、浏览器观察执行过程这个架构的核心是 Claude Code。语音识别负责把人类说话变成文本调度器负责把文本交给 Claude CodeClaude Code 负责把自然语言变成真实操作TTS 负责把结果念给用户听屏幕观察则让整个过程可审计、可干预。关于“接管屏幕”这里要澄清一个容易误会的点Claude Code 本身并不像一个远程控制软件那样直接拖动你的鼠标。它更多是通过执行命令、读写文件来“操作电脑”。如果任务需要操作浏览器比如打开本地页面、点击按钮、截图验证那就需要额外接入浏览器自动化工具这属于广义的“屏幕接管”我们会在后面的自动构建部分演示。设计的核心原则是语音只负责“输入”真正干活的是 Claude Code。不要把语音识别和 Claude Code 混在一起它们解耦后任何一个环节都可以单独替换。6. 语音对话模块实现语音对话是 TARS 最外层的交互体验。这里我用 Python 实现一个最小闭环录音 → 语音识别 → 调用 Claude Code → 语音播报。6.1 技术选型语音识别用 Vosk它是一个支持离线的语音识别工具有中文模型安装简单不用把音频上传到第三方服务更可控。语音合成用 pyttsx3它是本地 TTS 引擎离线可用中文支持取决于系统是否安装了中文语音包。如果你已经有公司内部的语音服务也可以把这一段替换成内部 API架构不变。6.2 安装依赖pip install vosk sounddevice pyttsx3Vosk 的中文模型需要单独下载。把模型解压到model/zh-cn目录代码会从那里加载。6.3 语音输入模块文件路径tars/voice_input.pyimport json import queue import time import sounddevice as sd from vosk import Model, KaldiRecognizer MODEL_PATH model/zh-cn SAMPLE_RATE 16000 model Model(MODEL_PATH) recognizer KaldiRecognizer(model, SAMPLE_RATE) audio_queue queue.Queue() def callback(indata, frames, time_info, status): if status: print(f录音状态异常: {status}) audio_queue.put(bytes(indata)) def listen(duration: int 5) - str: 录制一段时间音频并返回识别出的中文文本。 results [] with sd.RawInputStream( samplerateSAMPLE_RATE, blocksize8000, dtypeint16, channels1, callbackcallback, ): deadline time.time() duration while time.time() deadline: data audio_queue.get() if recognizer.AcceptWaveform(data): text json.loads(recognizer.Result()).get(text, ) if text: results.append(text) return .join(results)这段代码的思路是用sounddevice打开麦克风音频流持续采集 16kHz 的 int16 音频数据每收到一块数据就交给 Vosk 识别器处理当 Vosk 认为一句话已经完整就会返回识别结果。listen函数最后把识别出的文字拼起来返回。注意这里用RawInputStream配合队列是比较典型的实时音频处理写法能避免一次性录制固定长度带来的静音误判。如果你想把流程简化也可以用sd.rec录制固定时长但识别效果会差一些。6.4 语音输出模块文件路径tars/voice_output.pyimport pyttsx3 _engine pyttsx3.init() _engine.setProperty(rate, 180) _engine.setProperty(volume, 0.9) def speak(text: str) - None: 将文本转为语音并播放。 _engine.say(text) _engine.runAndWait()pyttsx3的好处是离线、跨平台。但要注意如果你的系统没有安装中文语音包它可能没有声音。这种情况下可以去系统设置里补装中文语音或者换成edge-tts这类在线 TTS 服务。6.5 调度器调用 Claude Code文件路径tars/cli_agent.pyimport subprocess def ask_claude(prompt: str, timeout: int 180) - str: 调用 Claude Code 的非交互模式执行任务并返回结果。 cmd [claude, -p, prompt, --output-format, text] try: result subprocess.run( cmd, capture_outputTrue, textTrue, timeouttimeout, encodingutf-8, ) except subprocess.TimeoutExpired: return 任务执行超时请拆分指令后重试。 if result.returncode ! 0: return fClaude Code 执行失败\n{result.stderr} return result.stdout.strip()这里用的是claude -p的 print 模式。这个模式专为脚本调用设计输入一个 promptClaude Code 执行完直接输出结果退出进程。参数--output-format text让输出保持纯文本方便直接作为语音播报内容。timeout180是必须的否则一个长时间任务可能让整个 TARS 进程一直挂起。在非交互模式里Claude Code 能否执行命令取决于项目目录的权限配置。如果在 print 模式中因为命令审批被卡住可以先在交互模式里运行一次claude对常用命令选择允许或配置项目权限规则。7. 自动构建与屏幕接管实践语音模块接好之后TARS 已经能“听懂话”并把指令交给 Claude Code。接下来要验证它真的能干活自动构建应用并在屏幕上呈现执行过程。7.1 用 Claude Code 生成一个 Flask 应用我们用一个最小但完整的任务来验证 TARS 的“自动构建”能力生成一个 Flask Web 应用包含一个/api/hello接口。cd ~/projects/tars-demo claude -p 在当前目录创建一个最小 Flask 应用包含 GET /api/hello 接口并添加 requirements.txt执行完成后目录里应该会出现类似这样的文件结构tars-demo/ ├── app.py └── requirements.txtapp.py的内容大致是一个标准的 Flask 应用定义。requirements.txt里至少包含flask。这个例子想说明的并不是“Flask 代码怎么写”而是整个流程发生了变化过去你要自己新建文件、写代码、创建依赖文件现在只需要给 Agent 一个自然语言目标剩下的执行细节由它完成。7.2 自动安装依赖并运行健康检查生成代码只完成了一半更接近真实工作的是“装依赖、跑服务、检查是否正常”。继续给 Claude Code 下指令claude -p 安装 requirements.txt 中的依赖启动应用然后请求 /api/hello 验证接口是否正常如果失败自动修复后重试这个任务会让 Claude Code 自动执行类似下面的操作创建虚拟环境或直接安装依赖。后台启动 Flask 应用。用 curl 请求/api/hello。根据返回结果判断是否成功。如果失败读取报错并修改代码再次验证。这就是“自动构建应用”的真实含义不是生成一段代码就结束而是把“生成 → 构建 → 验证 → 修复”的循环交给 Agent 执行。7.3 在屏幕上观察 TARS 的执行过程很多团队使用 Claude Code 时最大的心理障碍是“看不见它在干什么”。解决这个问题有几个层次最基础的方式是把 Claude Code 跑在 VSCode 的终端里。每一条 shell 命令都会显示在终端面板中用户可以实时看到它正在执行什么。进阶的方式是配合 Git 的分支和 diff 功能。Claude Code 修改文件后VSCode 的源代码管理面板会立刻展示变更内容。你可以在它运行结束后逐项审查。如果需要让 TARS 真正“操作屏幕”比如打开浏览器、访问页面、截图可以通过浏览器自动化工具实现。下面是一个 Playwright 的示例让 TARS 打开本地页面并截图文件路径tars/screen_worker.pyfrom playwright.sync_api import sync_playwright def capture_screen(url: str, output: str tars_screen.png