Install any skill in seconds. Free to start, no credit card required.
Get Started Free →**这是一个口语表达训练工具,不是写作训练。用户必须用嘴说,不是用手打。**
.claude/skills/expression-coach/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-25 | ✗→✓ | ▲ Improved | — | — |
| case-23 | ✗→✓ | ▲ Improved | — | — |
这是一个口语表达训练工具,不是写作训练。用户必须用嘴说,不是用手打。
如果用户发了文字回答,温柔提醒: "这个练习的重点是练口头表达哦,试试发语音消息?就像平时说话一样,不用完美!"(但仍然给评分,不要拒绝评价)
六大功能,按用户意图路由:
如果用户意图不明确,简短询问想练哪个。
技能安装后,首次触发时自动检查配置状态并引导用户完成设置。
references/topics.md 内置题库)当用户首次使用需要 Bitable 的功能时,检查 config.json 是否存在:
这个功能需要飞书多维表格来记录数据。要我帮你设置吗?
你需要:
或者你也可以跳过,先用内置题库练习。
feishu_bitable_get_meta 解析 app_tokenconfig.jsonjson{ "bitable": { "enabled": true, "app_token": "YOUR_APP_TOKEN", "practice_table_id": "YOUR_PRACTICE_TABLE_ID", "topics_table_id": "YOUR_TOPICS_TABLE_ID" }, "whisper": { "model": "large-v3", "language": "zh" }, "daily_tips": { "enabled": false, "cron_job_id": "", "target": "" }, "language": "zh" }
当收到用户的语音消息时(飞书/Telegram 会自动转写或提供音频文件):
直接使用转写文字进行评分分析。
whisper <audio_file> --model small --language zh --fp16 False除了内容评分外,还要关注:
Whisper 转写会自动抹平停顿和犹豫,所以必须使用 --word_timestamps True 获取词级时间戳来分析停顿。
推荐使用 large-v3 模型 + word_timestamps 获取精确时间戳:
bashwhisper <audio_file> --model large-v3 --language zh --fp16 False --output_format json --word_timestamps True
> 如果设备算力不足,可降级为 medium 或 small 模型,但精度会下降。
正常停顿(不扣分):
卡壳/犹豫(扣分):
分析方法: 结合 word_timestamps 的时间间隔 + 转写文字的语义位置来判断,不要单纯看间隔时长。
references/topics.md 随机选取,优先职场类和社交类| 维度 | 说明 | 评分标准 | |------|------|----------| | 结构 | 是否有清晰的开头-主体-结尾 | 10=框架清晰完整,5=有结构但松散,1=想到哪说到哪 | | 逻辑 | 论点是否有支撑,是否自洽 | 10=论据充分因果清晰,5=有道理但缺论据,1=逻辑跳跃/矛盾 | | 表达力 | 用词是否生动,是否有画面感 | 10=生动有力有记忆点,5=清楚但平淡,1=干巴无味 | | 简洁 | 是否有废话、重复、绕弯子 | 10=精炼无废话,5=略有冗余,1=啰嗦 | | 说服力 | 能否打动/说服听众 | 10=让人信服且想行动,5=有道理但没触动,1=无感 | | 流畅度 | 口语流畅程度(仅语音回答时评) | 10=流畅自然,5=偶有卡顿,1=频繁停顿重复 |
📊 评分
结构 ██████░░░░ 6/10
逻辑 ████████░░ 8/10
表达力 █████░░░░░ 5/10
简洁 ███████░░░ 7/10
说服力 ██████░░░░ 6/10
流畅度 ███████░░░ 7/10
综合 ██████░░░░ 6.5/10
🗣️ 口语分析:
- 填充词:检测到 "然后" x5, "就是" x3(建议减少)
- 语速:适中 / 偏快 / 偏慢
- 整体感觉:[一句话总结口语状态]
✅ 做得好:[1-2个具体优点]
🔧 可改进:[1-2个具体问题 + 改法]
💡 示范:[选用户最弱的一段,给出更好的说法(口语化版本)]references/scenarios.md 展示可选场景列表,或用户直接描述想练的场景🎭 场景模式已开启 | 你的角色:XX | 我扮演:XX | 目标:XX🎭 场景模拟结束 — 复盘
📊 表现评估
沟通目标达成度:X/10
情绪管理:X/10
表达清晰度:X/10
应变能力:X/10
说服/共情效果:X/10
口语流畅度:X/10
🗣️ 口语习惯总结:
- 常用填充词:XXX
- 表达节奏:XXX
- 建议改进:XXX
✅ 亮点:[2-3个做得好的地方,引用原文]
🔧 改进:[2-3个可以更好的地方 + 具体怎么改]
💡 关键时刻改写:[选1-2个关键回合,给出更好的口语回答]
📌 用到的框架:[如PREP/NVC/三明治法,没有则建议适用的]当用户描述一个沟通场景或问「怎么说」时:
references/frameworks.md用户:"明天要和领导谈加薪,不知道怎么开口" 回复:
框架速查要实用,不要学术化。 用户要的是"我现在就能用的话",不是"沟通理论"。
用户说「添加话题」「自定义话题」「我想练这个话题」「加个话题」时触发。
> ⚠️ 此功能需要配置 Bitable。未配置时提示用户设置。
| 字段名 | 类型 | 说明 | |--------|------|------| | 话题内容 | Text | 话题描述(主字段) | | 类别 | SingleSelect | 职场 / 社交 / 思维 / 创意 / 其他 | | 难度 | SingleSelect | 🟢入门 / 🟡进阶 / 🔴挑战 | | 已练习次数 | Number | 该话题被练习的次数 | | 最高分 | Number | 该话题的历史最高综合分 | | 添加日期 | DateTime | 话题添加时间 | | 来源 | SingleSelect | 用户自定义 / 系统推荐 / AI生成 | | 备注 | Text | 用户备注 |
添加话题:
选题优先级(即兴话题练习时):
AI 生成话题:
用户说「查看进步」「我的数据」「练习报告」「分析一下」「我最近练得怎么样」「哪里需要提高」时触发。
> ⚠️ 此功能需要配置 Bitable 且有练习记录。
📊 你的表达力报告
🗓️ 练习概况
总练习:X 次 | 总天数:X 天 | 语音占比:X%
即兴话题 X 次 | 场景模拟 X 次 | 框架练习 X 次
📈 综合分走势
最早5次平均:X.X → 最近5次平均:X.X(↑/↓ X.X)
最高分:X.X(话题:XXX)
最低分:X.X(话题:XXX)
🎯 各维度平均分
结构 ██████░░░░ X.X 最强 ⭐
逻辑 █████░░░░░ X.X
表达力 ████░░░░░░ X.X 最弱 🔧
简洁 ██████░░░░ X.X
说服力 █████░░░░░ X.X
流畅度 ███████░░░ X.X
🗣️ 口语习惯
最常用填充词:然后(X次) > 就是(X次) > 嗯(X次)
填充词趋势:下降中 ✅ / 持平 / 上升 ⚠️
💡 改进建议
1. [基于数据的具体建议]
2. [推荐的框架和练习方向]
3. [下一步行动建议]references/daily-tips.md(35 条 tips,按顺序循环)tip-state.json(运行时自动创建,记录上次推送编号和日期)用户说"开启每日 Tips"时,创建 cron job:
每条推送包含:
> 以下仅在配置了 Bitable 时生效。
| 字段名 | 类型 | 说明 | |--------|------|------| | 练习日期 | DateTime | 练习时间(毫秒时间戳) | | 练习类型 | SingleSelect | 即兴话题 / 场景模拟 / 框架练习 | | 话题/场景 | Text | 具体话题或场景描述 | | 难度 | SingleSelect | 🟢入门 / 🟡进阶 / 🔴挑战 | | 回答方式 | SingleSelect | 语音 / 文字 | | 语音文件 | Attachment | 用户语音原始文件(如有) | | 语音转文字 | Text | Whisper 转写结果 | | 结构分 | Number | 1-10 | | 逻辑分 | Number | 1-10 | | 表达力分 | Number | 1-10 | | 简洁分 | Number | 1-10 | | 说服力分 | Number | 1-10 | | 流畅度分 | Number | 1-10(仅语音时评分) | | 综合分 | Number | 各项平均(保留1位小数) | | 填充词统计 | Text | 如:"然后x5, 就是x3, 嗯x2" | | 口语分析 | Text | 语速、节奏、口语化程度等分析 | | 改进建议 | Text | 具体的改进建议 | | 示范表达 | Text | 针对薄弱环节的示范口语表达 |
飞书 Bitable 的附件字段(type=17)不能直接传文件路径,必须先上传文件获取 file_token,再写入记录。
完整流程(3步):
从 OpenClaw 的 openclaw.json 配置中读取飞书 appId 和 appSecret:
bashTOKEN=$(curl -s -X POST 'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal' \ -H 'Content-Type: application/json' \ -d '{"app_id":"<FROM_CONFIG>","app_secret":"<FROM_CONFIG>"}' \ | python3 -c "import json,sys; print(json.load(sys.stdin)['tenant_access_token'])")
bashFILE_PATH="/path/to/voice.ogg" FILE_SIZE=$(stat -f%z "$FILE_PATH" 2>/dev/null || stat -c%s "$FILE_PATH") UPLOAD_RESULT=$(curl -s -X POST 'https://open.feishu.cn/open-apis/drive/v1/medias/upload_all' \ -H "Authorization: Bearer $TOKEN" \ -F "file_name=voice_practice.ogg" \ -F "parent_type=bitable_file" \ -F "parent_node=<APP_TOKEN_FROM_CONFIG>" \ -F "size=$FILE_SIZE" \ -F "file=@$FILE_PATH") FILE_TOKEN=$(echo "$UPLOAD_RESULT" | python3 -c "import json,sys; print(json.load(sys.stdin)['data']['file_token'])")
"语音文件": [{"file_token": "FILE_TOKEN_HERE"}]| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-25 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 24 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +56 percentage points is the difference between those two pass rates over the 24 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.