@aalis/plugin-asr-openai 0.4.0 → 0.5.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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -25
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ export declare const displayName = "OpenAI Whisper ASR";
|
|
|
4
4
|
export declare const subsystem = "media";
|
|
5
5
|
export declare const provides: string[];
|
|
6
6
|
export declare const inject: {
|
|
7
|
-
required: string[];
|
|
8
7
|
optional: string[];
|
|
9
8
|
};
|
|
9
|
+
export declare const reusable = true;
|
|
10
10
|
interface Cfg {
|
|
11
11
|
apiKey: string;
|
|
12
12
|
baseUrl: string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOzD,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,QAAQ,UAAU,CAAC;AAChC,eAAO,MAAM,MAAM;;CAAuC,CAAC;AAC3D,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,UAAU,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,YAK1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,GAK3B,CAAC;AA4CF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAyCtE"}
|
package/dist/index.js
CHANGED
|
@@ -6,11 +6,14 @@
|
|
|
6
6
|
// ============================================================
|
|
7
7
|
import { Buffer } from 'node:buffer';
|
|
8
8
|
import { createProcessGateway } from '@aalis/plugin-process-api';
|
|
9
|
+
import { createStorageGateway, isStorageUri } from '@aalis/plugin-storage-api';
|
|
10
|
+
import { safeFetch } from '@aalis/util-network-guard';
|
|
9
11
|
export const name = '@aalis/plugin-asr-openai';
|
|
10
12
|
export const displayName = 'OpenAI Whisper ASR';
|
|
11
13
|
export const subsystem = 'media';
|
|
12
|
-
export const provides = [];
|
|
13
|
-
export const inject = {
|
|
14
|
+
export const provides = ['asr'];
|
|
15
|
+
export const inject = { optional: ['process', 'storage'] };
|
|
16
|
+
export const reusable = true;
|
|
14
17
|
export const configSchema = {
|
|
15
18
|
apiKey: { type: 'string', label: 'API Key', secret: true, default: '' },
|
|
16
19
|
baseUrl: { type: 'string', label: 'Base URL', default: 'https://api.openai.com/v1' },
|
|
@@ -23,13 +26,12 @@ export const defaultConfig = {
|
|
|
23
26
|
model: 'whisper-1',
|
|
24
27
|
priority: 50,
|
|
25
28
|
};
|
|
26
|
-
async function attachmentToBlob(data, proc) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const buf = Buffer.from(m[2], 'base64');
|
|
29
|
+
async function attachmentToBlob(data, proc, storage) {
|
|
30
|
+
// base64 data URL(必须带 ;base64,,借此与 storage URI `data:/...` 区分)
|
|
31
|
+
const dataUri = data.match(/^data:([^;]+);base64,(.+)$/);
|
|
32
|
+
if (dataUri) {
|
|
33
|
+
const mime = dataUri[1];
|
|
34
|
+
const buf = Buffer.from(dataUri[2], 'base64');
|
|
33
35
|
const ext = mime.split('/')[1]?.split(';')[0] ?? 'bin';
|
|
34
36
|
return { blob: new Blob([buf], { type: mime }), filename: `audio.${ext}` };
|
|
35
37
|
}
|
|
@@ -41,7 +43,7 @@ async function attachmentToBlob(data, proc) {
|
|
|
41
43
|
return { blob: new Blob([bytes]), filename: `audio.${ext}` };
|
|
42
44
|
}
|
|
43
45
|
if (data.startsWith('http://') || data.startsWith('https://')) {
|
|
44
|
-
const resp = await
|
|
46
|
+
const resp = await safeFetch(data);
|
|
45
47
|
if (!resp.ok)
|
|
46
48
|
throw new Error(`下载失败 ${resp.status}`);
|
|
47
49
|
const ab = await resp.arrayBuffer();
|
|
@@ -51,22 +53,32 @@ async function attachmentToBlob(data, proc) {
|
|
|
51
53
|
filename: `audio.${ext}`,
|
|
52
54
|
};
|
|
53
55
|
}
|
|
56
|
+
// storage URI(scheme:/...)或历史裸相对路径(data/... → data:/...)→ 经 storage 读取
|
|
57
|
+
let storageUri = null;
|
|
58
|
+
if (isStorageUri(data))
|
|
59
|
+
storageUri = data;
|
|
60
|
+
else if (/^data\//.test(data))
|
|
61
|
+
storageUri = `data:/${data.slice('data/'.length)}`;
|
|
62
|
+
if (storageUri) {
|
|
63
|
+
const bytes = (await storage.readFile(storageUri));
|
|
64
|
+
const ext = storageUri.split('.').pop() ?? 'bin';
|
|
65
|
+
return { blob: new Blob([bytes]), filename: `audio.${ext}` };
|
|
66
|
+
}
|
|
54
67
|
throw new Error(`不支持的附件来源: ${data.slice(0, 32)}`);
|
|
55
68
|
}
|
|
56
69
|
export function apply(ctx, raw) {
|
|
57
70
|
const cfg = { ...defaultConfig, ...raw };
|
|
58
71
|
const logger = ctx.logger.child('asr-openai');
|
|
59
72
|
if (!cfg.apiKey) {
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
// 与 openai/embedding-openai 一致:缺必填配置时抛清晰错误(而非静默 return,
|
|
74
|
+
// 否则声明了 provides:['asr'] 却不注册会触发难懂的 provides 校验错)。
|
|
75
|
+
throw new Error('OpenAI Whisper ASR 需要配置 apiKey(不使用 OpenAI ASR 可在插件管理里禁用本插件)');
|
|
62
76
|
}
|
|
63
77
|
const proc = createProcessGateway(ctx);
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
capabilities: ['audio'],
|
|
67
|
-
priority: cfg.priority,
|
|
78
|
+
const storage = createStorageGateway(ctx);
|
|
79
|
+
const asr = {
|
|
68
80
|
async transcribe(input) {
|
|
69
|
-
const { blob, filename } = await attachmentToBlob(input.attachment.data, proc);
|
|
81
|
+
const { blob, filename } = await attachmentToBlob(input.attachment.data, proc, storage);
|
|
70
82
|
const fd = new FormData();
|
|
71
83
|
fd.append('file', blob, filename);
|
|
72
84
|
fd.append('model', cfg.model);
|
|
@@ -87,13 +99,7 @@ export function apply(ctx, raw) {
|
|
|
87
99
|
return { text: data.text ?? '', segments };
|
|
88
100
|
},
|
|
89
101
|
};
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
logger.error('media 服务不可用,跳过注册');
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const dispose = media.registerProcessor(processor);
|
|
96
|
-
ctx.onDispose(() => dispose());
|
|
97
|
-
logger.info(`OpenAI Whisper 转写已注册 (model=${cfg.model}, prio=${cfg.priority})`);
|
|
102
|
+
ctx.provide('asr', asr, { priority: cfg.priority });
|
|
103
|
+
logger.info(`OpenAI Whisper ASR 已注册 (model=${cfg.model}, prio=${cfg.priority})`);
|
|
98
104
|
}
|
|
99
105
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qDAAqD;AACrD,EAAE;AACF,gEAAgE;AAChE,kDAAkD;AAClD,+DAA+D;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aalis/plugin-asr-openai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "语音识别(ASR)—— OpenAI Whisper API 提供者",
|
|
6
6
|
"type": "module",
|
|
@@ -14,25 +14,25 @@
|
|
|
14
14
|
"dist"
|
|
15
15
|
],
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@aalis/plugin-process-api": "^0.
|
|
17
|
+
"@aalis/plugin-process-api": "^0.5.0",
|
|
18
|
+
"@aalis/plugin-storage-api": "^0.5.1",
|
|
19
|
+
"@aalis/util-network-guard": "^0.5.0"
|
|
18
20
|
},
|
|
19
21
|
"devDependencies": {
|
|
20
22
|
"@types/node": "^22.0.0",
|
|
21
23
|
"typescript": "^5.7.0",
|
|
22
|
-
"@aalis/
|
|
23
|
-
"@aalis/
|
|
24
|
-
"@aalis/plugin-
|
|
24
|
+
"@aalis/core": "0.5.0",
|
|
25
|
+
"@aalis/plugin-webui-api": "0.5.0",
|
|
26
|
+
"@aalis/plugin-asr-api": "0.5.0"
|
|
25
27
|
},
|
|
26
28
|
"peerDependencies": {
|
|
27
29
|
"@aalis/core": ">=0.2.0 <1.0.0"
|
|
28
30
|
},
|
|
29
31
|
"aalis": {
|
|
30
32
|
"service": {
|
|
31
|
-
"required": [
|
|
32
|
-
"media"
|
|
33
|
-
],
|
|
34
33
|
"optional": [
|
|
35
|
-
"process"
|
|
34
|
+
"process",
|
|
35
|
+
"storage"
|
|
36
36
|
]
|
|
37
37
|
}
|
|
38
38
|
},
|