{"skill":{"slug":"moss-tts-family-chatbot","displayName":"moss-tts-family-chatbot","summary":"MOSI Studio 音频全套能力：语音转文字（ASR）、文字转语音（TTS）、 多说话人对话合成、声音克隆、飞书语音气泡。 两类触发场景： 1. 消息中包含 \"[media attached:\"、\"audio/ogg\"、\"audio/opus\" 或 路径 /home/openclaw/.openclaw/me...","description":"---\nname: mosi-studio\ndescription: >\n  MOSI Studio 音频全套能力：语音转文字（ASR）、文字转语音（TTS）、\n  多说话人对话合成、声音克隆、飞书语音气泡。\n  两类触发场景：\n  1. 消息中包含 \"[media attached:\"、\"audio/ogg\"、\"audio/opus\" 或\n     路径 /home/openclaw/.openclaw/media/inbound/ 时——用户发来了语音，\n     必须立刻转写，禁止说\"我没有语音识别能力\"。\n  2. 用户主动要求：TTS、文字转语音、语音合成、生成语音、克隆声音、\n     声音克隆、多说话人、对话合成、语音气泡、发语音、转语音、\n     \"text to speech\"、\"voice synthesis\"、\"generate audio\"、\n     \"voice clone\"、\"multi-speaker\"。\n  用户如果要求用语音回复，除非情况复杂需要说明，否则只需要回一条语音。\n---\n\n# MOSI Studio 音频全套 Skill\n\n> **文件路径铁律（禁止例外）**\n> 所有生成的音频文件必须保存到 `~/.openclaw/workspace/`。\n> 绝对不能用 `/tmp/`、`/var/tmp/` 或相对路径。\n> OpenClaw 媒体策略会静默拦截 workspace 以外的文件——不报错，直接失败。\n> 错误示例：`ffmpeg -i x.wav /tmp/out.opus`\n> 正确示例：`ffmpeg -i x.wav ~/.openclaw/workspace/out.opus`\n\n支持的能力：\n\n| 功能 | 模型 | 脚本 |\n|------|------|------|\n| 文字转语音（TTS） | moss-tts | `scripts/mosi_tts.sh` / `mosi_tts.py` |\n| 指令式语音生成 | moss-voice-generator | `scripts/mosi_voice_generator.sh` |\n| 语音转文字（ASR） | — | `scripts/mosi_asr.sh` |\n| 多说话人对话合成 | moss-ttsd | `scripts/mosi_dialogue.sh` |\n| 音效生成 | moss-sound-effect | `scripts/mosi_sound_effect.sh` |\n| 声音克隆 | — | `scripts/mosi_voice.py` |\n| 飞书语音气泡 | — | `scripts/mosi_feishu_voice.sh` |\n\nBase URL：`https://studio.mosi.cn`\n\n---\n\n## 环境准备\n\n### API Key\n\nKey 通过 Kubernetes Secret 注入为 `MOSI_TTS_API_KEY`，对话中不得透露。\n\n```bash\necho \"key已配置: $([ -n \"$MOSI_TTS_API_KEY\" ] \\\n  && echo yes || echo NO)\"\n```\n\n### 依赖清单\n\n下表列出本 skill 用到的所有外部工具，以及缺失时的替代方案：\n\n| 工具 | 用途 | 缺失时的处理 |\n|------|------|-------------|\n| `node` | JSON 处理、base64 解码 | 基础镜像自带，始终可用 |\n| `curl` | HTTP 请求 | 基础镜像自带，始终可用 |\n| `ffmpeg` | WAV→OPUS 转换（语音气泡必需） | 无法发语音气泡，TTS 仍可用 |\n| `ffprobe` | 获取音频时长（随 ffmpeg 一起安装） | 同上 |\n| `python3` + `python3-requests` | 声音克隆脚本 | 克隆功能不可用，其他功能正常 |\n| `bc` | 浮点数计算 | 用 `awk` 或 `node -e` 替代 |\n| `jq` | JSON 解析 | 用 `node -e` 替代 |\n| `wget` | 文件下载 | 用 `curl -O` 替代 |\n| `sox` | 音频格式分析/转换 | 用 `ffprobe` 替代 |\n| `mediainfo` | 媒体文件元信息 | 用 `ffprobe` 替代 |\n| `unzip` / `zip` | 压缩包处理 | — |\n| `tree` | 目录结构显示 | 用 `ls -R` 替代 |\n| `nano` | 文件编辑 | — |\n\n### 一键检查当前环境\n\n```bash\nfor cmd in node curl ffmpeg ffprobe python3 \\\n           bc jq wget sox mediainfo unzip zip; do\n  printf \"%-12s %s\\n\" \"$cmd\" \\\n    \"$(which $cmd 2>/dev/null || echo '未安装')\"\ndone\n```\n\n### 安装缺失依赖\n\n**推荐方式**：重新构建镜像（`Dockerfile.py3` 已包含全部依赖）：\n\n```bash\n# 在项目根目录执行\ndocker build -f Dockerfile.py3 -t openclaw-custom .\n```\n\n**临时安装**（有 root 权限，重启后失效）：\n\n```bash\napt-get update && apt-get install -y --no-install-recommends \\\n  python3 python3-pip python3-requests \\\n  ffmpeg bc jq wget sox mediainfo unzip zip tree nano\n```\n\n**没有 root 权限时**：\n\n- 基础 TTS / ASR / 对话合成：只需 `curl` + `node`，脚本可直接运行\n- 飞书语音气泡：必须有 `ffmpeg`，无权限时请让用户重建镜像\n- 声音克隆：需要 `python3`，无权限时功能不可用\n\n---\n\n## 1. 文字转语音（TTS）\n\n**接口**：`POST /api/v1/audio/speech`\n**模型**：`moss-tts`\n**输出**：24 kHz WAV，响应中 base64 编码\n\n### Shell 脚本（无额外依赖）\n\n```bash\nbash scripts/mosi_tts.sh --text \"你好，世界\"\n# 保存到：~/.openclaw/workspace/tts_output.wav\n\nbash scripts/mosi_tts.sh \\\n  --text \"Hello, world\" \\\n  --voice-id 2001931510222950400 \\\n  --output ~/.openclaw/workspace/my_audio.wav\n```\n\n### Python 脚本（需要 python3 + requests）\n\n```bash\npython3 scripts/mosi_tts.py \\\n  --text \"你好，世界\" \\\n  --output ~/.openclaw/workspace/tts_output.wav\n```\n\n> **输出路径规则**：必须用 `~/.openclaw/workspace/`，\n> workspace 以外的路径会被 OpenClaw 媒体策略拦截。\n\n### 请求参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `model` | string | — | 固定 `moss-tts` |\n| `text` | string | — | 要合成的文本 |\n| `voice_id` | string | — | 公共或自定义声音 ID |\n| `expected_duration_sec` | float | 自动 | 目标时长（0.5–1.5× 自然语速） |\n| `sampling_params.temperature` | float | 1.7 | 中文 1.7，英文 1.5 |\n| `sampling_params.max_new_tokens` | int | 512 | 最大 token 数 |\n| `meta_info` | bool | false | 是否返回性能指标 |\n\n### 内置公共声音\n\n| 声音 ID | 名称 | 风格 |\n|---------|------|------|\n| 2001257729754140672 | 阿树 | 轻松自然（默认） |\n| 2001931510222950400 | 程述 | 播客、理性 |\n| 2002941772480647168 | 阿宁 | 温柔、暖心 |\n| 2020009311371005952 | 台湾女声 | 柔和、治愈 |\n| 2020008594694475776 | 北京男声 | 清晰、标准 |\n| 2001286865130360832 | 周周 | 独白、讲故事 |\n| 2001898421836845056 | 子琪 | 活力、明亮 |\n| 2001910895478837248 | 小满 | 甜美、开朗 |\n| 2002991117984862208 | 梁子 | 专业、播报 |\n\n---\n\n## 2. 指令式语音生成（Voice Generator）\n\n**接口**：`POST /api/v1/audio/speech`\n**模型**：`moss-voice-generator`\n**输出**：24 kHz WAV，响应中 base64 编码\n\n通过自然语言描述所需的声音特征，即可生成对应风格的语音。\n如果用户需要生成特定的某个名人的声音，可以告诉用户自己需要上网找一段音色，然后用这个音色调用voice clone接口（找不到就算了）。\n无需指定 voice_id，用文字描述即可。\n\n### Shell 脚本\n\n```bash\n# 播音腔女声\nbash scripts/mosi_voice_generator.sh \\\n  -t \"各位观众朋友们大家好，欢迎收看今天的新闻节目。\" \\\n  -i \"播音腔女声，专业、清晰、有亲和力，像央视新闻主播\"\n\n# 温柔男声\nbash scripts/mosi_voice_generator.sh \\\n  -t \"晚安，好梦\" \\\n  -i \"一个温柔的男声，轻柔舒缓\"\n\n# 有活力的年轻女声\nbash scripts/mosi_voice_generator.sh \\\n  -t \"欢迎来到我们的节目！\" \\\n  -i \"年轻有活力的女声，热情开朗\"\n\n# 指定输出路径\nbash scripts/mosi_voice_generator.sh \\\n  -t \"要生成的文字\" \\\n  -i \"声音描述\" \\\n  -o ~/.openclaw/workspace/output.wav\n\n# 获取性能指标\nbash scripts/mosi_voice_generator.sh \\\n  -t \"测试文本\" \\\n  -i \"专业女声\" \\\n  --meta-info\n```\n\n### 请求参数\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `model` | string | 是 | 固定 `moss-voice-generator` |\n| `text` | string | 是 | 要转换成语音的文字 |\n| `instruction` | string | 是 | 声音风格描述，如：一个温柔的女声 |\n| `sampling_params.temperature` | float | 否 | 采样温度，默认 1.5 |\n| `sampling_params.top_p` | float | 否 | 核采样阈值，默认 0.6 |\n| `sampling_params.top_k` | int | 否 | Top-K 采样，默认 50 |\n| `meta_info` | bool | 否 | 是否返回性能指标，默认 false |\n\n### instruction 描述技巧\n\n描述越详细，生成的声音越符合预期：\n\n```\n# 好的描述示例\n\"播音腔女声，专业、清晰、有亲和力，像央视新闻主播\"\n\"年轻有活力的男声，语速稍快，充满热情\"\n\"温柔知性的女声，语速缓慢，像在讲睡前故事\"\n\"沉稳有力的男声，低沉磁性，适合广告旁白\"\n\n# 不够好的描述\n\"女声\"  # 太笼统\n\"好听的声音\"  # 没有具体特征\n```\n\n### 请求示例\n\n```json\n{\n  \"model\": \"moss-voice-generator\",\n  \"text\": \"各位观众朋友们大家好\",\n  \"instruction\": \"播音腔女声，专业、清晰、有亲和力\",\n  \"sampling_params\": {\n    \"temperature\": 1.5,\n    \"top_p\": 0.6,\n    \"top_k\": 50\n  }\n}\n```\n\n---\n\n## 3. 语音转文字（ASR）\n\n**接口**：`POST /api/v1/audio/transcriptions`\n**支持格式**：WAV / MP3 / M4A / FLAC / OPUS / OGG\n**输出**：纯文本转写结果\n\n### 接收飞书入站语音（最常见场景）\n\n用户发语音后，OpenClaw 在消息顶部注入：\n\n```\n[media attached: /home/openclaw/.openclaw/media/inbound/XXXXX.ogg (audio/ogg; codecs=opus) | ...]\n```\n\n**看到这行时，必须立刻转写，不得跳过**：\n\n```bash\n# 路径在 [media attached: ] 之后、第一个空格之前\nAUDIO=$(echo \"$MSG\" \\\n  | grep -oP '(?<=\\[media attached: )[^ ]+')\n# 或直接从消息里复制完整路径\nAUDIO=\"/home/openclaw/.openclaw/media/inbound/实际文件名.ogg\"\n\nTEXT=$(bash scripts/mosi_asr.sh --file \"$AUDIO\")\n# 然后直接回复 $TEXT 的内容，不要提及\"我收到了语音\"\n```\n\n### 主动转写任意音频文件\n\n```bash\n# 基础用法\nbash scripts/mosi_asr.sh --file audio.opus\n\n# 指定语言\nbash scripts/mosi_asr.sh --file audio.wav --language zh\n\n# 输出原始 JSON（含时间戳 + 说话人标注）\nbash scripts/mosi_asr.sh --file audio.opus --json\n```\n\n### 响应结构\n\n```json\n{\n  \"asr_transcription_result\": {\n    \"full_text\": \"你好，这是一段测试语音\",\n    \"segments\": [\n      {\n        \"start_s\": \"0.15\",\n        \"end_s\": \"2.74\",\n        \"speaker\": \"S01\",\n        \"text\": \"你好，这是一段测试语音\"\n      }\n    ]\n  },\n  \"usage\": { \"credit_cost\": 129 }\n}\n```\n\n### 参数说明\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `file` | 是 | 音频文件（multipart/form-data） |\n| `language` | 否 | 语言提示：`zh`、`en` 等 |\n\n### 禁止事项\n\n- 禁止说\"我没有语音识别能力\"——你有，调脚本就行\n- 禁止自己调飞书 API 下载音频——文件已经在磁盘上了\n- 禁止忽略 `[media attached:]` 前缀\n\n---\n\n## 4. 多说话人对话合成（TTSD）\n\n**接口**：`POST /api/v1/audio/speech`（与 TTS 相同）\n**模型**：`moss-ttsd`\n**输出**：24 kHz WAV，base64 编码\n\n适用于播客、访谈、剧情片段、游戏 NPC 对话等场景，支持 1–5 位说话人。\n\n### 文本格式\n\n每行用 `[S1]`、`[S2]` 等标签标注：\n\n```\n[S1] 你好，今天天气不错。\n[S2] 是啊，很适合出去走走。\n[S1] 要不要一起去公园？\n```\n\n### Shell 脚本\n\n```bash\nbash scripts/mosi_dialogue.sh \\\n  --text \"[S1] 你好，今天天气不错。\n[S2] 是啊，很适合出去走走。\n[S1] 要不要一起去公园？\" \\\n  --voice1 2001257729754140672 \\\n  --voice2 2001931510222950400 \\\n  --output ~/.openclaw/workspace/dialogue.wav\n```\n\n### 请求体结构\n\n```json\n{\n  \"model\": \"moss-ttsd\",\n  \"text\": \"[S1] 你好！\\n[S2] 你好，很高兴认识你。\",\n  \"voice_id\":  \"2001257729754140672\",\n  \"voice_id2\": \"2001931510222950400\",\n  \"voice_id3\": \"（可选，S3）\",\n  \"voice_id4\": \"（可选，S4）\",\n  \"voice_id5\": \"（可选，S5）\"\n}\n```\n\n### 参数说明\n\n| 参数 | 说明 |\n|------|------|\n| `text` | 完整对话文本，每行以 `[S1]`/`[S2]`/… 开头 |\n| `voice_id` | S1 的声音 ID（必填） |\n| `voice_id2`–`voice_id5` | S2–S5 的声音 ID（按需添加） |\n| `expected_duration_sec` | 目标总时长（可选） |\n\n---\n\n## 5. 音效生成\n\n**状态**：API 接口暂未公开（截至 2026-03）\n\n`moss-sound-effect` 模型存在，但 `studio.mosi.cn` 上还没有可用的\nREST 接口。通过 `/api/v1/audio/speech` 调用会返回：\n\n```json\n{\n  \"code\": 4000,\n  \"error\": \"Invalid Request: unsupported model for /audio/speech: moss-sound-effect\"\n}\n```\n\n`mosi_sound_effect.sh` 已预留，待接口上线后可直接使用。\n预期请求结构：\n\n```json\n{\n  \"model\": \"moss-sound-effect\",\n  \"prompt\": \"heavy rain with distant thunder\",\n  \"duration_sec\": 10\n}\n```\n\n关注 `studio.mosi.cn/docs` 获取接口上线通知。\n\n---\n\n## 6. 声音克隆\n\n从短音频（建议 10–120 秒）创建自定义声音。\n\n### 接口清单\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| POST | `/api/v1/files/upload` | 上传音频文件 |\n| POST | `/api/v1/voice/clone` | 从上传文件创建声音 |\n| GET | `/api/v1/voices` | 列出所有自定义声音 |\n| GET | `/api/v1/voices/{voice_id}` | 获取声音详情 |\n\n### 完整流程\n\n```bash\n# Step 1：上传音频（WAV/MP3/M4A/FLAC，最大 100 MB）\npython3 scripts/mosi_voice.py upload --file my_voice.wav\n# => File ID: 1234567890\n\n# Step 2：克隆\npython3 scripts/mosi_voice.py clone \\\n  --file-id 1234567890 \\\n  --text \"可选的转写文本，提供后质量更好\"\n# => Voice ID: abc123def\n\n# Step 3：在 TTS 中使用克隆声音\nbash scripts/mosi_tts.sh \\\n  --text \"这是我的克隆声音\" \\\n  --voice-id abc123def\n\n# 列出所有声音\npython3 scripts/mosi_voice.py list --status ACTIVE\n\n# 获取声音详情\npython3 scripts/mosi_voice.py get --voice-id abc123def\n```\n\n> `mosi_voice.py` 需要 `python3` + `requests`，\n> 缺失时参考\"环境准备\"章节安装。\n\n### 声音状态说明\n\n| 状态 | 含义 |\n|------|------|\n| `ACTIVE` | 可正常使用 |\n| `INACTIVE` | 已禁用 |\n| `FAILED` | 克隆失败 |\n| `DELETED` | 已删除 |\n\n---\n\n## 7. 飞书语音气泡\n\n> **直接用一键脚本，不要自己管理中间文件。**\n> 脚本内部已将所有路径固定在 `~/.openclaw/workspace/`。\n\n### 一行命令搞定\n\n```bash\nbash scripts/mosi_feishu_voice.sh \\\n  --text \"你好，世界\" \\\n  --chat-id <CHAT_ID>\n```\n\n`<CHAT_ID>` 从入站消息 context 中获取：\n群聊用 `GroupSubject` / `oc_xxxxxxxx`，私聊用 `From` / `ou_xxxxxxxx`。\n\n可选指定声音：\n\n```bash\nbash scripts/mosi_feishu_voice.sh \\\n  --text \"你好\" \\\n  --chat-id oc_xxxx \\\n  --voice-id 2001931510222950400\n```\n\n### 脚本内部流程\n\n1. TTS → `~/.openclaw/workspace/tts_output.wav`\n2. ffmpeg：WAV → `~/.openclaw/workspace/tts_output.opus`\n3. ffprobe 获取时长（毫秒）\n4. 用 `$FEISHU_APP_ID` / `$FEISHU_APP_SECRET` 获取 tenant_access_token\n5. 上传 OPUS 到飞书（`file_type=opus`）\n6. 发送语音消息（`msg_type=audio`）\n\n需要 ffmpeg：`apt-get install -y ffmpeg`\n\n---\n\n## 接口限额\n\n| 限制项 | 数值 |\n|--------|------|\n| TTS RPM | 5 次/分钟 |\n| 音效 RPM | 5 次/分钟 |\n| 对话合成 RPM | 5 次/分钟 |\n| 输出格式 | 24 kHz WAV（base64） |\n| TTS 超时 | 600 秒 |\n| 最大文本长度 | 约 1 小时音频 |\n\n---\n\n## 常见错误\n\n| 错误 | 原因 | 解决 |\n|------|------|------|\n| `MOSI_TTS_API_KEY not set` | Secret 未注入 | 检查 K8s Secret |\n| `{\"code\":4020}` | 余额不足 | 充值 MOSI 账户 |\n| `{\"code\":4029}` | 触发限速 | 等待 60 秒后重试 |\n| `{\"code\":5002}` | 声音不存在 | 确认 voice status 为 ACTIVE |\n| `{\"code\":5004}` | 请求超时 | 将文本切分为更短片段 |\n| `LocalMediaAccessError` | 输出路径被拦截 | 必须用 `~/.openclaw/workspace/` |\n| `ffmpeg: not found` | 未安装 | `apt-get install ffmpeg` 或改用纯 sh 脚本 |\n| `python3: not found` | 未安装 | TTS 用 `mosi_tts.sh`；声音克隆需安装 python3 |\n","tags":{"latest":"0.0.4"},"stats":{"comments":0,"downloads":687,"installsAllTime":1,"installsCurrent":1,"stars":0,"versions":1},"createdAt":1773221017400,"updatedAt":1778491828096},"latestVersion":{"version":"0.0.4","createdAt":1773221017400,"changelog":"**Summary:**  \nExpanded description: added multi-feature audio capability details, strict file path rules, supported operations, dependencies, and usage examples for multiple audio tasks.\n\n- Added detailed descriptions of supported audio features: ASR, TTS, multi-speaker dialogue synthesis, voice cloning, and Feishu voice bubbles.\n- Clarified strict file path requirements for generated audio outputs.\n- Listed and explained all script entry points and available audio models.\n- Provided comprehensive usage instructions for each capability (including sample scripts and parameter explanations).\n- Documented environment preparation steps, dependency handling, troubleshooting, and installation methods.\n- Included best practices, feature usage guides, and common pitfalls for users.","license":"MIT-0"},"metadata":null,"owner":{"handle":"mkkb473","userId":"s174hset0mwby06c5aeehg9bp983nexw","displayName":"YYL","image":"https://avatars.githubusercontent.com/u/39012250?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1780089838064}}