@downcity/plugins 1.0.56 → 1.0.57
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/bin/BuiltinPlugins.d.ts.map +1 -1
- package/bin/BuiltinPlugins.js +0 -4
- package/bin/BuiltinPlugins.js.map +1 -1
- package/bin/asr/Plugin.d.ts +67 -7
- package/bin/asr/Plugin.d.ts.map +1 -1
- package/bin/asr/Plugin.js +229 -461
- package/bin/asr/Plugin.js.map +1 -1
- package/bin/asr/types/AsrPlugin.d.ts +114 -0
- package/bin/asr/types/AsrPlugin.d.ts.map +1 -0
- package/bin/asr/types/AsrPlugin.js +10 -0
- package/bin/asr/types/AsrPlugin.js.map +1 -0
- package/bin/image/ImagePlugin.d.ts +1 -1
- package/bin/image/ImagePlugin.d.ts.map +1 -1
- package/bin/image/ImagePlugin.js +23 -5
- package/bin/image/ImagePlugin.js.map +1 -1
- package/bin/index.d.ts +2 -0
- package/bin/index.d.ts.map +1 -1
- package/bin/tts/Plugin.d.ts +53 -6
- package/bin/tts/Plugin.d.ts.map +1 -1
- package/bin/tts/Plugin.js +197 -474
- package/bin/tts/Plugin.js.map +1 -1
- package/bin/tts/types/TtsPlugin.d.ts +63 -102
- package/bin/tts/types/TtsPlugin.d.ts.map +1 -1
- package/bin/tts/types/TtsPlugin.js +4 -3
- package/bin/tts/types/TtsPlugin.js.map +1 -1
- package/bin/web/PROMPT.d.ts +1 -1
- package/bin/web/PROMPT.d.ts.map +1 -1
- package/bin/web/PROMPT.js +1 -1
- package/bin/web/PROMPT.js.map +1 -1
- package/bin/web/Plugin.d.ts +66 -5
- package/bin/web/Plugin.d.ts.map +1 -1
- package/bin/web/Plugin.js +126 -450
- package/bin/web/Plugin.js.map +1 -1
- package/bin/web/WebPromptAssets.d.ts +1 -9
- package/bin/web/WebPromptAssets.d.ts.map +1 -1
- package/bin/web/WebPromptAssets.js +1 -11
- package/bin/web/WebPromptAssets.js.map +1 -1
- package/bin/web/runtime/Install.d.ts +19 -0
- package/bin/web/runtime/Install.d.ts.map +1 -0
- package/bin/web/runtime/Install.js +178 -0
- package/bin/web/runtime/Install.js.map +1 -0
- package/bin/web/types/WebPlugin.d.ts +37 -109
- package/bin/web/types/WebPlugin.d.ts.map +1 -1
- package/bin/web/types/WebPlugin.js +5 -7
- package/bin/web/types/WebPlugin.js.map +1 -1
- package/package.json +2 -2
- package/src/BuiltinPlugins.ts +0 -4
- package/src/asr/Plugin.ts +264 -483
- package/src/asr/types/AsrPlugin.ts +118 -0
- package/src/image/ImagePlugin.ts +23 -5
- package/src/index.ts +12 -0
- package/src/tts/Plugin.ts +225 -492
- package/src/tts/types/TtsPlugin.ts +67 -102
- package/src/web/PROMPT.ts +1 -1
- package/src/web/PROMPT.ts.txt +32 -6
- package/src/web/Plugin.ts +119 -453
- package/src/web/WebPromptAssets.ts +1 -13
- package/src/web/runtime/Install.ts +241 -0
- package/src/web/types/WebPlugin.ts +37 -113
- package/bin/asr/Config.d.ts +0 -43
- package/bin/asr/Config.d.ts.map +0 -1
- package/bin/asr/Config.js +0 -107
- package/bin/asr/Config.js.map +0 -1
- package/bin/asr/Dependency.d.ts +0 -77
- package/bin/asr/Dependency.d.ts.map +0 -1
- package/bin/asr/Dependency.js +0 -238
- package/bin/asr/Dependency.js.map +0 -1
- package/bin/asr/InboundAugment.d.ts +0 -17
- package/bin/asr/InboundAugment.d.ts.map +0 -1
- package/bin/asr/InboundAugment.js +0 -47
- package/bin/asr/InboundAugment.js.map +0 -1
- package/bin/asr/ModelCatalog.d.ts +0 -29
- package/bin/asr/ModelCatalog.d.ts.map +0 -1
- package/bin/asr/ModelCatalog.js +0 -25
- package/bin/asr/ModelCatalog.js.map +0 -1
- package/bin/tts/Dependency.d.ts +0 -90
- package/bin/tts/Dependency.d.ts.map +0 -1
- package/bin/tts/Dependency.js +0 -344
- package/bin/tts/Dependency.js.map +0 -1
- package/bin/tts/PluginSupport.d.ts +0 -25
- package/bin/tts/PluginSupport.d.ts.map +0 -1
- package/bin/tts/PluginSupport.js +0 -72
- package/bin/tts/PluginSupport.js.map +0 -1
- package/bin/tts/runtime/Catalog.d.ts +0 -21
- package/bin/tts/runtime/Catalog.d.ts.map +0 -1
- package/bin/tts/runtime/Catalog.js +0 -90
- package/bin/tts/runtime/Catalog.js.map +0 -1
- package/bin/tts/runtime/DependencyInstaller.d.ts +0 -143
- package/bin/tts/runtime/DependencyInstaller.d.ts.map +0 -1
- package/bin/tts/runtime/DependencyInstaller.js +0 -261
- package/bin/tts/runtime/DependencyInstaller.js.map +0 -1
- package/bin/tts/runtime/Installer.d.ts +0 -89
- package/bin/tts/runtime/Installer.d.ts.map +0 -1
- package/bin/tts/runtime/Installer.js +0 -188
- package/bin/tts/runtime/Installer.js.map +0 -1
- package/bin/tts/runtime/Paths.d.ts +0 -20
- package/bin/tts/runtime/Paths.d.ts.map +0 -1
- package/bin/tts/runtime/Paths.js +0 -32
- package/bin/tts/runtime/Paths.js.map +0 -1
- package/bin/tts/runtime/Synthesizer.d.ts +0 -44
- package/bin/tts/runtime/Synthesizer.d.ts.map +0 -1
- package/bin/tts/runtime/Synthesizer.js +0 -363
- package/bin/tts/runtime/Synthesizer.js.map +0 -1
- package/bin/tts/types/Tts.d.ts +0 -91
- package/bin/tts/types/Tts.d.ts.map +0 -1
- package/bin/tts/types/Tts.js +0 -9
- package/bin/tts/types/Tts.js.map +0 -1
- package/bin/voice/Config.d.ts +0 -43
- package/bin/voice/Config.d.ts.map +0 -1
- package/bin/voice/Config.js +0 -104
- package/bin/voice/Config.js.map +0 -1
- package/bin/voice/Dependency.d.ts +0 -77
- package/bin/voice/Dependency.d.ts.map +0 -1
- package/bin/voice/Dependency.js +0 -237
- package/bin/voice/Dependency.js.map +0 -1
- package/bin/voice/InboundAugment.d.ts +0 -17
- package/bin/voice/InboundAugment.d.ts.map +0 -1
- package/bin/voice/InboundAugment.js +0 -47
- package/bin/voice/InboundAugment.js.map +0 -1
- package/bin/voice/ModelCatalog.d.ts +0 -29
- package/bin/voice/ModelCatalog.d.ts.map +0 -1
- package/bin/voice/ModelCatalog.js +0 -25
- package/bin/voice/ModelCatalog.js.map +0 -1
- package/bin/voice/runtime/Catalog.d.ts +0 -18
- package/bin/voice/runtime/Catalog.d.ts.map +0 -1
- package/bin/voice/runtime/Catalog.js +0 -61
- package/bin/voice/runtime/Catalog.js.map +0 -1
- package/bin/voice/runtime/DependencyInstaller.d.ts +0 -145
- package/bin/voice/runtime/DependencyInstaller.d.ts.map +0 -1
- package/bin/voice/runtime/DependencyInstaller.js +0 -309
- package/bin/voice/runtime/DependencyInstaller.js.map +0 -1
- package/bin/voice/runtime/Installer.d.ts +0 -94
- package/bin/voice/runtime/Installer.d.ts.map +0 -1
- package/bin/voice/runtime/Installer.js +0 -200
- package/bin/voice/runtime/Installer.js.map +0 -1
- package/bin/voice/runtime/Paths.d.ts +0 -8
- package/bin/voice/runtime/Paths.d.ts.map +0 -1
- package/bin/voice/runtime/Paths.js +0 -26
- package/bin/voice/runtime/Paths.js.map +0 -1
- package/bin/voice/runtime/Transcriber.d.ts +0 -57
- package/bin/voice/runtime/Transcriber.d.ts.map +0 -1
- package/bin/voice/runtime/Transcriber.js +0 -329
- package/bin/voice/runtime/Transcriber.js.map +0 -1
- package/bin/voice/types/Voice.d.ts +0 -58
- package/bin/voice/types/Voice.d.ts.map +0 -1
- package/bin/voice/types/Voice.js +0 -9
- package/bin/voice/types/Voice.js.map +0 -1
- package/bin/voice/types/VoicePlugin.d.ts +0 -190
- package/bin/voice/types/VoicePlugin.d.ts.map +0 -1
- package/bin/voice/types/VoicePlugin.js +0 -9
- package/bin/voice/types/VoicePlugin.js.map +0 -1
- package/bin/web/Dependency.d.ts +0 -10
- package/bin/web/Dependency.d.ts.map +0 -1
- package/bin/web/Dependency.js +0 -10
- package/bin/web/Dependency.js.map +0 -1
- package/bin/web/PROMPT.agent-browser.d.ts +0 -7
- package/bin/web/PROMPT.agent-browser.d.ts.map +0 -1
- package/bin/web/PROMPT.agent-browser.js +0 -8
- package/bin/web/PROMPT.agent-browser.js.map +0 -1
- package/bin/web/PROMPT.web-access.d.ts +0 -7
- package/bin/web/PROMPT.web-access.d.ts.map +0 -1
- package/bin/web/PROMPT.web-access.js +0 -8
- package/bin/web/PROMPT.web-access.js.map +0 -1
- package/bin/web/runtime/Config.d.ts +0 -21
- package/bin/web/runtime/Config.d.ts.map +0 -1
- package/bin/web/runtime/Config.js +0 -79
- package/bin/web/runtime/Config.js.map +0 -1
- package/bin/web/runtime/Source.d.ts +0 -29
- package/bin/web/runtime/Source.d.ts.map +0 -1
- package/bin/web/runtime/Source.js +0 -209
- package/bin/web/runtime/Source.js.map +0 -1
- package/src/asr/Config.ts +0 -138
- package/src/asr/Dependency.ts +0 -336
- package/src/asr/InboundAugment.ts +0 -59
- package/src/asr/ModelCatalog.ts +0 -43
- package/src/tts/Dependency.ts +0 -473
- package/src/tts/PluginSupport.ts +0 -85
- package/src/tts/runtime/Catalog.ts +0 -97
- package/src/tts/runtime/DependencyInstaller.ts +0 -436
- package/src/tts/runtime/Installer.ts +0 -297
- package/src/tts/runtime/Paths.ts +0 -39
- package/src/tts/runtime/Synthesizer.ts +0 -480
- package/src/tts/types/Tts.ts +0 -99
- package/src/voice/Config.ts +0 -135
- package/src/voice/Dependency.ts +0 -329
- package/src/voice/InboundAugment.ts +0 -59
- package/src/voice/ModelCatalog.ts +0 -43
- package/src/voice/runtime/Catalog.ts +0 -68
- package/src/voice/runtime/DependencyInstaller.ts +0 -505
- package/src/voice/runtime/Installer.ts +0 -324
- package/src/voice/runtime/Paths.ts +0 -26
- package/src/voice/runtime/Transcriber.ts +0 -467
- package/src/voice/types/Voice.ts +0 -68
- package/src/voice/types/VoicePlugin.ts +0 -194
- package/src/web/Dependency.ts +0 -17
- package/src/web/PROMPT.agent-browser.ts +0 -9
- package/src/web/PROMPT.agent-browser.ts.txt +0 -17
- package/src/web/PROMPT.web-access.ts +0 -9
- package/src/web/PROMPT.web-access.ts.txt +0 -13
- package/src/web/runtime/Config.ts +0 -105
- package/src/web/runtime/Source.ts +0 -257
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice 入站消息增强 hook。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 只处理 voice/audio 附件,转写结果作为 plugin section 注入。
|
|
6
|
-
* - 转写失败不阻塞主链路,保持 best-effort。
|
|
7
|
-
*/
|
|
8
|
-
import { transcribeWithVoiceDependency } from "../voice/Dependency.js";
|
|
9
|
-
/**
|
|
10
|
-
* 自动转写入站语音附件。
|
|
11
|
-
*/
|
|
12
|
-
export async function augmentVoiceInboundMessage(params) {
|
|
13
|
-
const input = params.value;
|
|
14
|
-
const voiceAttachments = (Array.isArray(input.attachments) ? input.attachments : []).filter((item) => (item.kind === "voice" || item.kind === "audio") &&
|
|
15
|
-
typeof item.path === "string" &&
|
|
16
|
-
item.path.trim());
|
|
17
|
-
if (voiceAttachments.length === 0) {
|
|
18
|
-
return input;
|
|
19
|
-
}
|
|
20
|
-
const pluginSections = Array.isArray(input.pluginSections)
|
|
21
|
-
? [...input.pluginSections]
|
|
22
|
-
: [];
|
|
23
|
-
for (const attachment of voiceAttachments) {
|
|
24
|
-
try {
|
|
25
|
-
const result = await transcribeWithVoiceDependency({
|
|
26
|
-
context: params.context,
|
|
27
|
-
audioPath: String(attachment.path || "").trim(),
|
|
28
|
-
});
|
|
29
|
-
const text = typeof result.text === "string" ? result.text.trim() : "";
|
|
30
|
-
if (!text)
|
|
31
|
-
continue;
|
|
32
|
-
const absPath = String(attachment.path || "").trim();
|
|
33
|
-
const rel = absPath.startsWith(`${params.context.rootPath}/`)
|
|
34
|
-
? absPath.slice(params.context.rootPath.length + 1)
|
|
35
|
-
: absPath;
|
|
36
|
-
pluginSections.push(`【语音转写 ${attachment.kind}: ${rel}】\n${text}`);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// 关键点(中文):转写失败不阻塞主链路,保持 best-effort。
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
...input,
|
|
44
|
-
pluginSections,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=InboundAugment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InboundAugment.js","sourceRoot":"","sources":["../../src/voice/InboundAugment.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,MAGhD;IACC,MAAM,KAAK,GAAG,MAAM,CAAC,KAA2C,CAAC;IACjE,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CACzF,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;QAChD,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CACnB,CAAC;IACF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,KAA6B,CAAC;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QACxD,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QAC3B,CAAC,CAAC,EAAE,CAAC;IAEP,KAAK,MAAM,UAAU,IAAI,gBAAgB,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC;gBACjD,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;aAChD,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;gBAC3D,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnD,CAAC,CAAC,OAAO,CAAC;YACZ,cAAc,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR,cAAc;KACS,CAAC;AAC5B,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice 插件模型目录封装。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 对 plugin 层暴露稳定的 voice 领域接口。
|
|
6
|
-
* - plugin 不直接依赖底层 runtime 文件布局,只依赖这里的领域封装。
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* 列出内置 voice 模型目录。
|
|
10
|
-
*/
|
|
11
|
-
export declare function listVoiceModels(): Array<{
|
|
12
|
-
/**
|
|
13
|
-
* 稳定模型 ID。
|
|
14
|
-
*/
|
|
15
|
-
id: string;
|
|
16
|
-
/**
|
|
17
|
-
* 用户可读标签。
|
|
18
|
-
*/
|
|
19
|
-
label: string;
|
|
20
|
-
/**
|
|
21
|
-
* 用户可读说明。
|
|
22
|
-
*/
|
|
23
|
-
description: string;
|
|
24
|
-
}>;
|
|
25
|
-
/**
|
|
26
|
-
* 解析用户输入的 voice 模型 ID。
|
|
27
|
-
*/
|
|
28
|
-
export declare function resolveVoicePluginModelId(input: string): string | null;
|
|
29
|
-
//# sourceMappingURL=ModelCatalog.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelCatalog.d.ts","sourceRoot":"","sources":["../../src/voice/ModelCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;GAEG;AACH,wBAAgB,eAAe,IAAI,KAAK,CAAC;IACvC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAMD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEtE"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice 插件模型目录封装。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 对 plugin 层暴露稳定的 voice 领域接口。
|
|
6
|
-
* - plugin 不直接依赖底层 runtime 文件布局,只依赖这里的领域封装。
|
|
7
|
-
*/
|
|
8
|
-
import { VOICE_MODEL_CATALOG, resolveVoiceModelId, } from "../voice/runtime/Catalog.js";
|
|
9
|
-
/**
|
|
10
|
-
* 列出内置 voice 模型目录。
|
|
11
|
-
*/
|
|
12
|
-
export function listVoiceModels() {
|
|
13
|
-
return VOICE_MODEL_CATALOG.map((item) => ({
|
|
14
|
-
id: item.id,
|
|
15
|
-
label: item.label,
|
|
16
|
-
description: item.description,
|
|
17
|
-
}));
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 解析用户输入的 voice 模型 ID。
|
|
21
|
-
*/
|
|
22
|
-
export function resolveVoicePluginModelId(input) {
|
|
23
|
-
return resolveVoiceModelId(input);
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=ModelCatalog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelCatalog.js","sourceRoot":"","sources":["../../src/voice/ModelCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,eAAe;IAc7B,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { VoiceModelCatalogItem, VoiceModelId } from "../../voice/types/Voice.js";
|
|
2
|
-
/**
|
|
3
|
-
* Voice 内置模型目录。
|
|
4
|
-
*
|
|
5
|
-
* 关键点(中文)
|
|
6
|
-
* - 统一维护 CLI 展示、下载源与配置落盘 ID。
|
|
7
|
-
* - 只保留“稳定字段”,避免目录频繁变动影响外部调用。
|
|
8
|
-
*/
|
|
9
|
-
export declare const VOICE_MODEL_CATALOG: readonly VoiceModelCatalogItem[];
|
|
10
|
-
/**
|
|
11
|
-
* 解析用户输入为稳定模型 ID(支持别名与大小写)。
|
|
12
|
-
*/
|
|
13
|
-
export declare function resolveVoiceModelId(input: string): VoiceModelId | null;
|
|
14
|
-
/**
|
|
15
|
-
* 读取目录项;不存在返回 null。
|
|
16
|
-
*/
|
|
17
|
-
export declare function getVoiceModelCatalogItem(id: VoiceModelId): VoiceModelCatalogItem | null;
|
|
18
|
-
//# sourceMappingURL=Catalog.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Catalog.d.ts","sourceRoot":"","sources":["../../../src/voice/runtime/Catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAElF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,qBAAqB,EAsBtD,CAAC;AAoBX;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMtE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,qBAAqB,GAAG,IAAI,CAEvF"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice 内置模型目录。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 统一维护 CLI 展示、下载源与配置落盘 ID。
|
|
6
|
-
* - 只保留“稳定字段”,避免目录频繁变动影响外部调用。
|
|
7
|
-
*/
|
|
8
|
-
export const VOICE_MODEL_CATALOG = [
|
|
9
|
-
{
|
|
10
|
-
id: "SenseVoiceSmall",
|
|
11
|
-
label: "SenseVoiceSmall",
|
|
12
|
-
description: "中文优先,体积较小,推荐默认选择。",
|
|
13
|
-
huggingfaceRepo: "FunAudioLLM/SenseVoiceSmall",
|
|
14
|
-
revision: "main",
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
id: "paraformer-zh-streaming",
|
|
18
|
-
label: "paraformer-zh-streaming",
|
|
19
|
-
description: "中文流式场景友好,低延迟。",
|
|
20
|
-
huggingfaceRepo: "funasr/paraformer-zh-streaming",
|
|
21
|
-
revision: "main",
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
id: "whisper-large-v3-turbo",
|
|
25
|
-
label: "whisper-large-v3-turbo",
|
|
26
|
-
description: "多语言能力稳定,泛化较强。",
|
|
27
|
-
huggingfaceRepo: "openai/whisper-large-v3-turbo",
|
|
28
|
-
revision: "main",
|
|
29
|
-
},
|
|
30
|
-
];
|
|
31
|
-
const VOICE_MODEL_ALIAS_MAP = {
|
|
32
|
-
sensevoicesmall: "SenseVoiceSmall",
|
|
33
|
-
"sensevoice-small": "SenseVoiceSmall",
|
|
34
|
-
"paraformer-zh-streaming": "paraformer-zh-streaming",
|
|
35
|
-
paraformer_zh_streaming: "paraformer-zh-streaming",
|
|
36
|
-
"whisper-large-v3-turbo": "whisper-large-v3-turbo",
|
|
37
|
-
whisper_large_v3_turbo: "whisper-large-v3-turbo",
|
|
38
|
-
};
|
|
39
|
-
const CATALOG_BY_ID = VOICE_MODEL_CATALOG.reduce((acc, item) => {
|
|
40
|
-
acc[item.id] = item;
|
|
41
|
-
return acc;
|
|
42
|
-
}, {});
|
|
43
|
-
/**
|
|
44
|
-
* 解析用户输入为稳定模型 ID(支持别名与大小写)。
|
|
45
|
-
*/
|
|
46
|
-
export function resolveVoiceModelId(input) {
|
|
47
|
-
const raw = String(input || "").trim();
|
|
48
|
-
if (!raw)
|
|
49
|
-
return null;
|
|
50
|
-
const exact = VOICE_MODEL_CATALOG.find((item) => item.id === raw);
|
|
51
|
-
if (exact)
|
|
52
|
-
return exact.id;
|
|
53
|
-
return VOICE_MODEL_ALIAS_MAP[raw.toLowerCase()] || null;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 读取目录项;不存在返回 null。
|
|
57
|
-
*/
|
|
58
|
-
export function getVoiceModelCatalogItem(id) {
|
|
59
|
-
return CATALOG_BY_ID[id] || null;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=Catalog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Catalog.js","sourceRoot":"","sources":["../../../src/voice/runtime/Catalog.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,mBAAmB;QAChC,eAAe,EAAE,6BAA6B;QAC9C,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,EAAE,EAAE,yBAAyB;QAC7B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,eAAe;QAC5B,eAAe,EAAE,gCAAgC;QACjD,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,eAAe;QAC5B,eAAe,EAAE,+BAA+B;QAChD,QAAQ,EAAE,MAAM;KACjB;CACO,CAAC;AAEX,MAAM,qBAAqB,GAAiC;IAC1D,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,iBAAiB;IACrC,yBAAyB,EAAE,yBAAyB;IACpD,uBAAuB,EAAE,yBAAyB;IAClD,wBAAwB,EAAE,wBAAwB;IAClD,sBAAsB,EAAE,wBAAwB;CACjD,CAAC;AAEF,MAAM,aAAa,GACjB,mBAAmB,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACZ,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC,EACD,EAAiD,CAClD,CAAC;AAEJ;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,EAAE,CAAC;IAC3B,OAAO,qBAAqB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAgB;IACvD,OAAO,aAAa,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AACnC,CAAC"}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice 转写依赖安装器。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 统一管理 `town voice` 的 Python 依赖安装逻辑。
|
|
6
|
-
* - 根据模型自动推导 runner(funasr / transformers-whisper)并执行 `python -m pip install`。
|
|
7
|
-
* - 返回结构化安装结果,供 CLI/日志/测试复用。
|
|
8
|
-
*/
|
|
9
|
-
import type { VoiceModelId, VoiceTranscribeStrategy } from "../../voice/types/Voice.js";
|
|
10
|
-
/**
|
|
11
|
-
* Voice 依赖 runner 类型。
|
|
12
|
-
*/
|
|
13
|
-
export type VoiceDependencyRunner = "funasr" | "transformers-whisper";
|
|
14
|
-
/**
|
|
15
|
-
* 单个 runner 的安装摘要。
|
|
16
|
-
*/
|
|
17
|
-
export interface VoiceDependencyInstallItem {
|
|
18
|
-
/**
|
|
19
|
-
* 当前安装 runner。
|
|
20
|
-
*/
|
|
21
|
-
runner: VoiceDependencyRunner;
|
|
22
|
-
/**
|
|
23
|
-
* Python 可执行文件。
|
|
24
|
-
*/
|
|
25
|
-
pythonBin: string;
|
|
26
|
-
/**
|
|
27
|
-
* 执行参数(不含 pythonBin)。
|
|
28
|
-
*/
|
|
29
|
-
args: string[];
|
|
30
|
-
/**
|
|
31
|
-
* 安装包列表。
|
|
32
|
-
*/
|
|
33
|
-
packages: string[];
|
|
34
|
-
/**
|
|
35
|
-
* 实际执行的命令行(便于排查)。
|
|
36
|
-
*/
|
|
37
|
-
command: string;
|
|
38
|
-
/**
|
|
39
|
-
* 执行耗时(毫秒)。
|
|
40
|
-
*/
|
|
41
|
-
elapsedMs: number;
|
|
42
|
-
/**
|
|
43
|
-
* 是否跳过安装。
|
|
44
|
-
*
|
|
45
|
-
* 说明(中文)
|
|
46
|
-
* - `true` 表示依赖已存在,仅做检查,不再重复安装。
|
|
47
|
-
* - `false` 或缺省表示执行了实际安装。
|
|
48
|
-
*/
|
|
49
|
-
skipped?: boolean;
|
|
50
|
-
/**
|
|
51
|
-
* 跳过原因(可选)。
|
|
52
|
-
*/
|
|
53
|
-
skipReason?: string;
|
|
54
|
-
/**
|
|
55
|
-
* stdout 尾部(可选)。
|
|
56
|
-
*/
|
|
57
|
-
stdoutTail?: string;
|
|
58
|
-
/**
|
|
59
|
-
* stderr 尾部(可选)。
|
|
60
|
-
*/
|
|
61
|
-
stderrTail?: string;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 依赖安装结果。
|
|
65
|
-
*/
|
|
66
|
-
export interface VoiceDependencyInstallResult {
|
|
67
|
-
/**
|
|
68
|
-
* 本次使用的 Python 可执行文件。
|
|
69
|
-
*/
|
|
70
|
-
pythonBin: string;
|
|
71
|
-
/**
|
|
72
|
-
* 本次处理的 runner 列表。
|
|
73
|
-
*/
|
|
74
|
-
runners: VoiceDependencyRunner[];
|
|
75
|
-
/**
|
|
76
|
-
* 各 runner 的安装摘要。
|
|
77
|
-
*/
|
|
78
|
-
items: VoiceDependencyInstallItem[];
|
|
79
|
-
/**
|
|
80
|
-
* 是否使用了虚拟环境安装。
|
|
81
|
-
*/
|
|
82
|
-
usedVirtualEnv: boolean;
|
|
83
|
-
/**
|
|
84
|
-
* 虚拟环境目录(仅 `usedVirtualEnv=true` 时存在)。
|
|
85
|
-
*/
|
|
86
|
-
venvDir?: string;
|
|
87
|
-
/**
|
|
88
|
-
* 初始尝试使用的 Python(仅进入虚拟环境回退时存在)。
|
|
89
|
-
*/
|
|
90
|
-
basePythonBin?: string;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 依赖安装输入参数。
|
|
94
|
-
*/
|
|
95
|
-
export interface VoiceDependencyInstallInput {
|
|
96
|
-
/**
|
|
97
|
-
* Python 可执行文件(默认 `python3`)。
|
|
98
|
-
*/
|
|
99
|
-
pythonBin?: string;
|
|
100
|
-
/**
|
|
101
|
-
* 需要安装的 runner 列表。
|
|
102
|
-
*/
|
|
103
|
-
runners: VoiceDependencyRunner[];
|
|
104
|
-
/**
|
|
105
|
-
* 是否使用 `pip -U` 升级。
|
|
106
|
-
*/
|
|
107
|
-
upgrade?: boolean;
|
|
108
|
-
/**
|
|
109
|
-
* pip 安装超时(毫秒)。
|
|
110
|
-
*/
|
|
111
|
-
timeoutMs?: number;
|
|
112
|
-
/**
|
|
113
|
-
* 虚拟环境目录(可选)。
|
|
114
|
-
*
|
|
115
|
-
* 说明(中文)
|
|
116
|
-
* - 当系统 Python 命中 PEP 668(不允许全局 pip install)时,自动回退到该目录。
|
|
117
|
-
* - 默认 `~/.downcity/venvs/voice`。
|
|
118
|
-
*/
|
|
119
|
-
venvDir?: string;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* 判断是否为 PEP 668(externally-managed-environment)错误。
|
|
123
|
-
*/
|
|
124
|
-
export declare function isPep668InstallError(text: string): boolean;
|
|
125
|
-
/**
|
|
126
|
-
* 根据模型推导推荐 runner。
|
|
127
|
-
*/
|
|
128
|
-
export declare function resolveVoiceRunnerByModel(modelId: VoiceModelId): VoiceDependencyRunner;
|
|
129
|
-
/**
|
|
130
|
-
* 根据模型列表推导去重后的 runner 列表。
|
|
131
|
-
*/
|
|
132
|
-
export declare function resolveVoiceRunnersByModels(modelIds: VoiceModelId[]): VoiceDependencyRunner[];
|
|
133
|
-
/**
|
|
134
|
-
* 根据模型推导推荐转写策略。
|
|
135
|
-
*/
|
|
136
|
-
export declare function resolveVoiceStrategyByModel(modelId: VoiceModelId): VoiceTranscribeStrategy;
|
|
137
|
-
/**
|
|
138
|
-
* 安装 Voice 转写依赖。
|
|
139
|
-
*
|
|
140
|
-
* 关键点(中文)
|
|
141
|
-
* - 逐个 runner 执行 pip 安装,任一失败即抛错。
|
|
142
|
-
* - 错误信息携带 stderr/stdout 尾部,便于用户快速定位。
|
|
143
|
-
*/
|
|
144
|
-
export declare function installVoiceTranscribeDependencies(input: VoiceDependencyInstallInput): Promise<VoiceDependencyInstallResult>;
|
|
145
|
-
//# sourceMappingURL=DependencyInstaller.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DependencyInstaller.d.ts","sourceRoot":"","sources":["../../../src/voice/runtime/DependencyInstaller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AASpF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,sBAAsB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,MAAM,EAAE,qBAAqB,CAAC;IAC9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;OAEG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC;;OAEG;IACH,KAAK,EAAE,0BAA0B,EAAE,CAAC;IACpC;;OAEG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAS1D;AAiPD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAGtF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,YAAY,EAAE,GACvB,qBAAqB,EAAE,CAEzB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,YAAY,GAAG,uBAAuB,CAG1F;AAED;;;;;;GAMG;AACH,wBAAsB,kCAAkC,CACtD,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAiDvC"}
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice 转写依赖安装器。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 统一管理 `town voice` 的 Python 依赖安装逻辑。
|
|
6
|
-
* - 根据模型自动推导 runner(funasr / transformers-whisper)并执行 `python -m pip install`。
|
|
7
|
-
* - 返回结构化安装结果,供 CLI/日志/测试复用。
|
|
8
|
-
*/
|
|
9
|
-
import { execFile as execFileCb } from "node:child_process";
|
|
10
|
-
import os from "node:os";
|
|
11
|
-
import path from "node:path";
|
|
12
|
-
import { promisify } from "node:util";
|
|
13
|
-
import fs from "fs-extra";
|
|
14
|
-
const execFileAsync = promisify(execFileCb);
|
|
15
|
-
const DEFAULT_PYTHON_BIN = "python3";
|
|
16
|
-
const DEFAULT_PIP_TIMEOUT_MS = 300_000;
|
|
17
|
-
const OUTPUT_TAIL_LIMIT = 1200;
|
|
18
|
-
const DEFAULT_VENV_DIR = path.join(os.homedir(), ".downcity", "venvs", "voice");
|
|
19
|
-
function normalizePythonBin(input) {
|
|
20
|
-
const text = String(input || "").trim();
|
|
21
|
-
return text || DEFAULT_PYTHON_BIN;
|
|
22
|
-
}
|
|
23
|
-
function normalizeTimeoutMs(value) {
|
|
24
|
-
if (!Number.isFinite(value))
|
|
25
|
-
return DEFAULT_PIP_TIMEOUT_MS;
|
|
26
|
-
const ms = Math.floor(Number(value));
|
|
27
|
-
if (ms < 5_000)
|
|
28
|
-
return 5_000;
|
|
29
|
-
if (ms > 1_800_000)
|
|
30
|
-
return 1_800_000;
|
|
31
|
-
return ms;
|
|
32
|
-
}
|
|
33
|
-
function normalizeVenvDir(input) {
|
|
34
|
-
const text = String(input || "").trim();
|
|
35
|
-
if (!text)
|
|
36
|
-
return DEFAULT_VENV_DIR;
|
|
37
|
-
return path.resolve(text);
|
|
38
|
-
}
|
|
39
|
-
function tailText(value) {
|
|
40
|
-
const text = String(value || "").trim();
|
|
41
|
-
if (!text)
|
|
42
|
-
return undefined;
|
|
43
|
-
if (text.length <= OUTPUT_TAIL_LIMIT)
|
|
44
|
-
return text;
|
|
45
|
-
return text.slice(text.length - OUTPUT_TAIL_LIMIT);
|
|
46
|
-
}
|
|
47
|
-
function resolveVenvPythonBin(venvDir) {
|
|
48
|
-
return path.join(venvDir, "bin", "python");
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* 判断是否为 PEP 668(externally-managed-environment)错误。
|
|
52
|
-
*/
|
|
53
|
-
export function isPep668InstallError(text) {
|
|
54
|
-
const msg = String(text || "").toLowerCase();
|
|
55
|
-
if (!msg)
|
|
56
|
-
return false;
|
|
57
|
-
return (msg.includes("externally-managed-environment") ||
|
|
58
|
-
msg.includes("this environment is externally managed") ||
|
|
59
|
-
msg.includes("pep 668") ||
|
|
60
|
-
msg.includes("--break-system-packages"));
|
|
61
|
-
}
|
|
62
|
-
function dedupeRunners(runners) {
|
|
63
|
-
const seen = new Set();
|
|
64
|
-
const out = [];
|
|
65
|
-
for (const runner of runners) {
|
|
66
|
-
if (seen.has(runner))
|
|
67
|
-
continue;
|
|
68
|
-
seen.add(runner);
|
|
69
|
-
out.push(runner);
|
|
70
|
-
}
|
|
71
|
-
return out;
|
|
72
|
-
}
|
|
73
|
-
function getRunnerPackages(runner) {
|
|
74
|
-
if (runner === "funasr") {
|
|
75
|
-
// 关键点(中文):FunASR 在常见语音模型推理路径会依赖 torch/torchaudio。
|
|
76
|
-
// 仅安装 funasr 会在转写阶段触发 `ModuleNotFoundError: torch`。
|
|
77
|
-
return ["funasr", "torch", "torchaudio"];
|
|
78
|
-
}
|
|
79
|
-
return ["transformers", "torch", "torchaudio"];
|
|
80
|
-
}
|
|
81
|
-
async function checkRunnerPackagesInstalled(params) {
|
|
82
|
-
const args = ["-m", "pip", "show", ...params.packages];
|
|
83
|
-
const command = [params.pythonBin, ...args].join(" ");
|
|
84
|
-
try {
|
|
85
|
-
await execFileAsync(params.pythonBin, args, {
|
|
86
|
-
timeout: params.timeoutMs,
|
|
87
|
-
maxBuffer: 8 * 1024 * 1024,
|
|
88
|
-
});
|
|
89
|
-
return {
|
|
90
|
-
installed: true,
|
|
91
|
-
args,
|
|
92
|
-
command,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return {
|
|
97
|
-
installed: false,
|
|
98
|
-
args,
|
|
99
|
-
command,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async function installRunnerWithPython(params) {
|
|
104
|
-
const packages = getRunnerPackages(params.runner);
|
|
105
|
-
const checkStartedAt = Date.now();
|
|
106
|
-
const checkResult = await checkRunnerPackagesInstalled({
|
|
107
|
-
pythonBin: params.pythonBin,
|
|
108
|
-
packages,
|
|
109
|
-
timeoutMs: params.timeoutMs,
|
|
110
|
-
});
|
|
111
|
-
if (checkResult.installed) {
|
|
112
|
-
return {
|
|
113
|
-
success: true,
|
|
114
|
-
item: {
|
|
115
|
-
runner: params.runner,
|
|
116
|
-
pythonBin: params.pythonBin,
|
|
117
|
-
args: checkResult.args,
|
|
118
|
-
packages,
|
|
119
|
-
command: checkResult.command,
|
|
120
|
-
elapsedMs: Date.now() - checkStartedAt,
|
|
121
|
-
skipped: true,
|
|
122
|
-
skipReason: "already-installed",
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
const args = [
|
|
127
|
-
"-m",
|
|
128
|
-
"pip",
|
|
129
|
-
"install",
|
|
130
|
-
...(params.upgrade ? ["-U"] : []),
|
|
131
|
-
...packages,
|
|
132
|
-
];
|
|
133
|
-
const command = [params.pythonBin, ...args].join(" ");
|
|
134
|
-
const startedAt = Date.now();
|
|
135
|
-
try {
|
|
136
|
-
const { stdout, stderr } = await execFileAsync(params.pythonBin, args, {
|
|
137
|
-
timeout: params.timeoutMs,
|
|
138
|
-
maxBuffer: 8 * 1024 * 1024,
|
|
139
|
-
});
|
|
140
|
-
return {
|
|
141
|
-
success: true,
|
|
142
|
-
item: {
|
|
143
|
-
runner: params.runner,
|
|
144
|
-
pythonBin: params.pythonBin,
|
|
145
|
-
args,
|
|
146
|
-
packages,
|
|
147
|
-
command,
|
|
148
|
-
elapsedMs: Date.now() - startedAt,
|
|
149
|
-
...(tailText(String(stdout || ""))
|
|
150
|
-
? { stdoutTail: tailText(String(stdout || "")) }
|
|
151
|
-
: {}),
|
|
152
|
-
...(tailText(String(stderr || ""))
|
|
153
|
-
? { stderrTail: tailText(String(stderr || "")) }
|
|
154
|
-
: {}),
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
const errorLike = error;
|
|
160
|
-
const stdoutTail = tailText(String(errorLike.stdout || ""));
|
|
161
|
-
const stderrTail = tailText(String(errorLike.stderr || ""));
|
|
162
|
-
const reason = stderrTail || stdoutTail || String(errorLike.message || error);
|
|
163
|
-
return {
|
|
164
|
-
success: false,
|
|
165
|
-
failure: {
|
|
166
|
-
runner: params.runner,
|
|
167
|
-
command,
|
|
168
|
-
reason,
|
|
169
|
-
},
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
async function installAllRunnersWithPython(params) {
|
|
174
|
-
const items = [];
|
|
175
|
-
for (const runner of params.runners) {
|
|
176
|
-
const attempt = await installRunnerWithPython({
|
|
177
|
-
pythonBin: params.pythonBin,
|
|
178
|
-
runner,
|
|
179
|
-
upgrade: params.upgrade,
|
|
180
|
-
timeoutMs: params.timeoutMs,
|
|
181
|
-
});
|
|
182
|
-
if (!attempt.success) {
|
|
183
|
-
return {
|
|
184
|
-
success: false,
|
|
185
|
-
failure: attempt.failure,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
items.push(attempt.item);
|
|
189
|
-
}
|
|
190
|
-
return {
|
|
191
|
-
success: true,
|
|
192
|
-
items,
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
function formatRunnerInstallFailure(failure) {
|
|
196
|
-
return `Failed to install voice dependencies for runner "${failure.runner}" via "${failure.command}": ${failure.reason}`;
|
|
197
|
-
}
|
|
198
|
-
async function ensureVoiceVirtualEnvPython(params) {
|
|
199
|
-
await fs.ensureDir(path.dirname(params.venvDir));
|
|
200
|
-
const createArgs = ["-m", "venv", params.venvDir];
|
|
201
|
-
const createCommand = [params.basePythonBin, ...createArgs].join(" ");
|
|
202
|
-
try {
|
|
203
|
-
await execFileAsync(params.basePythonBin, createArgs, {
|
|
204
|
-
timeout: params.timeoutMs,
|
|
205
|
-
maxBuffer: 8 * 1024 * 1024,
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
const errorLike = error;
|
|
210
|
-
const stdoutTail = tailText(String(errorLike.stdout || ""));
|
|
211
|
-
const stderrTail = tailText(String(errorLike.stderr || ""));
|
|
212
|
-
const reason = stderrTail || stdoutTail || String(errorLike.message || error);
|
|
213
|
-
throw new Error(`Failed to create voice virtual environment via "${createCommand}": ${reason}`);
|
|
214
|
-
}
|
|
215
|
-
const venvPythonBin = resolveVenvPythonBin(params.venvDir);
|
|
216
|
-
const upgradePipArgs = ["-m", "pip", "install", "-U", "pip"];
|
|
217
|
-
const upgradePipCommand = [venvPythonBin, ...upgradePipArgs].join(" ");
|
|
218
|
-
try {
|
|
219
|
-
await execFileAsync(venvPythonBin, upgradePipArgs, {
|
|
220
|
-
timeout: params.timeoutMs,
|
|
221
|
-
maxBuffer: 8 * 1024 * 1024,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
catch (error) {
|
|
225
|
-
const errorLike = error;
|
|
226
|
-
const stdoutTail = tailText(String(errorLike.stdout || ""));
|
|
227
|
-
const stderrTail = tailText(String(errorLike.stderr || ""));
|
|
228
|
-
const reason = stderrTail || stdoutTail || String(errorLike.message || error);
|
|
229
|
-
throw new Error(`Failed to upgrade pip in voice virtual environment via "${upgradePipCommand}": ${reason}`);
|
|
230
|
-
}
|
|
231
|
-
return venvPythonBin;
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* 根据模型推导推荐 runner。
|
|
235
|
-
*/
|
|
236
|
-
export function resolveVoiceRunnerByModel(modelId) {
|
|
237
|
-
if (modelId === "whisper-large-v3-turbo")
|
|
238
|
-
return "transformers-whisper";
|
|
239
|
-
return "funasr";
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* 根据模型列表推导去重后的 runner 列表。
|
|
243
|
-
*/
|
|
244
|
-
export function resolveVoiceRunnersByModels(modelIds) {
|
|
245
|
-
return dedupeRunners(modelIds.map((modelId) => resolveVoiceRunnerByModel(modelId)));
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* 根据模型推导推荐转写策略。
|
|
249
|
-
*/
|
|
250
|
-
export function resolveVoiceStrategyByModel(modelId) {
|
|
251
|
-
if (modelId === "whisper-large-v3-turbo")
|
|
252
|
-
return "transformers-whisper";
|
|
253
|
-
return "funasr";
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* 安装 Voice 转写依赖。
|
|
257
|
-
*
|
|
258
|
-
* 关键点(中文)
|
|
259
|
-
* - 逐个 runner 执行 pip 安装,任一失败即抛错。
|
|
260
|
-
* - 错误信息携带 stderr/stdout 尾部,便于用户快速定位。
|
|
261
|
-
*/
|
|
262
|
-
export async function installVoiceTranscribeDependencies(input) {
|
|
263
|
-
const basePythonBin = normalizePythonBin(input.pythonBin);
|
|
264
|
-
const timeoutMs = normalizeTimeoutMs(input.timeoutMs);
|
|
265
|
-
const upgrade = input.upgrade !== false;
|
|
266
|
-
const runners = dedupeRunners(input.runners || []);
|
|
267
|
-
const firstAttempt = await installAllRunnersWithPython({
|
|
268
|
-
pythonBin: basePythonBin,
|
|
269
|
-
runners,
|
|
270
|
-
upgrade,
|
|
271
|
-
timeoutMs,
|
|
272
|
-
});
|
|
273
|
-
if (firstAttempt.success) {
|
|
274
|
-
return {
|
|
275
|
-
pythonBin: basePythonBin,
|
|
276
|
-
runners,
|
|
277
|
-
items: firstAttempt.items,
|
|
278
|
-
usedVirtualEnv: false,
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
if (!isPep668InstallError(firstAttempt.failure.reason)) {
|
|
282
|
-
throw new Error(formatRunnerInstallFailure(firstAttempt.failure));
|
|
283
|
-
}
|
|
284
|
-
// 关键点(中文):命中 PEP 668 时自动回退到独立 venv,避免要求用户手工排障。
|
|
285
|
-
const venvDir = normalizeVenvDir(input.venvDir);
|
|
286
|
-
const venvPythonBin = await ensureVoiceVirtualEnvPython({
|
|
287
|
-
basePythonBin,
|
|
288
|
-
venvDir,
|
|
289
|
-
timeoutMs,
|
|
290
|
-
});
|
|
291
|
-
const venvAttempt = await installAllRunnersWithPython({
|
|
292
|
-
pythonBin: venvPythonBin,
|
|
293
|
-
runners,
|
|
294
|
-
upgrade,
|
|
295
|
-
timeoutMs,
|
|
296
|
-
});
|
|
297
|
-
if (!venvAttempt.success) {
|
|
298
|
-
throw new Error(formatRunnerInstallFailure(venvAttempt.failure));
|
|
299
|
-
}
|
|
300
|
-
return {
|
|
301
|
-
pythonBin: venvPythonBin,
|
|
302
|
-
runners,
|
|
303
|
-
items: venvAttempt.items,
|
|
304
|
-
usedVirtualEnv: true,
|
|
305
|
-
venvDir,
|
|
306
|
-
basePythonBin,
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=DependencyInstaller.js.map
|