@ryantest/openclaw-qqbot 0.0.1
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/LICENSE +22 -0
- package/README.md +483 -0
- package/README.zh.md +478 -0
- package/bin/qqbot-cli.js +243 -0
- package/clawdbot.plugin.json +16 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +26 -0
- package/dist/src/admin-resolver.d.ts +27 -0
- package/dist/src/admin-resolver.js +122 -0
- package/dist/src/api.d.ts +156 -0
- package/dist/src/api.js +599 -0
- package/dist/src/channel.d.ts +11 -0
- package/dist/src/channel.js +354 -0
- package/dist/src/config.d.ts +25 -0
- package/dist/src/config.js +161 -0
- package/dist/src/credential-backup.d.ts +31 -0
- package/dist/src/credential-backup.js +66 -0
- package/dist/src/gateway.d.ts +18 -0
- package/dist/src/gateway.js +1265 -0
- package/dist/src/image-server.d.ts +68 -0
- package/dist/src/image-server.js +462 -0
- package/dist/src/inbound-attachments.d.ts +58 -0
- package/dist/src/inbound-attachments.js +234 -0
- package/dist/src/known-users.d.ts +100 -0
- package/dist/src/known-users.js +263 -0
- package/dist/src/message-queue.d.ts +50 -0
- package/dist/src/message-queue.js +115 -0
- package/dist/src/onboarding.d.ts +10 -0
- package/dist/src/onboarding.js +203 -0
- package/dist/src/outbound-deliver.d.ts +48 -0
- package/dist/src/outbound-deliver.js +462 -0
- package/dist/src/outbound.d.ts +203 -0
- package/dist/src/outbound.js +1102 -0
- package/dist/src/proactive.d.ts +170 -0
- package/dist/src/proactive.js +399 -0
- package/dist/src/ref-index-store.d.ts +70 -0
- package/dist/src/ref-index-store.js +273 -0
- package/dist/src/reply-dispatcher.d.ts +35 -0
- package/dist/src/reply-dispatcher.js +311 -0
- package/dist/src/runtime.d.ts +3 -0
- package/dist/src/runtime.js +10 -0
- package/dist/src/session-store.d.ts +52 -0
- package/dist/src/session-store.js +254 -0
- package/dist/src/slash-commands.d.ts +71 -0
- package/dist/src/slash-commands.js +1179 -0
- package/dist/src/startup-greeting.d.ts +30 -0
- package/dist/src/startup-greeting.js +78 -0
- package/dist/src/stt.d.ts +21 -0
- package/dist/src/stt.js +70 -0
- package/dist/src/tools/channel.d.ts +16 -0
- package/dist/src/tools/channel.js +234 -0
- package/dist/src/tools/remind.d.ts +2 -0
- package/dist/src/tools/remind.js +247 -0
- package/dist/src/types.d.ts +175 -0
- package/dist/src/types.js +1 -0
- package/dist/src/typing-keepalive.d.ts +27 -0
- package/dist/src/typing-keepalive.js +64 -0
- package/dist/src/update-checker.d.ts +34 -0
- package/dist/src/update-checker.js +166 -0
- package/dist/src/user-messages.d.ts +8 -0
- package/dist/src/user-messages.js +8 -0
- package/dist/src/utils/audio-convert.d.ts +89 -0
- package/dist/src/utils/audio-convert.js +704 -0
- package/dist/src/utils/file-utils.d.ts +55 -0
- package/dist/src/utils/file-utils.js +150 -0
- package/dist/src/utils/image-size.d.ts +51 -0
- package/dist/src/utils/image-size.js +234 -0
- package/dist/src/utils/media-tags.d.ts +14 -0
- package/dist/src/utils/media-tags.js +164 -0
- package/dist/src/utils/payload.d.ts +112 -0
- package/dist/src/utils/payload.js +186 -0
- package/dist/src/utils/platform.d.ts +137 -0
- package/dist/src/utils/platform.js +390 -0
- package/dist/src/utils/text-parsing.d.ts +32 -0
- package/dist/src/utils/text-parsing.js +80 -0
- package/dist/src/utils/upload-cache.d.ts +34 -0
- package/dist/src/utils/upload-cache.js +93 -0
- package/index.ts +31 -0
- package/moltbot.plugin.json +16 -0
- package/node_modules/@eshaz/web-worker/LICENSE +201 -0
- package/node_modules/@eshaz/web-worker/README.md +134 -0
- package/node_modules/@eshaz/web-worker/browser.js +17 -0
- package/node_modules/@eshaz/web-worker/cjs/browser.js +16 -0
- package/node_modules/@eshaz/web-worker/cjs/node.js +219 -0
- package/node_modules/@eshaz/web-worker/index.d.ts +4 -0
- package/node_modules/@eshaz/web-worker/node.js +223 -0
- package/node_modules/@eshaz/web-worker/package.json +54 -0
- package/node_modules/@wasm-audio-decoders/common/index.js +5 -0
- package/node_modules/@wasm-audio-decoders/common/package.json +36 -0
- package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js +231 -0
- package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js +129 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/README +67 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/build_puff.js +31 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/puff.c +863 -0
- package/node_modules/@wasm-audio-decoders/common/src/puff/puff.h +35 -0
- package/node_modules/@wasm-audio-decoders/common/src/utilities.js +3 -0
- package/node_modules/@wasm-audio-decoders/common/types.d.ts +7 -0
- package/node_modules/mpg123-decoder/README.md +265 -0
- package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js +185 -0
- package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js.map +1 -0
- package/node_modules/mpg123-decoder/index.js +8 -0
- package/node_modules/mpg123-decoder/package.json +58 -0
- package/node_modules/mpg123-decoder/src/EmscriptenWasm.js +464 -0
- package/node_modules/mpg123-decoder/src/MPEGDecoder.js +200 -0
- package/node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js +21 -0
- package/node_modules/mpg123-decoder/types.d.ts +30 -0
- package/node_modules/silk-wasm/LICENSE +21 -0
- package/node_modules/silk-wasm/README.md +85 -0
- package/node_modules/silk-wasm/lib/index.cjs +16 -0
- package/node_modules/silk-wasm/lib/index.d.ts +70 -0
- package/node_modules/silk-wasm/lib/index.mjs +16 -0
- package/node_modules/silk-wasm/lib/silk.wasm +0 -0
- package/node_modules/silk-wasm/lib/utils.d.ts +4 -0
- package/node_modules/silk-wasm/package.json +39 -0
- package/node_modules/simple-yenc/.github/FUNDING.yml +1 -0
- package/node_modules/simple-yenc/.prettierignore +1 -0
- package/node_modules/simple-yenc/LICENSE +7 -0
- package/node_modules/simple-yenc/README.md +163 -0
- package/node_modules/simple-yenc/dist/esm.js +1 -0
- package/node_modules/simple-yenc/dist/index.js +1 -0
- package/node_modules/simple-yenc/package.json +50 -0
- package/node_modules/simple-yenc/rollup.config.js +27 -0
- package/node_modules/simple-yenc/src/simple-yenc.js +302 -0
- package/node_modules/ws/LICENSE +20 -0
- package/node_modules/ws/README.md +548 -0
- package/node_modules/ws/browser.js +8 -0
- package/node_modules/ws/index.js +13 -0
- package/node_modules/ws/lib/buffer-util.js +131 -0
- package/node_modules/ws/lib/constants.js +19 -0
- package/node_modules/ws/lib/event-target.js +292 -0
- package/node_modules/ws/lib/extension.js +203 -0
- package/node_modules/ws/lib/limiter.js +55 -0
- package/node_modules/ws/lib/permessage-deflate.js +528 -0
- package/node_modules/ws/lib/receiver.js +706 -0
- package/node_modules/ws/lib/sender.js +602 -0
- package/node_modules/ws/lib/stream.js +161 -0
- package/node_modules/ws/lib/subprotocol.js +62 -0
- package/node_modules/ws/lib/validation.js +152 -0
- package/node_modules/ws/lib/websocket-server.js +554 -0
- package/node_modules/ws/lib/websocket.js +1393 -0
- package/node_modules/ws/package.json +69 -0
- package/node_modules/ws/wrapper.mjs +8 -0
- package/openclaw.plugin.json +16 -0
- package/package.json +76 -0
- package/scripts/cleanup-legacy-plugins.sh +124 -0
- package/scripts/proactive-api-server.ts +369 -0
- package/scripts/send-proactive.ts +293 -0
- package/scripts/set-markdown.sh +156 -0
- package/scripts/test-sendmedia.ts +116 -0
- package/scripts/upgrade-via-alt-pkg.sh +307 -0
- package/scripts/upgrade-via-npm.ps1 +296 -0
- package/scripts/upgrade-via-npm.sh +301 -0
- package/scripts/upgrade-via-source.sh +774 -0
- package/skills/qqbot-channel/SKILL.md +263 -0
- package/skills/qqbot-channel/references/api_references.md +521 -0
- package/skills/qqbot-media/SKILL.md +56 -0
- package/skills/qqbot-remind/SKILL.md +149 -0
- package/src/admin-resolver.ts +140 -0
- package/src/api.ts +819 -0
- package/src/bot-logs-2026-03-21T11-21-47(2).txt +46 -0
- package/src/channel.ts +381 -0
- package/src/config.ts +187 -0
- package/src/credential-backup.ts +72 -0
- package/src/gateway.log +43 -0
- package/src/gateway.ts +1404 -0
- package/src/image-server.ts +539 -0
- package/src/inbound-attachments.ts +304 -0
- package/src/known-users.ts +353 -0
- package/src/message-queue.ts +169 -0
- package/src/onboarding.ts +274 -0
- package/src/openclaw-2026-03-21.log +3729 -0
- package/src/openclaw-plugin-sdk.d.ts +522 -0
- package/src/outbound-deliver.ts +552 -0
- package/src/outbound.ts +1266 -0
- package/src/proactive.ts +530 -0
- package/src/ref-index-store.ts +357 -0
- package/src/reply-dispatcher.ts +334 -0
- package/src/runtime.ts +14 -0
- package/src/session-store.ts +303 -0
- package/src/slash-commands.ts +1305 -0
- package/src/startup-greeting.ts +98 -0
- package/src/stt.ts +86 -0
- package/src/tools/channel.ts +281 -0
- package/src/tools/remind.ts +296 -0
- package/src/types.ts +183 -0
- package/src/typing-keepalive.ts +59 -0
- package/src/update-checker.ts +179 -0
- package/src/user-messages.ts +7 -0
- package/src/utils/audio-convert.ts +803 -0
- package/src/utils/file-utils.ts +167 -0
- package/src/utils/image-size.ts +266 -0
- package/src/utils/media-tags.ts +182 -0
- package/src/utils/payload.ts +265 -0
- package/src/utils/platform.ts +435 -0
- package/src/utils/text-parsing.ts +82 -0
- package/src/utils/upload-cache.ts +128 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 版本检查器
|
|
3
|
+
*
|
|
4
|
+
* - triggerUpdateCheck(): gateway 启动时调用,后台预热缓存
|
|
5
|
+
* - getUpdateInfo(): 每次实时查询 npm registry,返回最新结果
|
|
6
|
+
*
|
|
7
|
+
* 使用 HTTPS 直接请求 npm registry API(不依赖 npm CLI),
|
|
8
|
+
* 支持多 registry fallback:npmjs.org → npmmirror.com,解决国内网络问题。
|
|
9
|
+
*/
|
|
10
|
+
import { createRequire } from "node:module";
|
|
11
|
+
import https from "node:https";
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const PKG_NAME = "@tencent-connect/openclaw-qqbot";
|
|
14
|
+
const ENCODED_PKG = encodeURIComponent(PKG_NAME);
|
|
15
|
+
const REGISTRIES = [
|
|
16
|
+
`https://registry.npmjs.org/${ENCODED_PKG}`,
|
|
17
|
+
`https://registry.npmmirror.com/${ENCODED_PKG}`,
|
|
18
|
+
];
|
|
19
|
+
let CURRENT_VERSION = "unknown";
|
|
20
|
+
try {
|
|
21
|
+
const pkg = require("../package.json");
|
|
22
|
+
CURRENT_VERSION = pkg.version ?? "unknown";
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// fallback
|
|
26
|
+
}
|
|
27
|
+
let _log;
|
|
28
|
+
function fetchJson(url, timeoutMs) {
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const req = https.get(url, { timeout: timeoutMs, headers: { Accept: "application/json" } }, (res) => {
|
|
31
|
+
if (res.statusCode !== 200) {
|
|
32
|
+
res.resume();
|
|
33
|
+
reject(new Error(`HTTP ${res.statusCode} from ${url}`));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let data = "";
|
|
37
|
+
res.on("data", (chunk) => { data += chunk; });
|
|
38
|
+
res.on("end", () => {
|
|
39
|
+
try {
|
|
40
|
+
resolve(JSON.parse(data));
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
reject(e);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
req.on("error", reject);
|
|
48
|
+
req.on("timeout", () => { req.destroy(); reject(new Error(`timeout fetching ${url}`)); });
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async function fetchDistTags() {
|
|
52
|
+
for (const url of REGISTRIES) {
|
|
53
|
+
try {
|
|
54
|
+
const json = await fetchJson(url, 10_000);
|
|
55
|
+
const tags = json["dist-tags"];
|
|
56
|
+
if (tags && typeof tags === "object")
|
|
57
|
+
return tags;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
_log?.debug?.(`[qqbot:update-checker] ${url} failed: ${e.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new Error("all registries failed");
|
|
64
|
+
}
|
|
65
|
+
function buildUpdateInfo(tags) {
|
|
66
|
+
const currentIsPrerelease = CURRENT_VERSION.includes("-");
|
|
67
|
+
const stableTag = tags.latest || null;
|
|
68
|
+
const alphaTag = tags.alpha || null;
|
|
69
|
+
// 严格隔离:alpha 只跟 alpha 比,正式版只跟正式版比,不交叉
|
|
70
|
+
const compareTarget = currentIsPrerelease ? alphaTag : stableTag;
|
|
71
|
+
const hasUpdate = typeof compareTarget === "string"
|
|
72
|
+
&& compareTarget !== CURRENT_VERSION
|
|
73
|
+
&& compareVersions(compareTarget, CURRENT_VERSION) > 0;
|
|
74
|
+
return {
|
|
75
|
+
current: CURRENT_VERSION,
|
|
76
|
+
latest: compareTarget,
|
|
77
|
+
stable: stableTag,
|
|
78
|
+
alpha: alphaTag,
|
|
79
|
+
hasUpdate,
|
|
80
|
+
checkedAt: Date.now(),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** gateway 启动时调用,保存 log 引用 */
|
|
84
|
+
export function triggerUpdateCheck(log) {
|
|
85
|
+
if (log)
|
|
86
|
+
_log = log;
|
|
87
|
+
// 预热:fire-and-forget
|
|
88
|
+
getUpdateInfo().then((info) => {
|
|
89
|
+
if (info.hasUpdate) {
|
|
90
|
+
_log?.info?.(`[qqbot:update-checker] new version available: ${info.latest} (current: ${CURRENT_VERSION})`);
|
|
91
|
+
}
|
|
92
|
+
}).catch(() => { });
|
|
93
|
+
}
|
|
94
|
+
/** 每次实时查询 npm registry */
|
|
95
|
+
export async function getUpdateInfo() {
|
|
96
|
+
try {
|
|
97
|
+
const tags = await fetchDistTags();
|
|
98
|
+
return buildUpdateInfo(tags);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
_log?.debug?.(`[qqbot:update-checker] check failed: ${err.message}`);
|
|
102
|
+
return { current: CURRENT_VERSION, latest: null, stable: null, alpha: null, hasUpdate: false, checkedAt: Date.now(), error: err.message };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 检查指定版本是否存在于 npm registry
|
|
107
|
+
* 用于 /bot-upgrade --version 的前置校验
|
|
108
|
+
*/
|
|
109
|
+
export async function checkVersionExists(version) {
|
|
110
|
+
for (const baseUrl of REGISTRIES) {
|
|
111
|
+
try {
|
|
112
|
+
const url = `${baseUrl}/${version}`;
|
|
113
|
+
const json = await fetchJson(url, 10_000);
|
|
114
|
+
if (json && json.version === version)
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// try next registry
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
function compareVersions(a, b) {
|
|
124
|
+
const parse = (v) => {
|
|
125
|
+
const clean = v.replace(/^v/, "");
|
|
126
|
+
const [main, pre] = clean.split("-", 2);
|
|
127
|
+
return { parts: main.split(".").map(Number), pre: pre || null };
|
|
128
|
+
};
|
|
129
|
+
const pa = parse(a);
|
|
130
|
+
const pb = parse(b);
|
|
131
|
+
// 先比主版本号
|
|
132
|
+
for (let i = 0; i < 3; i++) {
|
|
133
|
+
const diff = (pa.parts[i] || 0) - (pb.parts[i] || 0);
|
|
134
|
+
if (diff !== 0)
|
|
135
|
+
return diff;
|
|
136
|
+
}
|
|
137
|
+
// 主版本号相同:正式版 > prerelease
|
|
138
|
+
if (!pa.pre && pb.pre)
|
|
139
|
+
return 1;
|
|
140
|
+
if (pa.pre && !pb.pre)
|
|
141
|
+
return -1;
|
|
142
|
+
if (!pa.pre && !pb.pre)
|
|
143
|
+
return 0;
|
|
144
|
+
// 都是 prerelease:按段逐一比较(alpha.1 vs alpha.2)
|
|
145
|
+
const aParts = pa.pre.split(".");
|
|
146
|
+
const bParts = pb.pre.split(".");
|
|
147
|
+
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
148
|
+
const aP = aParts[i] ?? "";
|
|
149
|
+
const bP = bParts[i] ?? "";
|
|
150
|
+
const aNum = Number(aP);
|
|
151
|
+
const bNum = Number(bP);
|
|
152
|
+
// 都是数字则按数字比较
|
|
153
|
+
if (!isNaN(aNum) && !isNaN(bNum)) {
|
|
154
|
+
if (aNum !== bNum)
|
|
155
|
+
return aNum - bNum;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// 字符串比较
|
|
159
|
+
if (aP < bP)
|
|
160
|
+
return -1;
|
|
161
|
+
if (aP > bP)
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将 SILK/AMR 语音文件转换为 WAV 格式
|
|
3
|
+
*
|
|
4
|
+
* @param inputPath 输入文件路径(.amr / .silk / .slk)
|
|
5
|
+
* @param outputDir 输出目录(默认与输入文件同目录)
|
|
6
|
+
* @returns 转换后的 WAV 文件路径,失败返回 null
|
|
7
|
+
*/
|
|
8
|
+
export declare function convertSilkToWav(inputPath: string, outputDir?: string): Promise<{
|
|
9
|
+
wavPath: string;
|
|
10
|
+
duration: number;
|
|
11
|
+
} | null>;
|
|
12
|
+
/**
|
|
13
|
+
* 判断是否为语音附件(根据 content_type 或文件扩展名)
|
|
14
|
+
*/
|
|
15
|
+
export declare function isVoiceAttachment(att: {
|
|
16
|
+
content_type?: string;
|
|
17
|
+
filename?: string;
|
|
18
|
+
}): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 格式化语音时长为可读字符串
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatDuration(durationMs: number): string;
|
|
23
|
+
export declare function isAudioFile(filePath: string, mimeType?: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 判断语音是否需要转码(参考企微 wecom-app 的 shouldTranscodeWecomVoice)
|
|
26
|
+
*
|
|
27
|
+
* QQ Bot API 原生支持 WAV/MP3/SILK 三种格式,其他格式需要先转码。
|
|
28
|
+
* 使用 MIME + 扩展名双重判断,避免仅靠扩展名导致误判。
|
|
29
|
+
*
|
|
30
|
+
* @param filePath 音频文件路径
|
|
31
|
+
* @param mimeType 可选的 MIME 类型
|
|
32
|
+
* @returns true 表示需要转码,false 表示可以直传
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldTranscodeVoice(filePath: string, mimeType?: string): boolean;
|
|
35
|
+
export interface TTSConfig {
|
|
36
|
+
baseUrl: string;
|
|
37
|
+
apiKey: string;
|
|
38
|
+
model: string;
|
|
39
|
+
voice: string;
|
|
40
|
+
/** Azure OpenAI 风格:使用 api-key header 而非 Bearer token */
|
|
41
|
+
authStyle?: "bearer" | "api-key";
|
|
42
|
+
/** 附加在 URL 后的查询参数,如 Azure 的 api-version */
|
|
43
|
+
queryParams?: Record<string, string>;
|
|
44
|
+
/** 自定义速度(默认不传) */
|
|
45
|
+
speed?: number;
|
|
46
|
+
}
|
|
47
|
+
export declare function resolveTTSConfig(cfg: Record<string, unknown>): TTSConfig | null;
|
|
48
|
+
export declare function textToSpeechPCM(text: string, ttsCfg: TTSConfig): Promise<{
|
|
49
|
+
pcmBuffer: Buffer;
|
|
50
|
+
sampleRate: number;
|
|
51
|
+
}>;
|
|
52
|
+
export declare function pcmToSilk(pcmBuffer: Buffer, sampleRate: number): Promise<{
|
|
53
|
+
silkBuffer: Buffer;
|
|
54
|
+
duration: number;
|
|
55
|
+
}>;
|
|
56
|
+
export declare function textToSilk(text: string, ttsCfg: TTSConfig, outputDir: string): Promise<{
|
|
57
|
+
silkPath: string;
|
|
58
|
+
silkBase64: string;
|
|
59
|
+
duration: number;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* 将本地音频文件转换为 QQ Bot 可上传的 Base64
|
|
63
|
+
*
|
|
64
|
+
* QQ Bot API 支持直传 WAV、MP3、SILK 三种格式,其他格式仍需转换。
|
|
65
|
+
* 转换策略(参考 NapCat/go-cqhttp/Discord/Telegram 的做法):
|
|
66
|
+
*
|
|
67
|
+
* 1. WAV / MP3 / SILK → 直传(跳过转换)
|
|
68
|
+
* 2. 有 ffmpeg → ffmpeg 万能解码为 PCM → silk-wasm 编码
|
|
69
|
+
* 支持: ogg, opus, aac, flac, wma, m4a, pcm 等所有 ffmpeg 支持的格式
|
|
70
|
+
* 3. 无 ffmpeg → WASM fallback(仅支持 pcm, wav)
|
|
71
|
+
*
|
|
72
|
+
* @param directUploadFormats - 自定义直传格式列表,覆盖默认值。传 undefined 使用 QQ_NATIVE_UPLOAD_FORMATS
|
|
73
|
+
*/
|
|
74
|
+
export declare function audioFileToSilkBase64(filePath: string, directUploadFormats?: string[]): Promise<string | null>;
|
|
75
|
+
/**
|
|
76
|
+
* 等待文件就绪(轮询直到文件出现且大小稳定)
|
|
77
|
+
* 用于 TTS 生成后等待文件写入完成
|
|
78
|
+
*
|
|
79
|
+
* 优化策略:
|
|
80
|
+
* - 文件出现后如果持续 0 字节超过 emptyGiveUpMs(默认 10s),快速失败
|
|
81
|
+
* - 文件未出现超过 noFileGiveUpMs(默认 15s),快速失败
|
|
82
|
+
* - 整体超时 timeoutMs 作为最终兜底
|
|
83
|
+
*
|
|
84
|
+
* @param filePath 文件路径
|
|
85
|
+
* @param timeoutMs 最大等待时间(默认 30 秒)
|
|
86
|
+
* @param pollMs 轮询间隔(默认 500ms)
|
|
87
|
+
* @returns 文件大小(字节),超时或文件始终为空返回 0
|
|
88
|
+
*/
|
|
89
|
+
export declare function waitForFile(filePath: string, timeoutMs?: number, pollMs?: number): Promise<number>;
|