Install
openclaw skills install @thcjp/tts-whatsapp-paidopenclaw skills install @thcjp/tts-whatsapp-paid核心功能: 本技能提供(CRM)集成等能力。
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 基础功能 | 支持 | 支持 |
| WhatsApp语音消息专业版定时发送 | 不支持 | 支持 |
| WhatsApp语音消息专业版批量处理 | 不支持 | 支持 |
| 多渠道消息批量发送 | 不支持 | 支持 |
| 消息模板与变量注入 | 不支持 | 支持 |
| 送达状态实时回调 | 不支持 | 支持 |
| 能力 | 免费版 | 专业版 | 增量价值 |
|---|---|---|---|
| TTS 合成 | 支持 | 支持 | - |
| 多语言 | 40+ | 40+ | - |
| 单人发送 | 支持 | 支持 | - |
| 音质/语速 | 支持 | 支持 | - |
| 自动清理 | 支持 | 支持 | - |
| 群组发送 | 不支持 | 支持 | 群广播 |
| 批量发送 | 不支持 | 联系人列表群发 | 生产力 |
| 定时发送 | 不支持 | cron 任务 | 自动化 |
| 消息模板 | 不支持 | 变量替换 | 个性化 |
| 多语言批量 | 不支持 | 一次任务多语言 | 国际化 |
| 发送队列 | 不支持 | 并发控制 | 高吞吐 |
| 发送报告 | 不支持 | 状态追踪 | 审计 |
| API 服务 | 不支持 | FastAPI | 远程调用 |
| CRM 集成 | 不支持 | 联系人管理 | 客户运营 |
发送语音消息到 WhatsApp 群组.
tts-whatsapp "各位同事,明天上午十点有团队会议,请准时参加。" \
--lang zh_CN \
--voice zh_CN-huayan-medium \
--target "120363257357161211@g.us"
tts-whatsapp "Team, reminder: meeting tomorrow at 10 AM." \
--lang en_US \
--target "group-id@g.us"
基于联系人列表批量发送个性化语音消息.
import csv
import subprocess
import os
class BatchWhatsAppSender:
"""批量 WhatsApp 语音发送器"""
def __init__(self, default_lang="zh_CN", voice="zh_CN-huayan-medium"):
self.default_lang = default_lang
self.voice = voice
self.results = []
def send_from_csv(self, csv_path, template):
"""从 CSV 批量发送
Args:
csv_path: 联系人 CSV 文件路径
template: 消息模板,用 {name} 等占位符
"""
with open(csv_path, "r", encoding="utf-8") as f:
readers = csv.DictReader(f)
for row in readers:
message = template.format(**row)
target = row["phone"]
lang = row.get("language", self.default_lang)
voice = row.get("voice", self.voice)
result = self.send_one(message, target, lang, voice)
self.results.append({
"name": row.get("name", ""),
"phone": target,
"status": "success" if result else "failed",
"message": message[:50]
})
self.generate_report()
def send_one(self, text, target, lang, voice):
"""发送单条"""
try:
cmd = [
"tts-whatsapp", text,
"--lang", lang,
"--voice", voice,
"--target", target,
"--quality", "medium"
]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
return result.returncode == 0
except Exception as e:
print(f"发送失败 {target}: {e}")
return False
def generate_report(self):
"""生成发送报告"""
success = sum(1 for r in self.results if r["status"] == "success")
failed = len(self.results) - success
print(f"\n发送报告")
print(f"成功: {success}")
print(f"失败: {failed}")
print(f"总计: {len(self.results)}")
with open("send_report.csv", "w", encoding="utf-8") as f:
f.write("name,phone,status,message\n")
for r in self.results:
f.write(f"{r['name']},{r['phone']},{r['status']},{r['message']}\n")
sender = BatchWhatsAppSender()
sender.send_from_csv(
"contacts.csv",
"你好 {name},提醒您:{event} 将于 {time} 开始。"
)
name,phone,language,event,time
张三,+8613800138000,zh_CN,产品评审会,2026-07-20 14:00
李四,+8613800138001,zh_CN,产品评审会,2026-07-20 14:00
John,+15555550123,en_US,Product Review,2026-07-20 14:00
配置定时任务自动发送语音消息.
import schedule
import time
import subprocess
class ScheduledSender:
"""定时语音消息发送器"""
def __init__(self):
self.jobs = []
def add_daily(self, time_str, message, target, lang="zh_CN"):
"""添加每日定时任务"""
schedule.every().day.at(time_str).do(
self._send, message=message, target=target, lang=lang
)
self.jobs.append({"type": "daily", "time": time_str, "target": target})
def add_weekly(self, day, time_str, message, target, lang="zh_CN"):
"""添加每周定时任务"""
getattr(schedule.every(), day).at(time_str).do(
self._send, message=message, target=target, lang=lang
)
self.jobs.append({"type": "weekly", "day": day, "time": time_str})
def _send(self, message, target, lang):
"""执行发送"""
cmd = ["tts-whatsapp", message, "--lang", lang, "--target", target]
run(cmd, capture_output=True, text=True)
status = "成功" if result.returncode == 0 else "失败"
print(f"[{time.strftime('%H:%M:%S')}] {status}: {message[:30]}")
def run(self):
"""启动调度器"""
print(f"已加载 {len(self.jobs)} 个定时任务")
for job in self.jobs:
print(f" - {job}")
while True:
schedule.run_pending()
time.sleep(60)
scheduler = ScheduledSender()
scheduler.add_daily("09:00", "早上好!记得查看今日待办事项。", "+8613800138000")
scheduler.add_weekly("monday", "10:00",
"各位同事,请记得提交本周工作周报。", "group-id@g.us")
scheduler.run()
将语音消息发送封装为 API 服务.
from fastapi import FastAPI, BackgroundTasks
from fastapi.responses import JSONResponse
import subprocess
app = FastAPI(title="WhatsApp TTS 服务", version="1.0.0")
@app.post("/api/v1/send")
async def send_voice(
text: str,
target: str,
lang: str = "zh_CN",
voice: str = None,
quality: str = "medium",
speed: float = 1.0,
background_tasks: BackgroundTasks = None
):
"""发送单条语音消息"""
cmd = ["tts-whatsapp", text, "--lang", lang, "--target", target,
"--quality", quality, "--speed", str(speed)]
if voice:
cmd.extend(["--voice", voice])
run(cmd, capture_output=True, text=True, timeout=30)
if result.returncode == 0:
return JSONResponse({"status": "success", "target": target})
return JSONResponse({"status": "failed", "error": result.stderr}, status_code=500)
@app.post("/api/v1/broadcast")
async def broadcast(
text: str,
targets: list,
lang: str = "zh_CN",
background_tasks: BackgroundTasks = None
):
"""批量群发(异步)"""
def send_batch():
for target in targets:
subprocess.run(
["tts-whatsapp", text, "--lang", lang, "--target", target],
capture_output=True, timeout=30
)
background_tasks.add_task(send_batch)
return {"status": "accepted", "count": len(targets)}
@app.post("/api/v1/schedule")
async def schedule_send(
text: str,
target: str,
send_at: str,
lang: str = "zh_CN"
):
"""定时发送(需配合调度器)"""
with open("schedule_queue.json", "a", encoding="utf-8") as f:
import json
json.dump({"text": text, "target": target, "time": send_at, "lang": lang}, f)
f.write("\n")
return {"status": "scheduled", "send_at": send_at}
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| piper-tts | Python 库 | 必需 | pip install piper-tts |
| ffmpeg | 系统工具 | 必需 | brew install ffmpeg / apt install ffmpeg |
| schedule | Python 库 | 可选(定时) | pip install schedule |
| fastapi | Python 库 | 可选(API) | pip install fastapi uvicorn |
| WhatsApp 连接 | 服务 | 必需 | 本地配置或桥接服务 |
| Python 3.9+ | 运行时 | 必需 | python.org 下载 |
| 语音模型 | 数据文件 | 必需 | 从 Piper 仓库下载 |
| LLM API | API | 必需 | 由Agent内置LLM提供 |
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| content | string | 否 | 处理的内容输入 |
| mode | string | 否 | 处理模式, 可选值: json/text/markdown |
| style | string | 否 | 输出风格, 参考 references/style.md |
{
"success": true,
"data": {
"result": "处理结果",
"status": "success",
"metadata": {
"template_used": "reviewer",
"word_count": 0,
"style": "专业"
}
},
"error": null
}
输出模板参考: assets/output.json
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 |
| 依赖项 | 类型 | 必需 | 说明 |
|---|---|---|---|
| LLM | 模型 | 是 | 需要LLM进行内容生成, 推荐GPT-4/智谱GLM-4/DeepSeek |
| API Key | 凭证 | 否 | 使用云端LLM时需要, 本地LLM不需要 |
| 国内替代方案: |
broadcast:
contacts_file: "contacts.csv"
template: "你好 {name},{message}"
default_lang: "zh_CN"
default_voice: "zh_CN-huayan-medium"
quality: "medium"
speed: 1.0
max_concurrent: 3
retry: 2
delay_between: 2 # 秒
report_file: "send_report.csv"
schedules:
- name: "每日提醒"
time: "09:00"
message: "早上好!记得查看今日待办。"
target: "+8613800138000"
lang: "zh_CN"
- name: "周报提醒"
day: "monday"
time: "10:00"
message: "请记得提交本周工作周报。"
target: "group-id@g.us"
lang: "zh_CN"
| 变量 | 说明 | 示例 |
|---|---|---|
{name} | 联系人姓名 | 张三 |
{phone} | 手机号 | +86138... |
{event} | 事件名称 | 产品评审会 |
{time} | 时间 | 14:00 |
{date} | 日期 | 2026-07-20 |
| 自定义 | CSV 任意字段 | 任何列名 |
| 错误场景(续) | 原因 | 处理方式 |
|---|---|---|
| LLM响应超时或无响应 | 网络延迟或模型负载过高 | 请求重试;确认Agent平台LLM服务正常 |
| 输入内容格式不正确 | 用户输入不符合skill预期格式 | 检查输入是否符合skill使用说明中的格式要求,参考示例章节 |
| 执行结果与预期不符 | 指令描述不够明确或上下文不足 | 提供更详细的指令描述,补充必要的上下文信息 |
| 命令执行失败 | 运行环境不满足要求或权限不足 | 确认运行环境符合依赖说明中的要求;检查命令权限设置 |
是的。WhatsApp 对批量消息有限制。建议:
使用 Python 字符串格式化,{name} 等占位符在发送时替换为 CSV 中的实际值。支持任意字段名.
在 CSV 中为每个联系人指定 language 和 voice 字段,发送时自动选择对应语言的语音模型.
零迁移成本。专业版是免费版的超集,命令行完全兼容。升级后原有单条发送继续可用,新特性按需启用.
单实例支持 5-10 并发(受 TTS 合成速度限制)。大批量建议使用任务队列异步处理。可通过多实例部署线性扩展.
| 错误现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---|---|---|---|
| 无法发送消息 | WhatsApp服务不可用 | 检查网络连接,尝试重新启动WhatsApp应用 | 确保WhatsApp服务可用,检查网络连接稳定性 |
| 消息发送失败 | 目标号码错误或不在WhatsApp上 | 验证目标号码是否正确,检查对方是否在WhatsApp上 | 确认目标号码无误,确保对方已加入WhatsApp |
| 定时任务未执行 | 定时任务配置错误 | 检查定时任务配置是否正确,确认cron作业是否运行 | 修正定时任务配置,确保cron作业正确运行 |
| 批量发送速度慢 | 并发控制设置不当 | 检查并发控制设置,调整并发数 | 调整并发数,优化批量发送速度 |
| API服务响应慢 | 服务器负载过高 | 检查服务器负载,优化资源分配 | 优化服务器配置,增加资源或升级服务 |
| 风险项 | 等级 | 防护措施 | 验证方法 |
|---|---|---|---|
| 数据泄露 | 高 | 使用HTTPS加密通信,限制API访问权限 | 检查SSL证书,验证API访问日志 |
| 账户被黑 | 中 | 定期更换密码,启用两步验证 | 检查账户活动日志,验证两步验证设置 |
| 恶意软件攻击 | 高 | 使用防病毒软件,定期更新系统 | 执行防病毒扫描,检查系统更新日志 |
| 网络钓鱼攻击 | 中 | 教育用户识别钓鱼链接,限制外部链接访问 | 进行钓鱼链接识别培训,检查网络访问日志 |
| 数据损坏 | 中 | 定期备份数据,使用冗余存储 | 执行数据备份,检查数据完整性 |
| API滥用 | 高 | 限制API调用频率,监控API使用情况 | 设置API调用频率限制,监控API使用日志 |
| 效率提升量化分析 | |:------|:------| | 消息发送效率提升 | 50% | | 定时任务执行效率提升 | 30% | | 批量发送效率提升 | 40% | | API服务响应时间缩短 | 25% | | 用户操作便捷性提升 | 35% | | 差异化对比 | |:------|:------| | 功能对比 | tts-whatsapp paid提供更全面的语音消息发送功能,包括群发、定时发送、批量处理等,而免费版功能有限。 | | 用户体验对比 | tts-whatsapp paid提供更流畅的用户体验,包括更快的发送速度、更丰富的消息模板等。 | | 安全性对比 | tts-whatsapp paid提供更严格的安全措施,包括数据加密、账户保护等。 | | 可扩展性对比 | tts-whatsapp paid支持更高的并发处理能力,适用于更大规模的企业应用。 | | 成本效益对比 | tts-whatsapp paid虽然需要付费,但提供更高的性价比,通过提高效率降低运营成本。 |
A1: 企业级WhatsApp语音消息工具,支持群发广播、定时发送、批量处理与消息模板,适配团队协作。面向团队与企业用户的 WhatsApp 语音消息工具(专业版)。核。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。
针对WhatsApp语音消息专业版使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---|---|---|
| API认证失败(401) | API密钥错误或过期 | 检查密钥配置,重新生成token |
| 接口限流(429) | 请求频率超出限制 | 降低调用频率,启用重试退避策略 |
| 响应超时(504) | 网络延迟或服务端负载过高 | 增加超时阈值,检查网络连接 |
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |
针对WhatsApp语音消息专业版使用中可能遇到的常见问题,提供以下排查方案: |---------|---------|---------|