模块化基座 Skill — 功能按需配置,所有环境变量均为 选填。 有配置就启用对应功能,无配置则跳过。完整功能需要飞书 + MiniMax + 多维表格。
模块环境变量说明飞书语音推送FEISHU_APP_ID, FEISHU_APP_SECRET, FEISHU_USER_OPEN_ID发 TTS 语音到飞书MiniMax TTSMINIMAX_API_KEY云端语音合成(主方案)Piper 本地 TTSPIPER_BIN, PIPER_MODEL完全离线的语音兜底SenseVoice 本地 ASRSENSE_VOICE_MODEL_DIR完全离线的语音识别多维表格记忆BITABLE_APP_TOKEN, BITABLE_WORDS_TABLE_ID, BITABLE_CHAT_TABLE_ID单词记录 + 艾宾浩斯定时推送cron jobs08:00 / 12:00 / 20:00(可单独开启)
原则:填了变量 → 启用该模块;没填 → 该模块静默跳过,不报错。
text
english-tutor/
├── SKILL.md
├── metadata.json
├── _meta.json
├── agent/ ← 核心 Node.js 运行时
│ ├── config.js ← 配置(全部选填,env 注入)
│ ├── minimax.js ← MiniMax TTS + Chat API
│ ├── memory.js ← 多维表格记忆(可选)
│ └── agent.js ← 主流程入口
├── scripts/ ← Python 辅助脚本
│ ├── check_env.py ← 环境检测
│ ├── config_manager.py ← 配置管理
│ ├── download_model.py ← SenseVoice 模型下载
│ ├── feishu_voice.py ← 飞书语音发送(TTS→Opus→上传→发送)
│ ├── transcribe.py ← ASR 转录(本地/云端)
│ └── wordlist_parser.py ← 单词表解析器
├── references/
│ └── config-schema.md
└── assets/
└── wordlist_example.csv
变量默认值说明FEISHU_APP_ID``""飞书应用 App ID(填了才发飞书语音)FEISHU_APP_SECRET``""飞书应用 SecretFEISHU_USER_OPEN_ID``""接收语音的飞书用户 Open ID
变量默认值说明MINIMAX_API_KEY``""MiniMax API Key(不填则跳过云端 TTS)MINIMAX_TTS_MODEL``speech-2.8-hdTTS 模型MINIMAX_TTS_SPEED``1.05语速MINIMAX_TTS_VOICE_ID``male-qn-qingse音色 IDPIPER_BIN``""Piper 主程序路径(不填则跳过本地 TTS)PIPER_MODEL``""Piper ONNX 模型路径TTS_PROVIDER``minimax优先方案: minimax / piper
变量默认值说明SENSE_VOICE_MODEL_DIR``""SenseVoice 模型目录(不填则跳过本地 ASR)
变量默认值说明BITABLE_APP_TOKEN``""App Token(不填则无艾宾浩斯记忆)BITABLE_WORDS_TABLE_ID``""words 表 IDBITABLE_CHAT_TABLE_ID``""chat_log 表 ID
变量默认值说明DAILY_WORD_MAX``15每日新词上限
本 skill 为 Credential-Using Skill,但 所有凭据均为选填:
json
{
"credential_using": true,
"required_credentials": [],
"optional_credentials": [
{ "name": "FEISHU_APP_ID", "description": "飞书语音推送" },
{ "name": "FEISHU_APP_SECRET", "description": "飞书语音推送" },
{ "name": "FEISHU_USER_OPEN_ID","description": "飞书语音推送" },
{ "name": "MINIMAX_API_KEY", "description": "云端 TTS + LLM 对话" },
{ "name": "BITABLE_APP_TOKEN", "description": "艾宾浩斯记忆(可选)" },
{ "name": "BITABLE_WORDS_TABLE_ID", "description": "单词记录表" },
{ "name": "BITABLE_CHAT_TABLE_ID", "description": "对话历史表" }
]
}
时间cron说明晨间0 8 * * *通勤场景跟读午间0 12 * * *口语问答晚间0 20 * * *复盘 + 旧词复习
定时任务默认关闭,用户在引导设置中自行选择开启哪些。
FEISHU_APP_ID / FEISHU_APP_SECRET / FEISHU_USER_OPEN_IDMINIMAX_API_KEYPIPER_BIN / PIPER_MODELSENSE_VOICE_MODEL_DIR(或运行 python3 scripts/download_model.py)BITABLE_APP_TOKEN + 两个表 ID_isReady() 返回 false,所有方法静默跳过env= 参数传递给 Node.js 子进程(内存传递)~/.openclaw/english-tutor/config.json 设为 600bash
mkdir -p /vol1/@apphome/trim.openclaw/data/workspace/piper/voices
curl -L https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_amd64.tar.gz \
-o /tmp/piper.tar.gz && tar xf /tmp/piper.tar.gz -C /tmp
curl -L "https://hf-mirror.com/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx" \
-o /vol1/@apphome/trim.openclaw/data/workspace/piper/voices/en_US-lessac-medium.onnx
bash
pip install --user --break-system-packages numpy sherpa-onnx
python3 /vol1/@apphome/trim.openclaw/data/workspace/skills/english-tutor/scripts/download_model.py
CSV(推荐):
csv
word,pronunciation,meaning,example
commute,/kəˈmjuːt/,通勤,I commute by subway every day.
纯文本(每行一个):
text
commute,通勤
subway,地铁
transfer,换乘
复习轮次间隔第 1 次次日第 2 次3 天后第 3 次7 天后第 4 次15 天后第 5 次+掌握(不再自动提醒)