{"id":"30f3eff6-285a-4ec5-945f-651b7ef5f1a0","entityType":"agent","slug":"clawhub-franklu0819-lang-feishu-voice","name":"Feishu Voice","canonicalUrl":"https://www.xpersona.co/agent/clawhub-franklu0819-lang-feishu-voice","canonicalPath":"/agent/clawhub-franklu0819-lang-feishu-voice","generatedAt":"2026-10-10T02:24:43.265Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":null},"description":"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。 Skill: Feishu Voice Owner: franklu0819-lang Summary: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。 Tags: audio:1.1.2, chinese:1.1.2, coze:1.1.2, feishu:1.1.2, latest:1.2.0, messaging:1.1.2, tts:1.1.2, voice:1.1.2 Version history: v1.2.0 | 2026-03-28T15:13:35.856Z | user 优化Token获取逻辑，修复参数错误，增加默认配置支持 v1.1.2 | 2026-03-25T04:10:52.367Z | user 删除遗留脚本，修复硬编码路径，测试验证通过 v1.1.1 | 2026-03-25T03:21:56.404Z | user 修","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.5K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s178vhkrfj7fyecavdqnte98p583hvqc:feishu-voice","sourceUrl":"https://clawhub.ai/franklu0819-lang/feishu-voice","homepage":"https://clawhub.ai/franklu0819-lang/skills/feishu-voice","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/franklu0819-lang/feishu-voice","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/franklu0819-lang/skills/feishu-voice","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。 Skill: Feishu Voice Owner: franklu0819-lang Summary: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":null},"stars":null,"forks":null,"downloads":2492,"packageName":null,"latestVersion":"1.2.0","tractionLabel":"2.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T14:21:53.787Z","lastCrawledAt":"2026-10-09T14:21:53.787Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T14:21:53.787Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.0","createdAt":"2026-03-28T15:13:35.856Z","changelog":"优化Token获取逻辑，修复参数错误，增加默认配置支持","fileCount":7,"zipByteSize":10478},{"version":"1.1.2","createdAt":"2026-03-25T04:10:52.367Z","changelog":"删除遗留脚本，修复硬编码路径，测试验证通过","fileCount":6,"zipByteSize":9078},{"version":"1.1.1","createdAt":"2026-03-25T03:21:56.404Z","changelog":"修复硬编码路径，添加智能路径解析，完善可选环境变量声明","fileCount":7,"zipByteSize":10817},{"version":"1.1.0","createdAt":"2026-03-25T03:18:39.209Z","changelog":"修复依赖声明：从 zhipu-tts 迁移到 coze-tts，更新文档，添加多应用配置说明","fileCount":7,"zipByteSize":10037},{"version":"2.0.0","createdAt":"2026-03-24T15:10:22.492Z","changelog":"重大更新：迁移到 Coze TTS，新增语速调整功能","fileCount":6,"zipByteSize":8749},{"version":"1.0.1","createdAt":"2026-02-21T15:26:19.996Z","changelog":"🔒 安全修复：移除所有硬编码密钥，改用环境变量读取。确保技能文档和脚本中不包含实际密钥。","fileCount":6,"zipByteSize":8418},{"version":"1.0.0","createdAt":"2026-02-21T14:50:05.723Z","changelog":"Initial release: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送","fileCount":6,"zipByteSize":8589}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178vhkrfj7fyecavdqnte98p583hvqc:feishu-voice","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T02:24:43.263Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-franklu0819-lang-feishu-voice/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":null},"readme":"Skill: Feishu Voice\n\nOwner: franklu0819-lang\n\nSummary: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\n\nTags: audio:1.1.2, chinese:1.1.2, coze:1.1.2, feishu:1.1.2, latest:1.2.0, messaging:1.1.2, tts:1.1.2, voice:1.1.2\n\nVersion history:\n\nv1.2.0 | 2026-03-28T15:13:35.856Z | user\n\n优化Token获取逻辑，修复参数错误，增加默认配置支持\n\nv1.1.2 | 2026-03-25T04:10:52.367Z | user\n\n删除遗留脚本，修复硬编码路径，测试验证通过\n\nv1.1.1 | 2026-03-25T03:21:56.404Z | user\n\n修复硬编码路径，添加智能路径解析，完善可选环境变量声明\n\nv1.1.0 | 2026-03-25T03:18:39.209Z | user\n\n修复依赖声明：从 zhipu-tts 迁移到 coze-tts，更新文档，添加多应用配置说明\n\nv2.0.0 | 2026-03-24T15:10:22.492Z | user\n\n重大更新：迁移到 Coze TTS，新增语速调整功能\n\nv1.0.1 | 2026-02-21T15:26:19.996Z | user\n\n🔒 安全修复：移除所有硬编码密钥，改用环境变量读取。确保技能文档和脚本中不包含实际密钥。\n\nv1.0.0 | 2026-02-21T14:50:05.723Z | user\n\nInitial release: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送\n\nArchive index:\n\nArchive v1.2.0: 7 files, 10478 bytes\n\nFiles: _meta.json (131b), package.json (691b), README.md (3401b), references/feishu_voice_api.md (1812b), scripts/send_voice.sh (6693b), skill-card.md (2507b), SKILL.md (5703b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `voice_id` (可选): Coze 音色 ID（默认：1）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n- `接收者` (可选): 飞书 open_id\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n- `COZE_API_KEY`: Coze API 密钥\n\n### 流程说明\n\n1. **TTS 生成**: 使用 coze-tts 生成 MP3 格式音频\n2. **语速调整**（可选）: 使用 ffmpeg atempo 滤镜调整语速\n3. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n4. **读取时长**: 使用 ffprobe 获取音频时长（毫秒）\n5. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n6. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id_here\"\nexport FEISHU_APP_SECRET=\"your_app_secret_here\"\nexport COZE_API_KEY=\"your_coze_key_here\"\n\n# 发送语音（默认设置）\nbash scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\"\n\n# 发送语音（指定 voice_id=2，语速 1.2x）\nbash scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\" 2 1.2\n```\n\n## 注意事项\n\n1. **Coze TTS 限制**: 单次文本长度请参考 Coze 文档\n2. **整数时长**: duration 必须是整数毫秒\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **语速范围**: 支持 0.5-2.0x，使用 ffmpeg atempo 实现\n5. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## 更新日志\n\n**2026-03-24**: 从 zhipu-tts 迁移到 coze-tts，新增语速调整功能\n\nFile v1.2.0:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport COZE_API_KEY=\"your_coze_key\"\n\n# 发送语音消息（默认设置）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n```\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n# - 接收者: 飞书 open_id（可选）\n\nbash scripts/send_voice.sh \"你好\" 2 1.2 ou_xxx\n```\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1774710815856\n}\n\nFile v1.2.0:references/feishu_voice_api.md\n\n# 飞书语音消息 API 参考\n\n## 接口信息\n\n### 获取访问令牌\n- **接口**: `POST /auth/v3/tenant_access_token/internal`\n- **用途**: 获取飞书 API 访问令牌\n\n### 上传文件\n- **接口**: `POST /im/v1/files`\n- **用途**: 上传语音文件到飞书服务器\n\n**关键参数**:\n- `file_type=opus` - 文件类型必须是 opus\n- `duration` - 音频时长（毫秒，整数）\n\n### 发送消息\n- **接口**: `POST /im/v1/messages?receive_id_type=open_id`\n- **用途**: 发送语音消息\n\n**消息格式**:\n```json\n{\n  \"receive_id\": \"ou_xxx\",\n  \"msg_type\": \"audio\",\n  \"content\": \"{\\\"file_key\\\": \\\"xxx\\\", \\\"duration\\\": 6000}\"\n}\n```\n\n## 音频格式要求\n\n| 参数 | 要求 |\n|------|------|\n| 格式 | opus (OGG 容器) |\n| 编码 | libopus |\n| 比特率 | 24k |\n| 采样率 | 24000 Hz |\n| 声道 | 单声道 |\n\n## 环境变量说明\n\n### 必需变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_APP_ID | 飞书应用 ID |\n| FEISHU_APP_SECRET | 飞书应用密钥 |\n| COZE_API_KEY | Coze API 密钥 |\n\n### 可选变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_RECEIVER | 默认接收者 Open ID |\n| FEISHU_APP_ID_B | 应用 B 的 ID（多应用场景） |\n| FEISHU_APP_SECRET_B | 应用 B 的密钥 |\n| FEISHU_RECEIVER_B | 应用 B 的接收者 |\n| OPENCLAW_WORKSPACE | OpenClaw 工作区目录路径 |\n\n## TTS 脚本路径解析\n\n脚本会按以下顺序尝试找到 coze-tts：\n\n1. **相对路径**: `../coze-tts/scripts/text_to_speech.sh`（相对于当前技能目录）\n2. **环境变量**: `$OPENCLAW_WORKSPACE/skills/coze-tts/scripts/text_to_speech.sh`\n3. **常见路径**: 尝试 `$HOME/.openclaw/workspace`、`$HOME/openclaw/workspace`、`/opt/openclaw/workspace`\n\n## 官方文档\n\nhttps://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n\nFile v1.2.0:skill-card.md\n\n## Description:\n\nFeishu Voice converts text to speech with coze-tts, converts the audio to Feishu-compatible opus format, uploads it, and sends it as a playable Feishu voice message.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[franklu0819-lang](https://clawhub.ai/user/franklu0819-lang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and operators use this skill to automate sending generated voice messages into Feishu chats from text input, with optional voice, speed, and receiver parameters.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends user text and generated audio through external Feishu and Coze services while using local credentials.\n\nMitigation: Use minimally scoped Feishu and Coze credentials, restrict the Feishu app permissions to the needed chat workflow, and avoid sensitive text unless the data path is approved.\n\nRisk: The skill executes a local coze-tts dependency that may inherit environment secrets.\n\nMitigation: Install coze-tts only from a trusted local path and review that dependency before running this skill with production credentials.\n\nRisk: Temporary audio files are created on the local machine during conversion.\n\nMitigation: Run the skill in a trusted or isolated workspace and avoid shared machines for sensitive voice content until temporary-file handling is hardened.\n\n## Reference(s):\n\n- [ClawHub Feishu Voice skill page](https://clawhub.ai/franklu0819-lang/skills/feishu-voice)\n- [Feishu voice API reference](artifact/references/feishu_voice_api.md)\n- [Feishu message create documentation](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Configuration, API Calls, Files, Text]\n\n**Output Format:** [Markdown guidance with bash command examples; runtime output is terminal status text and a Feishu voice message side effect.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires ffmpeg, ffprobe, jq, Feishu credentials, a Coze API key, and the coze-tts dependency; generates temporary local audio files during execution.]\n\n## Skill Version(s):\n\n1.2.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.2.0:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.1.1\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\", \"coze\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n\nArchive v1.1.2: 6 files, 9078 bytes\n\nFiles: package.json (691b), README.md (3401b), references/feishu_voice_api.md (1812b), scripts/send_voice.sh (6482b), SKILL.md (5703b), _meta.json (131b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `voice_id` (可选): Coze 音色 ID（默认：1）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n- `接收者` (可选): 飞书 open_id\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n- `COZE_API_KEY`: Coze API 密钥\n\n### 流程说明\n\n1. **TTS 生成**: 使用 coze-tts 生成 MP3 格式音频\n2. **语速调整**（可选）: 使用 ffmpeg atempo 滤镜调整语速\n3. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n4. **读取时长**: 使用 ffprobe 获取音频时长（毫秒）\n5. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n6. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id_here\"\nexport FEISHU_APP_SECRET=\"your_app_secret_here\"\nexport COZE_API_KEY=\"your_coze_key_here\"\n\n# 发送语音（默认设置）\nbash scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\"\n\n# 发送语音（指定 voice_id=2，语速 1.2x）\nbash scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\" 2 1.2\n```\n\n## 注意事项\n\n1. **Coze TTS 限制**: 单次文本长度请参考 Coze 文档\n2. **整数时长**: duration 必须是整数毫秒\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **语速范围**: 支持 0.5-2.0x，使用 ffmpeg atempo 实现\n5. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## 更新日志\n\n**2026-03-24**: 从 zhipu-tts 迁移到 coze-tts，新增语速调整功能\n\nFile v1.1.2:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport COZE_API_KEY=\"your_coze_key\"\n\n# 发送语音消息（默认设置）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n```\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n# - 接收者: 飞书 open_id（可选）\n\nbash scripts/send_voice.sh \"你好\" 2 1.2 ou_xxx\n```\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1774411852367\n}\n\nFile v1.1.2:references/feishu_voice_api.md\n\n# 飞书语音消息 API 参考\n\n## 接口信息\n\n### 获取访问令牌\n- **接口**: `POST /auth/v3/tenant_access_token/internal`\n- **用途**: 获取飞书 API 访问令牌\n\n### 上传文件\n- **接口**: `POST /im/v1/files`\n- **用途**: 上传语音文件到飞书服务器\n\n**关键参数**:\n- `file_type=opus` - 文件类型必须是 opus\n- `duration` - 音频时长（毫秒，整数）\n\n### 发送消息\n- **接口**: `POST /im/v1/messages?receive_id_type=open_id`\n- **用途**: 发送语音消息\n\n**消息格式**:\n```json\n{\n  \"receive_id\": \"ou_xxx\",\n  \"msg_type\": \"audio\",\n  \"content\": \"{\\\"file_key\\\": \\\"xxx\\\", \\\"duration\\\": 6000}\"\n}\n```\n\n## 音频格式要求\n\n| 参数 | 要求 |\n|------|------|\n| 格式 | opus (OGG 容器) |\n| 编码 | libopus |\n| 比特率 | 24k |\n| 采样率 | 24000 Hz |\n| 声道 | 单声道 |\n\n## 环境变量说明\n\n### 必需变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_APP_ID | 飞书应用 ID |\n| FEISHU_APP_SECRET | 飞书应用密钥 |\n| COZE_API_KEY | Coze API 密钥 |\n\n### 可选变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_RECEIVER | 默认接收者 Open ID |\n| FEISHU_APP_ID_B | 应用 B 的 ID（多应用场景） |\n| FEISHU_APP_SECRET_B | 应用 B 的密钥 |\n| FEISHU_RECEIVER_B | 应用 B 的接收者 |\n| OPENCLAW_WORKSPACE | OpenClaw 工作区目录路径 |\n\n## TTS 脚本路径解析\n\n脚本会按以下顺序尝试找到 coze-tts：\n\n1. **相对路径**: `../coze-tts/scripts/text_to_speech.sh`（相对于当前技能目录）\n2. **环境变量**: `$OPENCLAW_WORKSPACE/skills/coze-tts/scripts/text_to_speech.sh`\n3. **常见路径**: 尝试 `$HOME/.openclaw/workspace`、`$HOME/openclaw/workspace`、`/opt/openclaw/workspace`\n\n## 官方文档\n\nhttps://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n\nFile v1.1.2:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.1.1\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\", \"coze\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n\nArchive v1.1.1: 7 files, 10817 bytes\n\nFiles: package.json (691b), README.md (3401b), references/feishu_voice_api.md (1790b), scripts/send_voice_auto.sh (3852b), scripts/send_voice.sh (6362b), SKILL.md (5795b), _meta.json (131b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `voice_id` (可选): Coze 音色 ID（默认：1）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n- `接收者` (可选): 飞书 open_id\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n- `COZE_API_KEY`: Coze API 密钥\n\n### 流程说明\n\n1. **TTS 生成**: 使用 coze-tts 生成 MP3 格式音频\n2. **语速调整**（可选）: 使用 ffmpeg atempo 滤镜调整语速\n3. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n4. **读取时长**: 使用 ffprobe 获取音频时长（毫秒）\n5. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n6. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id_here\"\nexport FEISHU_APP_SECRET=\"your_app_secret_here\"\nexport COZE_API_KEY=\"your_coze_key_here\"\n\n# 发送语音（默认设置）\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\"\n\n# 发送语音（指定 voice_id=2，语速 1.2x）\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\" 2 1.2\n```\n\n## 注意事项\n\n1. **Coze TTS 限制**: 单次文本长度请参考 Coze 文档\n2. **整数时长**: duration 必须是整数毫秒\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **语速范围**: 支持 0.5-2.0x，使用 ffmpeg atempo 实现\n5. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## 更新日志\n\n**2026-03-24**: 从 zhipu-tts 迁移到 coze-tts，新增语速调整功能\n\nFile v1.1.1:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport COZE_API_KEY=\"your_coze_key\"\n\n# 发送语音消息（默认设置）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n```\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n# - 接收者: 飞书 open_id（可选）\n\nbash scripts/send_voice.sh \"你好\" 2 1.2 ou_xxx\n```\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1774408916404\n}\n\nFile v1.1.1:references/feishu_voice_api.md\n\n# 飞书语音消息 API 参考\n\n## 接口信息\n\n### 获取访问令牌\n- **接口**: `POST /auth/v3/tenant_access_token/internal`\n- **用途**: 获取飞书 API 访问令牌\n\n### 上传文件\n- **接口**: `POST /im/v1/files`\n- **用途**: 上传语音文件到飞书服务器\n\n**关键参数**:\n- `file_type=opus` - 文件类型必须是 opus\n- `duration` - 音频时长（毫秒，整数）\n\n### 发送消息\n- **接口**: `POST /im/v1/messages?receive_id_type=open_id`\n- **用途**: 发送语音消息\n\n**消息格式**:\n```json\n{\n  \"receive_id\": \"ou_xxx\",\n  \"msg_type\": \"audio\",\n  \"content\": \"{\\\"file_key\\\": \\\"xxx\\\", \\\"duration\\\": 6000}\"\n}\n```\n\n## 音频格式要求\n\n| 参数 | 要求 |\n|------|------|\n| 格式 | opus (OGG 容器) |\n| 编码 | libopus |\n| 比特率 | 24k |\n| 采样率 | 24000 Hz |\n| 声道 | 单声道 |\n\n## 环境变量说明\n\n### 必需变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_APP_ID | 飞书应用 ID |\n| FEISHU_APP_SECRET | 飞书应用密钥 |\n| COZE_API_KEY | Coze API 密钥 |\n\n### 可选变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_RECEIVER | 默认接收者 Open ID |\n| FEISHU_APP_ID_B | 应用 B 的 ID（多应用场景） |\n| FEISHU_APP_SECRET_B | 应用 B 的密钥 |\n| FEISHU_RECEIVER_B | 应用 B 的接收者 |\n| OPENCLAW_WORKSPACE | OpenClaw 工作区目录路径 |\n\n## TTS 脚本路径解析\n\n脚本会按以下顺序尝试找到 coze-tts：\n\n1. **相对路径**: `../coze-tts/scripts/text_to_speech.sh`（相对于当前技能目录）\n2. **环境变量**: `$OPENCLAW_WORKSPACE/skills/coze-tts/scripts/text_to_speech.sh`\n3. **默认路径**: `/root/.openclaw/workspace/skills/coze-tts/scripts/text_to_speech.sh`\n\n## 官方文档\n\nhttps://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n\nFile v1.1.1:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.1.1\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\", \"coze\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n\nArchive v1.1.0: 7 files, 10037 bytes\n\nFiles: package.json (563b), README.md (3213b), references/feishu_voice_api.md (1386b), scripts/send_voice_auto.sh (3852b), scripts/send_voice.sh (5499b), SKILL.md (5479b), _meta.json (131b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n\n# 多应用配置（可选）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `voice_id` (可选): Coze 音色 ID（默认：1）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n- `接收者` (可选): 飞书 open_id\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n- `COZE_API_KEY`: Coze API 密钥\n\n### 流程说明\n\n1. **TTS 生成**: 使用 coze-tts 生成 MP3 格式音频\n2. **语速调整**（可选）: 使用 ffmpeg atempo 滤镜调整语速\n3. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n4. **读取时长**: 使用 ffprobe 获取音频时长（毫秒）\n5. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n6. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id_here\"\nexport FEISHU_APP_SECRET=\"your_app_secret_here\"\nexport COZE_API_KEY=\"your_coze_key_here\"\n\n# 发送语音（默认设置）\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\"\n\n# 发送语音（指定 voice_id=2，语速 1.2x）\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\" 2 1.2\n```\n\n## 注意事项\n\n1. **Coze TTS 限制**: 单次文本长度请参考 Coze 文档\n2. **整数时长**: duration 必须是整数毫秒\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **语速范围**: 支持 0.5-2.0x，使用 ffmpeg atempo 实现\n5. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## 更新日志\n\n**2026-03-24**: 从 zhipu-tts 迁移到 coze-tts，新增语速调整功能\n\nFile v1.1.0:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n\n# 多应用配置（可选）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport COZE_API_KEY=\"your_coze_key\"\n\n# 发送语音消息（默认设置）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n```\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n# - 接收者: 飞书 open_id（可选）\n\nbash scripts/send_voice.sh \"你好\" 2 1.2 ou_xxx\n```\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1774408719209\n}\n\nFile v1.1.0:references/feishu_voice_api.md\n\n# 飞书语音消息 API 参考\n\n## 接口信息\n\n### 获取访问令牌\n- **接口**: `POST /auth/v3/tenant_access_token/internal`\n- **用途**: 获取飞书 API 访问令牌\n\n### 上传文件\n- **接口**: `POST /im/v1/files`\n- **用途**: 上传语音文件到飞书服务器\n\n**关键参数**:\n- `file_type=opus` - 文件类型必须是 opus\n- `duration` - 音频时长（毫秒，整数）\n\n### 发送消息\n- **接口**: `POST /im/v1/messages?receive_id_type=open_id`\n- **用途**: 发送语音消息\n\n**消息格式**:\n```json\n{\n  \"receive_id\": \"ou_xxx\",\n  \"msg_type\": \"audio\",\n  \"content\": \"{\\\"file_key\\\": \\\"xxx\\\", \\\"duration\\\": 6000}\"\n}\n```\n\n## 音频格式要求\n\n| 参数 | 要求 |\n|------|------|\n| 格式 | opus (OGG 容器) |\n| 编码 | libopus |\n| 比特率 | 24k |\n| 采样率 | 24000 Hz |\n| 声道 | 单声道 |\n\n## 环境变量说明\n\n### 必需变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_APP_ID | 飞书应用 ID |\n| FEISHU_APP_SECRET | 飞书应用密钥 |\n| COZE_API_KEY | Coze API 密钥 |\n\n### 可选变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_RECEIVER | 默认接收者 Open ID |\n| FEISHU_APP_ID_B | 应用 B 的 ID（多应用场景） |\n| FEISHU_APP_SECRET_B | 应用 B 的密钥 |\n| FEISHU_RECEIVER_B | 应用 B 的接收者 |\n\n## 官方文档\n\nhttps://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n\nFile v1.1.0:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.1.0\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\", \"coze\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n\nArchive v2.0.0: 6 files, 8749 bytes\n\nFiles: package.json (542b), README.md (2344b), scripts/send_voice_auto.sh (3852b), scripts/send_voice.sh (5499b), SKILL.md (5241b), _meta.json (131b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `voice_id` (可选): Coze 音色 ID（默认：1）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n- `接收者` (可选): 飞书 open_id\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n- `COZE_API_KEY`: Coze API 密钥\n\n### 流程说明\n\n1. **TTS 生成**: 使用 coze-tts 生成 MP3 格式音频\n2. **语速调整**（可选）: 使用 ffmpeg atempo 滤镜调整语速\n3. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n4. **读取时长**: 使用 ffprobe 获取音频时长（毫秒）\n5. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n6. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id_here\"\nexport FEISHU_APP_SECRET=\"your_app_secret_here\"\nexport COZE_API_KEY=\"your_coze_key_here\"\n\n# 发送语音（默认设置）\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\"\n\n# 发送语音（指定 voice_id=2，语速 1.2x）\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\" 2 1.2\n```\n\n## 注意事项\n\n1. **Coze TTS 限制**: 单次文本长度请参考 Coze 文档\n2. **整数时长**: duration 必须是整数毫秒\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **语速范围**: 支持 0.5-2.0x，使用 ffmpeg atempo 实现\n5. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## 更新日志\n\n**2026-03-24**: 从 zhipu-tts 迁移到 coze-tts，新增语速调整功能\n\nFile v2.0.0:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 zhipu-tts）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n- ✅ 支持多种声音和语速\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# 智谱 AI 配置（用于 TTS）\nexport ZHIPU_API_KEY=\"your_zhipu_key\"       # 智谱 API 密钥\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `zhipu-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport ZHIPU_API_KEY=\"your_zhipu_key\"\n\n# 发送语音消息（默认声音）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定声音和语速\nbash scripts/send_voice.sh \"你好\" tongtong 1.2\n```\n\n## 可用声音\n\n- **tongtong** (彤彤) - 默认女声，平衡音色\n- **chuichui** (锤锤) - 男声，深沉音色\n- **xiaochen** (小陈) - 年轻声音\n\n## 语速范围\n\n- 0.5 - 2.0（默认 1.0）\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数秒），否则时长显示为 0。\n\n## 使用场景\n\n- 📢 飞书机器人语音通知\n- 🤖 智能客服语音回复\n- 📝 自动语音播报\n- 🎙️ 语音消息群发\n- 👥 飞书群语音互动\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1774365022492\n}\n\nFile v2.0.0:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.0.0\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"ZHIPU_API_KEY\"],\n      \"skills\": [\"zhipu-tts\"]\n    }\n  }\n}\n\nArchive v1.0.1: 6 files, 8418 bytes\n\nFiles: package.json (542b), README.md (2344b), scripts/send_voice_auto.sh (3852b), scripts/send_voice.sh (4666b), SKILL.md (4773b), _meta.json (131b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"ZHIPU_API_KEY\"],\n      \"skills\": [\"zhipu-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 zhipu-tts）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n- ✅ 支持多种声音和语速\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# 智谱 AI 配置（用于 TTS）\nexport ZHIPU_API_KEY=\"your_zhipu_key\"       # 智谱 API 密钥\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `zhipu-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定声音和语速\nbash scripts/send_voice.sh \"你好\" tongtong 1.2\n\n# 可用声音：\n# - tongtong (彤彤) - 默认女声，平衡音色\n# - chuichui (锤锤) - 男声，深沉音色\n# - xiaochen (小陈) - 年轻声音\n\n# 语速范围：0.5 - 2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [声音] [语速]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `声音` (可选): tongtong, chuichui, xiaochen（默认：tongtong）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n\n### 流程说明\n\n1. **TTS 生成**: 使用 zhipu-tts 生成 WAV 格式音频\n2. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n3. **读取时长**: 使用 ffprobe 获取音频时长（秒）\n4. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n5. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6\"          # ← 关键参数\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数秒）\n\n```bash\n# 获取时长（四舍五入）\nDURATION=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1}')\n\n# 上传时带上 duration\ncurl ... -F \"duration=$DURATION\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.wav -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id_here\"\nexport FEISHU_APP_SECRET=\"your_app_secret_here\"\nexport ZHIPU_API_KEY=\"your_zhipu_key_here\"\n\n# 发送语音\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好，这是一条测试语音消息。\"\n```\n\n## 注意事项\n\n1. **时长限制**: 智谱 TTS 单次最多 1024 字符\n2. **整数时长**: duration 必须是整数（四舍五入）\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `zhipu-tts`: 文字转语音\n- `zhipu-asr`: 语音转文字\n\nFile v1.0.1:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 zhipu-tts）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n- ✅ 支持多种声音和语速\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# 智谱 AI 配置（用于 TTS）\nexport ZHIPU_API_KEY=\"your_zhipu_key\"       # 智谱 API 密钥\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `zhipu-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport ZHIPU_API_KEY=\"your_zhipu_key\"\n\n# 发送语音消息（默认声音）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定声音和语速\nbash scripts/send_voice.sh \"你好\" tongtong 1.2\n```\n\n## 可用声音\n\n- **tongtong** (彤彤) - 默认女声，平衡音色\n- **chuichui** (锤锤) - 男声，深沉音色\n- **xiaochen** (小陈) - 年轻声音\n\n## 语速范围\n\n- 0.5 - 2.0（默认 1.0）\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数秒），否则时长显示为 0。\n\n## 使用场景\n\n- 📢 飞书机器人语音通知\n- 🤖 智能客服语音回复\n- 📝 自动语音播报\n- 🎙️ 语音消息群发\n- 👥 飞书群语音互动\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1771687579996\n}\n\nFile v1.0.1:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.0.0\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"ZHIPU_API_KEY\"],\n      \"skills\": [\"zhipu-tts\"]\n    }\n  }\n}\n\nArchive v1.0.0: 6 files, 8589 bytes\n\nFiles: package.json (542b), README.md (2344b), scripts/send_voice_auto.sh (3911b), scripts/send_voice.sh (4725b), SKILL.md (4799b), _meta.json (131b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"ZHIPU_API_KEY\"],\n      \"skills\": [\"zhipu-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 zhipu-tts）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n- ✅ 支持多种声音和语速\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# 智谱 AI 配置（用于 TTS）\nexport ZHIPU_API_KEY=\"your_zhipu_key\"       # 智谱 API 密钥\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `zhipu-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定声音和语速\nbash scripts/send_voice.sh \"你好\" tongtong 1.2\n\n# 可用声音：\n# - tongtong (彤彤) - 默认女声，平衡音色\n# - chuichui (锤锤) - 男声，深沉音色\n# - xiaochen (小陈) - 年轻声音\n\n# 语速范围：0.5 - 2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [声音] [语速]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `声音` (可选): tongtong, chuichui, xiaochen（默认：tongtong）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n\n### 流程说明\n\n1. **TTS 生成**: 使用 zhipu-tts 生成 WAV 格式音频\n2. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n3. **读取时长**: 使用 ffprobe 获取音频时长（秒）\n4. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n5. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6\"          # ← 关键参数\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数秒）\n\n```bash\n# 获取时长（四舍五入）\nDURATION=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1}')\n\n# 上传时带上 duration\ncurl ... -F \"duration=$DURATION\"\n```\n\n### 无法播放\n\n**问题**: 语音消息无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.wav -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 完整示例\n\n```bash\n# 设置环境变量\nexport FEISHU_APP_ID=\"cli_a9f73f30c4389cd0\"\nexport FEISHU_APP_SECRET=\"Jv15kBkLKrmlunZy9g9G7gyMSjgb0Beh\"\nexport ZHIPU_API_KEY=\"your_key\"\n\n# 发送语音\nbash /root/.openclaw/workspace/skills/feishu-voice/scripts/send_voice.sh \\\n  \"你好小帅，我是小美！这是一条测试语音消息。\"\n```\n\n## 注意事项\n\n1. **时长限制**: 智谱 TTS 单次最多 1024 字符\n2. **整数时长**: duration 必须是整数（四舍五入）\n3. **opus 格式**: 飞书只接受 opus 格式的音频消息\n4. **文件清理**: 临时文件会自动清理\n\n## 相关技能\n\n- `zhipu-tts`: 文字转语音\n- `zhipu-asr`: 语音转文字\n\nFile v1.0.0:README.md\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 zhipu-tts）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n- ✅ 支持多种声音和语速\n\n## 前置要求\n\n### 环境变量\n\n```bash\n# 飞书配置\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 接收者 Open ID（可选，默认从上下文获取）\n\n# 智谱 AI 配置（用于 TTS）\nexport ZHIPU_API_KEY=\"your_zhipu_key\"       # 智谱 API 密钥\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `zhipu-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport ZHIPU_API_KEY=\"your_zhipu_key\"\n\n# 发送语音消息（默认声音）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定声音和语速\nbash scripts/send_voice.sh \"你好\" tongtong 1.2\n```\n\n## 可用声音\n\n- **tongtong** (彤彤) - 默认女声，平衡音色\n- **chuichui** (锤锤) - 男声，深沉音色\n- **xiaochen** (小陈) - 年轻声音\n\n## 语速范围\n\n- 0.5 - 2.0（默认 1.0）\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数秒），否则时长显示为 0。\n\n## 使用场景\n\n- 📢 飞书机器人语音通知\n- 🤖 智能客服语音回复\n- 📝 自动语音播报\n- 🎙️ 语音消息群发\n- 👥 飞书群语音互动\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1771685405723\n}\n\nFile v1.0.0:package.json\n\n{\n  \"name\": \"feishu-voice\",\n  \"version\": \"1.0.0\",\n  \"description\": \"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、时长读取、文件上传和消息发送\",\n  \"keywords\": [\"feishu\", \"voice\", \"tts\", \"audio\", \"messaging\", \"chinese\"],\n  \"author\": \"franklu0819-lang\",\n  \"license\": \"MIT\",\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"ZHIPU_API_KEY\"],\n      \"skills\": [\"zhipu-tts\"]\n    }\n  }\n}","readmeExcerpt":"Skill: Feishu Voice Owner: franklu0819-lang Summary: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。 Tags: audio:1.1.2, chinese:1.1.2, coze:1.1.2, feishu:1.1.2, latest:1.2.0, messaging:1.1.2, tts:1.1.2, voice:1.1.2 Version history: v1.2.0 | 2026-03-28T15:13:35.856Z | user 优化Token获取逻辑，修复参数错误，增加默认配置支持 v1.1.2 | 2026-03-25T04:10:52.367Z | user 删除遗留脚本，修复硬编码路径，测试验证通过 v1.1.1 | 2026-03-25T03:21:56.404Z | user 修","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥"},{"language":"bash","snippet":"# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录"},{"language":"bash","snippet":"# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\""},{"language":"bash","snippet":"# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）"},{"language":"bash","snippet":"bash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]"},{"language":"bash","snippet":"curl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: feishu-voice\ndescription: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。\nmetadata: {\n  \"openclaw\": {\n    \"requires\": {\n      \"bins\": [\"ffmpeg\", \"ffprobe\", \"jq\"],\n      \"env\": [\"FEISHU_APP_ID\", \"FEISHU_APP_SECRET\", \"COZE_API_KEY\"],\n      \"optional_env\": [\"FEISHU_RECEIVER\", \"FEISHU_APP_ID_B\", \"FEISHU_APP_SECRET_B\", \"FEISHU_RECEIVER_B\", \"OPENCLAW_WORKSPACE\"],\n      \"skills\": [\"coze-tts\"]\n    }\n  }\n}\n---\n\n# 飞书语音消息发送技能\n\n将文本转换为语音消息发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n```\n\n## 脚本说明\n\n### send_voice.sh\n\n主脚本，完整的语音消息发送流程。\n\n**用法：**\n```bash\nbash scripts/send_voice.sh <文本> [voice_id] [语速] [接收者]\n```\n\n**参数：**\n- `文本` (必需): 要转换为语音的文字\n- `voice_id` (可选): Coze 音色 ID（默认：1）\n- `语速` (可选): 0.5-2.0（默认：1.0）\n- `接收者` (可选): 飞书 open_id\n\n**环境变量：**\n- `FEISHU_APP_ID`: 飞书应用 ID\n- `FEISHU_APP_SECRET`: 飞书应用密钥\n- `FEISHU_RECEIVER`: 接收者 Open ID（可选）\n- `COZE_API_KEY`: Coze API 密钥\n\n### 流程说明\n\n1. **TTS 生成**: 使用 coze-tts 生成 MP3 格式音频\n2. **语速调整**（可选）: 使用 ffmpeg atempo 滤镜调整语速\n3. **格式转换**: 使用 ffmpeg 转换为 opus 格式\n4. **读取时长**: 使用 ffprobe 获取音频时长（毫秒）\n5. **上传文件**: 上传到飞书，指定 `file_type=opus` 和 `duration`\n6. **发送消息**: 发送 `msg_type=audio` 消息\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 正确的上传方式\ncurl -X POST \"https://open.feishu.cn/open-apis/im/v1/files\" \\\n  -F \"file=@voice.opus\" \\\n  -F \"file_type=opus\" \\\n  -F \"duration=6000\"          # ← 关键参数（毫秒）\n```\n\n### API 端点\n\n| 端点 | 用途 |\n|------|------|\n| `/auth/v3/tenant_access_token/internal` | 获取访问令牌 |\n| `/im/v1/files` | 上传文件 |\n| `/im/v1/messages` | 发送消息 |\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n###"},{"path":"README.md","content":"# 飞书语音消息发送技能\n\n将文本转换为语音消息并发送到飞书，支持在飞书聊天窗口直接播放。\n\n## 功能特性\n\n- ✅ TTS 文字转语音（使用 **coze-tts**）\n- ✅ 支持语速调整（0.5-2.0x）\n- ✅ 自动转换为 opus 格式（飞书要求）\n- ✅ 读取音频时长\n- ✅ 上传到飞书服务器\n- ✅ 发送可播放的语音消息\n\n## 前置要求\n\n### 环境变量\n\n**必需变量：**\n\n```bash\n# 飞书配置（必需）\nexport FEISHU_APP_ID=\"cli_xxx\"              # 飞书应用 ID\nexport FEISHU_APP_SECRET=\"your_secret\"      # 飞书应用密钥\n\n# Coze 配置（用于 TTS）\nexport COZE_API_KEY=\"your_coze_key\"         # Coze API 密钥\n```\n\n**可选变量：**\n\n```bash\n# 接收者配置\nexport FEISHU_RECEIVER=\"ou_xxx\"             # 默认接收者 Open ID\n\n# 多应用配置（用于支持多个飞书应用）\nexport FEISHU_APP_ID_B=\"cli_xxx\"            # 应用 B 的 ID\nexport FEISHU_APP_SECRET_B=\"your_secret\"    # 应用 B 的密钥\nexport FEISHU_RECEIVER_B=\"ou_xxx\"           # 应用 B 的接收者\n\n# 工作区路径（用于定位依赖技能）\nexport OPENCLAW_WORKSPACE=\"/path/to/workspace\"  # OpenClaw 工作区目录\n```\n\n### 必需工具\n\n- `ffmpeg` - 音频格式转换、语速调整\n- `ffprobe` - 读取音频信息\n- `jq` - JSON 处理\n\n### 依赖技能\n\n- `coze-tts` - 文字转语音\n\n## 快速开始\n\n```bash\n# 安装依赖（如果需要）\nsudo apt-get install ffmpeg ffprobe jq\n\n# 设置环境变量\nexport FEISHU_APP_ID=\"your_app_id\"\nexport FEISHU_APP_SECRET=\"your_app_secret\"\nexport COZE_API_KEY=\"your_coze_key\"\n\n# 发送语音消息（默认设置）\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n\n# 指定 voice_id 和语速\nbash scripts/send_voice.sh \"你好\" 2 1.2\n```\n\n## 使用方法\n\n### 基本用法\n\n```bash\n# 发送语音消息\nbash scripts/send_voice.sh \"你好，这是一条语音消息\"\n```\n\n### 高级选项\n\n```bash\n# 参数说明：\n# - voice_id: Coze 音色 ID（默认 1）\n# - 语速: 0.5-2.0（默认 1.0）\n# - 接收者: 飞书 open_id（可选）\n\nbash scripts/send_voice.sh \"你好\" 2 1.2 ou_xxx\n```\n\n## 技术细节\n\n### 音频格式要求\n\n飞书语音消息要求：\n- **格式**: opus (OGG 容器)\n- **编码**: libopus\n- **比特率**: 24k\n- **采样率**: 24000 Hz\n- **声道**: 单声道\n\n### Duration 参数\n\n**关键**: 必须在上传时提供 `duration` 参数（整数毫秒），否则时长显示为 0。\n\n```bash\n# 获取时长（转换为毫秒）\nDURATION_MS=$(ffprobe -v error -show_entries format=duration \\\n  -of default=noprint_wrappers=1:nokey=1 voice.opus | awk '{printf \"%.0f\", $1 * 1000}')\n\n# 上传时带上 duration（毫秒）\ncurl ... -F \"duration=$DURATION_MS\"\n```\n\n## 故障排查\n\n### 语音没有时长\n\n**问题**: 发送的语音消息时长显示为 0\n\n**解决**: 确保在上传时传递了 `duration` 参数（整数毫秒）\n\n### 无法播放\n\n**可能原因**:\n1. 格式不是 opus\n2. `file_type` 参数错误\n3. 文件损坏\n\n**解决**:\n```bash\n# 检查格式\nffprobe voice.opus\n\n# 重新转换\nffmpeg -i input.mp3 -c:a libopus -b:a 24k voice.opus\n```\n\n### API 权限错误\n\n**问题**: 上传时返回权限错误\n\n**解决**: 确保飞书应用有以下权限：\n- `im:message`\n- `im:message:send_as_bot`\n\n## 相关技能\n\n- `coze-tts`: 文字转语音\n- `coze-asr`: 语音转文字\n\n## Author\n\nfranklu0819-lang\n\n## License\n\nMIT"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn784af36jyc12gczmcr7fq0a981dbhr\",\n  \"slug\": \"feishu-voice\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1774710815856\n}"},{"path":"references/feishu_voice_api.md","content":"# 飞书语音消息 API 参考\n\n## 接口信息\n\n### 获取访问令牌\n- **接口**: `POST /auth/v3/tenant_access_token/internal`\n- **用途**: 获取飞书 API 访问令牌\n\n### 上传文件\n- **接口**: `POST /im/v1/files`\n- **用途**: 上传语音文件到飞书服务器\n\n**关键参数**:\n- `file_type=opus` - 文件类型必须是 opus\n- `duration` - 音频时长（毫秒，整数）\n\n### 发送消息\n- **接口**: `POST /im/v1/messages?receive_id_type=open_id`\n- **用途**: 发送语音消息\n\n**消息格式**:\n```json\n{\n  \"receive_id\": \"ou_xxx\",\n  \"msg_type\": \"audio\",\n  \"content\": \"{\\\"file_key\\\": \\\"xxx\\\", \\\"duration\\\": 6000}\"\n}\n```\n\n## 音频格式要求\n\n| 参数 | 要求 |\n|------|------|\n| 格式 | opus (OGG 容器) |\n| 编码 | libopus |\n| 比特率 | 24k |\n| 采样率 | 24000 Hz |\n| 声道 | 单声道 |\n\n## 环境变量说明\n\n### 必需变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_APP_ID | 飞书应用 ID |\n| FEISHU_APP_SECRET | 飞书应用密钥 |\n| COZE_API_KEY | Coze API 密钥 |\n\n### 可选变量\n\n| 变量名 | 说明 |\n|--------|------|\n| FEISHU_RECEIVER | 默认接收者 Open ID |\n| FEISHU_APP_ID_B | 应用 B 的 ID（多应用场景） |\n| FEISHU_APP_SECRET_B | 应用 B 的密钥 |\n| FEISHU_RECEIVER_B | 应用 B 的接收者 |\n| OPENCLAW_WORKSPACE | OpenClaw 工作区目录路径 |\n\n## TTS 脚本路径解析\n\n脚本会按以下顺序尝试找到 coze-tts：\n\n1. **相对路径**: `../coze-tts/scripts/text_to_speech.sh`（相对于当前技能目录）\n2. **环境变量**: `$OPENCLAW_WORKSPACE/skills/coze-tts/scripts/text_to_speech.sh`\n3. **常见路径**: 尝试 `$HOME/.openclaw/workspace`、`$HOME/openclaw/workspace`、`/opt/openclaw/workspace`\n\n## 官方文档\n\nhttps://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create"},{"path":"skill-card.md","content":"## Description:\n\nFeishu Voice converts text to speech with coze-tts, converts the audio to Feishu-compatible opus format, uploads it, and sends it as a playable Feishu voice message.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[franklu0819-lang](https://clawhub.ai/user/franklu0819-lang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and operators use this skill to automate sending generated voice messages into Feishu chats from text input, with optional voice, speed, and receiver parameters.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends user text and generated audio through external Feishu and Coze services while using local credentials.\n\nMitigation: Use minimally scoped Feishu and Coze credentials, restrict the Feishu app permissions to the needed chat workflow, and avoid sensitive text unless the data path is approved.\n\nRisk: The skill executes a local coze-tts dependency that may inherit environment secrets.\n\nMitigation: Install coze-tts only from a trusted local path and review that dependency before running this skill with production credentials.\n\nRisk: Temporary audio files are created on the local machine during conversion.\n\nMitigation: Run the skill in a trusted or isolated workspace and avoid shared machines for sensitive voice content until temporary-file handling is hardened.\n\n## Reference(s):\n\n- [ClawHub Feishu Voice skill page](https://clawhub.ai/franklu0819-lang/skills/feishu-voice)\n- [Feishu voice API reference](artifact/references/feishu_voice_api.md)\n- [Feishu message create documentation](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Configuration, API Calls, Files, Text]\n\n**Output Format:** [Markdown guidance with bash command examples; runtime output is terminal status text and a Feishu voice message side effect.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires ffmpeg, ffprobe, jq, Feishu credentials, a Coze API key, and the coze-tts dependency; generates temporary local audio files during execution.]\n\n## Skill Version(s):\n\n1.2.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。 Skill: Feishu Voice Owner: franklu0819-lang Summary: 飞书语音消息发送技能。将文本转换为语音并发送到飞书，支持 TTS 生成、格式转换、语速调整、时长读取、文件上传和消息发送。 Tags: audio:1.1.2, chinese:1.1.2, coze:1.1.2, feishu:1.1.2, latest:1.2.0, messaging:1.1.2, tts:1.1.2, voice:1.1.2 Version history: v1.2.0 | 2026-03-28T15:13:35.856Z | user 优化Token获取逻辑，修复参数错误，增加默认配置支持 v1.1.2 | 2026-03-25T04:10:52.367Z | user 删除遗留脚本，修复硬编码路径，测试验证通过 v1.1.1 | 2026-03-25T03:21:56.404Z | user 修","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":940,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T14:21:53.787Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:24:43.265Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}