# Feishu Mood Music

> 飞书音乐心情伴侣。识别用户的情绪状态，生成匹配的治愈/陪伴音乐并发送到飞书群。 三级触发机制： (1) 显式触发（直接要歌）："来首歌"、"想听歌"、"来首应景的"、"音乐治愈"、"解压音乐"、"放首歌" (2) 半隐式触发（情绪词 + @机器人）："心情不好"、"有点累"、"好烦"、"需要放松"、"emo了"、"压力好大"、"开心"、"兴奋" (3) 全隐式触发（极端情绪词，无需@，自动送歌）："烦死了"、"无语死了"、"崩溃了"、"活不下去"、"气炸了"、"爽死了"、"太开心了"、"牛逼炸了" 当用户表达情绪状态并需要音乐陪伴时激活。

- Skill: `lord1egypt/feishu-mood-music` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lord1egypt/feishu-mood-music`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lord1egypt/feishu-mood-music/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Lord1Egypt (https://skillmd.com/u/lord1egypt)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/lord1egypt/feishu-mood-music

---


# 飞书音乐心情伴侣 — Mood Music Companion

感知用户情绪，生成治愈音乐，通过飞书消息即时送达。不是冷冰冰的点歌台，是一个懂你情绪的音乐搭档。

**依赖**：MiniMax CLI（`mmx-cli`）+ Token Plan

---

## 快速配置（首次使用）

### 1. 安装 MiniMax CLI

```bash
npm install -g mmx-cli
```

> 需要 Node.js 18+。完整文档：https://github.com/MiniMax-AI/cli

### 2. 订阅 Token Plan

前往 MiniMax 平台订阅 Token Plan（音乐生成需要额度）：
- 🇨🇳 国内：https://platform.minimaxi.com/subscribe/token-plan
- 🌍 海外：https://platform.minimax.io/subscribe/token-plan

### 3. 登录认证

```bash
# 方式一：API Key 登录（推荐，从平台「接口密钥」页获取）
mmx auth login --api-key sk-xxxxx

# 方式二：浏览器 OAuth 登录
mmx auth login
```

### 4. 验证

```bash
mmx auth status    # 检查登录
mmx quota          # 检查额度
mmx music generate --prompt "gentle piano, healing" --out /tmp/test_mood.mp3  # 测试生成
```

全部通过即可使用本 Skill。

---

## 情绪-音乐映射表

### 负面情绪（治愈方向）

| 情绪信号 | 识别关键词 | 音乐策略 | 风格 | 情绪曲线 |
|---------|-----------|---------|------|---------|
| 😞 低落/难过 | 难过、伤心、emo、低落、郁闷 | 先共鸣后治愈 | Lo-fi R&B → Acoustic Warm | 从忧伤缓缓上升到温暖 |
| 😤 烦躁/愤怒 | 烦、气死了、崩溃、炸了 | 释放型 | Post-Rock, Alt Rock | 先给爆发出口，再收归平静 |
| 😰 焦虑/压力 | 焦虑、压力大、紧张、慌 | 镇静型 | Ambient, New Age | 持续安定，缓慢呼吸节奏 |
| 😴 疲惫/倦怠 | 好累、不想动、倦了、乏 | 温柔托底 | Bossa Nova, Soft Jazz | 不强求振作，给温柔的休息感 |
| 😢 孤独/思念 | 孤独、想念、一个人、寂寞 | 陪伴型 | Indie Folk, Singer-songwriter | 像朋友在身边轻声哼唱 |

### 正面情绪（助燃方向）

| 情绪信号 | 识别关键词 | 音乐策略 | 风格 |
|---------|-----------|---------|------|
| 😊 开心/满足 | 开心、不错、满足、幸福 | 锦上添花 | City Pop, Funk, Disco |
| 🔥 兴奋/庆祝 | 太棒了、赢了、发布、上线 | 推向高潮 | EDM, Dance Pop, Hyperpop |
| 🌟 期待/憧憬 | 期待、马上就、等不及 | 氛围渲染 | Synth Pop, Dream Pop |
| 💪 战斗/冲刺 | 冲、干就完了、拼了 | 热血增幅 | Rock, Trap, Epic Electronic |

---

## 工作流

### Step 1: 触发判断（三级触发机制）

本 Skill 采用三级触发，根据信号强度决定行为：

#### 🟢 Level 1：显式触发（直接要歌）

用户明确要求音乐，**无论是否 @机器人，立即生成**。

| 触发词 | 动作 |
|--------|------|
| 来首歌、想听歌、放首歌 | 直接生成，不问 |
| 来首应景的、音乐治愈、解压音乐 | 直接生成，不问 |
| 来首 [风格] 的歌 | 按指定风格生成 |

#### 🟡 Level 2：半隐式触发（情绪词 + @机器人）

用户表达了情绪**且 @了机器人**，视为求助信号，**直接生成**。
如果只有情绪词但没有 @，**不触发**（避免群聊噪音）。

| 触发词（需要 @） | 动作 |
|-----------------|------|
| 心情不好、有点累、好烦、好丧 | 匹配情绪 → 生成 |
| emo了、压力好大、需要放松、陪我 | 匹配情绪 → 生成 |
| 开心、兴奋、太棒了 | 匹配情绪 → 生成 |

#### 🔴 Level 3：全隐式触发（极端情绪，自动送歌）

用户情绪到了极端值，**无需 @，自动生成并送歌**。
这些词本身就是强烈信号，沉默反而像冷漠。

**负面极端**（先共鸣后治愈）：

| 触发词 | 情绪 | 动作 |
|--------|------|------|
| 烦死了、烦得要死 | 😤 暴怒 | 释放型音乐 + 「🎵 先听会儿」 |
| 无语死了、服了 | 😤 无奈 | 释放型音乐 |
| 崩溃了、要疯了、受不了了 | 😰 崩溃 | 镇静型音乐 + 「🎵 深呼吸」 |
| 累死了、不想干了 | 😴 极度疲惫 | 温柔托底音乐 + 「🎵 歇会儿吧」 |
| 想哭、难受死了 | 😢 极度悲伤 | 陪伴型带歌词 + 「🎵 这首给你」 |

**正面极端**（助燃放大）：

| 触发词 | 情绪 | 动作 |
|--------|------|------|
| 爽死了、太爽了 | 🔥 极度兴奋 | 高能舞曲 + 「🎵 燥起来！」 |
| 太开心了、幸福死了 | 😊 极度开心 | 欢快 Funk + 「🎵 快乐加倍！」 |
| 牛逼炸了、赢麻了 | 🔥 庆祝 | EDM/Hyperpop + 「🎵 这首给你庆祝！」 |
| 冲冲冲、干就完了 | 💪 战斗 | 热血摇滚 + 「🎵 冲！」 |

**全隐式安全规则**：
- 仅在群聊中对**已知用户**触发（非陌生人）
- 同一用户 **30 分钟内最多触发 1 次**（防刷屏）
- 私聊场景下，Level 2 和 Level 3 均可无需 @ 触发

### Step 2: 情绪识别

从用户消息中分析：
1. **情绪类别**：匹配上方映射表（可多维度叠加）
2. **情绪强度**：轻微 / 中等 / 强烈（影响音乐激烈程度和歌词策略）
3. **场景线索**：工作中 / 下班后 / 深夜（影响风格选择）

### Step 3: 构建 Prompt

根据情绪映射选择音乐策略，构建 prompt。

**负面情绪**使用"情绪曲线"策略——不直接跳到快乐，而是先共鸣再引导：

```
prompt 模板（负面情绪）:
<style>, <mood 起始: 共鸣词>, gradually shifting to <mood 目标: 治愈词>, 
<instruments>, <BPM> BPM, <vocal/instrumental>, 
a song that understands how you feel and gently lifts you up
```

**正面情绪**使用"助燃"策略——放大当前感受：

```
prompt 模板（正面情绪）:
<style>, <mood: 正面高能词>, <instruments>, <BPM> BPM, 
<vocal/instrumental>, energetic and feel-good
```

### Step 4: 歌词策略

| 情绪类型 | 歌词策略 |
|---------|---------|
| 负面轻微 | 纯音乐（`is_instrumental: true`），不加歌词避免矫情感 |
| 负面强烈 | 带歌词（`lyrics_optimizer: true`），让 AI 写共鸣歌词，有"被懂了"的感觉 |
| 正面情绪 | 带歌词，节奏明快有感染力 |
| 用户指定 | 按用户要求 |

### Step 5: 生成音乐

优先使用 CLI，回退到 Python 脚本：

```bash
# 方式一：MiniMax CLI（推荐）
# 纯音乐（负面轻微）
mmx music generate \
  --prompt "<constructed prompt>" \
  --instrumental \
  --out /tmp/openclaw/mood_<emotion>.mp3

# 带歌词（负面强烈/正面）— 自动生成歌词
mmx music generate \
  --prompt "<constructed prompt>" \
  --lyrics "[verse]\n[chorus]" \
  --out /tmp/openclaw/mood_<emotion>.mp3

# 方式二：Python 脚本（需要 MINIMAX_API_KEY 环境变量）
python3 scripts/generate_mood_music.py \
  --prompt "<constructed prompt>" \
  --instrumental \
  --output /tmp/openclaw/mood_<emotion>.mp3
```

### Step 6: 播放与送达

生成完成后，**必须完成送达**，不能只输出文件路径。根据环境自动选择最佳方式。

#### 环境探测

```bash
# 检测本地音乐播放器（macOS）
osascript -e 'id of application "Music"' 2>/dev/null && echo "HAS_MUSIC_APP"
# 或检测命令行播放器
which mpv afplay ffplay 2>/dev/null
```

#### 送达策略

| 条件 | 行为 |
|------|------|
| 检测到本地播放器（Music.app / mpv / afplay） | **自动吊起播放** + 飞书发送备份 |
| 未检测到本地播放器 | **发送飞书音频消息** |

#### 路径 A：本地播放器可用

```bash
# macOS 用系统命令打开默认播放器
open /tmp/openclaw/mood_<emotion>.mp3

# 或 afplay 后台播放
afplay /tmp/openclaw/mood_<emotion>.mp3 &

# 或 mpv
mpv --no-video /tmp/openclaw/mood_<emotion>.mp3 &
```

同时发一份到飞书群（见路径 B）。

#### 路径 B：飞书音频消息送达

**⚠️ 关键步骤，不可跳过。** 飞书语音气泡需要特殊的上传+发送流程。

**方式 1：使用内置脚本（推荐，一行搞定）**

Skill 自带 `scripts/send_feishu_audio.sh`，支持 `--file` 模式直接发送已有音频：

```bash
# 发送已生成的音乐到飞书群（语音气泡，非文件附件）
bash scripts/send_feishu_audio.sh --file /tmp/openclaw/mood_<emotion>.mp3 "<chat_id>"
```

凭证自动从环境变量 `FEISHU_APP_ID` / `FEISHU_APP_SECRET` 读取，
或回退到 `$HOME/.openclaw/openclaw.json`。

**方式 2：OpenClaw message 工具**（OpenClaw 环境）
```
message(action="send", filePath="/tmp/openclaw/mood_<emotion>.mp3",
        message="<共情文案>")
```

**方式 3：手动 curl 两步流程**（理解原理用）

```bash
# ⚠️ 关键坑：file_type 必须填 opus（不是 mp3），否则报 234001
# ⚠️ 关键坑：msg_type 必须是 audio（不是 file），否则显示为附件

# Step 1: 上传文件（file_type=opus）
FILE_KEY=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/files" \
  -H "Authorization: Bearer $TOKEN" \
  -F "file_type=opus" \
  -F "file_name=voice.opus" \
  -F "file=@/tmp/openclaw/mood_<emotion>.mp3" \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['file_key'])")

# Step 2: 发送音频消息（msg_type=audio）
curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"receive_id\":\"$CHAT_ID\",\"msg_type\":\"audio\",\"content\":\"{\\\"file_key\\\":\\\"$FILE_KEY\\\"}\"}"
```

#### ❌ 错误行为（严禁）

- 只输出文件路径如 `📎 /workspace/.../output/xxx.mp3` → **用户无法访问服务器路径**
- 只发文字说"已生成" → **用户听不到音乐**
- 把 base64 音频贴在聊天里 → **不可读**

**原则：用户必须能在 2 次点击内听到音乐。**

播放器优先级：`open`（macOS 默认）> `mpv` > `afplay` > 飞书音频消息 > 飞书文件消息

**共情文案模板**（简短、不说教）：

| 情绪 | 文案示例 |
|------|---------|
| 低落 | 🎵 这首给你，不用急着开心 |
| 烦躁 | 🎵 先听会儿，让脑子放空一下 |
| 焦虑 | 🎵 深呼吸，跟着节奏慢下来 |
| 疲惫 | 🎵 歇会儿吧，没什么比你重要 |
| 开心 | 🎵 快乐加倍！这首配你的好心情 |
| 兴奋 | 🎵 燥起来！这首给你庆祝 |

---

## 进阶：情绪追踪（可选）

如果用户频繁使用，可以在 `memory/mood-music-log.json` 中记录：

```json
{
  "history": [
    {"date": "2026-04-10", "emotion": "tired", "style": "bossa nova", "rating": "👍"},
    {"date": "2026-04-09", "emotion": "anxious", "style": "ambient", "rating": null}
  ]
}
```

用于：
- 避免连续推荐相同风格
- 发现用户偏好（"你之前喜欢 Bossa Nova 治愈系，这次也来一首？"）
- 如果连续多天负面情绪，温和提醒（不是心理医生，只是朋友式的关心）

---

## 边界与安全

- **不是心理咨询**：不诊断、不处方、不说"你应该怎样"
- **不过度解读**：用户说"有点累"就是累，别上升到心理问题
- **不强制正能量**：允许用户沉浸在情绪里，音乐是陪伴不是说教
- **隐私**：情绪记录仅存本地，不外传

---

## 生成方式

### 方式一：MiniMax CLI（推荐，零代码）

CLI 自动管理认证和 region，无需手动传 API Key：

```bash
# 纯音乐
mmx music generate --prompt "<prompt>" --instrumental --out /tmp/openclaw/mood.mp3

# 带自动歌词
mmx music generate --prompt "<prompt>" --lyrics "[verse]\n[chorus]" --out /tmp/openclaw/mood.mp3
```

### 方式二：Python 脚本（需要 API Key）

`scripts/generate_mood_music.py` 直接调用 MiniMax Music API：

- 读取 API Key：从环境变量 `MINIMAX_API_KEY` 获取
- 模型：`music-2.5+`
- 支持 `--instrumental` 切换纯音乐/带歌词
- 带歌词模式：`lyrics_optimizer: true`（API 自动写词）
- 输出：MP3，44100Hz，256kbps

