@dofe/infra-clients 0.1.17 → 0.1.19

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.
Files changed (95) hide show
  1. package/dist/index.d.ts +4 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/internal/email/sendcloud.client.js.map +1 -1
  6. package/dist/internal/file-storage/dto/file.dto.d.ts +0 -1
  7. package/dist/internal/file-storage/dto/file.dto.d.ts.map +1 -1
  8. package/dist/internal/file-storage/file-s3.client.d.ts.map +1 -1
  9. package/dist/internal/file-storage/file-s3.client.js +1 -1
  10. package/dist/internal/file-storage/file-s3.client.js.map +1 -1
  11. package/dist/internal/file-storage/file-tos.client.d.ts.map +1 -1
  12. package/dist/internal/file-storage/file-tos.client.js.map +1 -1
  13. package/dist/internal/sms/sms-aliyun.client.d.ts +2 -1
  14. package/dist/internal/sms/sms-aliyun.client.d.ts.map +1 -1
  15. package/dist/internal/sms/sms-aliyun.client.js.map +1 -1
  16. package/dist/internal/sms/sms-http.client.js.map +1 -1
  17. package/dist/internal/sms/sms-tencent.client.d.ts +1 -1
  18. package/dist/internal/sms/sms-tencent.client.js.map +1 -1
  19. package/dist/internal/sms/sms-volcengine.client.d.ts +2 -2
  20. package/dist/internal/sms/sms-volcengine.client.d.ts.map +1 -1
  21. package/dist/internal/sms/sms-volcengine.client.js +2 -0
  22. package/dist/internal/sms/sms-volcengine.client.js.map +1 -1
  23. package/package.json +21 -7
  24. package/dist/internal/file-cdn/dto/file-cdn.dto.d.ts +0 -78
  25. package/dist/internal/file-cdn/dto/file-cdn.dto.d.ts.map +0 -1
  26. package/dist/internal/file-cdn/dto/file-cdn.dto.js +0 -70
  27. package/dist/internal/file-cdn/dto/file-cdn.dto.js.map +0 -1
  28. package/dist/internal/file-cdn/file-cdn.client.d.ts +0 -283
  29. package/dist/internal/file-cdn/file-cdn.client.d.ts.map +0 -1
  30. package/dist/internal/file-cdn/file-cdn.client.js +0 -526
  31. package/dist/internal/file-cdn/file-cdn.client.js.map +0 -1
  32. package/dist/internal/file-cdn/file-cdn.module.d.ts +0 -3
  33. package/dist/internal/file-cdn/file-cdn.module.d.ts.map +0 -1
  34. package/dist/internal/file-cdn/file-cdn.module.js +0 -32
  35. package/dist/internal/file-cdn/file-cdn.module.js.map +0 -1
  36. package/dist/internal/file-cdn/index.d.ts +0 -35
  37. package/dist/internal/file-cdn/index.d.ts.map +0 -1
  38. package/dist/internal/file-cdn/index.js +0 -54
  39. package/dist/internal/file-cdn/index.js.map +0 -1
  40. package/dist/internal/openspeech/index.d.ts +0 -35
  41. package/dist/internal/openspeech/index.d.ts.map +0 -1
  42. package/dist/internal/openspeech/index.js +0 -56
  43. package/dist/internal/openspeech/index.js.map +0 -1
  44. package/dist/internal/openspeech/openspeech.client.d.ts +0 -304
  45. package/dist/internal/openspeech/openspeech.client.d.ts.map +0 -1
  46. package/dist/internal/openspeech/openspeech.client.js +0 -405
  47. package/dist/internal/openspeech/openspeech.client.js.map +0 -1
  48. package/dist/internal/openspeech/openspeech.factory.d.ts +0 -247
  49. package/dist/internal/openspeech/openspeech.factory.d.ts.map +0 -1
  50. package/dist/internal/openspeech/openspeech.factory.js +0 -406
  51. package/dist/internal/openspeech/openspeech.factory.js.map +0 -1
  52. package/dist/internal/openspeech/openspeech.module.d.ts +0 -45
  53. package/dist/internal/openspeech/openspeech.module.d.ts.map +0 -1
  54. package/dist/internal/openspeech/openspeech.module.js +0 -68
  55. package/dist/internal/openspeech/openspeech.module.js.map +0 -1
  56. package/dist/internal/openspeech/providers/aliyun.provider.d.ts +0 -125
  57. package/dist/internal/openspeech/providers/aliyun.provider.d.ts.map +0 -1
  58. package/dist/internal/openspeech/providers/aliyun.provider.js +0 -274
  59. package/dist/internal/openspeech/providers/aliyun.provider.js.map +0 -1
  60. package/dist/internal/openspeech/providers/base.provider.d.ts +0 -98
  61. package/dist/internal/openspeech/providers/base.provider.d.ts.map +0 -1
  62. package/dist/internal/openspeech/providers/base.provider.js +0 -87
  63. package/dist/internal/openspeech/providers/base.provider.js.map +0 -1
  64. package/dist/internal/openspeech/providers/index.d.ts +0 -10
  65. package/dist/internal/openspeech/providers/index.d.ts.map +0 -1
  66. package/dist/internal/openspeech/providers/index.js +0 -26
  67. package/dist/internal/openspeech/providers/index.js.map +0 -1
  68. package/dist/internal/openspeech/providers/volcengine-streaming.provider.d.ts +0 -291
  69. package/dist/internal/openspeech/providers/volcengine-streaming.provider.d.ts.map +0 -1
  70. package/dist/internal/openspeech/providers/volcengine-streaming.provider.js +0 -1358
  71. package/dist/internal/openspeech/providers/volcengine-streaming.provider.js.map +0 -1
  72. package/dist/internal/openspeech/providers/volcengine.provider.d.ts +0 -144
  73. package/dist/internal/openspeech/providers/volcengine.provider.d.ts.map +0 -1
  74. package/dist/internal/openspeech/providers/volcengine.provider.js +0 -337
  75. package/dist/internal/openspeech/providers/volcengine.provider.js.map +0 -1
  76. package/dist/internal/openspeech/types.d.ts +0 -408
  77. package/dist/internal/openspeech/types.d.ts.map +0 -1
  78. package/dist/internal/openspeech/types.js +0 -11
  79. package/dist/internal/openspeech/types.js.map +0 -1
  80. package/dist/internal/volcengine-tts/dto/tts.dto.d.ts +0 -52
  81. package/dist/internal/volcengine-tts/dto/tts.dto.d.ts.map +0 -1
  82. package/dist/internal/volcengine-tts/dto/tts.dto.js +0 -59
  83. package/dist/internal/volcengine-tts/dto/tts.dto.js.map +0 -1
  84. package/dist/internal/volcengine-tts/index.d.ts +0 -4
  85. package/dist/internal/volcengine-tts/index.d.ts.map +0 -1
  86. package/dist/internal/volcengine-tts/index.js +0 -20
  87. package/dist/internal/volcengine-tts/index.js.map +0 -1
  88. package/dist/internal/volcengine-tts/volcengine-tts.client.d.ts +0 -104
  89. package/dist/internal/volcengine-tts/volcengine-tts.client.d.ts.map +0 -1
  90. package/dist/internal/volcengine-tts/volcengine-tts.client.js +0 -690
  91. package/dist/internal/volcengine-tts/volcengine-tts.client.js.map +0 -1
  92. package/dist/internal/volcengine-tts/volcengine-tts.module.d.ts +0 -3
  93. package/dist/internal/volcengine-tts/volcengine-tts.module.d.ts.map +0 -1
  94. package/dist/internal/volcengine-tts/volcengine-tts.module.js +0 -34
  95. package/dist/internal/volcengine-tts/volcengine-tts.module.js.map +0 -1
@@ -1,405 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview OpenSpeech 语音识别服务客户端
4
- *
5
- * 本文件是语音识别服务的统一入口(Facade 模式),提供了简洁的 API 接口,
6
- * 内部通过工厂模式委托给具体的云服务商实现。
7
- *
8
- * 架构说明:
9
- * ```
10
- * ┌─────────────────────────────────────────────────────────────┐
11
- * │ OpenspeechClient │
12
- * │ (Facade 门面) │
13
- * └─────────────────────────────┬───────────────────────────────┘
14
- * │
15
- * ▼
16
- * ┌─────────────────────────────────────────────────────────────┐
17
- * │ OpenspeechProviderFactory │
18
- * │ (工厂模式) │
19
- * └──────────────┬──────────────────────────────┬───────────────┘
20
- * │ │
21
- * ▼ ▼
22
- * ┌──────────────────────────┐ ┌──────────────────────────────┐
23
- * │ AliyunOpenspeechProvider │ │ VolcengineOpenspeechProvider │
24
- * │ (阿里云实现) │ │ (火山引擎实现) │
25
- * └──────────────────────────┘ └──────────────────────────────┘
26
- * ```
27
- *
28
- * @module openspeech/client
29
- */
30
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
31
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
32
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
33
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
34
- return c > 3 && r && Object.defineProperty(target, key, r), r;
35
- };
36
- var __metadata = (this && this.__metadata) || function (k, v) {
37
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
38
- };
39
- var __param = (this && this.__param) || function (paramIndex, decorator) {
40
- return function (target, key) { decorator(target, key, paramIndex); }
41
- };
42
- Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.OpenspeechClient = void 0;
44
- const common_1 = require("@nestjs/common");
45
- const nest_winston_1 = require("nest-winston");
46
- const winston_1 = require("winston");
47
- const infra_shared_services_1 = require("@dofe/infra-shared-services");
48
- const infra_utils_1 = require("@dofe/infra-utils");
49
- const openspeech_factory_1 = require("./openspeech.factory");
50
- /**
51
- * OpenSpeech 语音识别服务客户端
52
- *
53
- * @description 作为语音识别服务的统一门面,提供以下核心功能:
54
- *
55
- * 1. **任务提交** - `submitTranscribeTask`
56
- * 根据 FileKey 自动选择云服务商,提交语音识别任务
57
- *
58
- * 2. **状态查询** - `queryTranscribeTaskStatus`
59
- * 查询指定任务的处理状态和结果
60
- *
61
- * 3. **同步识别** - `transcribeFromFileKey`
62
- * 提交任务并轮询等待结果(阻塞式,向后兼容)
63
- *
64
- * 云服务商选择逻辑:
65
- * - 优先使用 `preferVendor` 参数指定的云服务商
66
- * - 默认根据 FileKey 的 vendor 字段选择
67
- * - oss -> 阿里云, tos -> 火山引擎
68
- *
69
- * @class OpenspeechClient
70
- *
71
- * @example
72
- * ```typescript
73
- * // 注入客户端
74
- * @Injectable()
75
- * class VideoService {
76
- * constructor(private readonly openspeech: OpenspeechClient) {}
77
- *
78
- * // 异步任务模式(推荐)
79
- * async startTranscription(fileKey: FileKey) {
80
- * const { vendor, vendorTaskId } = await this.openspeech.submitTranscribeTask(fileKey);
81
- * // 保存 vendorTaskId,通过回调或轮询获取结果
82
- * return { vendor, vendorTaskId };
83
- * }
84
- *
85
- * // 查询任务状态
86
- * async checkStatus(vendor: FileBucketVendor, taskId: string) {
87
- * return await this.openspeech.queryTranscribeTaskStatus(vendor, taskId);
88
- * }
89
- *
90
- * // 同步模式(阻塞等待,适用于简单场景)
91
- * async transcribeSync(fileKey: FileKey) {
92
- * return await this.openspeech.transcribeFromFileKey(fileKey);
93
- * }
94
- * }
95
- * ```
96
- */
97
- let OpenspeechClient = class OpenspeechClient {
98
- fileApi;
99
- providerFactory;
100
- logger;
101
- /**
102
- * 构造函数
103
- *
104
- * @param {FileStorageService} fileApi - 文件存储服务
105
- * @param {OpenspeechProviderFactory} providerFactory - 提供商工厂
106
- * @param {Logger} logger - Winston 日志记录器
107
- */
108
- constructor(fileApi, providerFactory, logger) {
109
- this.fileApi = fileApi;
110
- this.providerFactory = providerFactory;
111
- this.logger = logger;
112
- }
113
- /**
114
- * 根据 FileKey 提交语音识别任务
115
- *
116
- * @description 根据文件信息自动选择云服务商并提交识别任务。
117
- *
118
- * 处理流程:
119
- * 1. 验证 FileKey 的必要字段
120
- * 2. 根据视频 key 推导音频 key
121
- * 3. 获取存储桶配置,拼接音频 HTTP URL
122
- * 4. 选择云服务商(优先级:preferVendor > vendor)
123
- * 5. 调用对应提供商提交任务
124
- *
125
- * @param {Partial<FileKey>} fileKey - 文件信息
126
- * @param {FileBucketVendor} [fileKey.vendor] - 存储服务商(必填)
127
- * @param {string} [fileKey.bucket] - 存储桶名称(必填)
128
- * @param {string} [fileKey.key] - 文件路径(必填)
129
- * @param {FileBucketVendor} [(fileKey as any).preferVendor] - 优先使用的云服务商
130
- * @returns {Promise<SubmitTaskResult>} 任务提交结果
131
- * @throws {Error} FileKey 无效或提交失败时抛出异常
132
- *
133
- * @example
134
- * ```typescript
135
- * // 基本用法
136
- * const result = await client.submitTranscribeTask({
137
- * vendor: 'oss',
138
- * bucket: 'my-bucket',
139
- * key: 'videos/example.mp4',
140
- * });
141
- * console.log('Task ID:', result.vendorTaskId);
142
- *
143
- * // 指定使用火山引擎
144
- * const result = await client.submitTranscribeTask({
145
- * vendor: 'oss',
146
- * bucket: 'my-bucket',
147
- * key: 'videos/example.mp4',
148
- * preferVendor: 'tos',
149
- * } as any);
150
- * ```
151
- */
152
- async submitTranscribeTask(fileKey) {
153
- // 参数验证
154
- if (!fileKey?.vendor || !fileKey?.bucket || !fileKey?.key) {
155
- throw new Error('Invalid FileKey for openspeech transcription');
156
- }
157
- // 根据视频 key 推导音频 key(与转码保持一致)
158
- const audioKey = infra_utils_1.fileUtil.buildAudioKeyFromVideoKey(fileKey.key, 'mp3');
159
- const audioUrl = await this.fileApi.getPrivateDownloadUrl(fileKey.vendor, fileKey.bucket, audioKey);
160
- this.logger.info('Openspeech transcription submit requested', {
161
- vendor: fileKey.vendor,
162
- bucket: fileKey.bucket,
163
- audioKey,
164
- audioUrl,
165
- });
166
- // 选择云服务商:优先使用 preferVendor,否则根据 fileKey.vendor 选择
167
- const preferVendor = fileKey.preferVendor;
168
- const useVendor = preferVendor ?? fileKey.vendor;
169
- // 获取对应的提供商并提交任务
170
- const provider = this.providerFactory.getProvider(useVendor);
171
- const vendorTaskId = await provider.submitTask({ audioUrl });
172
- return {
173
- vendor: useVendor,
174
- vendorTaskId,
175
- audioUrl,
176
- };
177
- }
178
- /**
179
- * 查询语音识别任务状态
180
- *
181
- * @description 根据云服务商和任务 ID 查询识别任务的状态和结果。
182
- *
183
- * 返回状态说明:
184
- * - `processing`: 任务正在处理中,需要继续轮询
185
- * - `success`: 识别成功,text 字段包含识别结果
186
- * - `error`: 识别失败,error 字段包含错误信息
187
- *
188
- * @param {FileBucketVendor} vendor - 云服务商类型
189
- * @param {string} vendorTaskId - 云服务商返回的任务 ID
190
- * @returns {Promise<TaskStatusResult>} 任务状态和结果
191
- * @throws {Error} 不支持的 vendor 类型时抛出异常
192
- *
193
- * @example
194
- * ```typescript
195
- * const result = await client.queryTranscribeTaskStatus('oss', 'task-123');
196
- *
197
- * if (result.status === 'success') {
198
- * console.log('识别文本:', result.text);
199
- * } else if (result.status === 'processing') {
200
- * // 稍后重试
201
- * setTimeout(() => this.checkStatus(), 3000);
202
- * } else {
203
- * console.error('识别失败:', result.error);
204
- * }
205
- * ```
206
- */
207
- async queryTranscribeTaskStatus(vendor, vendorTaskId) {
208
- const provider = this.providerFactory.getProvider(vendor);
209
- return provider.queryTaskStatus(vendorTaskId);
210
- }
211
- /**
212
- * 根据 FileKey 进行语音识别(同步阻塞模式)
213
- *
214
- * @description 提交任务并轮询等待结果,直到识别完成或失败。
215
- * 此方法会阻塞直到获得最终结果,适用于简单场景。
216
- *
217
- * **注意**:对于生产环境,建议使用异步模式:
218
- * 1. 调用 `submitTranscribeTask` 提交任务
219
- * 2. 配置回调 URL 接收结果,或定时调用 `queryTranscribeTaskStatus` 查询
220
- *
221
- * @deprecated 建议使用异步模式(submitTranscribeTask + queryTranscribeTaskStatus)
222
- * @param {Partial<FileKey>} fileKey - 文件信息
223
- * @returns {Promise<string>} 识别出的文本内容
224
- * @throws {Error} 识别失败时抛出异常
225
- *
226
- * @example
227
- * ```typescript
228
- * try {
229
- * const text = await client.transcribeFromFileKey({
230
- * vendor: 'oss',
231
- * bucket: 'my-bucket',
232
- * key: 'videos/example.mp4',
233
- * });
234
- * console.log('识别结果:', text);
235
- * } catch (error) {
236
- * console.error('识别失败:', error.message);
237
- * }
238
- * ```
239
- */
240
- async transcribeFromFileKey(fileKey) {
241
- // 提交任务
242
- const { vendor, vendorTaskId } = await this.submitTranscribeTask(fileKey);
243
- // 轮询等待结果
244
- for (;;) {
245
- await new Promise((resolve) => setTimeout(resolve, 3000));
246
- const result = await this.queryTranscribeTaskStatus(vendor, vendorTaskId);
247
- if (result.status === 'success') {
248
- return result.text || '';
249
- }
250
- if (result.status === 'error') {
251
- throw new Error(result.error || 'Transcription failed');
252
- }
253
- // processing 状态继续轮询
254
- }
255
- }
256
- // =========================================================================
257
- // 流式语音识别方法
258
- // =========================================================================
259
- /**
260
- * 建立流式语音识别连接
261
- *
262
- * @description 建立 WebSocket 连接用于实时语音识别。
263
- * 目前仅支持火山引擎 (tos) 流式识别。
264
- *
265
- * @param {FileBucketVendor} vendor - 云服务商类型(目前仅支持 'tos')
266
- * @param {StreamingConnectParams} params - 连接参数
267
- * @param {StreamingAsrCallbacks} callbacks - 事件回调
268
- * @returns {Promise<string>} 连接 ID
269
- * @throws {Error} 不支持的 vendor 类型或连接失败时抛出异常
270
- *
271
- * @example
272
- * ```typescript
273
- * const connectionId = await client.connectStreaming(
274
- * 'tos',
275
- * { sessionId: 'session-123', audioFormat: 'pcm' },
276
- * {
277
- * onResult: (result) => console.log('识别结果:', result.text),
278
- * onConnected: () => console.log('已连接'),
279
- * onError: (error) => console.error('错误:', error),
280
- * }
281
- * );
282
- * ```
283
- */
284
- async connectStreaming(vendor, params, callbacks) {
285
- this.logger.info('Openspeech streaming connection requested', {
286
- vendor,
287
- sessionId: params.sessionId,
288
- audioFormat: params.audioFormat,
289
- });
290
- const provider = this.providerFactory.getStreamingProvider(vendor);
291
- return provider.connect(params, callbacks);
292
- }
293
- /**
294
- * 发送音频数据到流式识别连接
295
- *
296
- * @description 将音频数据发送到已建立的流式识别连接。
297
- *
298
- * @param {FileBucketVendor} vendor - 云服务商类型
299
- * @param {string} connectionId - 连接 ID
300
- * @param {Buffer} audioData - 音频数据
301
- * @param {boolean} [isLast=false] - 是否为最后一帧
302
- * @throws {Error} 连接不存在或发送失败时抛出异常
303
- *
304
- * @example
305
- * ```typescript
306
- * // 发送音频数据
307
- * await client.sendStreamingAudio('tos', connectionId, audioBuffer);
308
- *
309
- * // 发送最后一帧
310
- * await client.sendStreamingAudio('tos', connectionId, lastBuffer, true);
311
- * ```
312
- */
313
- async sendStreamingAudio(vendor, connectionId, audioData, isLast = false) {
314
- const provider = this.providerFactory.getStreamingProvider(vendor);
315
- return provider.sendAudio(connectionId, audioData, isLast);
316
- }
317
- /**
318
- * 关闭流式识别连接
319
- *
320
- * @param {FileBucketVendor} vendor - 云服务商类型
321
- * @param {string} connectionId - 连接 ID
322
- *
323
- * @example
324
- * ```typescript
325
- * await client.disconnectStreaming('tos', connectionId);
326
- * ```
327
- */
328
- async disconnectStreaming(vendor, connectionId) {
329
- this.logger.info('Openspeech streaming disconnection requested', {
330
- vendor,
331
- connectionId,
332
- });
333
- const provider = this.providerFactory.getStreamingProvider(vendor);
334
- return provider.disconnect(connectionId);
335
- }
336
- /**
337
- * 获取流式识别连接状态
338
- *
339
- * @param {FileBucketVendor} vendor - 云服务商类型
340
- * @param {string} connectionId - 连接 ID
341
- * @returns {StreamingAsrStatus} 连接状态
342
- *
343
- * @example
344
- * ```typescript
345
- * const status = client.getStreamingStatus('tos', connectionId);
346
- * if (status === 'streaming') {
347
- * // 正在识别中
348
- * }
349
- * ```
350
- */
351
- getStreamingStatus(vendor, connectionId) {
352
- const provider = this.providerFactory.getStreamingProvider(vendor);
353
- return provider.getConnectionStatus(connectionId);
354
- }
355
- /**
356
- * 获取流式识别提供商实例
357
- *
358
- * @description 直接获取流式识别提供商,用于高级操作。
359
- *
360
- * @param {FileBucketVendor} vendor - 云服务商类型
361
- * @returns {IStreamingAsrProvider} 流式识别提供商实例
362
- *
363
- * @example
364
- * ```typescript
365
- * const provider = client.getStreamingProvider('tos');
366
- * const transcript = provider.getTranscript(connectionId);
367
- * ```
368
- */
369
- getStreamingProvider(vendor) {
370
- return this.providerFactory.getStreamingProvider(vendor);
371
- }
372
- /**
373
- * 检查指定云服务商是否支持流式识别
374
- *
375
- * @param {FileBucketVendor} vendor - 云服务商类型
376
- * @returns {boolean} 是否支持流式识别
377
- *
378
- * @example
379
- * ```typescript
380
- * if (client.isStreamingAvailable('tos')) {
381
- * // 使用流式识别
382
- * }
383
- * ```
384
- */
385
- isStreamingAvailable(vendor) {
386
- return this.providerFactory.isStreamingAvailable(vendor);
387
- }
388
- /**
389
- * 获取所有支持流式识别的云服务商列表
390
- *
391
- * @returns {FileBucketVendor[]} 支持流式识别的云服务商列表
392
- */
393
- getStreamingAvailableVendors() {
394
- return this.providerFactory.getStreamingAvailableVendors();
395
- }
396
- };
397
- exports.OpenspeechClient = OpenspeechClient;
398
- exports.OpenspeechClient = OpenspeechClient = __decorate([
399
- (0, common_1.Injectable)(),
400
- __param(2, (0, common_1.Inject)(nest_winston_1.WINSTON_MODULE_PROVIDER)),
401
- __metadata("design:paramtypes", [infra_shared_services_1.FileStorageService,
402
- openspeech_factory_1.OpenspeechProviderFactory,
403
- winston_1.Logger])
404
- ], OpenspeechClient);
405
- //# sourceMappingURL=openspeech.client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openspeech.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openspeech/openspeech.client.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;;;;;;;;;;;;;AAEH,2CAAoD;AACpD,+CAAuD;AACvD,qCAAiC;AAGjC,uEAAiE;AACjE,mDAA6C;AAC7C,6DAAiE;AAUjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IASR;IACA;IACiC;IAVpD;;;;;;OAMG;IACH,YACmB,OAA2B,EAC3B,eAA0C,EACT,MAAc;QAF/C,YAAO,GAAP,OAAO,CAAoB;QAC3B,oBAAe,GAAf,eAAe,CAA2B;QACT,WAAM,GAAN,MAAM,CAAQ;IAC/D,CAAC;IAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,KAAK,CAAC,oBAAoB,CACxB,OAA4B;QAE5B,OAAO;QACP,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,sBAAQ,CAAC,yBAAyB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACvD,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,EACd,QAAQ,CACT,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;YAC5D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ;YACR,QAAQ;SACT,CAAC,CAAC;QAEH,kDAAkD;QAClD,MAAM,YAAY,GAAI,OAAe,CAAC,YAEzB,CAAC;QACd,MAAM,SAAS,GAAG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;QAEjD,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7D,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,YAAY;YACZ,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,yBAAyB,CAC7B,MAAwB,EACxB,YAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,qBAAqB,CAAC,OAA4B;QACtD,OAAO;QACP,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE1E,SAAS;QACT,SAAS,CAAC;YACR,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE1E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;YAC1D,CAAC;YAED,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,WAAW;IACX,4EAA4E;IAE5E;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,gBAAgB,CACpB,MAAwB,EACxB,MAA8B,EAC9B,SAAgC;QAEhC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;YAC5D,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,kBAAkB,CACtB,MAAwB,EACxB,YAAoB,EACpB,SAAiB,EACjB,SAAkB,KAAK;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,mBAAmB,CACvB,MAAwB,EACxB,YAAoB;QAEpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE;YAC/D,MAAM;YACN,YAAY;SACb,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,kBAAkB,CAChB,MAAwB,EACxB,YAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,MAAwB;QAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,MAAwB;QAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,4BAA4B;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC,4BAA4B,EAAE,CAAC;IAC7D,CAAC;CACF,CAAA;AA1VY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAYR,WAAA,IAAA,eAAM,EAAC,sCAAuB,CAAC,CAAA;qCAFN,0CAAkB;QACV,8CAAyB;QACD,gBAAM;GAXvD,gBAAgB,CA0V5B"}
@@ -1,247 +0,0 @@
1
- /**
2
- * @fileoverview OpenSpeech 服务提供商工厂
3
- *
4
- * 本文件实现了语音识别服务提供商的工厂模式,负责:
5
- * - 根据云服务商类型创建对应的提供商实例
6
- * - 管理提供商实例的生命周期(单例模式)
7
- * - 提供统一的提供商获取接口
8
- * - 支持录音文件识别(AUC)和流式识别(SAUC)两种模式
9
- *
10
- * @module openspeech/factory
11
- */
12
- import { HttpService } from '@nestjs/axios';
13
- import { Logger } from 'winston';
14
- import { FileBucketVendor } from '@prisma/client';
15
- import { IOpenspeechProvider, IStreamingAsrProvider } from './types';
16
- /**
17
- * OpenSpeech 服务提供商工厂
18
- *
19
- * @description 使用工厂模式管理不同云服务商的语音识别服务提供商。
20
- * 主要职责:
21
- * - 根据 vendor 类型创建对应的提供商实例
22
- * - 使用单例模式缓存提供商实例,避免重复创建
23
- * - 提供统一的提供商获取接口
24
- * - 支持录音文件识别和流式识别两种模式
25
- *
26
- * 支持的云服务商:
27
- * - 'oss': 阿里云 NLS 语音识别
28
- * - 'tos': 火山引擎大模型语音识别(支持 AUC 录音识别和 SAUC 流式识别)
29
- *
30
- * @class OpenspeechProviderFactory
31
- *
32
- * @example
33
- * ```typescript
34
- * @Injectable()
35
- * class MyService {
36
- * constructor(private readonly factory: OpenspeechProviderFactory) {}
37
- *
38
- * // 录音文件识别
39
- * async transcribe(vendor: FileBucketVendor, audioUrl: string) {
40
- * const provider = this.factory.getProvider(vendor);
41
- * const taskId = await provider.submitTask({ audioUrl });
42
- * // ...
43
- * }
44
- *
45
- * // 流式语音识别
46
- * async streamingTranscribe(sessionId: string) {
47
- * const provider = this.factory.getStreamingProvider('tos');
48
- * const connectionId = await provider.connect(
49
- * { sessionId, audioFormat: 'pcm' },
50
- * { onResult: (result) => console.log(result.text) }
51
- * );
52
- * // ...
53
- * }
54
- * }
55
- * ```
56
- */
57
- export declare class OpenspeechProviderFactory {
58
- private readonly httpService;
59
- private readonly logger;
60
- /**
61
- * 录音文件识别提供商实例缓存
62
- * @private
63
- */
64
- private readonly providers;
65
- /**
66
- * 流式识别提供商实例缓存
67
- * @private
68
- */
69
- private readonly streamingProviders;
70
- /**
71
- * OpenSpeech 配置
72
- * @private
73
- */
74
- private readonly openspeechConfig;
75
- /**
76
- * 构造函数
77
- *
78
- * @param {HttpService} httpService - NestJS HTTP 服务(用于火山引擎)
79
- * @param {Logger} logger - Winston 日志记录器
80
- */
81
- constructor(httpService: HttpService, logger: Logger);
82
- /**
83
- * 获取指定云服务商的录音文件识别提供商实例
84
- *
85
- * @description 根据 vendor 类型返回对应的提供商实例。
86
- * 使用单例模式,同一 vendor 只会创建一个实例。
87
- *
88
- * @param {FileBucketVendor} vendor - 云服务商类型
89
- * @returns {IOpenspeechProvider} 提供商实例
90
- * @throws {Error} 不支持的 vendor 类型或配置缺失时抛出异常
91
- *
92
- * @example
93
- * ```typescript
94
- * // 获取阿里云提供商
95
- * const aliyunProvider = factory.getProvider('oss');
96
- *
97
- * // 获取火山引擎提供商
98
- * const volcengineProvider = factory.getProvider('tos');
99
- * ```
100
- */
101
- getProvider(vendor: FileBucketVendor): IOpenspeechProvider;
102
- /**
103
- * 获取指定云服务商的流式识别提供商实例
104
- *
105
- * @description 根据 vendor 类型返回对应的流式识别提供商实例。
106
- * 目前仅支持火山引擎 (tos)。
107
- *
108
- * @param {FileBucketVendor} vendor - 云服务商类型(目前仅支持 'tos')
109
- * @returns {IStreamingAsrProvider} 流式识别提供商实例
110
- * @throws {Error} 不支持的 vendor 类型或配置缺失时抛出异常
111
- *
112
- * @example
113
- * ```typescript
114
- * const streamingProvider = factory.getStreamingProvider('tos');
115
- * const connectionId = await streamingProvider.connect(
116
- * { sessionId: 'session-123', audioFormat: 'pcm' },
117
- * { onResult: (result) => console.log(result.text) }
118
- * );
119
- * ```
120
- */
121
- getStreamingProvider(vendor: FileBucketVendor): IStreamingAsrProvider;
122
- /**
123
- * 创建录音文件识别提供商实例
124
- *
125
- * @private
126
- * @param {FileBucketVendor} vendor - 云服务商类型
127
- * @returns {IOpenspeechProvider} 新创建的提供商实例
128
- * @throws {Error} 不支持的 vendor 类型或配置缺失时抛出异常
129
- */
130
- private createProvider;
131
- /**
132
- * 创建流式识别提供商实例
133
- *
134
- * @private
135
- * @param {FileBucketVendor} vendor - 云服务商类型
136
- * @returns {IStreamingAsrProvider} 新创建的流式识别提供商实例
137
- * @throws {Error} 不支持的 vendor 类型或配置缺失时抛出异常
138
- */
139
- private createStreamingProvider;
140
- /**
141
- * 将阿里云配置转换为 Provider 配置
142
- *
143
- * @private
144
- * @param {NonNullable<OpenSpeechConfig['oss']>} config - 阿里云原始配置
145
- * @returns {AliyunOpenspeechConfig} 阿里云 Provider 配置
146
- */
147
- private toAliyunConfig;
148
- /**
149
- * 将火山引擎配置转换为录音文件识别(AUC)Provider 配置
150
- *
151
- * @private
152
- * @param {NonNullable<OpenSpeechConfig['tos']>} config - 火山引擎原始配置
153
- * @returns {VolcengineAucConfig} 火山引擎 AUC Provider 配置
154
- * @throws {Error} AUC 配置缺失时抛出异常
155
- */
156
- private toVolcengineAucConfig;
157
- /**
158
- * 将火山引擎配置转换为流式识别(SAUC)Provider 配置
159
- *
160
- * @private
161
- * @param {NonNullable<OpenSpeechConfig['tos']>} config - 火山引擎原始配置
162
- * @returns {VolcengineSaucConfig} 火山引擎 SAUC Provider 配置
163
- * @throws {Error} SAUC 配置缺失时抛出异常
164
- */
165
- private toVolcengineSaucConfig;
166
- /**
167
- * 创建阿里云提供商实例
168
- *
169
- * @private
170
- * @returns {AliyunOpenspeechProvider} 阿里云提供商实例
171
- * @throws {Error} 配置缺失时抛出异常
172
- */
173
- private createAliyunProvider;
174
- /**
175
- * 创建火山引擎录音文件识别提供商实例
176
- *
177
- * @private
178
- * @returns {VolcengineOpenspeechProvider} 火山引擎 AUC 提供商实例
179
- * @throws {Error} 配置缺失时抛出异常
180
- */
181
- private createVolcengineAucProvider;
182
- /**
183
- * 创建火山引擎流式识别提供商实例
184
- *
185
- * @private
186
- * @returns {VolcengineStreamingAsrProvider} 火山引擎 SAUC 提供商实例
187
- * @throws {Error} 配置缺失时抛出异常
188
- */
189
- private createVolcengineSaucProvider;
190
- /**
191
- * 检查指定云服务商的录音文件识别是否可用
192
- *
193
- * @param {FileBucketVendor} vendor - 云服务商类型
194
- * @returns {boolean} 是否可用(配置存在)
195
- *
196
- * @example
197
- * ```typescript
198
- * if (factory.isVendorAvailable('oss')) {
199
- * const provider = factory.getProvider('oss');
200
- * // ...
201
- * }
202
- * ```
203
- */
204
- isVendorAvailable(vendor: FileBucketVendor): boolean;
205
- /**
206
- * 检查指定云服务商的流式识别是否可用
207
- *
208
- * @param {FileBucketVendor} vendor - 云服务商类型
209
- * @returns {boolean} 是否可用(配置存在)
210
- *
211
- * @example
212
- * ```typescript
213
- * if (factory.isStreamingAvailable('tos')) {
214
- * const provider = factory.getStreamingProvider('tos');
215
- * // ...
216
- * }
217
- * ```
218
- */
219
- isStreamingAvailable(vendor: FileBucketVendor): boolean;
220
- /**
221
- * 获取所有可用的云服务商列表(录音文件识别)
222
- *
223
- * @returns {FileBucketVendor[]} 可用的云服务商列表
224
- *
225
- * @example
226
- * ```typescript
227
- * const vendors = factory.getAvailableVendors();
228
- * console.log('Available vendors:', vendors);
229
- * // 输出: ['oss', 'tos']
230
- * ```
231
- */
232
- getAvailableVendors(): FileBucketVendor[];
233
- /**
234
- * 获取所有支持流式识别的云服务商列表
235
- *
236
- * @returns {FileBucketVendor[]} 支持流式识别的云服务商列表
237
- *
238
- * @example
239
- * ```typescript
240
- * const vendors = factory.getStreamingAvailableVendors();
241
- * console.log('Streaming available vendors:', vendors);
242
- * // 输出: ['tos']
243
- * ```
244
- */
245
- getStreamingAvailableVendors(): FileBucketVendor[];
246
- }
247
- //# sourceMappingURL=openspeech.factory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openspeech.factory.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openspeech/openspeech.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EAItB,MAAM,SAAS,CAAC;AAKjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBACa,yBAAyB;IA8BlC,OAAO,CAAC,QAAQ,CAAC,WAAW;IACK,OAAO,CAAC,QAAQ,CAAC,MAAM;IA9B1D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CACd;IAEZ;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAGrB;IAEd;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD;;;;;OAKG;gBAEgB,WAAW,EAAE,WAAW,EACS,MAAM,EAAE,MAAM;IAKlE;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,mBAAmB;IAa1D;;;;;;;;;;;;;;;;;;OAkBG;IACH,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,qBAAqB;IAarE;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;;;;OAOG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;;;;;OAMG;IACH,OAAO,CAAC,2BAA2B;IAiBnC;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IAapC;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;IAWpD;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;IASvD;;;;;;;;;;;OAWG;IACH,mBAAmB,IAAI,gBAAgB,EAAE;IAazC;;;;;;;;;;;OAWG;IACH,4BAA4B,IAAI,gBAAgB,EAAE;CASnD"}