dlinkclaw-openclaw 2026.10.16 → 2026.10.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +2 -2
- package/dist/src/channel.js +4 -3
- package/dist/src/client/message.js +20 -15
- package/dist/src/services/index.js +5 -1
- package/ext_capabilities/workrelay-speak/CLONE_GUIDE.md +129 -129
- package/ext_capabilities/workrelay-speak/HARDWARE.md +84 -84
- package/ext_capabilities/workrelay-speak/QWEN_GUIDE.md +151 -151
- package/ext_capabilities/workrelay-speak/README.md +79 -79
- package/ext_capabilities/workrelay-speak/clean_text.py +21 -0
- package/ext_capabilities/workrelay-speak/install.sh +343 -329
- package/ext_capabilities/workrelay-speak/manifest.json +63 -63
- package/ext_capabilities/workrelay-speak/patch-kokoro-en.py +85 -85
- package/ext_capabilities/workrelay-speak/status.sh +111 -111
- package/ext_capabilities/workrelay-speak/workrelay-tts.sh +118 -118
- package/ext_capabilities/workrelay-speak-luxtts/README.md +44 -44
- package/ext_capabilities/workrelay-speak-luxtts/install.sh +330 -330
- package/ext_capabilities/workrelay-speak-luxtts/manifest.json +63 -63
- package/ext_capabilities/workrelay-speak-luxtts/samples/reference_text.txt +4 -4
- package/ext_capabilities/workrelay-speak-luxtts/status.sh +115 -115
- package/ext_capabilities/workrelay-speak-luxtts/workrelay-tts.sh +98 -98
- package/ext_capabilities/workrelay-speak-qwen/README.md +62 -62
- package/ext_capabilities/workrelay-speak-qwen/install.sh +358 -349
- package/ext_capabilities/workrelay-speak-qwen/manifest.json +63 -63
- package/ext_capabilities/workrelay-speak-qwen/status.sh +106 -106
- package/ext_capabilities/workrelay-speak-qwen/workrelay-tts.sh +98 -98
- package/ext_capabilities/workrelay-transcribe/README.md +76 -76
- package/ext_capabilities/workrelay-transcribe/install.sh +345 -227
- package/ext_capabilities/workrelay-transcribe/manifest.json +42 -42
- package/ext_capabilities/workrelay-transcribe/status.sh +63 -63
- package/ext_capabilities/workrelay-transcribe/transcribe.py +56 -56
- package/ext_capabilities/workrelay-transcribe/transcribe_server.py +116 -116
- package/ext_capabilities/workrelay-transcribe/voicebox-transcribe.sh +88 -88
- package/package.json +2 -2
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dlinkclaw-openclaw",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.18",
|
|
4
4
|
"description": "DLinkClaw OpenClaw channel plugin — 朵联 OpenClaw 接入通道",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"DLinkClaw",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"selectionLabel": "朵联(DLinkClaw)",
|
|
69
69
|
"docsPath": "/channels/dlinkclaw-openclaw",
|
|
70
70
|
"docsLabel": "dlinkclaw-openclaw",
|
|
71
|
-
"blurb": "朵联 DLinkClaw OpenClaw 接入通道,
|
|
71
|
+
"blurb": "朵联 DLinkClaw OpenClaw 接入通道, 本地或云端部署OpenClaw连接朵联客户端, 支持企业微信、QQ、钉钉、飞书, 无需公网IP.",
|
|
72
72
|
"aliases": [
|
|
73
73
|
"dlink",
|
|
74
74
|
"DLinkClaw",
|
package/dist/src/channel.js
CHANGED
|
@@ -27,9 +27,9 @@ export const dlChannel = {
|
|
|
27
27
|
capabilities: {
|
|
28
28
|
chatTypes: ['direct', 'group'],
|
|
29
29
|
reactions: true,
|
|
30
|
-
polls:
|
|
31
|
-
edit:
|
|
32
|
-
groupManagement:
|
|
30
|
+
polls: false,
|
|
31
|
+
edit: false,
|
|
32
|
+
groupManagement: false,
|
|
33
33
|
threads: true,
|
|
34
34
|
reply: true,
|
|
35
35
|
media: true,
|
|
@@ -38,6 +38,7 @@ export const dlChannel = {
|
|
|
38
38
|
tts: {
|
|
39
39
|
voice: {
|
|
40
40
|
synthesisTarget: 'voice-note',
|
|
41
|
+
transcodesAudio: true,
|
|
41
42
|
captionedFinalText: true
|
|
42
43
|
}
|
|
43
44
|
}
|
|
@@ -3,6 +3,10 @@ import { md5 } from "./crypto.js";
|
|
|
3
3
|
import { createChannelHistoryWindow } from "openclaw/plugin-sdk/reply-history";
|
|
4
4
|
import { buildChannelInboundEventContext } from "openclaw/plugin-sdk/channel-inbound";
|
|
5
5
|
import { uuidStr } from "../utils.js";
|
|
6
|
+
/** 2026-10-18:只有包含复选框行(- [ ] / - [x] / - [/])的内容才算任务清单。 */
|
|
7
|
+
function isTaskListContent(content) {
|
|
8
|
+
return /(^|\n)\s*[-*]\s*\[[ xX/~%>]*\]\s*\S/.test(content);
|
|
9
|
+
}
|
|
6
10
|
//入站队列最大数
|
|
7
11
|
const MESSAGE_QUEUE_SIZE = 2_000;
|
|
8
12
|
// Message accumulator: stores the accumulated payload and original message fields by streamId
|
|
@@ -424,12 +428,12 @@ async function resetSession({ client, sessionKey, streamId, agentId }) {
|
|
|
424
428
|
});
|
|
425
429
|
return true;
|
|
426
430
|
}
|
|
427
|
-
const prompt = `请根据以下聊天记录,生成一个不超过128字的标题,概括这次对话的主题:
|
|
428
|
-
${msgList.join('\n')}
|
|
429
|
-
|
|
430
|
-
要求:
|
|
431
|
-
- 标题长度 ≤ 128 字
|
|
432
|
-
- 简洁准确地概括对话核心内容
|
|
431
|
+
const prompt = `请根据以下聊天记录,生成一个不超过128字的标题,概括这次对话的主题:
|
|
432
|
+
${msgList.join('\n')}
|
|
433
|
+
|
|
434
|
+
要求:
|
|
435
|
+
- 标题长度 ≤ 128 字
|
|
436
|
+
- 简洁准确地概括对话核心内容
|
|
433
437
|
- 直接输出标题,并在标题末尾符加上标记"[tag_reset]",不要多余文字`;
|
|
434
438
|
const askAgent = await client.exeCmd({
|
|
435
439
|
cmd: 'agent.ask',
|
|
@@ -567,12 +571,12 @@ async function archiveSession({ client, sessionKey, streamId, agentId, chatId, c
|
|
|
567
571
|
}
|
|
568
572
|
const newSessionKey = `agent:${agentId}:${channelId}-${newSuffix}:${chatType}:${chatId.toLowerCase()}`;
|
|
569
573
|
//生成标题(在新的 agent 会话中执行)
|
|
570
|
-
const prompt = `请根据以下聊天记录,生成一个不超过128字的标题,概括这次对话的主题:
|
|
571
|
-
${msgList.join('\n')}
|
|
572
|
-
|
|
573
|
-
要求:
|
|
574
|
-
- 标题长度 ≤ 128 字
|
|
575
|
-
- 简洁准确地概括对话核心内容
|
|
574
|
+
const prompt = `请根据以下聊天记录,生成一个不超过128字的标题,概括这次对话的主题:
|
|
575
|
+
${msgList.join('\n')}
|
|
576
|
+
|
|
577
|
+
要求:
|
|
578
|
+
- 标题长度 ≤ 128 字
|
|
579
|
+
- 简洁准确地概括对话核心内容
|
|
576
580
|
- 直接输出标题,并在标题末尾符加上标记"[tag_archive]",不要多余文字`;
|
|
577
581
|
const askAgent = await client.exeCmd({
|
|
578
582
|
cmd: 'agent.ask',
|
|
@@ -1090,7 +1094,7 @@ export async function routeAndDispatchMessage(ctx) {
|
|
|
1090
1094
|
streamId,
|
|
1091
1095
|
content,
|
|
1092
1096
|
status: 'read',
|
|
1093
|
-
kind: 'plan',
|
|
1097
|
+
kind: isTaskListContent(content) ? 'plan' : 'block',
|
|
1094
1098
|
});
|
|
1095
1099
|
}
|
|
1096
1100
|
},
|
|
@@ -1172,11 +1176,12 @@ export async function routeAndDispatchMessage(ctx) {
|
|
|
1172
1176
|
}
|
|
1173
1177
|
if (strs.length > 0) {
|
|
1174
1178
|
logger.info(`onPlanUpdate 输出 >>> ${strs.join('')}`);
|
|
1179
|
+
const joined = strs.join('');
|
|
1175
1180
|
await client.publishProcessingState({
|
|
1176
1181
|
streamId,
|
|
1177
|
-
content:
|
|
1182
|
+
content: joined,
|
|
1178
1183
|
status: 'read',
|
|
1179
|
-
kind: 'plan'
|
|
1184
|
+
kind: isTaskListContent(joined) ? 'plan' : 'block'
|
|
1180
1185
|
});
|
|
1181
1186
|
}
|
|
1182
1187
|
},
|
|
@@ -147,10 +147,14 @@ export class CmdHandler {
|
|
|
147
147
|
LAST_PUSHED_CONTENT.clear(); // 简单上限保护,避免 Map 无限增长
|
|
148
148
|
}
|
|
149
149
|
LAST_PUSHED_CONTENT.set(streamId, content);
|
|
150
|
+
// 2026-10-18 修复(石头哥:任务清单里显示成中间文本):
|
|
151
|
+
// 只有包含复选框行(- [ ] / - [x] / - [/])的内容才是真正的任务清单;
|
|
152
|
+
// 其余中间文本降级为 block,避免污染客户端的任务清单 store。
|
|
153
|
+
const isTaskList = /(^|\n)\s*[-*]\s*\[[ xX/~%>]*\]\s*\S/.test(content);
|
|
150
154
|
this.dlClient.publishProcessingState({
|
|
151
155
|
streamId,
|
|
152
156
|
content,
|
|
153
|
-
kind: 'plan',
|
|
157
|
+
kind: isTaskList ? 'plan' : 'block',
|
|
154
158
|
status: 'read'
|
|
155
159
|
});
|
|
156
160
|
}
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
# WorkRelay 语音合成(TTS)扩展能力 — 声音克隆配置说明书
|
|
2
|
-
|
|
3
|
-
> 适用:已安装 workrelay-speak 扩展能力(默认 Kokoro 预设声音可用)的用户,
|
|
4
|
-
> 需要**克隆自己的声音**(做视频配音、个性化语音等场景)时的进阶配置。
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 一、原理说明
|
|
9
|
-
|
|
10
|
-
- WorkRelay TTS 扩展能力基于 Docker 部署的 **Voicebox** 服务,默认使用 **Kokoro** 小模型(82M,50+ 预设音色,开箱即用)。
|
|
11
|
-
- **Kokoro 不支持声音克隆**(只支持预设音色)。
|
|
12
|
-
- **声音克隆需要 Qwen3-TTS(千问)模型**(1.7B,约 4.6GB),Voicebox 内置支持 zero-shot 克隆:
|
|
13
|
-
上传一段参考音频 + 逐字稿 → 生成克隆声音 profile → 用该 profile 合成语音。
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 二、准备工作
|
|
18
|
-
|
|
19
|
-
| 项目 | 要求 |
|
|
20
|
-
|---|---|
|
|
21
|
-
| 已安装 workrelay-speak 扩展 | Voicebox 容器运行中(`docker ps` 能看到 voicebox) |
|
|
22
|
-
| 参考音频 | 1~5 段**清晰人声**(10~30 秒/段,44.1kHz 或 48kHz 更佳,无明显噪音) |
|
|
23
|
-
| 逐字稿 | 每段音频对应的**逐字文本**(必须和音频内容一字不差,克隆质量关键) |
|
|
24
|
-
| 磁盘空间 | ≥ 5GB(千问模型 4.6GB) |
|
|
25
|
-
|
|
26
|
-
> 音频格式支持 wav / mp3 / m4a / webm 等(opuse/webm 会自动转码)。
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## 三、配置步骤
|
|
31
|
-
|
|
32
|
-
### 第 1 步:下载千问 TTS 模型
|
|
33
|
-
|
|
34
|
-
> ⚠️ 容器内直连 huggingface.co 通常不通(国内网络),需在**宿主机**预下载后放入容器缓存卷。
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
# 1) 安装下载工具(宿主机执行,一次性)
|
|
38
|
-
python3 -m pip install --break-system-packages huggingface_hub
|
|
39
|
-
|
|
40
|
-
# 2) 找到容器缓存卷路径
|
|
41
|
-
HF_VOL=$(docker volume inspect voicebox_huggingface-cache -f '{{.Mountpoint}}')
|
|
42
|
-
|
|
43
|
-
# 3) 下载千问 1.7B 模型(约 4.6GB,视网速 5~30 分钟)
|
|
44
|
-
HF_LOC=$(python3 -m pip show huggingface_hub | grep Location | awk '{print $2}')
|
|
45
|
-
sudo env PYTHONPATH="$HF_LOC" HF_HUB_DISABLE_PROGRESS_BARS=1 python3 -c "
|
|
46
|
-
from huggingface_hub import snapshot_download
|
|
47
|
-
snapshot_download('Qwen/Qwen3-TTS-12Hz-1.7B-Base', cache_dir='$HF_VOL')
|
|
48
|
-
print('模型下载完成')
|
|
49
|
-
"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### 第 2 步:让容器离线加载模型
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
# 在 Voicebox 仓库目录生成 override 配置并重建容器
|
|
56
|
-
cd ~/.workrelay/voicebox
|
|
57
|
-
cat > docker-compose.override.yml <<'EOF'
|
|
58
|
-
services:
|
|
59
|
-
voicebox:
|
|
60
|
-
environment:
|
|
61
|
-
- HF_HUB_CACHE=/home/voicebox/.cache/huggingface
|
|
62
|
-
- HF_HUB_OFFLINE=1
|
|
63
|
-
EOF
|
|
64
|
-
docker compose up -d
|
|
65
|
-
# 等待容器 healthy(约 30 秒)
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 第 3 步:创建克隆声音 profile
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
# 创建克隆 profile(cloned 类型)
|
|
72
|
-
curl -X POST http://127.0.0.1:17600/profiles \
|
|
73
|
-
-H "Content-Type: application/json" \
|
|
74
|
-
-d '{"name":"我的克隆声音","description":"我的声音克隆","language":"zh","voice_type":"cloned"}'
|
|
75
|
-
# 记下返回的 "id"(形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),下面用 <PROFILE_ID> 代替
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### 第 4 步:上传参考音频样本
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
# 每段音频一条命令;reference_text 必须与音频内容逐字一致!
|
|
82
|
-
curl -X POST "http://127.0.0.1:17600/profiles/<PROFILE_ID>/samples" \
|
|
83
|
-
-F "file=@/path/to/sample1.wav" \
|
|
84
|
-
-F "reference_text=这段音频里说的话,逐字写在这里"
|
|
85
|
-
|
|
86
|
-
# 建议上传 2~5 段同一个人不同语句的样本,克隆效果更好
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 第 5 步:用克隆声音合成
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
# 方式 A:命令行直接合成(WR_VOICEBOX_PROFILE_ID 指向克隆 profile)
|
|
93
|
-
WR_VOICEBOX_PROFILE_ID=<PROFILE_ID> \
|
|
94
|
-
~/.workrelay/speak/workrelay-tts.sh "用克隆声音说的测试文字" /tmp/clone-test.wav
|
|
95
|
-
|
|
96
|
-
# 方式 B:让 OpenClaw 默认用克隆声音回复(写入 profile_id 文件,覆盖默认预设)
|
|
97
|
-
echo "<PROFILE_ID>" > ~/.workrelay/speak/profile_id
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
> 引擎无需手动指定:克隆 profile 未设引擎时,脚本自动使用 qwen(千问)。
|
|
101
|
-
> 想切回默认 Kokoro 预设声音:`rm -f ~/.workrelay/speak/profile_id` 即可。
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## 四、验证
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
# 检查克隆 profile 及样本
|
|
109
|
-
curl http://127.0.0.1:17600/profiles/<PROFILE_ID>
|
|
110
|
-
curl http://127.0.0.1:17600/profiles/<PROFILE_ID>/samples
|
|
111
|
-
|
|
112
|
-
# 试听合成的 wav
|
|
113
|
-
ls -la /tmp/clone-test.wav
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## 五、常见问题
|
|
119
|
-
|
|
120
|
-
| 问题 | 原因 / 解决 |
|
|
121
|
-
|---|---|
|
|
122
|
-
| 合成报 `Profile not found` | profile_id 写错,或 profile 被删;重新创建并核对 |
|
|
123
|
-
| 合成报模型下载失败/连不上 HF | 模型未预下载或 override 未生效;重做第 1、2 步 |
|
|
124
|
-
| 克隆声音不像 | 样本太短/有噪音/逐字稿不匹配;换更清晰样本、多传几段 |
|
|
125
|
-
| 想恢复默认声音 | 删除 `~/.workrelay/speak/profile_id` |
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
*文档版本:2026-08-12(基于 WorkRelay workrelay-speak 扩展能力实测)*
|
|
1
|
+
# WorkRelay 语音合成(TTS)扩展能力 — 声音克隆配置说明书
|
|
2
|
+
|
|
3
|
+
> 适用:已安装 workrelay-speak 扩展能力(默认 Kokoro 预设声音可用)的用户,
|
|
4
|
+
> 需要**克隆自己的声音**(做视频配音、个性化语音等场景)时的进阶配置。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、原理说明
|
|
9
|
+
|
|
10
|
+
- WorkRelay TTS 扩展能力基于 Docker 部署的 **Voicebox** 服务,默认使用 **Kokoro** 小模型(82M,50+ 预设音色,开箱即用)。
|
|
11
|
+
- **Kokoro 不支持声音克隆**(只支持预设音色)。
|
|
12
|
+
- **声音克隆需要 Qwen3-TTS(千问)模型**(1.7B,约 4.6GB),Voicebox 内置支持 zero-shot 克隆:
|
|
13
|
+
上传一段参考音频 + 逐字稿 → 生成克隆声音 profile → 用该 profile 合成语音。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 二、准备工作
|
|
18
|
+
|
|
19
|
+
| 项目 | 要求 |
|
|
20
|
+
|---|---|
|
|
21
|
+
| 已安装 workrelay-speak 扩展 | Voicebox 容器运行中(`docker ps` 能看到 voicebox) |
|
|
22
|
+
| 参考音频 | 1~5 段**清晰人声**(10~30 秒/段,44.1kHz 或 48kHz 更佳,无明显噪音) |
|
|
23
|
+
| 逐字稿 | 每段音频对应的**逐字文本**(必须和音频内容一字不差,克隆质量关键) |
|
|
24
|
+
| 磁盘空间 | ≥ 5GB(千问模型 4.6GB) |
|
|
25
|
+
|
|
26
|
+
> 音频格式支持 wav / mp3 / m4a / webm 等(opuse/webm 会自动转码)。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 三、配置步骤
|
|
31
|
+
|
|
32
|
+
### 第 1 步:下载千问 TTS 模型
|
|
33
|
+
|
|
34
|
+
> ⚠️ 容器内直连 huggingface.co 通常不通(国内网络),需在**宿主机**预下载后放入容器缓存卷。
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 1) 安装下载工具(宿主机执行,一次性)
|
|
38
|
+
python3 -m pip install --break-system-packages huggingface_hub
|
|
39
|
+
|
|
40
|
+
# 2) 找到容器缓存卷路径
|
|
41
|
+
HF_VOL=$(docker volume inspect voicebox_huggingface-cache -f '{{.Mountpoint}}')
|
|
42
|
+
|
|
43
|
+
# 3) 下载千问 1.7B 模型(约 4.6GB,视网速 5~30 分钟)
|
|
44
|
+
HF_LOC=$(python3 -m pip show huggingface_hub | grep Location | awk '{print $2}')
|
|
45
|
+
sudo env PYTHONPATH="$HF_LOC" HF_HUB_DISABLE_PROGRESS_BARS=1 python3 -c "
|
|
46
|
+
from huggingface_hub import snapshot_download
|
|
47
|
+
snapshot_download('Qwen/Qwen3-TTS-12Hz-1.7B-Base', cache_dir='$HF_VOL')
|
|
48
|
+
print('模型下载完成')
|
|
49
|
+
"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 第 2 步:让容器离线加载模型
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# 在 Voicebox 仓库目录生成 override 配置并重建容器
|
|
56
|
+
cd ~/.workrelay/voicebox
|
|
57
|
+
cat > docker-compose.override.yml <<'EOF'
|
|
58
|
+
services:
|
|
59
|
+
voicebox:
|
|
60
|
+
environment:
|
|
61
|
+
- HF_HUB_CACHE=/home/voicebox/.cache/huggingface
|
|
62
|
+
- HF_HUB_OFFLINE=1
|
|
63
|
+
EOF
|
|
64
|
+
docker compose up -d
|
|
65
|
+
# 等待容器 healthy(约 30 秒)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 第 3 步:创建克隆声音 profile
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# 创建克隆 profile(cloned 类型)
|
|
72
|
+
curl -X POST http://127.0.0.1:17600/profiles \
|
|
73
|
+
-H "Content-Type: application/json" \
|
|
74
|
+
-d '{"name":"我的克隆声音","description":"我的声音克隆","language":"zh","voice_type":"cloned"}'
|
|
75
|
+
# 记下返回的 "id"(形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),下面用 <PROFILE_ID> 代替
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 第 4 步:上传参考音频样本
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 每段音频一条命令;reference_text 必须与音频内容逐字一致!
|
|
82
|
+
curl -X POST "http://127.0.0.1:17600/profiles/<PROFILE_ID>/samples" \
|
|
83
|
+
-F "file=@/path/to/sample1.wav" \
|
|
84
|
+
-F "reference_text=这段音频里说的话,逐字写在这里"
|
|
85
|
+
|
|
86
|
+
# 建议上传 2~5 段同一个人不同语句的样本,克隆效果更好
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 第 5 步:用克隆声音合成
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# 方式 A:命令行直接合成(WR_VOICEBOX_PROFILE_ID 指向克隆 profile)
|
|
93
|
+
WR_VOICEBOX_PROFILE_ID=<PROFILE_ID> \
|
|
94
|
+
~/.workrelay/speak/workrelay-tts.sh "用克隆声音说的测试文字" /tmp/clone-test.wav
|
|
95
|
+
|
|
96
|
+
# 方式 B:让 OpenClaw 默认用克隆声音回复(写入 profile_id 文件,覆盖默认预设)
|
|
97
|
+
echo "<PROFILE_ID>" > ~/.workrelay/speak/profile_id
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
> 引擎无需手动指定:克隆 profile 未设引擎时,脚本自动使用 qwen(千问)。
|
|
101
|
+
> 想切回默认 Kokoro 预设声音:`rm -f ~/.workrelay/speak/profile_id` 即可。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 四、验证
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# 检查克隆 profile 及样本
|
|
109
|
+
curl http://127.0.0.1:17600/profiles/<PROFILE_ID>
|
|
110
|
+
curl http://127.0.0.1:17600/profiles/<PROFILE_ID>/samples
|
|
111
|
+
|
|
112
|
+
# 试听合成的 wav
|
|
113
|
+
ls -la /tmp/clone-test.wav
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 五、常见问题
|
|
119
|
+
|
|
120
|
+
| 问题 | 原因 / 解决 |
|
|
121
|
+
|---|---|
|
|
122
|
+
| 合成报 `Profile not found` | profile_id 写错,或 profile 被删;重新创建并核对 |
|
|
123
|
+
| 合成报模型下载失败/连不上 HF | 模型未预下载或 override 未生效;重做第 1、2 步 |
|
|
124
|
+
| 克隆声音不像 | 样本太短/有噪音/逐字稿不匹配;换更清晰样本、多传几段 |
|
|
125
|
+
| 想恢复默认声音 | 删除 `~/.workrelay/speak/profile_id` |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
*文档版本:2026-08-12(基于 WorkRelay workrelay-speak 扩展能力实测)*
|
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
# WorkRelay 语音功能最低硬件配置
|
|
2
|
-
|
|
3
|
-
## 一、语音转录(faster-whisper)
|
|
4
|
-
|
|
5
|
-
| 项目 | 最低要求 | 推荐配置 |
|
|
6
|
-
|------|----------|----------|
|
|
7
|
-
| **CPU** | 双核 2.0GHz+ | 四核 2.5GHz+ |
|
|
8
|
-
| **内存** | 4GB 可用 | 8GB+ |
|
|
9
|
-
| **磁盘** | 2.5GB 可用 | 5GB+ |
|
|
10
|
-
| **OS** | Linux / macOS | Ubuntu 22.04+ |
|
|
11
|
-
| **Python** | 3.8+ | 3.10+ |
|
|
12
|
-
|
|
13
|
-
**额外依赖:** `pip`, `git`(标准 Linux 发行版自带)
|
|
14
|
-
|
|
15
|
-
**实测数据(8核 31GB Linux CPU):**
|
|
16
|
-
- 首次加载模型:10-20 秒
|
|
17
|
-
- 10 秒语音转录:2-5 秒
|
|
18
|
-
- 30 秒语音转录:5-10 秒
|
|
19
|
-
|
|
20
|
-
> ⚠️ 不支持原生 Windows(需 WSL2)
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 二、语音合成 / 声音克隆(Voicebox TTS,Docker)
|
|
25
|
-
|
|
26
|
-
| 项目 | 最低要求 | 推荐配置 |
|
|
27
|
-
|------|----------|----------|
|
|
28
|
-
| **CPU** | 双核 2.0GHz+ | 四核 3.0GHz+ |
|
|
29
|
-
| **内存** | 4GB 可用 | 8GB+ |
|
|
30
|
-
| **磁盘** | 10GB 可用 | 15GB+ |
|
|
31
|
-
| **OS** | Linux(需 Docker) | Ubuntu 22.04+ |
|
|
32
|
-
| **Docker** | 24.0+ | 27.0+ |
|
|
33
|
-
| **GPU** | 无(CPU 推理) | NVIDIA CUDA(加速 5-10x) |
|
|
34
|
-
|
|
35
|
-
**额外依赖:** `docker`, `docker compose v2`, `git`
|
|
36
|
-
|
|
37
|
-
**Docker 资源(默认 Kokoro 引擎):**
|
|
38
|
-
- Voicebox 镜像:~11GB(含全部 TTS 引擎依赖)
|
|
39
|
-
- Kokoro 模型:~350MB(默认,安装时自动预下载)
|
|
40
|
-
- 运行内存:~2-3GB(Docker 内,Kokoro CPU 推理)
|
|
41
|
-
|
|
42
|
-
**实测数据(8核 31GB Linux CPU,Kokoro):**
|
|
43
|
-
- 短句(10 字):1-3 秒
|
|
44
|
-
- 中句(30 字):3-8 秒
|
|
45
|
-
- 长句(100 字):10-20 秒
|
|
46
|
-
|
|
47
|
-
> 默认使用 Kokoro(82MB)轻量引擎,开箱即用;
|
|
48
|
-
> 如需声音克隆或更高音质,可另配 Qwen3-TTS 1.7B(~4.6GB,内存需求 6GB+),详见 `CLONE_GUIDE.md`。
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## 三、两个功能同时启用
|
|
53
|
-
|
|
54
|
-
| 项目 | 最低要求 | 推荐配置 |
|
|
55
|
-
|------|----------|----------|
|
|
56
|
-
| **CPU** | 四核 2.5GHz+ | 八核 3.0GHz+ |
|
|
57
|
-
| **内存** | 12GB 可用 | 16GB+(配置给 Docker 8GB) |
|
|
58
|
-
| **磁盘** | 15GB 可用 | 25GB+ |
|
|
59
|
-
| **GPU** | 无 | NVIDIA CUDA |
|
|
60
|
-
|
|
61
|
-
**内存分配建议(16GB 总内存场景):**
|
|
62
|
-
- faster-whisper 模型常驻:~2GB
|
|
63
|
-
- Voicebox Docker 容器:~6-8GB
|
|
64
|
-
- 剩余系统缓冲:~6-8GB
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## 四、客户端提示文案建议
|
|
69
|
-
|
|
70
|
-
### 转录
|
|
71
|
-
```
|
|
72
|
-
最低:2核 CPU + 4GB 内存 + 2.5GB 磁盘
|
|
73
|
-
推荐:4核 CPU + 8GB 内存 + 5GB 磁盘
|
|
74
|
-
不支持原生 Windows(需 WSL2)
|
|
75
|
-
首次安装需下载 1.6GB 模型文件
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### 语音合成
|
|
79
|
-
```
|
|
80
|
-
最低:2核 CPU + 4GB 内存 + 10GB 磁盘 + Docker
|
|
81
|
-
推荐:4核 CPU + 8GB 内存 + 15GB 磁盘 + Docker
|
|
82
|
-
首次安装需下载 Docker 镜像 + Kokoro 模型(~350MB)
|
|
83
|
-
默认 Kokoro 轻量引擎,CPU 推理快,开箱即用
|
|
84
|
-
```
|
|
1
|
+
# WorkRelay 语音功能最低硬件配置
|
|
2
|
+
|
|
3
|
+
## 一、语音转录(faster-whisper)
|
|
4
|
+
|
|
5
|
+
| 项目 | 最低要求 | 推荐配置 |
|
|
6
|
+
|------|----------|----------|
|
|
7
|
+
| **CPU** | 双核 2.0GHz+ | 四核 2.5GHz+ |
|
|
8
|
+
| **内存** | 4GB 可用 | 8GB+ |
|
|
9
|
+
| **磁盘** | 2.5GB 可用 | 5GB+ |
|
|
10
|
+
| **OS** | Linux / macOS | Ubuntu 22.04+ |
|
|
11
|
+
| **Python** | 3.8+ | 3.10+ |
|
|
12
|
+
|
|
13
|
+
**额外依赖:** `pip`, `git`(标准 Linux 发行版自带)
|
|
14
|
+
|
|
15
|
+
**实测数据(8核 31GB Linux CPU):**
|
|
16
|
+
- 首次加载模型:10-20 秒
|
|
17
|
+
- 10 秒语音转录:2-5 秒
|
|
18
|
+
- 30 秒语音转录:5-10 秒
|
|
19
|
+
|
|
20
|
+
> ⚠️ 不支持原生 Windows(需 WSL2)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 二、语音合成 / 声音克隆(Voicebox TTS,Docker)
|
|
25
|
+
|
|
26
|
+
| 项目 | 最低要求 | 推荐配置 |
|
|
27
|
+
|------|----------|----------|
|
|
28
|
+
| **CPU** | 双核 2.0GHz+ | 四核 3.0GHz+ |
|
|
29
|
+
| **内存** | 4GB 可用 | 8GB+ |
|
|
30
|
+
| **磁盘** | 10GB 可用 | 15GB+ |
|
|
31
|
+
| **OS** | Linux(需 Docker) | Ubuntu 22.04+ |
|
|
32
|
+
| **Docker** | 24.0+ | 27.0+ |
|
|
33
|
+
| **GPU** | 无(CPU 推理) | NVIDIA CUDA(加速 5-10x) |
|
|
34
|
+
|
|
35
|
+
**额外依赖:** `docker`, `docker compose v2`, `git`
|
|
36
|
+
|
|
37
|
+
**Docker 资源(默认 Kokoro 引擎):**
|
|
38
|
+
- Voicebox 镜像:~11GB(含全部 TTS 引擎依赖)
|
|
39
|
+
- Kokoro 模型:~350MB(默认,安装时自动预下载)
|
|
40
|
+
- 运行内存:~2-3GB(Docker 内,Kokoro CPU 推理)
|
|
41
|
+
|
|
42
|
+
**实测数据(8核 31GB Linux CPU,Kokoro):**
|
|
43
|
+
- 短句(10 字):1-3 秒
|
|
44
|
+
- 中句(30 字):3-8 秒
|
|
45
|
+
- 长句(100 字):10-20 秒
|
|
46
|
+
|
|
47
|
+
> 默认使用 Kokoro(82MB)轻量引擎,开箱即用;
|
|
48
|
+
> 如需声音克隆或更高音质,可另配 Qwen3-TTS 1.7B(~4.6GB,内存需求 6GB+),详见 `CLONE_GUIDE.md`。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 三、两个功能同时启用
|
|
53
|
+
|
|
54
|
+
| 项目 | 最低要求 | 推荐配置 |
|
|
55
|
+
|------|----------|----------|
|
|
56
|
+
| **CPU** | 四核 2.5GHz+ | 八核 3.0GHz+ |
|
|
57
|
+
| **内存** | 12GB 可用 | 16GB+(配置给 Docker 8GB) |
|
|
58
|
+
| **磁盘** | 15GB 可用 | 25GB+ |
|
|
59
|
+
| **GPU** | 无 | NVIDIA CUDA |
|
|
60
|
+
|
|
61
|
+
**内存分配建议(16GB 总内存场景):**
|
|
62
|
+
- faster-whisper 模型常驻:~2GB
|
|
63
|
+
- Voicebox Docker 容器:~6-8GB
|
|
64
|
+
- 剩余系统缓冲:~6-8GB
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 四、客户端提示文案建议
|
|
69
|
+
|
|
70
|
+
### 转录
|
|
71
|
+
```
|
|
72
|
+
最低:2核 CPU + 4GB 内存 + 2.5GB 磁盘
|
|
73
|
+
推荐:4核 CPU + 8GB 内存 + 5GB 磁盘
|
|
74
|
+
不支持原生 Windows(需 WSL2)
|
|
75
|
+
首次安装需下载 1.6GB 模型文件
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 语音合成
|
|
79
|
+
```
|
|
80
|
+
最低:2核 CPU + 4GB 内存 + 10GB 磁盘 + Docker
|
|
81
|
+
推荐:4核 CPU + 8GB 内存 + 15GB 磁盘 + Docker
|
|
82
|
+
首次安装需下载 Docker 镜像 + Kokoro 模型(~350MB)
|
|
83
|
+
默认 Kokoro 轻量引擎,CPU 推理快,开箱即用
|
|
84
|
+
```
|