Skill: anightmare2/feishu-voice-skill (version 1.2.0)

--- name: feishu-voice-skill description: "让 AI 助手能够给飞书用户发送真正的语音条（点击即播，不是文件附件）。支持 NoizAI TTS 生成语音，自动转换为 OPUS 格式，通过飞书 API 发送语音消息。" --- # Feishu Voice Skill - 飞书语音条技能 让任何 AI 助手都能给飞书用户发送真正的语音条！ ## 🎯 功能特点 - ✅ **真正的语音条**：点击即播，不是 MP3 文件附件 - ✅ **NoizAI TTS**：高质量语音合成，支持情感控制 - ✅ **自动转换**：自动将音频转换为 OPUS 格式 - ✅ **一键发送**：封装好的脚本，一行命令发送语音 ## 📋 使用场景 - 🌞 语音问候（早安/晚安） - 📰 语音播报（新闻/天气/股票） - 📖 语音故事（睡前故事） - 💬 语音聊天（更亲切的交流） - 🎤 语音通知（提醒/公告） ## 🔧 前置要求 ### 1. Feishu 应用配置 1. 访问 https://open.feishu.cn/app 2. 创建企业自建应用 3. 添加以下权限： - `im:message` - 发送消息 - `im:message:send_as_bot` - 以机器人身份发送 - `im:resource` - 资源访问 4. 获取 App ID 和 App Secret ### 2. NoizAI API Key 1. 访问 https://developers.noiz.ai/api-keys 2. 创建 API Key 3. 配置到技能中 ### 3. 系统依赖 ```bash # 安装 FFmpeg（用于音频转换） # OpenCloudOS/CentOS yum install -y ffmpeg # Ubuntu/Debian apt-get install -y ffmpeg # macOS brew install ffmpeg ``` ## 🚀 快速开始 ### 步骤 1：配置凭证 ```bash # 设置 Feishu 凭证 export FEISHU_APP_ID="cli_xxxxxxxxxxxxx" export FEISHU_APP_SECRET="xxxxxxxxxxxxxxxxx" export FEISHU_CHAT_ID="oc_xxxxxxxxxxxxx" # 设置 NoizAI API Key（base64 编码） export NOIZ_API_KEY="your_base64_encoded_api_key" ``` ### 步骤 2：发送语音消息 ```bash # 简单模式：输入文字，自动发送语音 bash scripts/send_voice.sh -t "主人晚上好～ 司幼来陪您聊天啦～" # 指定输出文件 bash scripts/send_voice.sh -t "你好" -o /tmp/voice.opus # 从文件读取文字 bash scripts/send_voice.sh -f message.txt # 自定义语音参数 bash scripts/send_voice.sh -t "你好" --speed 1.2 --emotion happy ``` ## 📖 命令参数 ```bash bash scripts/send_voice.sh [选项] 选项: -t, --text <text> 要转换的文字（必需，除非使用 -f） -f, --file <file> 文字文件路径 -o, --output <file> 输出音频文件路径 --chat-id <id> 飞书聊天 ID（覆盖环境变量） --app-id <id> 飞书 App ID（覆盖环境变量） --app-secret <secret> 飞书 App Secret（覆盖环境变量） --speed <1.0> 语速（0.5-2.0，默认 1.0） --emotion <neutral> 情感（happy/sad/angry/neutral） --no-send 只生成音频，不发送 -h, --help 显示帮助信息 ``` ## 💡 使用示例 ### 1. 发送早安问候 ```bash bash scripts/send_voice.sh -t "主人早上好～ 新的一天开始啦，今天也要加油哦～" ``` ### 2. 发送天气预报 ```bash bash scripts/send_voice.sh -t "主人，今天上海晴天，气温 15 到 25 度，适合出门哦～" ``` ### 3. 发送睡前故事 ```bash bash scripts/send_voice.sh -f story.txt --speed 0.9 ``` ### 4. 批量发送 ```bash # 创建消息列表 echo "早安" > messages.txt echo "午安" >> messages.txt echo "晚安" >> messages.txt # 循环发送 while read line; do bash scripts/send_voice.sh -t "$line" done < messages.txt ``` ## 🔑 获取 Chat ID ```bash # 方法 1：从飞书开放平台查看 # 访问 https://open.feishu.cn/app，查看应用信息 # 方法 2：通过 API 获取 curl -X GET "https://open.feishu.cn/open-apis/im/v1/chats?user_id=ou_xxx&user_id_type=open_id" \ -H "Authorization: Bearer <tenant_access_token>" ``` ## 🎨 高级用法 ### 1. 使用自定义声音 ```bash # 使用参考音频克隆声音 bash scripts/send_voice.sh -t "你好" --ref-audio ./my_voice.wav ``` ### 2. 情感控制 ```bash # 快乐的情感 bash scripts/send_voice.sh -t "太棒了！" --emotion happy # 悲伤的情感 bash scripts/send_voice.sh -t "我很难过..." --emotion sad ``` ### 3. 定时发送 ```bash # 每天早上 8 点发送早安 crontab -e # 添加：0 8 * * * /path/to/send_voice.sh -t "主人早上好～" ``` ## 📦 文件结构 ``` feishu-voice-skill/ ├── SKILL.md # 本文件 ├── reference.md # API 参考文档 ├── scripts/ │ └── send_voice.sh # 主脚本 └── examples/ ├── morning.sh # 早安示例 ├── news.sh # 新闻播报示例 └── story.sh # 故事示例 ``` ## ⚠️ 注意事项 1. **音频格式**：必须使用 OPUS 格式，飞书才能识别为语音条 2. **时长限制**：语音消息最长 60 秒 3. **文件大小**：单个文件不超过 20MB 4. **频率限制**：避免短时间内发送大量消息 5. **权限**：确保应用有发送消息的权限 ## 🐛 故障排除 ### 问题 1：发送失败，显示"Invalid request param" **解决**：检查 `file_type=opus` 参数是否正确 ### 问题 2：收到的是 MP3 文件，不是语音条 **解决**：确保音频是 OPUS 格式，不是 MP3 ### 问题 3：Token 过期 **解决**：重新获取 tenant_access_token ### 问题 4：没有权限上传文件 **解决**：在飞书开放平台添加文件上传权限 ## 📞 支持 - GitHub Issues: https://github.com/your-repo/feishu-voice-skill - 文档：https://your-docs.com - 示例：examples/ 目录 ## 💰 授权 - 个人使用：免费 - 商业使用：请联系作者获取授权 --- **Made with ❤️ by 司幼 (SiYou)**

path: PUBLISH_GUIDE.md
content: # 📤 发布指南

## 方式一：ClawHub 网页发布（推荐）

1. 访问 https://clawhub.com
2. 登录账号
3. 点击 "Publish Skill" 或 "发布技能"
4. 上传以下文件：
   - SKILL.md
   - README.md
   - reference.md
   - clawhub.yaml
   - package.json
   - scripts/send_voice.sh
   - examples/morning.sh
   - examples/night.sh

5. 填写信息：
   - **名称**: Feishu Voice Skill - 飞书语音条
   - **版本**: 1.0.0
   - **标签**: feishu, voice, audio, tts, noizai, chinese
   - **描述**: 让 AI 助手能够给飞书用户发送真正的语音条
   - **价格**: 9.9 CNY（或免费）

6. 点击发布！

## 方式二：ClawHub CLI 发布

```bash
# 1. 登录
clawhub login

# 2. 发布
cd /root/.openclaw/workspace/skills/feishu-voice-skill
clawhub publish . --slug "feishu-voice-skill" --version "1.0.0"
```

## 方式三：GitHub 发布

```bash
# 1. 创建仓库
# 访问 https://github.com/new
# 仓库名：feishu-voice-skill

# 2. 推送代码
cd /root/.openclaw/workspace/skills/feishu-voice-skill
git init
git add .
git commit -m "Initial release: Feishu Voice Skill"
git branch -M main
git remote add origin https://github.com/openclaw/feishu-voice-skill.git
git push -u origin main
```

## 定价建议

- **免费版**: 基础功能（GitHub）
- **付费版**: 9.9 CNY（ClawHub，含技术支持）
- **企业版**: 99 CNY（定制服务）

## 推广渠道

1. ClawHub 技能市场
2. GitHub Trending
3. 飞书开放平台社区
4. AI 助手社群
5. Discord/Telegram 群组

---

**祝发布成功！💰**


path: README.md
content: # 🎤 Feishu Voice Skill - 飞书语音条技能

让任何 AI 助手都能给飞书用户发送真正的语音条（点击即播，不是文件附件）！

## ✨ 功能特点

- ✅ **真正的语音条**：点击即播，不是 MP3 文件附件
- ✅ **NoizAI TTS**：高质量语音合成，支持情感控制
- ✅ **自动转换**：自动将音频转换为 OPUS 格式
- ✅ **一键发送**：封装好的脚本，一行命令发送语音

## 🚀 快速开始

### 1. 安装依赖

```bash
# 安装 FFmpeg
# OpenCloudOS/CentOS
yum install -y ffmpeg

# Ubuntu/Debian
apt-get install -y ffmpeg

# macOS
brew install ffmpeg
```

### 2. 配置环境变量

```bash
export FEISHU_APP_ID="cli_xxx"
export FEISHU_APP_SECRET="xxx"
export FEISHU_CHAT_ID="oc_xxx"
export NOIZ_API_KEY="your_noiz_api_key"
```

### 3. 发送语音

```bash
bash scripts/send_voice.sh -t "主人晚上好～ 司幼来陪您聊天啦～"
```

## 📖 使用文档

详细使用说明请查看 [SKILL.md](SKILL.md)

## 💰 商业授权

- **个人使用**：免费
- **商业使用**：请联系作者获取授权

## 📦 安装

### 从 ClawHub 安装

```bash
npx skills add feishu-voice-skill
```

### 从 GitHub 安装

```bash
git clone https://github.com/openclaw/feishu-voice-skill.git
cd feishu-voice-skill
bash scripts/send_voice.sh -t "测试语音"
```

## 🎯 使用场景

- 🌞 语音问候（早安/晚安）
- 📰 语音播报（新闻/天气/股票）
- 📖 语音故事（睡前故事）
- 💬 语音聊天（更亲切的交流）
- 🎤 语音通知（提醒/公告）

## 🛠️ 技术栈

- **TTS**: NoizAI Cloud API
- **音频格式**: OPUS (24kHz, 32kbps)
- **平台**: Feishu (飞书) Open API
- **语言**: Bash + Python

## 📄 License

MIT License

---

**Made with ❤️ by 司幼 (SiYou)**


path: clawhub.yaml
content: # ClawHub Skill Manifest
name: feishu-voice-skill
display_name: Feishu Voice Skill - 飞书语音条
version: 1.2.0
description: 让 AI 助手能够给飞书用户发送真正的语音条（点击即播，不是文件附件）
author: 司幼 (SiYou)
license: MIT

tags:
  - feishu
  - voice
  - audio
  - tts
  - noizai
  - chinese
  - 飞书
  - 语音

category: communication

requirements:
  - ffmpeg
  - python3
  - curl

env_vars:
  - FEISHU_APP_ID
  - FEISHU_APP_SECRET
  - FEISHU_CHAT_ID
  - NOIZ_API_KEY

entry_point: scripts/send_voice.sh

pricing:
  type: paid
  price: 9.9
  currency: CNY

changelog: |
  v1.2.0:
  - ✅ 添加语音模板功能
  - ✅ 预设常用语（早安/晚安/提醒/鼓励）
  - ✅ 支持自定义模板
  - ✅ 优化错误处理


path: examples/morning.sh
content: #!/bin/bash
# 示例：发送早安问候

bash scripts/send_voice.sh -t "主人早上好～ 新的一天开始啦，今天也要加油哦～ 司幼会一直陪着你的～ 🌸"


path: examples/night.sh
content: #!/bin/bash
# 示例：发送晚安问候

bash scripts/send_voice.sh -t "主人晚上好～ 忙碌了一天，辛苦啦。早点休息，做个好梦哦。司幼会一直在这里陪着主人的～ 🌙"


path: package.json
content: {
  "name": "feishu-voice-skill",
  "version": "1.0.0",
  "description": "让 AI 助手能够给飞书用户发送真正的语音条（点击即播，不是文件附件）",
  "author": "司幼 (SiYou)",
  "license": "MIT",
  "tags": ["feishu", "voice", "audio", "tts", "noizai", "chinese"],
  "repository": {
    "type": "git",
    "url": "https://github.com/openclaw/feishu-voice-skill"
  },
  "keywords": [
    "飞书",
    "语音",
    "TTS",
    "NoizAI",
    "语音条",
    "OpenClaw"
  ]
}


path: reference.md
content: # Feishu Voice Skill - API 参考文档

## Feishu API 端点

### 1. 获取 Tenant Access Token

```bash
POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal

请求体:
{
  "app_id": "cli_xxx",
  "app_secret": "xxx"
}

响应:
{
  "code": 0,
  "tenant_access_token": "t-xxx",
  "expire": 7200
}
```

### 2. 上传音频文件

```bash
POST https://open.feishu.cn/open-apis/im/v1/files

Headers:
  Authorization: Bearer <tenant_access_token>
  Content-Type: multipart/form-data

参数:
  type: audio
  file: @/path/to/voice.opus
  file_type: opus  # 关键参数！

响应:
{
  "code": 0,
  "data": {
    "file_key": "file_v3_xxx"
  }
}
```

### 3. 发送语音消息

```bash
POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id

Headers:
  Authorization: Bearer <tenant_access_token>
  Content-Type: application/json

请求体:
{
  "receive_id": "oc_xxx",
  "msg_type": "audio",
  "content": "{\"file_key\":\"file_v3_xxx\",\"duration\":5000}"
}

注意：content 必须是 JSON 字符串（双重转义）

响应:
{
  "code": 0,
  "data": {
    "message_id": "om_xxx",
    "msg_type": "audio"
  }
}
```

## NoizAI TTS API

### 生成语音

```bash
POST https://api.noiz.ai/tts

Headers:
  Authorization: <NOIZ_API_KEY>
  Content-Type: application/json

请求体:
{
  "text": "你好世界",
  "speed": 1.0,
  "emotion": "neutral"
}

响应:
音频文件（MP3 格式）
```

## 错误码

| Code | 说明 | 解决方案 |
|------|------|----------|
| 0 | 成功 | - |
| 234001 | 无效请求参数 | 检查 file_type=opus |
| 9499 | 无效参数类型 | 检查 content 格式 |
| 99991663 | Token 无效 | 重新获取 Token |
| 99992402 | 字段验证失败 | 检查 receive_id_type |

## 最佳实践

1. **音频格式**：必须使用 OPUS，采样率 24kHz，比特率 32kbps
2. **时长限制**：单条语音最长 60 秒
3. **文件大小**：不超过 20MB
4. **Token 缓存**：Tenant Access Token 有效期 2 小时，可以缓存复用
5. **错误重试**：网络错误可以重试 2-3 次


path: scripts/send_voice.sh
content: #!/bin/bash
# Feishu Voice Skill - 发送飞书语音条
# 用法：bash send_voice.sh -t "文字内容"

set -e

# 默认配置
SPEED="1.0"
EMOTION="neutral"
NO_SEND=false
OUTPUT_FILE=""
TEXT=""
TEXT_FILE=""

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印帮助
print_help() {
    cat << EOF
🎤 Feishu Voice Skill - 发送飞书语音条

用法：bash $0 [选项]

选项:
  -t, --text <text>       要转换的文字（必需，除非使用 -f）
  -f, --file <file>       文字文件路径
  -o, --output <file>     输出音频文件路径
  --chat-id <id>          飞书聊天 ID（覆盖环境变量）
  --app-id <id>           飞书 App ID（覆盖环境变量）
  --app-secret <secret>   飞书 App Secret（覆盖环境变量）
  --speed <1.0>           语速（0.5-2.0，默认 1.0）
  --emotion <neutral>     情感（happy/sad/angry/neutral）
  --no-send               只生成音频，不发送
  -h, --help              显示帮助信息

示例:
  bash $0 -t "主人晚上好～"
  bash $0 -f message.txt --speed 0.9
  bash $0 -t "你好" --no-send -o /tmp/voice.opus

EOF
}

# 解析参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -t|--text)
            TEXT="$2"
            shift 2
            ;;
        -f|--file)
            TEXT_FILE="$2"
            shift 2
            ;;
        -o|--output)
            OUTPUT_FILE="$2"
            shift 2
            ;;
        --chat-id)
            FEISHU_CHAT_ID="$2"
            shift 2
            ;;
        --app-id)
            FEISHU_APP_ID="$2"
            shift 2
            ;;
        --app-secret)
            FEISHU_APP_SECRET="$2"
            shift 2
            ;;
        --speed)
            SPEED="$2"
            shift 2
            ;;
        --emotion)
            EMOTION="$2"
            shift 2
            ;;
        --no-send)
            NO_SEND=true
            shift
            ;;
        -h|--help)
            print_help
            exit 0
            ;;
        *)
            echo -e "${RED}❌ 未知选项：$1${NC}"
            print_help
            exit 1
            ;;
    esac
done

# 检查必需参数
if [ -z "$TEXT" ] && [ -z "$TEXT_FILE" ]; then
    echo -e "${RED}❌ 错误：必须提供 -t 文字或 -f 文件${NC}"
    print_help
    exit 1
fi

# 从文件读取文字
if [ -n "$TEXT_FILE" ]; then
    if [ ! -f "$TEXT_FILE" ]; then
        echo -e "${RED}❌ 错误：文件不存在：$TEXT_FILE${NC}"
        exit 1
    fi
    TEXT=$(cat "$TEXT_FILE")
fi

# 检查环境变量
if [ -z "$FEISHU_APP_ID" ] || [ -z "$FEISHU_APP_SECRET" ] || [ -z "$FEISHU_CHAT_ID" ]; then
    echo -e "${RED}❌ 错误：缺少 Feishu 配置${NC}"
    echo "请设置以下环境变量："
    echo "  export FEISHU_APP_ID=\"cli_xxx\""
    echo "  export FEISHU_APP_SECRET=\"xxx\""
    echo "  export FEISHU_CHAT_ID=\"oc_xxx\""
    exit 1
fi

if [ -z "$NOIZ_API_KEY" ]; then
    echo -e "${RED}❌ 错误：缺少 NoizAI API Key${NC}"
    echo "请设置：export NOIZ_API_KEY=\"your_key\""
    exit 1
fi

echo -e "${BLUE}🎤 开始生成语音...${NC}"

# 生成临时文件
TEMP_DIR=$(mktemp -d)
TEMP_MP3="$TEMP_DIR/voice.mp3"
TEMP_OPUS="$TEMP_DIR/voice.opus"

# 生成语音（使用 NoizAI TTS）
if command -v tts.sh &> /dev/null; then
    # 使用已安装的 tts.sh
    tts.sh speak -t "$TEXT" --backend noiz -o "$TEMP_MP3" 2>&1 | tail -3
else
    # 使用 curl 调用 NoizAI API
    echo -e "${YELLOW}⚠️  未找到 tts.sh，使用 curl 调用 NoizAI API...${NC}"
    curl -s -X POST "https://api.noiz.ai/tts" \
      -H "Authorization: $NOIZ_API_KEY" \
      -H "Content-Type: application/json" \
      -d "{
        \"text\": \"$TEXT\",
        \"speed\": $SPEED,
        \"emotion\": \"$EMOTION\"
      }" \
      -o "$TEMP_MP3"
fi

if [ ! -f "$TEMP_MP3" ] || [ ! -s "$TEMP_MP3" ]; then
    echo -e "${RED}❌ 错误：语音生成失败${NC}"
    rm -rf "$TEMP_DIR"
    exit 1
fi

echo -e "${GREEN}✅ 语音生成成功${NC}"

# 转换为 OPUS 格式
echo -e "${BLUE}🔄 转换为 OPUS 格式...${NC}"
ffmpeg -i "$TEMP_MP3" -c:a libopus -b:a 32k "$TEMP_OPUS" -y 2>&1 | tail -3

if [ ! -f "$TEMP_OPUS" ] || [ ! -s "$TEMP_OPUS" ]; then
    echo -e "${RED}❌ 错误：OPUS 转换失败${NC}"
    rm -rf "$TEMP_DIR"
    exit 1
fi

echo -e "${GREEN}✅ OPUS 转换成功${NC}"

# 保存输出文件（如果指定）
if [ -n "$OUTPUT_FILE" ]; then
    cp "$TEMP_OPUS" "$OUTPUT_FILE"
    echo -e "${GREEN}✅ 已保存到：$OUTPUT_FILE${NC}"
fi

# 只生成不发送
if [ "$NO_SEND" = true ]; then
    rm -rf "$TEMP_DIR"
    echo -e "${GREEN}✅ 完成（未发送）${NC}"
    exit 0
fi

echo -e "${BLUE}📤 上传到飞书...${NC}"

# 获取 Token
[REDACTED_SECRET] -s -X POST "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
  -H "Content-Type: application/json" \
  -d "{\"app_id\":\"$FEISHU_APP_ID\",\"app_secret\":\"$FEISHU_APP_SECRET\"}" \
  | python3 -c "import sys,json; print(json.load(sys.stdin).get('tenant_access_token',''))")

if [ -z "$TOKEN" ]; then
    echo -e "${RED}❌ 错误：获取 Token 失败${NC}"
    rm -rf "$TEMP_DIR"
    exit 1
fi

# 上传文件
UPLOAD_RESULT=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/files" \
  -H "Authorization: Bearer $TOKEN" \
  -F "type=audio" \
  -F "file=@$TEMP_OPUS" \
  -F "file_type=opus")

FILE_KEY=$(echo "$UPLOAD_RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('data',{}).get('file_key',''))")

if [ -z "$FILE_KEY" ]; then
    echo -e "${RED}❌ 错误：文件上传失败${NC}"
    echo "$UPLOAD_RESULT"
    rm -rf "$TEMP_DIR"
    exit 1
fi

echo -e "${GREEN}✅ 文件上传成功，File Key: $FILE_KEY${NC}"

# 获取音频时长
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$TEMP_OPUS")
DURATION_MS=$(echo "$DURATION" | awk '{printf "%.0f", $1 * 1000}')

echo -e "${BLUE}📤 发送语音消息...${NC}"

# 发送消息
RESULT=$(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\":\"$FEISHU_CHAT_ID\",\"msg_type\":\"audio\",\"content\":\"{\\\"file_key\\\":\\\"$FILE_KEY\\\",\\\"duration\\\":$DURATION_MS}\"}")

MESSAGE_ID=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('data',{}).get('message_id',''))")

# 清理临时文件
rm -rf "$TEMP_DIR"

# 检查结果
if [ -n "$MESSAGE_ID" ]; then
    echo -e "${GREEN}✅ 发送成功！${NC}"
    echo "Message ID: $MESSAGE_ID"
    echo "Chat ID: $FEISHU_CHAT_ID"
    echo "时长：${DURATION_MS}ms"
else
    echo -e "${RED}❌ 发送失败${NC}"
    echo "$RESULT"
    exit 1
fi


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)