TRTC AI Realtime Interpreter Skill (v1.0)
本文档是 Coding Agent 的执行 SOP,也是面向用户的参考指南。 任何涉及"实时翻译 / AI 会议翻译 / 用 TRTC 做同声传译"的自然语言意图,都应先读本文件再动手。 所有脚本调用必须严格遵守 §11 工具白名单。
0. 路径基线(SKILL_ROOT / PROJECT_ROOT)—— 最高优先级,先读这里
本 Skill 的所有运行时资产(capabilities/、scripts/、scenarios/、auto_adapters/、start.sh)
都在 Skill 自己的目录下,不一定在用户工作区根目录。Skill 可能被安装在任意位置:项目子目录、
.agents/skills/、.codebuddy/skills/ 等。因此永远不要假设"Skill 根目录 == 工作区根目录"。
| 变量 | 含义 | 如何获取 |
|---|---|---|
SKILL_ROOT |
Skill 自己的目录(包含 SKILL.md / scripts/ / capabilities/ ...) |
= 加载本 Skill 时系统注入的 Base directory 绝对路径。Agent 需要记住它。 |
PROJECT_ROOT |
用户当前项目根目录(= 工作区根目录;Path B 的集成目标) | = 当前工作区根目录的绝对路径。 |
硬性规则:
- 所有调用 Skill 内置脚本/资产的命令必须用
SKILL_ROOT的绝对路径,例如:
不要写裸相对路径(假设它相对工作区根目录解析)——这是历史版本最常见的 bug 根源。cd "$SKILL_ROOT" && python3 scripts/verify-credentials.py - 本文档所有含
$SKILL_ROOT/$PROJECT_ROOT的命令模板,Agent 执行前必须替换成真实绝对路径。 - 如果一时确定不了
SKILL_ROOT,做一次性探测(不要让用户挪目录):find "$PWD" -maxdepth 4 -name SKILL.md -path '*trtc-ai-realtime-interpreter*' 2>/dev/null | head -1
1. 何时使用本 Skill
触发条件(见文件头 frontmatter 的 triggers.keywords):用户提到"实时翻译""AI 会议翻译""同声传译""TRTC 翻译"等,
或在已加载本 Skill 的会话里明确表示"开始/跑起来/接入"。
不适用(应拒绝并说明):
- 纯文字翻译(不涉及语音/实时通话)
- 离线文档翻译
- 非 TRTC 生态的实时音视频方案(应引导至对应 Skill)
产品定位说明:本 Skill 封装的是 TRTC Conversational AI(语音)实时翻译能力,默认演示场景是"多人会议室, 谁说话都能被实时翻译"。底层能力包设计上跟具体场景解耦,未来可复用到直播、客服等其他场景,但本次范围聚焦 多人会议翻译,无需向用户提供额外的场景模式选择。
2. 交互语言检测(全程硬性约束)
跟随触发本 Skill 的第一条用户消息判断语言(中文/英文/其他近似英文),存入 interaction_lang;
用户中途明确要求切换语言则立即更新。所有引导文案、ask_followup_question 的问题与选项、
错误提示,均需遵循 interaction_lang。
Path A 场景的 UI 语言默认跟随 interaction_lang(除非用户另有指定);Path B 不生成 UI,
只有"对话语言",交付代码里的注释/README 也遵循 interaction_lang。
2.5 Prompt Reporting
- Root/host bootstrap 统一处理 Prompt、路由和 Host Stop notice;若本 Skill 被直接调用且 Host 未记录本轮,才用 stdin Prompt 入口补一次。普通失败继续业务流程;固定控制 marker 按 root dispatcher 规则处理。
TRTC_REPORTING_NOTICE_REQUIRED_V1时先完成答案,由 Host Stop 展示runtime/continuation-notice.md,模型不得自行附加或改写。 - 展示澄清问题前运行同脚本的
context --question "<完整问题>";固定选项仍使用标准选项 UI。
3. 环境检查(全自动,用户无需操作)
AI 引导话术(用
interaction_lang输出): 开始之前,系统会自动检查运行环境是否满足要求,你不需要做任何事,等一下就好。
执行的检查($SKILL_ROOT 替换为绝对路径):
3.1 Python >= 3.9
python3 -c "import sys; assert sys.version_info >= (3, 9), sys.version" && echo OK || echo BAD_PY
失败 → 提示用户去 https://www.python.org/downloads/ 装新版本,装完再继续。
3.2 Node.js >= 16 + npm(前端构建需要)
node -v 2>/dev/null && npm -v 2>/dev/null && echo OK || echo MISSING
MISSING → 提示用户去 https://nodejs.org/ 安装 Node.js LTS 版(含 npm),装完再继续。
3.3 SKILL_ROOT 校验
test -f "$SKILL_ROOT/capabilities/conversation-core/manifest.yaml" && echo OK || echo MISSING
MISSING → 用 §0.2 的 find 兜底重新确定 SKILL_ROOT。
3.4 .env 状态
test -f "$SKILL_ROOT/capabilities/conversation-core/.env" && echo OK || echo MISSING
- OK → 告知用户"之前配置过密钥,可以直接复用;如需重新配置请告诉我",可跳过 §5(除非用户明确要求重配)
- MISSING → 第一步必须走 §5 三把钥匙配置
4. 路径选择
AI 引导话术:环境检查通过!现在选一下怎么开始体验。
用 ask_followup_question 工具做单选:
[{
"id": "path",
"question": "想怎么开始使用 AI 实时翻译?",
"options": [
"快速开始 —— 直接在浏览器里看到完整效果:一个真实的会议室,参会人说话就有 AI 实时翻译。只需要配 3 把钥匙,系统会自动装好默认能力,2-3 分钟就能看到结果。适合第一次接触、想先看看这东西长什么样的人",
"集成到我的系统 —— 如果你已经有自己的会议室、直播间或者 App,只想把 AI 实时翻译这个能力接进去,选这个。我会给你一套后端 API 和集成示例代码,不生成任何网页界面。同样先配 3 把钥匙"
],
"multiSelect": false
}]
- 选 A → 进入 §6(Path A:快速体验)
- 选 B → 进入 §7(Path B:接入已有系统)
不支持
ask_followup_question的 fallback:用自然语言列出两条路径,从对话中收集用户答案,不要自行假设。
5. 三把钥匙配置
触发条件:§3.3 返回 MISSING,或某个钥匙后续被 verify-credentials.py 判定失败。 命令中的
$SKILL_ROOT替换为绝对路径后执行。 引导风格硬规则:最大程度对新手友好。用"三把钥匙"的比喻、大白话、一次只让用户做一件事。 每把钥匙都遵循同一套流程:①一句话解释它是干嘛的 → ②给一段带占位符的代码块让用户复制、填好、回传 → ③Agent 用write_to_file写进.env→ ④立即跑verify-credentials.py验证 → ⑤只回"收到了,格式没问题", 绝不回显完整钥匙内容。
⚠️ 链接使用红线(违反视为缺陷): 下面每把钥匙的获取链接都是带埋点参数的完整 URL(含
utm_source、utm_medium、utm_campaign、_channel_track_key)。 Agent 向用户展示这些链接时,必须原样复制粘贴完整 URL,不得简化、不得截断、不得去掉查询参数。 例如 TRTC 国际版控制台链接必须包含?quickclaim=engine_trial&utm_source=github&utm_medium=skill&utm_campaign=...&_channel_track_key=3WFHfiqw, 不得简化为https://console.trtc.io/。这是营销归因入口,简化链接会导致埋点丢失。
开场白(对用户说): 要让翻译 Agent 真正"开口"帮你翻译,需要 3 把钥匙,我一把一把带你搞定,不用担心:
- TRTC 应用凭证 —— 让翻译 Agent"开口说话"的语音通道;
- 腾讯云 API 密钥 —— 负责发放临时通行证的"前台"(语音跑在 TRTC 上,凭证在腾讯云签发,两个账号自动打通,不用单独注册);
- LLM 密钥 —— 翻译 Agent 的"大脑",负责听懂你说的话、把它翻译成另一种语言。
5.0 配置方式(两种任选)
方式一:自己填:把 capabilities/conversation-core/.env.example 复制成 .env,照着填。
方式二:发给我,我帮你填:把每把钥匙的值贴给我,我写进 .env。钥匙信息只用于这次配置写入,不会被记录或泄露。
5.1 钥匙 1 · TRTC 应用凭证(语音通道)
AI 话术:
先配第 1 把——TRTC 应用凭证,它是让翻译 Agent"开口说话"的语音通道。
获取步骤:
- 进 TRTC 控制台创建一个支持"对话式 AI"的 RTC Engine 应用(已经有的话直接用)
- 创建完 RTC Engine 应用后,还需要在控制台左侧的 "集成" 标签页下启用 Conference 应用 (这个应用和 RTC Engine 一样都有免费试用,我们的 demo 集成了 Conference 能力,必须启用才能正常使用)
- 进去后找两个信息:SDKAppID(一串数字)和 SDKSecretKey(在"服务端集成"里的长字符串)
- ⚠️ 注意:页面上可能还有个 STSecretKey,那是客户端用的,我们不要——要服务端的 SDKSecretKey
把值填进下面代码块(替换占位文字),整段发给我:
TRTC_SDK_APP_ID=yourSDKAppID # 一个数字 TRTC_SDK_SECRET_KEY=yourSDKSecretKey # 服务端 SDKSecretKey,不是客户端 STSecretKey TRTC_REGION=intl
收到后:
- 校验:SDKAppID 是整数;SDKSecretKey 64 位
[0-9a-f](若检测到 128 位且前后各 64 位相同,自动截断为前 64 位并告知用户) write_to_file("$SKILL_ROOT/capabilities/conversation-core/.env", ...)写入TRTC_SDK_APP_ID=+TRTC_SDK_SECRET_KEY=+TRTC_REGION=- 不回显完整密钥,只确认"收到,格式没问题"
execute_command("cd \"$SKILL_ROOT\" && python3 scripts/verify-credentials.py --type trtc")- 解析 JSON:
ok:true→ 说"这把没问题,下一把"进入钥匙 2;ok:false→ 按 §5.5 错误码表回应
5.2 钥匙 2 · 腾讯云 API 密钥("前台")
AI 话术:
第 2 把——腾讯云 API 密钥,它是负责发放临时通行证的"前台"。TRTC 和腾讯云是同一个账号体系,登录态自动同步,不用重新注册。
获取步骤:
- 打开 https://console.tencentcloud.com/cam/capi?utm_source=github&utm_medium=skill&utm_campaign=Twitter%20AI%20%E4%B8%93%E9%A1%B9%20-%20AI%20Oral%20Coach&_channel_track_key=v0K1Q0DSE
- 页面上会看到 SecretId 和 SecretKey(可能要点"显示"才能看到完整内容)
填进代码块发给我:
TENCENT_CLOUD_SECRET_ID=yourSecretId TENCENT_CLOUD_SECRET_KEY=yourSecretKey
收到后:
- 校验:SecretId 通常 36 位
^[A-Za-z0-9]+$;SecretKey 非空 write_to_file追加TENCENT_CLOUD_SECRET_ID=+TENCENT_CLOUD_SECRET_KEY=+TENCENT_CLOUD_REGION=ap-guangzhouexecute_command("cd \"$SKILL_ROOT\" && python3 scripts/verify-credentials.py --type tencent")- 解析同上;失败按 §5.5 回应
5.3 钥匙 3 · LLM 密钥("大脑")
AI 话术:
最后一把——LLM 密钥,它是翻译 Agent 的"大脑",负责听懂你说的话并翻译成另一种语言。你需要一个 LLM 服务商的账号。
| 服务商 | 模型 | 获取 API Key |
|---|---|---|
| OpenAI | GPT | https://platform.openai.com/api-keys |
| Anthropic | Claude | https://console.anthropic.com/settings/keys |
| Google AI | Gemini | https://aistudio.google.com/apikey |
| DeepSeek | DeepSeek | https://platform.deepseek.com/api_keys |
| Together AI | 开源模型托管 | https://api.together.ai/settings/api-keys |
| Groq | 高性能推理 | https://console.groq.com/keys |
| Cohere | 企业 AI | https://dashboard.cohere.com/api-keys |
| Mistral AI | Mistral | https://console.mistral.ai/api-keys |
填进代码块发给我:
LLM_API_KEY=yourAPIKey LLM_API_URL=yourAPIEndpoint # 用 OpenAI 时可删掉此行 LLM_MODEL=yourModelName
- 用 OpenAI:可以删掉
LLM_API_URL那行(默认就是 OpenAI 地址)- 用其他服务商(DeepSeek/Claude/Gemini 等):必须同时填
LLM_API_URL和LLM_MODEL,去对应服务商文档查"API Base URL"和"Model Name"
收到后:
- 校验:
LLM_API_KEY非空;LLM_API_URL空则默认https://api.openai.com/v1/chat/completions;LLM_MODEL空则默认gpt-4o-mini write_to_file追加对应字段execute_command("cd \"$SKILL_ROOT\" && python3 scripts/verify-credentials.py --type llm")ok:true→ "三把钥匙都配好、也都验证通过了,进入下一步"
5.4 安全约束(红线,违反视为缺陷)
| 红线 | 正确做法 |
|---|---|
| 不把密钥当命令行参数传给任何脚本 | 用 write_to_file 写 .env,再无参数调用 verify-credentials.py |
| 不在聊天回复里回显完整密钥值 | 只确认"收到 + 长度/格式 OK" |
| 不把密钥输出到日志/stdout | verify-credentials.py 只输出 ok/error/message/latency_ms |
不用 echo $SECRET / cat .env |
shell 历史/终端日志会记录 |
| 写完 .env 后权限设为 600 | execute_command("chmod 600 \"$SKILL_ROOT/capabilities/conversation-core/.env\"") |
5.5 错误码 → AI 回应模板
| error | 含义 | AI 该说什么 |
|---|---|---|
| E000 | 密钥未配置/为空 | "这项在 .env 里看起来是空的,请再发一次" |
| E001 | 腾讯云 API 校验失败 | "腾讯云 API 校验失败。常见原因:①Id/Key 顺序可能填反了 ②密钥可能被禁用 ③账号未开通 STS。可在 console.cloud.tencent.com/cam 检查" |
| E002 | TRTC 校验失败 | "TRTC 校验失败。请核对:①SDKAppID 是否属于你的账号 ②是否把 SDKSecretKey 和 STSecretKey 弄混了 ③确认 TRTC_REGION 与你的控制台站点一致(国际站用 intl)" |
| E003 | LLM 校验失败 | "LLM 校验失败。如果用的不是 OpenAI,可能需要更新 API 地址,你用的是哪家服务商?" |
| E004 | 网络不可达 | "连不上校验服务器,请检查:①是否需要代理 ②是否有防火墙限制 ③网络是否正常。也可以先跳过深度校验继续" |
6. Path A:快速体验
用户在 §4 选了 A。默认产物:Vue3 会议室 + AI 实时翻译 demo(真实 TRTC 建房进房 + 房主开关AI + 扇出翻译 + 转写面板)。 命令中的
$SKILL_ROOT替换为绝对路径。
AI 引导话术:好,走快速体验路径!我来把整套会议翻译系统搭起来,你不需要做任何事,等一下就好。
这条路径会装好这些能力:
- conversation-core:拉起真实的语音通话能力
- realtime-translation:语言对驱动的实时翻译(因为配了真实钥匙,翻译是真的)
- meeting-ops:按当前真实参会人扇出翻译(谁说话都能被翻译)
装好后你会打开浏览器,看到一个完整的会议室(可以叫朋友一起进房测试)+ AI 翻译工具栏按钮。
6.1 部署参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| 后端端口 | 8020 | FastAPI 统一托管 API + 构建的前端 dist(不再需要单独的前端 dev server) |
| HTTPS | 自动 | start.sh 检测到 cert.pem/key.pem 就启用 HTTPS(TRTC Web SDK 采集麦克风要求安全上下文),否则 HTTP |
6.2 步骤序列(严格按顺序,钥匙没验证通过绝不启动)
Step 1:配置三把钥匙
test -f "$SKILL_ROOT/capabilities/conversation-core/.env" && echo OK || echo MISSING
MISSING → 走 §5 逐把配置,完成后 chmod 600 "$SKILL_ROOT/capabilities/conversation-core/.env",再回到 Step 2。
Step 2:验证三把钥匙全部有效(关键关卡,不通过不往下走)
cd "$SKILL_ROOT" && python3 scripts/verify-credentials.py --type all
- 期望:
{"ok": true, "type": "all", "items": [...]} - 任一钥匙
ok:false→ 不启动 demo,回到 §5 对应那把重新收集(按 §5.5 错误码表提示用户),验证通过了才继续。 - 没有真实且有效的三把钥匙,demo 起来也无法真正翻译——所以这一步必须真的通过,不能跳过。
Step 3:安装后收尾检查
cd "$SKILL_ROOT" && python3 scripts/post-install-patch.py
预期返回 {"ok": true, ...}(确保 .env 存在且权限 600,能力包声明的模块文件齐全)。
Step 4:部署到独立目录并构建前端(拷贝源码到 Demo 目录,在 Demo 内 npm install + build)
cd "$SKILL_ROOT" && bash scripts/deploy-demo.sh "$PROJECT_ROOT"
预期输出 DEPLOY_OK: <demo_dir>。脚本会自动检查 Node.js/npm 环境,拷贝后端源码 + 前端源码 + .env 到 Demo 目录,然后在 Demo 目录内执行 npm install && npm run build。Skill 目录不产生任何构建产物。
部署后 $PROJECT_ROOT/ai-interpreter-demo/ 目录结构:
ai-interpreter-demo/
├── capabilities/ # 含 .env(三把钥匙)
├── scenarios/meeting-interpreter/
│ ├── backend/ # 后端代码 + start.sh
│ └── ui/ # 前端源码 + dist(构建产物)+ node_modules
所有运行时依赖都在这个独立目录里,不依赖 Skill 文件夹。
Step 5:启动后端(从 Demo 目录启动,后端会自动托管同目录下的前端 dist)
cd "$PROJECT_ROOT/ai-interpreter-demo/scenarios/meeting-interpreter/backend" && nohup bash start.sh > /tmp/meeting-interpreter-backend.log 2>&1 &
sleep 8 && curl -k -sS https://localhost:8020/api/v1/health
首次启动要建 venv + 装后端 Python 依赖(含 tencentcloud-sdk-python),通常 30-60 秒;若健康检查失败,sleep 25 后重试;仍失败查看 tail -80 /tmp/meeting-interpreter-backend.log。
预期 health 返回 {"status": "ok", ...}(三把钥匙都绿)——如果这里显示 missing_credentials,说明 .env 没配好,回到 Step 1。
Step 6:验证前端能正常打开(避免浏览器白屏)
curl -k -sS https://localhost:8020/ | head -5
curl -k -sS -o /dev/null -w "JS HTTP %{http_code}, size=%{size_download}\n" https://localhost:8020/assets/$(ls "$PROJECT_ROOT/ai-interpreter-demo/scenarios/meeting-interpreter/ui/dist/assets/"*.js | head -1 | xargs basename)
curl -k -sS -o /dev/null -w "CSS HTTP %{http_code}, size=%{size_download}\n" https://localhost:8020/assets/$(ls "$PROJECT_ROOT/ai-interpreter-demo/scenarios/meeting-interpreter/ui/dist/assets/"*.css | head -1 | xargs basename)
预期:HTML 200 + JS 200(10MB左右)+ CSS 200(500KB左右)。如果任何一项返回 503/HTML "前端资源缺失" 页面,说明部署目录被损坏——重新执行 Step 4 即可。
Step 7:输出访问入口
全部搭好了!打开浏览器访问:
| 页面 | 地址 | 说明 |
|---|---|---|
| 会议室 + AI 翻译 | https://localhost:8020 | 主入口(后端会一起托管构建的前端,浏览器打开这里就行) |
| 后端 API 自检 | https://localhost:8020/api/v1/health | 三把钥匙连通状态 |
| API 文档 | https://localhost:8020/docs | FastAPI Swagger |
体验建议:
· 建房进房后,点工具栏里的 AI 翻译按钮(仅主持人可点)→ 选语言对 → 开启
· 参会人说话,会看到实时字幕 + 译文播报
· 打开转写面板看双语对照记录
说明:AI 翻译按钮"仅主持人可操作"是本 demo 的产品设计(控制云服务调用开销)。如果你是要把这套能力接进自己已有的系统,请回到开头选"接入我已有的系统"路径。
6.3 启动后:输出进阶自定义提示(被动模式)
核心规则:Demo 跑起来后,只输出下面的纯文本提示——绝不主动触发
ask_followup_question。等用户自己表达了对应意图,再按 §6.4 / §6.5 / §6.6 的指引去响应。这样不会打断刚搭完的用户的体验,也不强迫他们进入不需要的配置。
Path A 成功后,在 Step 7 的输出之后追加这段固定文案(按 interaction_lang 选用对应版本):
中文版:
Demo 已经跑起来了!现在用的是默认的语音模型和 3 组语言对,你可以直接在会议室里开始体验实时翻译。
如果后续想做进阶自定义,随时告诉我就行——现在不用决定:
1. 更换 STT / LLM / TTS 模型
把翻译引擎换成其他模型组合,比如换 DeepSeek 做翻译、换第三方 TTS 音色。
→ 跟我说"我想更换模型配置"
2. 支持更多语言对
除了默认的中英/中粤/英粤之外,想加入法语、日语、韩语等其他语种的翻译方向。
→ 跟我说"我想添加更多语言对"
3. 定制会议室 UI
调整颜色、布局、Logo,或改掉工具栏/转写面板的交互细节,让它更贴合你的品牌。
→ 跟我说"我想自定义前端界面"
English version:
Demo is up and running! It uses the default voice models and 3 language pairs — you can start experiencing real-time interpretation in the meeting room right away.
If you want advanced customization later, just tell me — no need to decide now:
1. Switch STT / LLM / TTS models
Replace the translation engines with other model combos — e.g. use DeepSeek for translation or switch to a third-party TTS voice.
→ Tell me "I want to switch model config"
2. Support more language pairs
Beyond the default zh-en / zh-yue / en-yue, add French, Japanese, Korean and other translation directions.
→ Tell me "I want to add more language pairs"
3. Customize the meeting room UI
Adjust colors, layout, logo, or modify the toolbar / transcription panel interactions to match your brand.
→ Tell me "I want to customize the frontend UI"
6.4 更换模型配置(仅在用户触发后执行)
触发意图:用户说"更换模型配置" / "换模型" / "切换 STT" / "换 TTS 音色" / "switch model config" 等。
触发后,告知用户配置入口并给出指引:
好,当前 Demo 使用的模型配置都在
.env里,我帮你说明怎么改:更换 LLM(翻译大脑): 编辑
ai-interpreter-demo/capabilities/conversation-core/.env:
LLM_MODEL:换成你想要的模型名称(如deepseek-chat、gemini-2.0-flash等)LLM_API_KEY:换成新模型的 API KeyLLM_API_URL:换成新模型的 API 地址(如 DeepSeek 填https://api.deepseek.com/v1/chat/completions)- 改完重启后端生效:
cd ai-interpreter-demo/scenarios/meeting-interpreter/backend && bash start.sh更换 TTS 音色: 编辑
ai-interpreter-demo/capabilities/realtime-translation/src/modes.py,把目标 TTSvoice_id换成你想要的音色。 支持的内置音色列表和第三方 TTS 配置参数见 TTS 文档。 改完后重新部署一次:cd "$SKILL_ROOT" && bash scripts/deploy-demo.sh "$PROJECT_ROOT"(保留 .env 不变)更换 STT 语种引擎: 同样在
modes.py里改stt_lang字段。当engine_model_type=bigmodel时,支持 30 种语种(见 STT 文档)。 改完同样重新部署生效。
如果用户说"不知道怎么选":读取 .env 当前值,将 README 中"进阶:自定义 TRTC Conversational AI"章节的文档链接给用户参考。
6.5 添加更多语言对(仅在用户触发后执行)
触发意图:用户说"添加更多语言对" / "支持法语翻译" / "加日语" / "add more language pairs" 等。
触发后,告知用户语言对配置方式:
好,添加新语言对需要两步:
Step 1:在
modes.py里新增一个条目 编辑ai-interpreter-demo/capabilities/realtime-translation/src/modes.py,在MODE_CONFIG字典里追加新区块:"zh-ja": { "from_lang": "Chinese", "to_lang": "Japanese", "stt_lang": "zh", "tts_voice_id": "v-female-p9Xy7Q1L", # 参考 TTS 文档选合适的音色 "system_prompt": "You are a real-time interpreter. Detect whether input is Chinese or Japanese and translate to the other language. Output only the translation, no greetings or explanations.", }Step 2:重新部署让改动生效
cd "$SKILL_ROOT" && bash scripts/deploy-demo.sh "$PROJECT_ROOT"这会保留现有的
.env密钥配置,只更新代码。部署完重启后端即可。
注意:
6.6 自定义前端 UI(仅在用户触发后执行)
触发意图:用户说"自定义前端界面" / "改会议室 UI" / "改颜色/布局/Logo" / "customize frontend" 等。
触发后,指引用户修改方向:
好,前端代码在
ai-interpreter-demo/scenarios/meeting-interpreter/ui/下,是标准的 Vue3 + Vite + Tailwind CSS 项目。你可以这样上手:快速改外观(不改逻辑):
- 颜色/主题:编辑
ui/tailwind.config.js或ui/src/style.css,替换颜色变量- Logo/品牌:在
ui/src/components/conference/TopBar.vue中替换 Logo 图片或文字- 文案:所有界面文字直接在各
.vue组件中修改改交互逻辑:
- 工具栏:编辑
ui/src/components/conference/Toolbar.vue(AI 翻译按钮、语言对选择器)- 转写面板:编辑
ui/src/components/conference/TranscriptPanel.vue(双语对照视图)- 字幕样式:编辑
ui/src/components/conference/ChatPanel.vue(实时气泡)本地开发 & 预览:
cd ai-interpreter-demo/scenarios/meeting-interpreter/ui npm run dev这会启动 Vite dev server(默认 http://localhost:5173),改代码实时热更新。
确认没问题后构建:
cd ai-interpreter-demo/scenarios/meeting-interpreter/ui npm run build构建产物会更新到
ui/dist/,后端会自动托管最新版本。
注意:
silent-listener.ts和subtitle-parser.ts是框架无关的能力片段,不建议手改——它们对接 TRTC 底层消息协议,改动可能导致字幕/转写失效。
6.7 禁止事项
- ❌ 用裸相对路径调用脚本(必须
cd "$SKILL_ROOT"或用绝对路径) - ❌ 跳过 Step 1 的 .env 检查
- ❌ 把任何密钥当命令行参数传给脚本
- ❌ 修改
capabilities/*/src/下骨架层代码去"抢时间",应该通过场景层scenarios/meeting-interpreter做 glue - ❌ 执行
git commit/git push(除非用户明确要求) - ❌ 在聊天回复里回显完整密钥内容
7. Path B:集成到我的系统(只给后端能力,不生成 UI)
用户在 §4 选了 B。关键定位:把 AI 实时翻译的后端能力接进用户的现有项目(
PROJECT_ROOT), 不生成任何前端 UI,但生成完整的 API 集成代码。
AI 引导话术(大白话,小白友好): 好,那我把 AI 实时翻译的能力接进你现在的系统里。这条路我不会生成任何网页界面——界面还是用你自己的, 我只把"翻译大脑"这部分能力给你,再配一份现成的对接代码,你的开发同学照着接就行。
接下来分几步走,很简单:
- 先跟你一起配好 3 把钥匙(跟快速开始那条路一样);
- 我验证这 3 把钥匙都能用;
- 把翻译后端跑起来,确认它真的能翻译;
- 按你的项目技术栈,生成一份对接示例代码交给你。
先从配钥匙开始。
7.1 三把钥匙配置 + 验证(和 Path A 完全一样,先配再验)
test -f "$SKILL_ROOT/capabilities/conversation-core/.env" && echo OK || echo MISSING
MISSING → 走 §5 逐把配置(翻译能力硬依赖三把钥匙,全部必填)。
配完后必须验证全部通过再往下走:
cd "$SKILL_ROOT" && python3 scripts/verify-credentials.py --type all
期望 {"ok": true, ...};任一 ok:false → 回 §5 重配那把,验证通过才继续。
7.2 确认集成目标(PROJECT_ROOT + 技术栈)
- 确认
PROJECT_ROOT(默认当前工作区根目录;如果用户项目在子目录,让其指定) - 自动检测技术栈:
cd "$SKILL_ROOT" && python3 scripts/add-capability.py --list
7.3 把翻译后端跑起来并验证(无 UI,接口层验证)
cd "$SKILL_ROOT" && nohup bash start.sh > /tmp/trtc-interpreter-start.log 2>&1 &
sleep 8 && curl -sS http://localhost:8020/api/v1/health
期望:health 返回 status: ok,三把钥匙(tencent_cloud / trtc / llm)全绿。
再确认翻译能力路由挂载正常:
curl -sS "http://localhost:8020/api/v1/meeting/session/state?room_id=smoke_test"
返回 {"active": false, ...} 即说明能力路由已就绪。
7.4 生成对接示例代码交付给用户
cd "$SKILL_ROOT" && python3 scripts/add-capability.py realtime-translation meeting-ops \
--target-project "$PROJECT_ROOT" --apply
产出落在 $PROJECT_ROOT/ai-interpreter-integration/:
frontend/silent-listener.ts+frontend/subtitle-parser.ts(框架无关的前端片段:进房收字幕 + 解析双语转写)backend/fastapi_reverse_proxy.py(若检测到 Python 后端;含一个必须由用户实现的权限校验占位函数)- 若识别不出技术栈,输出
auto_adapters/integration_templates/generic-rest-api.md路径,引导用户按 REST API 手动接入
必须主动向用户说明的一件事(大白话):
有个地方需要你自己接一下:触发翻译这个动作,涉及真实的云服务调用(要花钱的),所以"谁有权限开翻译" 这件事应该由你自己系统来判断——比如是不是房间的管理员。我给的示例代码里留了一个位置,你把你系统里 判断权限的逻辑填进去就行。具体在
auto_adapters/integration_templates/room-owner-authz-note.md里有说明和示例。
7.5 最终交付清单
AI 话术:搞定!这是交给你的东西:
- 一份后端 API 文档(浏览器打开
http://localhost:8020/docs就能看)- 一套对接示例代码,放在你项目的
ai-interpreter-integration/目录里- 一份权限校验的接入说明(那个需要你自己填的地方)
接下来交给你的开发同学:照着示例代码把翻译能力接进你的系统,把留空的权限判断补上, 再把前端片段接到你自己会议室/直播间的 SDK 上收字幕就行。有问题随时回来找我。
7.6 禁止事项(Path B)
- ❌ 生成任何前端 UI(那是 Path A 专属)
- ❌ 用裸相对路径调用脚本
- ❌ 帮用户实现真实的权限校验逻辑(只给占位函数 + 说明,用户自己接自己的鉴权体系)
- ❌ 修改
capabilities/*/src/骨架/能力包代码 - ❌ 三把钥匙没验证通过就启动服务
8. 启动与验证(通用)
8.1 Path A 独立重启
cd "$PROJECT_ROOT/ai-interpreter-demo/scenarios/meeting-interpreter/backend" && bash start.sh
后端从独立 Demo 目录启动,会自动托管同目录下的前端 dist 和 .env,浏览器直接打开
https://localhost:8020即可。 不需要也不应该再单独跑npm run dev——那是开发修改 UI 时才用的命令,不属于运行 Path A 的一部分。 如果修改了前端代码需要重新部署:cd "$SKILL_ROOT" && bash scripts/deploy-demo.sh "$PROJECT_ROOT"如果只改了前端代码、只想重新构建(不重新拷贝):cd "$PROJECT_ROOT/ai-interpreter-demo/scenarios/meeting-interpreter/ui" && npm run build
8.2 Path B 独立重启
cd "$SKILL_ROOT" && bash start.sh [--port N]
8.3 健康自检
curl -k -sS https://localhost:8020/api/v1/health # Path A(HTTPS 自签证书)
curl -sS http://localhost:8020/api/v1/health # Path B(骨架默认 HTTP)
期望:status 为 ok,三个 LED 全绿。
9. 常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| 密钥校验失败 | 配置的密钥过期或填错 | 回到 §5 逐项核对,只需重填校验失败的那一项 |
| 翻译启动报 UserSig 过期或错误 | TRTC_REGION 与应用所在站点不匹配 | 检查 .env 里 TRTC_REGION:国际站应用必须用 intl,改完后需重启后端服务 |
| 端口被占用 | 8020 被其他程序占用 | 换端口(PORT=8080 bash start.sh),或 lsof -ti :8020 -sTCP:LISTEN | xargs kill |
| 网络不可达 | 公司网络/防火墙限制 | 检查是否需要代理,或联系网络管理员放通相关域名 |
| Python 版本太老 | Python < 3.9 | 去 https://www.python.org/downloads/ 装新版本 |
| 找不到资产/脚本报"No such file" | 用了裸相对路径,cwd 不是 SKILL_ROOT | 按 §0 重新确定绝对 SKILL_ROOT,所有命令 cd "$SKILL_ROOT" 或用绝对路径 |
| Path A 浏览器看到旧页面 | 浏览器缓存 | 强制刷新(Cmd+Shift+R / Ctrl+Shift+R) |
| meeting-ops 接口谁都能调用怎么办 | 这是设计如此,权限交给集成方 | 见 §7.4 的权限校验提示,接入自己系统的鉴权 |
| 多路 TTS 声音在同一房间叠放 | 多人同时说话,多路翻译并发播报 | v1 已知限制,明确不在本次范围内 |
10. 明确不在本次范围内(记录不做,避免重复讨论)
- AI 开关打开后新加入会议的人自动补一路翻译(v1 只做开关瞬间的快照式扇出)
- 多人同时说话时多路 TTS 声音叠放的体验优化
- 房间级 AI 状态的持久化存储(demo 规模内存态足够;生产场景集成方自行接 Redis 等)
- meeting-ops 内置任何形式的权限校验(明确设计为不做,见 §7.4)
11. AI 工具白名单(强制)
所有
$SKILL_ROOT/$PROJECT_ROOT执行前替换为绝对路径。调用脚本永远cd "$SKILL_ROOT"或用绝对路径。
11.1 允许的命令(execute_command)
| 命令 | 用途 |
|---|---|
python3 -c "import sys; assert sys.version_info >= (3,9)" |
前置检查 |
test -f "$SKILL_ROOT/<path>" && echo OK || echo MISSING |
文件存在性检查 |
find "$PWD" -maxdepth 4 -name SKILL.md -path '*trtc-ai-realtime-interpreter*' |
SKILL_ROOT 兜底探测 |
node -v 2>/dev/null && npm -v 2>/dev/null |
Node.js/npm 环境检查 |
cd "$SKILL_ROOT" && python3 scripts/verify-credentials.py [--type tencent|trtc|llm] [--no-deep] |
密钥校验 |
cd "$SKILL_ROOT" && python3 scripts/add-capability.py --list |
列出能力包 |
cd "$SKILL_ROOT" && python3 scripts/add-capability.py <names> --target-project "$PROJECT_ROOT" --apply |
Path B 集成资产渲染 |
cd "$SKILL_ROOT" && python3 scripts/post-install-patch.py |
安装后收尾检查 |
cd "$SKILL_ROOT" && bash scripts/deploy-demo.sh "$PROJECT_ROOT" |
Path A 独立部署(拷贝源码到 Demo 目录 + 在 Demo 内构建前端) |
cd "$PROJECT_ROOT/ai-interpreter-demo/scenarios/meeting-interpreter/backend" && bash start.sh |
Path A 启动(从 Demo 目录启动后端) |
cd "$SKILL_ROOT" && bash start.sh [--port N] |
Path B 骨架启动 |
sleep N && curl -k -sS https://localhost:PORT/api/v1/health |
健康检查 |
tail -80 /tmp/*.log |
启动失败诊断 |
lsof -ti :PORT -sTCP:LISTEN |
查端口占用 |
chmod 600 "$SKILL_ROOT/capabilities/conversation-core/.env" |
收紧权限 |
11.2 禁止的命令
| 命令 | 禁止原因 |
|---|---|
| 把密钥当命令行参数传给任何脚本 | shell 历史泄露 |
echo $TENCENT_CLOUD_SECRET_ID / cat .env |
可能通过终端记录/截图泄露 |
git add . && git commit(未经用户要求) |
可能误提交密钥 |
裸相对路径调用脚本(不 cd "$SKILL_ROOT") |
cwd 假设错误 -> 找不到资产 |
11.3 文件写入白名单(write_to_file)
| 路径 | 用途 |
|---|---|
$SKILL_ROOT/capabilities/conversation-core/.env |
密钥写入 |
$PROJECT_ROOT/ai-interpreter-integration/** |
Path B 集成示例(由脚本生成,非 AI 手写) |
/tmp/*.log |
启动日志 |
其他文件写入需要用户明确确认后才能进行。
特别注意:capabilities/*/src/ 下的骨架/能力包代码是可复用层,不应因为单个场景需求被直接手改——场景专属逻辑应放进 scenarios/meeting-interpreter/backend/。
最后提醒(Coding Agent 内化):
- 🔴 先按 §0 确定
SKILL_ROOT(=注入的 Base directory)和PROJECT_ROOT,一切命令用绝对路径,永远不要让用户挪目录。- 每一步先调用工具拿事实,再讲给用户听(不要凭记忆回答)。
- 工具调用失败 -> 给用户 stderr 摘要,不要隐藏错误。
- 严格遵守 §11 工具白名单与 §5.4 安全红线。
- 钥匙没验证通过(
verify-credentials.py --type all返回 ok:true)绝不启动 demo——没有真实有效的三把钥匙,demo 起来也无法真正翻译。这是 Path A Step 2 / Path B §7.1 的硬关卡。- Path A 必须按 §6.2 的 7 步顺序走,别漏 Step 2(验证钥匙)和 Step 4(拷贝 dist 到独立目录)。
- Path A 跑完后:按 §6.3 输出被动提示(只输出纯文本,不主动弹
ask_followup_question),等用户自己触发 §6.4/§6.5/§6.6 的指引。- Path B 绝不生成任何 UI;对接代码里的权限校验占位必须主动提示用户填,不要漏。
meeting-ops明确不做权限校验,这是设计决策,不是缺陷——不要"好心"帮它加上。