@aalis/plugin-asr-openai 0.1.0

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.
@@ -0,0 +1,20 @@
1
+ import type { ConfigSchema, Context } from '@aalis/core';
2
+ export declare const name = "@aalis/plugin-asr-openai";
3
+ export declare const displayName = "OpenAI Whisper ASR";
4
+ export declare const subsystem = "media";
5
+ export declare const provides: string[];
6
+ export declare const inject: {
7
+ required: string[];
8
+ optional: string[];
9
+ };
10
+ interface Cfg {
11
+ apiKey: string;
12
+ baseUrl: string;
13
+ model: string;
14
+ priority: number;
15
+ }
16
+ export declare const configSchema: ConfigSchema;
17
+ export declare const defaultConfig: Cfg;
18
+ export declare function apply(ctx: Context, raw: Record<string, unknown>): void;
19
+ export {};
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAKzD,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,QAAQ,EAAE,MAAM,EAAO,CAAC;AACrC,eAAO,MAAM,MAAM;;;CAAiD,CAAC;AAErE,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;AA+BF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAgDtE"}
package/dist/index.js ADDED
@@ -0,0 +1,99 @@
1
+ // ============================================================
2
+ // @aalis/plugin-asr-openai — OpenAI Whisper API 转写后端
3
+ //
4
+ // 注册一个 audio MediaProcessor,调用 OpenAI 兼容 /audio/transcriptions。
5
+ // 兼容 OpenAI、Groq、本地 ollama-asr 网关等所有 OpenAI 风格协议。
6
+ // ============================================================
7
+ import { Buffer } from 'node:buffer';
8
+ import { createProcessGateway } from '@aalis/plugin-process-api';
9
+ export const name = '@aalis/plugin-asr-openai';
10
+ export const displayName = 'OpenAI Whisper ASR';
11
+ export const subsystem = 'media';
12
+ export const provides = [];
13
+ export const inject = { required: ['media'], optional: ['process'] };
14
+ export const configSchema = {
15
+ apiKey: { type: 'string', label: 'API Key', secret: true, default: '' },
16
+ baseUrl: { type: 'string', label: 'Base URL', default: 'https://api.openai.com/v1' },
17
+ model: { type: 'string', label: '模型', default: 'whisper-1' },
18
+ priority: { type: 'number', label: '优先级 (越大越优先)', default: 50 },
19
+ };
20
+ export const defaultConfig = {
21
+ apiKey: '',
22
+ baseUrl: 'https://api.openai.com/v1',
23
+ model: 'whisper-1',
24
+ priority: 50,
25
+ };
26
+ async function attachmentToBlob(data, proc) {
27
+ if (data.startsWith('data:')) {
28
+ const m = data.match(/^data:([^;]+);base64,(.+)$/);
29
+ if (!m)
30
+ throw new Error('无效 data URL');
31
+ const mime = m[1];
32
+ const buf = Buffer.from(m[2], 'base64');
33
+ const ext = mime.split('/')[1]?.split(';')[0] ?? 'bin';
34
+ return { blob: new Blob([buf], { type: mime }), filename: `audio.${ext}` };
35
+ }
36
+ if (data.startsWith('file://') || data.startsWith('/')) {
37
+ // 走 ProcessService.readExternalFile(治外文件能力),避免直 import node:fs
38
+ const bytes = await proc.readExternalFile(data);
39
+ const path = data.startsWith('file://') ? data.slice(7) : data;
40
+ const ext = path.split('.').pop() ?? 'bin';
41
+ return { blob: new Blob([bytes]), filename: `audio.${ext}` };
42
+ }
43
+ if (data.startsWith('http://') || data.startsWith('https://')) {
44
+ const resp = await fetch(data);
45
+ if (!resp.ok)
46
+ throw new Error(`下载失败 ${resp.status}`);
47
+ const ab = await resp.arrayBuffer();
48
+ const ext = data.split('.').pop()?.split('?')[0] ?? 'bin';
49
+ return {
50
+ blob: new Blob([ab], { type: resp.headers.get('content-type') ?? 'application/octet-stream' }),
51
+ filename: `audio.${ext}`,
52
+ };
53
+ }
54
+ throw new Error(`不支持的附件来源: ${data.slice(0, 32)}`);
55
+ }
56
+ export function apply(ctx, raw) {
57
+ const cfg = { ...defaultConfig, ...raw };
58
+ const logger = ctx.logger.child('asr-openai');
59
+ if (!cfg.apiKey) {
60
+ logger.warn('未配置 apiKey,插件不会注册 processor');
61
+ return;
62
+ }
63
+ const proc = createProcessGateway(ctx);
64
+ const processor = {
65
+ name: `asr-openai:${cfg.model}`,
66
+ capabilities: ['audio'],
67
+ priority: cfg.priority,
68
+ async transcribe(input) {
69
+ const { blob, filename } = await attachmentToBlob(input.attachment.data, proc);
70
+ const fd = new FormData();
71
+ fd.append('file', blob, filename);
72
+ fd.append('model', cfg.model);
73
+ if (input.language)
74
+ fd.append('language', input.language);
75
+ fd.append('response_format', input.withTimestamps ? 'verbose_json' : 'json');
76
+ const resp = await fetch(`${cfg.baseUrl.replace(/\/+$/, '')}/audio/transcriptions`, {
77
+ method: 'POST',
78
+ headers: { Authorization: `Bearer ${cfg.apiKey}` },
79
+ body: fd,
80
+ });
81
+ if (!resp.ok) {
82
+ const text = await resp.text().catch(() => '');
83
+ throw new Error(`Whisper API 失败 ${resp.status}: ${text}`);
84
+ }
85
+ const data = (await resp.json());
86
+ const segments = data.segments?.map(s => ({ start: s.start, end: s.end, text: s.text }));
87
+ return { text: data.text ?? '', segments };
88
+ },
89
+ };
90
+ const media = ctx.getService('media');
91
+ if (!media) {
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})`);
98
+ }
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@aalis/plugin-asr-openai",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "keywords": [
6
+ "aalis-plugin"
7
+ ],
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "@aalis/plugin-process-api": "^0.1.0"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.0.0",
18
+ "typescript": "^5.7.0",
19
+ "@aalis/core": "0.1.0",
20
+ "@aalis/plugin-media-api": "0.1.0",
21
+ "@aalis/plugin-webui-api": "0.1.0"
22
+ },
23
+ "peerDependencies": {
24
+ "@aalis/core": "^0.1.0"
25
+ },
26
+ "aalis": {
27
+ "service": {
28
+ "required": [
29
+ "media"
30
+ ],
31
+ "optional": [
32
+ "process"
33
+ ]
34
+ }
35
+ },
36
+ "scripts": {
37
+ "build": "tsc",
38
+ "dev": "tsc --watch"
39
+ }
40
+ }