@easyv/biz-components 0.0.48 → 0.0.49

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.
@@ -1,5 +1,5 @@
1
- var coWebWorker = { exports: {} };
1
+ var propTypes = { exports: {} };
2
2
  export {
3
- coWebWorker as __module
3
+ propTypes as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es2.js.map
@@ -1,5 +1,5 @@
1
- var propTypes = { exports: {} };
1
+ var classnames = { exports: {} };
2
2
  export {
3
- propTypes as __module
3
+ classnames as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es3.js.map
@@ -1,5 +1,5 @@
1
- var classnames = { exports: {} };
1
+ var coWebWorker = { exports: {} };
2
2
  export {
3
- classnames as __module
3
+ coWebWorker as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es4.js.map
package/dist/index.es.js CHANGED
@@ -14,7 +14,7 @@ import { EXPLICIT_DISCONNECT_REASON, MAX_TIMEOUT, MessageType, MpsErrorCode, ROO
14
14
  import { FunASRManager, getWebSocketConnectForFunASR } from "./utils/funASR/funASRManager.es.js";
15
15
  import { XFStreamVoiceManager } from "./utils/xunFeiVoice/XFStreamVoiceManager.es.js";
16
16
  import { RecorderManager } from "./utils/xunFeiVoice/RecorderManager/RecorderManager.es.js";
17
- import { AudioManager } from "./utils/voskBrowserManager/AudioManager/AudioManager.es.js";
17
+ import { AudioManager, defaultSampleRate } from "./utils/voskBrowserManager/AudioManager/AudioManager.es.js";
18
18
  import { VoskBrowserManager } from "./utils/voskBrowserManager/voskBrowserManager.es.js";
19
19
  export {
20
20
  AiAgentMessageType,
@@ -36,6 +36,7 @@ export {
36
36
  VoiceAnimation,
37
37
  VoskBrowserManager,
38
38
  XFStreamVoiceManager,
39
+ defaultSampleRate,
39
40
  generateAiChatMessageFromAiChatDetail,
40
41
  generateAiChatMessageFromSocketMessage,
41
42
  generateDefaultAiMsg,
@@ -1,5 +1,5 @@
1
1
  import { getDefaultExportFromCjs } from "../../../../../_virtual/_commonjsHelpers.es.js";
2
- import { __module as classnames$1 } from "../../../../../_virtual/index.es4.js";
2
+ import { __module as classnames$1 } from "../../../../../_virtual/index.es3.js";
3
3
  /*!
4
4
  Copyright (c) 2018 Jed Watson.
5
5
  Licensed under the MIT License (MIT), see
@@ -1,5 +1,5 @@
1
1
  import { getDefaultExportFromCjs } from "../../../../../_virtual/_commonjsHelpers.es.js";
2
- import { __module as coWebWorker } from "../../../../../_virtual/index.es2.js";
2
+ import { __module as coWebWorker } from "../../../../../_virtual/index.es4.js";
3
3
  class CrossOriginWorker extends Worker {
4
4
  constructor(scriptUrl) {
5
5
  const b = new Blob([`importScripts('${new URL(scriptUrl).toString()}')`], { type: "application/javascript" });
@@ -1,5 +1,5 @@
1
1
  import { getDefaultExportFromCjs } from "../../../../../_virtual/_commonjsHelpers.es.js";
2
- import { __module as propTypes } from "../../../../../_virtual/index.es3.js";
2
+ import { __module as propTypes } from "../../../../../_virtual/index.es2.js";
3
3
  import { __require as requireReactIs } from "../../../react-is@16.13.1/node_modules/react-is/index.es.js";
4
4
  import { __require as requireFactoryWithTypeCheckers } from "./factoryWithTypeCheckers.es.js";
5
5
  import { __require as requireFactoryWithThrowingShims } from "./factoryWithThrowingShims.es.js";
@@ -1,5 +1,6 @@
1
1
  import { SampleRate } from './types';
2
2
 
3
+ export declare const defaultSampleRate = 48000;
3
4
  export interface AudiManagerConfig {
4
5
  /** 一个转换成 string js 文件。其内容要符合 AudioWorkletProcessor 的要求。
5
6
  * - 需使用 registerProcessor 注册,第一个参数为 “audio-worklet-processor”,如: registerProcessor('audio-worklet-processor', audioToFloat32Processor);
@@ -16,7 +17,6 @@ export interface AudiManagerConfig {
16
17
  /** 对实时音频录制进行管理。 */
17
18
  export declare class AudioManager {
18
19
  workletUrl?: string;
19
- onFrameRecorded?: (data: Float32Array) => void;
20
20
  sampleRate?: SampleRate;
21
21
  status: 'init' | 'starting' | 'running' | 'closed';
22
22
  audioContext?: AudioContext;
@@ -3,6 +3,7 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { requestMicrophonePermission } from "../../xunFeiVoice/utils.es.js";
5
5
  import defaultWorkletProcessorStr from "./workletProcessor.es.js";
6
+ const defaultSampleRate = 48e3;
6
7
  const generateWorkletUrl = (jsStr) => {
7
8
  const blob = new Blob([jsStr], { type: "application/javascript" });
8
9
  const scriptUrl = URL.createObjectURL(blob);
@@ -11,8 +12,7 @@ const generateWorkletUrl = (jsStr) => {
11
12
  class AudioManager {
12
13
  constructor(config) {
13
14
  __publicField(this, "workletUrl");
14
- __publicField(this, "onFrameRecorded");
15
- __publicField(this, "sampleRate", 48e3);
15
+ __publicField(this, "sampleRate", defaultSampleRate);
16
16
  __publicField(this, "status", "init");
17
17
  __publicField(this, "audioContext");
18
18
  __publicField(this, "mediaSource");
@@ -21,7 +21,6 @@ class AudioManager {
21
21
  console.log("audio manager constructor: ====", config);
22
22
  const processorStr = config.workletProcessor || defaultWorkletProcessorStr;
23
23
  this.workletUrl = generateWorkletUrl(processorStr);
24
- this.onFrameRecorded = config.onFrameRecorded;
25
24
  this.sampleRate = config.sampleRate;
26
25
  this.config = config;
27
26
  }
@@ -47,8 +46,8 @@ class AudioManager {
47
46
  frameSize: this.config.frameSize
48
47
  });
49
48
  audioWorkletNode.port.onmessage = (e) => {
50
- var _a2;
51
- (_a2 = this.onFrameRecorded) == null ? void 0 : _a2.call(this, e.data);
49
+ var _a2, _b2;
50
+ (_b2 = (_a2 = this.config).onFrameRecorded) == null ? void 0 : _b2.call(_a2, e.data);
52
51
  };
53
52
  mediaSource.connect(audioWorkletNode);
54
53
  this.audioContext = audioContext;
@@ -84,6 +83,7 @@ class AudioManager {
84
83
  }
85
84
  }
86
85
  export {
87
- AudioManager
86
+ AudioManager,
87
+ defaultSampleRate
88
88
  };
89
89
  //# sourceMappingURL=AudioManager.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioManager.es.js","sources":["../../../../src/utils/voskBrowserManager/AudioManager/AudioManager.ts"],"sourcesContent":["import { requestMicrophonePermission } from '../../xunFeiVoice/utils';\nimport { SampleRate } from './types';\nimport defaultWorkletProcessorStr from './workletProcessor.js?raw';\n\nexport interface AudiManagerConfig {\n /** 一个转换成 string js 文件。其内容要符合 AudioWorkletProcessor 的要求。\n * - 需使用 registerProcessor 注册,第一个参数为 “audio-worklet-processor”,如: registerProcessor('audio-worklet-processor', audioToFloat32Processor);\n * - 参考:https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletProcessor\n */\n workletProcessor?: string;\n /** 采样率(每秒采样数)的浮点数,常用值:16000, 32000, 44100, 48000 */\n sampleRate?: SampleRate;\n onFrameRecorded?: (data: Float32Array) => void;\n onStart?: () => void;\n onStop?: () => void;\n frameSize?: number;\n}\n\nconst generateWorkletUrl = (jsStr: string) => {\n const blob = new Blob([jsStr], { type: 'application/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n return scriptUrl;\n};\n\n/** 对实时音频录制进行管理。 */\nexport class AudioManager {\n workletUrl?: string;\n onFrameRecorded?: (data: Float32Array) => void;\n sampleRate?: SampleRate = 48000;\n status: 'init' | 'starting' | 'running' | 'closed' = 'init';\n audioContext?: AudioContext;\n mediaSource?: MediaStreamAudioSourceNode;\n mediaStream?: MediaStream;\n config: AudiManagerConfig = {};\n\n constructor(config: AudiManagerConfig) {\n console.log('audio manager constructor: ====', config);\n const processorStr = config.workletProcessor || defaultWorkletProcessorStr;\n this.workletUrl = generateWorkletUrl(processorStr);\n this.onFrameRecorded = config.onFrameRecorded;\n this.sampleRate = config.sampleRate;\n this.config = config;\n }\n\n async start() {\n try {\n if (this.status === 'starting') {\n return;\n }\n this.status = 'starting';\n // 1. 创建 AudioContext\n const audioContext = new window.AudioContext({\n sampleRate: this.sampleRate,\n });\n if (!this.workletUrl) {\n throw Error('加载 workletProcessor 失败!');\n }\n // 加载给定 JavaScript 文件中的模块,并将其添加到当前 Worklet 中\n await audioContext.audioWorklet.addModule(this.workletUrl);\n const audioWorkletNode = new AudioWorkletNode(audioContext, 'audio-worklet-processor');\n // 获取音频流并创建处理节点\n const mediaStream = await requestMicrophonePermission();\n const mediaSource = audioContext.createMediaStreamSource(mediaStream);\n // 发送配置给 workletProcessor\n audioWorkletNode.port.postMessage({\n type: 'init',\n frameSize: this.config.frameSize,\n });\n // 监听消息\n audioWorkletNode.port.onmessage = (e) => {\n this.onFrameRecorded?.(e.data);\n };\n // 连接音频节点\n mediaSource.connect(audioWorkletNode);\n // 赋值到 this 上\n this.audioContext = audioContext;\n this.mediaSource = mediaSource;\n this.mediaStream = mediaStream;\n this.status = 'running';\n this.config.onStart?.();\n } catch (error) {\n console.error('Failed to start recording:', error);\n throw error;\n }\n }\n\n async stop() {\n this.status = 'closed';\n /** 暂停音频上下文对象中的进度,并暂时剥离进程对音频设备硬件的访问权限,减少 CPU 和电池的使用 */\n if (this.audioContext?.state === 'running') {\n await this.audioContext.suspend();\n }\n this.config.onStop?.();\n }\n\n close() {\n this.mediaSource?.disconnect();\n this.status = 'closed';\n if (this.audioContext?.state !== 'closed') {\n return this.audioContext?.close();\n }\n }\n\n destroy() {\n this.close();\n this.mediaStream?.getTracks()?.forEach((track) => track.stop());\n }\n}\n"],"names":["_a"],"mappings":";;;;;AAkBA,MAAM,qBAAqB,CAAC,UAAkB;AACtC,QAAA,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,0BAA0B;AAC3D,QAAA,YAAY,IAAI,gBAAgB,IAAI;AACnC,SAAA;AACT;AAGO,MAAM,aAAa;AAAA,EAUxB,YAAY,QAA2B;AATvC;AACA;AACA,sCAA0B;AAC1B,kCAAqD;AACrD;AACA;AACA;AACA,kCAA4B,CAAC;AAGnB,YAAA,IAAI,mCAAmC,MAAM;AAC/C,UAAA,eAAe,OAAO,oBAAoB;AAC3C,SAAA,aAAa,mBAAmB,YAAY;AACjD,SAAK,kBAAkB,OAAO;AAC9B,SAAK,aAAa,OAAO;AACzB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGhB,MAAM,QAAQ;;AACR,QAAA;AACE,UAAA,KAAK,WAAW,YAAY;AAC9B;AAAA,MAAA;AAEF,WAAK,SAAS;AAER,YAAA,eAAe,IAAI,OAAO,aAAa;AAAA,QAC3C,YAAY,KAAK;AAAA,MAAA,CAClB;AACG,UAAA,CAAC,KAAK,YAAY;AACpB,cAAM,MAAM,yBAAyB;AAAA,MAAA;AAGvC,YAAM,aAAa,aAAa,UAAU,KAAK,UAAU;AACzD,YAAM,mBAAmB,IAAI,iBAAiB,cAAc,yBAAyB;AAE/E,YAAA,cAAc,MAAM,4BAA4B;AAChD,YAAA,cAAc,aAAa,wBAAwB,WAAW;AAEpE,uBAAiB,KAAK,YAAY;AAAA,QAChC,MAAM;AAAA,QACN,WAAW,KAAK,OAAO;AAAA,MAAA,CACxB;AAEgB,uBAAA,KAAK,YAAY,CAAC,MAAM;;AAClC,SAAAA,MAAA,KAAA,oBAAA,gBAAAA,IAAA,WAAkB,EAAE;AAAA,MAC3B;AAEA,kBAAY,QAAQ,gBAAgB;AAEpC,WAAK,eAAe;AACpB,WAAK,cAAc;AACnB,WAAK,cAAc;AACnB,WAAK,SAAS;AACd,uBAAK,QAAO,YAAZ;AAAA,aACO,OAAO;AACN,cAAA,MAAM,8BAA8B,KAAK;AAC3C,YAAA;AAAA,IAAA;AAAA,EACR;AAAA,EAGF,MAAM,OAAO;;AACX,SAAK,SAAS;AAEV,UAAA,UAAK,iBAAL,mBAAmB,WAAU,WAAW;AACpC,YAAA,KAAK,aAAa,QAAQ;AAAA,IAAA;AAElC,qBAAK,QAAO,WAAZ;AAAA,EAAqB;AAAA,EAGvB,QAAQ;;AACN,eAAK,gBAAL,mBAAkB;AAClB,SAAK,SAAS;AACV,UAAA,UAAK,iBAAL,mBAAmB,WAAU,UAAU;AAClC,cAAA,UAAK,iBAAL,mBAAmB;AAAA,IAAM;AAAA,EAClC;AAAA,EAGF,UAAU;;AACR,SAAK,MAAM;AACN,qBAAA,gBAAA,mBAAa,gBAAb,mBAA0B,QAAQ,CAAC,UAAU,MAAM;EAAM;AAElE;"}
1
+ {"version":3,"file":"AudioManager.es.js","sources":["../../../../src/utils/voskBrowserManager/AudioManager/AudioManager.ts"],"sourcesContent":["import { requestMicrophonePermission } from '../../xunFeiVoice/utils';\nimport { SampleRate } from './types';\nimport defaultWorkletProcessorStr from './workletProcessor.js?raw';\n\nexport const defaultSampleRate = 48000;\n\nexport interface AudiManagerConfig {\n /** 一个转换成 string js 文件。其内容要符合 AudioWorkletProcessor 的要求。\n * - 需使用 registerProcessor 注册,第一个参数为 “audio-worklet-processor”,如: registerProcessor('audio-worklet-processor', audioToFloat32Processor);\n * - 参考:https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletProcessor\n */\n workletProcessor?: string;\n /** 采样率(每秒采样数)的浮点数,常用值:16000, 32000, 44100, 48000 */\n sampleRate?: SampleRate;\n onFrameRecorded?: (data: Float32Array) => void;\n onStart?: () => void;\n onStop?: () => void;\n frameSize?: number;\n}\n\nconst generateWorkletUrl = (jsStr: string) => {\n const blob = new Blob([jsStr], { type: 'application/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n return scriptUrl;\n};\n\n/** 对实时音频录制进行管理。 */\nexport class AudioManager {\n workletUrl?: string;\n sampleRate?: SampleRate = defaultSampleRate;\n status: 'init' | 'starting' | 'running' | 'closed' = 'init';\n audioContext?: AudioContext;\n mediaSource?: MediaStreamAudioSourceNode;\n mediaStream?: MediaStream;\n config: AudiManagerConfig = {};\n\n constructor(config: AudiManagerConfig) {\n console.log('audio manager constructor: ====', config);\n const processorStr = config.workletProcessor || defaultWorkletProcessorStr;\n this.workletUrl = generateWorkletUrl(processorStr);\n this.sampleRate = config.sampleRate;\n this.config = config;\n }\n\n async start() {\n try {\n if (this.status === 'starting') {\n return;\n }\n this.status = 'starting';\n // 1. 创建 AudioContext\n const audioContext = new window.AudioContext({\n sampleRate: this.sampleRate,\n });\n if (!this.workletUrl) {\n throw Error('加载 workletProcessor 失败!');\n }\n // 加载给定 JavaScript 文件中的模块,并将其添加到当前 Worklet 中\n await audioContext.audioWorklet.addModule(this.workletUrl);\n const audioWorkletNode = new AudioWorkletNode(audioContext, 'audio-worklet-processor');\n // 获取音频流并创建处理节点\n const mediaStream = await requestMicrophonePermission();\n const mediaSource = audioContext.createMediaStreamSource(mediaStream);\n // 发送配置给 workletProcessor\n audioWorkletNode.port.postMessage({\n type: 'init',\n frameSize: this.config.frameSize,\n });\n // 监听消息\n audioWorkletNode.port.onmessage = (e) => {\n this.config.onFrameRecorded?.(e.data);\n };\n // 连接音频节点\n mediaSource.connect(audioWorkletNode);\n // 赋值到 this 上\n this.audioContext = audioContext;\n this.mediaSource = mediaSource;\n this.mediaStream = mediaStream;\n this.status = 'running';\n this.config.onStart?.();\n } catch (error) {\n console.error('Failed to start recording:', error);\n throw error;\n }\n }\n\n async stop() {\n this.status = 'closed';\n /** 暂停音频上下文对象中的进度,并暂时剥离进程对音频设备硬件的访问权限,减少 CPU 和电池的使用 */\n if (this.audioContext?.state === 'running') {\n await this.audioContext.suspend();\n }\n this.config.onStop?.();\n }\n\n close() {\n this.mediaSource?.disconnect();\n this.status = 'closed';\n if (this.audioContext?.state !== 'closed') {\n return this.audioContext?.close();\n }\n }\n\n destroy() {\n this.close();\n this.mediaStream?.getTracks()?.forEach((track) => track.stop());\n }\n}\n"],"names":["_b","_a"],"mappings":";;;;;AAIO,MAAM,oBAAoB;AAgBjC,MAAM,qBAAqB,CAAC,UAAkB;AACtC,QAAA,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,0BAA0B;AAC3D,QAAA,YAAY,IAAI,gBAAgB,IAAI;AACnC,SAAA;AACT;AAGO,MAAM,aAAa;AAAA,EASxB,YAAY,QAA2B;AARvC;AACA,sCAA0B;AAC1B,kCAAqD;AACrD;AACA;AACA;AACA,kCAA4B,CAAC;AAGnB,YAAA,IAAI,mCAAmC,MAAM;AAC/C,UAAA,eAAe,OAAO,oBAAoB;AAC3C,SAAA,aAAa,mBAAmB,YAAY;AACjD,SAAK,aAAa,OAAO;AACzB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGhB,MAAM,QAAQ;;AACR,QAAA;AACE,UAAA,KAAK,WAAW,YAAY;AAC9B;AAAA,MAAA;AAEF,WAAK,SAAS;AAER,YAAA,eAAe,IAAI,OAAO,aAAa;AAAA,QAC3C,YAAY,KAAK;AAAA,MAAA,CAClB;AACG,UAAA,CAAC,KAAK,YAAY;AACpB,cAAM,MAAM,yBAAyB;AAAA,MAAA;AAGvC,YAAM,aAAa,aAAa,UAAU,KAAK,UAAU;AACzD,YAAM,mBAAmB,IAAI,iBAAiB,cAAc,yBAAyB;AAE/E,YAAA,cAAc,MAAM,4BAA4B;AAChD,YAAA,cAAc,aAAa,wBAAwB,WAAW;AAEpE,uBAAiB,KAAK,YAAY;AAAA,QAChC,MAAM;AAAA,QACN,WAAW,KAAK,OAAO;AAAA,MAAA,CACxB;AAEgB,uBAAA,KAAK,YAAY,CAAC,MAAM;;AAClC,SAAAA,OAAAC,MAAA,KAAA,QAAO,oBAAP,gBAAAD,IAAA,KAAAC,KAAyB,EAAE;AAAA,MAClC;AAEA,kBAAY,QAAQ,gBAAgB;AAEpC,WAAK,eAAe;AACpB,WAAK,cAAc;AACnB,WAAK,cAAc;AACnB,WAAK,SAAS;AACd,uBAAK,QAAO,YAAZ;AAAA,aACO,OAAO;AACN,cAAA,MAAM,8BAA8B,KAAK;AAC3C,YAAA;AAAA,IAAA;AAAA,EACR;AAAA,EAGF,MAAM,OAAO;;AACX,SAAK,SAAS;AAEV,UAAA,UAAK,iBAAL,mBAAmB,WAAU,WAAW;AACpC,YAAA,KAAK,aAAa,QAAQ;AAAA,IAAA;AAElC,qBAAK,QAAO,WAAZ;AAAA,EAAqB;AAAA,EAGvB,QAAQ;;AACN,eAAK,gBAAL,mBAAkB;AAClB,SAAK,SAAS;AACV,UAAA,UAAK,iBAAL,mBAAmB,WAAU,UAAU;AAClC,cAAA,UAAK,iBAAL,mBAAmB;AAAA,IAAM;AAAA,EAClC;AAAA,EAGF,UAAU;;AACR,SAAK,MAAM;AACN,qBAAA,gBAAA,mBAAa,gBAAb,mBAA0B,QAAQ,CAAC,UAAU,MAAM;EAAM;AAElE;"}
@@ -1,4 +1,4 @@
1
- const defaultWorkletProcessorStr = "/** 录音数据处理器,把 录音数据转换成 Float32 的数据 */\nclass audioToFloat32Processor extends AudioWorkletProcessor {\n /** 每一帧的数据大小 */\n frameSize = 4096;\n float32Data = new Float32Array(this.frameSize);\n _pos = 0;\n\n constructor() {\n super();\n this.port.onMessage = (e) => {\n console.log('%c 🐱 cat ==== set worklet', 'color: orange; font-size: 16px;');\n if (e?.type === 'init' && typeof e?.frameSize === 'number') {\n this.frameSize = e.frameSize;\n this.float32Data = new Float32Array(this.frameSize);\n this._pos = 0;\n }\n };\n }\n\n process(inputs, outputs, parameters) {\n // 获取第一个输入通道的音频数据\n const input = inputs[0][0];\n if (input && input.length > 0) {\n for (let i = 0; i < input.length; i++) {\n this.float32Data[this._pos++] = input[i];\n if (this._pos === this.frameSize) {\n this.port.postMessage(this.float32Data);\n this._pos = 0;\n }\n }\n }\n return true;\n }\n}\n\nregisterProcessor('audio-worklet-processor', audioToFloat32Processor);\n";
1
+ const defaultWorkletProcessorStr = "/** 录音数据处理器,把 录音数据转换成 Float32 的数据 */\nclass audioToFloat32Processor extends AudioWorkletProcessor {\n /** 每一帧的数据大小 */\n frameSize = 4096;\n float32Data = new Float32Array(this.frameSize);\n _pos = 0;\n\n constructor() {\n super();\n this.port.onMessage = (e) => {\n console.log('%c 🐱 cat ==== set worklet', 'color: orange; font-size: 16px;');\n if (e?.type === 'init' && typeof e?.frameSize === 'number') {\n this.frameSize = e.frameSize;\n this.float32Data = new Float32Array(this.frameSize);\n this._pos = 0;\n }\n };\n }\n\n process(inputs) {\n // 获取第一个输入通道的音频数据\n const input = inputs[0][0];\n if (input && input.length > 0) {\n for (let i = 0; i < input.length; i++) {\n this.float32Data[this._pos++] = input[i];\n if (this._pos === this.frameSize) {\n this.port.postMessage(this.float32Data);\n this._pos = 0;\n }\n }\n }\n return true;\n }\n}\n\nregisterProcessor('audio-worklet-processor', audioToFloat32Processor);\n";
2
2
  export {
3
3
  defaultWorkletProcessorStr as default
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"workletProcessor.es.js","sources":["../../../../src/utils/voskBrowserManager/AudioManager/workletProcessor.js?raw"],"sourcesContent":["export default \"/** 录音数据处理器,把 录音数据转换成 Float32 的数据 */\\nclass audioToFloat32Processor extends AudioWorkletProcessor {\\n /** 每一帧的数据大小 */\\n frameSize = 4096;\\n float32Data = new Float32Array(this.frameSize);\\n _pos = 0;\\n\\n constructor() {\\n super();\\n this.port.onMessage = (e) => {\\n console.log('%c 🐱 cat ==== set worklet', 'color: orange; font-size: 16px;');\\n if (e?.type === 'init' && typeof e?.frameSize === 'number') {\\n this.frameSize = e.frameSize;\\n this.float32Data = new Float32Array(this.frameSize);\\n this._pos = 0;\\n }\\n };\\n }\\n\\n process(inputs, outputs, parameters) {\\n // 获取第一个输入通道的音频数据\\n const input = inputs[0][0];\\n if (input && input.length > 0) {\\n for (let i = 0; i < input.length; i++) {\\n this.float32Data[this._pos++] = input[i];\\n if (this._pos === this.frameSize) {\\n this.port.postMessage(this.float32Data);\\n this._pos = 0;\\n }\\n }\\n }\\n return true;\\n }\\n}\\n\\nregisterProcessor('audio-worklet-processor', audioToFloat32Processor);\\n\""],"names":[],"mappings":"AAAA,MAAe,6BAAA;"}
1
+ {"version":3,"file":"workletProcessor.es.js","sources":["../../../../src/utils/voskBrowserManager/AudioManager/workletProcessor.js?raw"],"sourcesContent":["export default \"/** 录音数据处理器,把 录音数据转换成 Float32 的数据 */\\nclass audioToFloat32Processor extends AudioWorkletProcessor {\\n /** 每一帧的数据大小 */\\n frameSize = 4096;\\n float32Data = new Float32Array(this.frameSize);\\n _pos = 0;\\n\\n constructor() {\\n super();\\n this.port.onMessage = (e) => {\\n console.log('%c 🐱 cat ==== set worklet', 'color: orange; font-size: 16px;');\\n if (e?.type === 'init' && typeof e?.frameSize === 'number') {\\n this.frameSize = e.frameSize;\\n this.float32Data = new Float32Array(this.frameSize);\\n this._pos = 0;\\n }\\n };\\n }\\n\\n process(inputs) {\\n // 获取第一个输入通道的音频数据\\n const input = inputs[0][0];\\n if (input && input.length > 0) {\\n for (let i = 0; i < input.length; i++) {\\n this.float32Data[this._pos++] = input[i];\\n if (this._pos === this.frameSize) {\\n this.port.postMessage(this.float32Data);\\n this._pos = 0;\\n }\\n }\\n }\\n return true;\\n }\\n}\\n\\nregisterProcessor('audio-worklet-processor', audioToFloat32Processor);\\n\""],"names":[],"mappings":"AAAA,MAAe,6BAAA;"}
@@ -17,6 +17,7 @@ export declare class VoskBrowserManager {
17
17
  audioManager?: AudioManager;
18
18
  autoStart: boolean;
19
19
  constructor(config: VoskBrowserManagerConfig);
20
+ setConfig(config: Partial<Pick<VoskBrowserManagerConfig, 'onResult' | 'onPartialResult'>>): void;
20
21
  init(vosk: typeof Vosk): Promise<void>;
21
22
  start(): void;
22
23
  stop(): void;
@@ -1,9 +1,18 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { AudioManager } from "./AudioManager/AudioManager.es.js";
4
+ import { defaultSampleRate, AudioManager } from "./AudioManager/AudioManager.es.js";
5
5
  import omit from "../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/omit.es.js";
6
- const defaultSampleRate = 16e3;
6
+ const pickAudioManagerConfig = (config) => {
7
+ return omit(config, [
8
+ "vosk",
9
+ "modelUrl",
10
+ "autoStart",
11
+ "onResult",
12
+ "onPartialResult",
13
+ "onInitialized"
14
+ ]);
15
+ };
7
16
  class VoskBrowserManager {
8
17
  constructor(config) {
9
18
  __publicField(this, "config");
@@ -16,6 +25,12 @@ class VoskBrowserManager {
16
25
  this.autoStart = config.autoStart || true;
17
26
  this.init(config.vosk);
18
27
  }
28
+ setConfig(config) {
29
+ this.config = {
30
+ ...this.config,
31
+ ...config
32
+ };
33
+ }
19
34
  async init(vosk) {
20
35
  var _a, _b;
21
36
  console.time("load model:");
@@ -33,7 +48,8 @@ class VoskBrowserManager {
33
48
  (_b2 = (_a2 = this.config).onPartialResult) == null ? void 0 : _b2.call(_a2, partialText);
34
49
  });
35
50
  this.audioManager = new AudioManager({
36
- ...omit(this.config, ["vosk", "modelUrl", "onResult", "onPartialResult", "onInitialized"]),
51
+ ...pickAudioManagerConfig(this.config),
52
+ sampleRate: this.sampleRate,
37
53
  onFrameRecorded: (data) => {
38
54
  var _a2, _b2;
39
55
  recognizer.acceptWaveformFloat(data, this.sampleRate);
@@ -1 +1 @@
1
- {"version":3,"file":"voskBrowserManager.es.js","sources":["../../../src/utils/voskBrowserManager/voskBrowserManager.ts"],"sourcesContent":["import { omit } from 'lodash-es';\nimport type * as Vosk from 'vosk-browser';\nimport { AudiManagerConfig, AudioManager } from './AudioManager/AudioManager';\nimport { SampleRate } from './AudioManager/types';\n\ninterface VoskBrowserManagerConfig extends AudiManagerConfig {\n vosk: typeof Vosk;\n modelUrl: string;\n /** 加载模型等初始化配置完成后,自动开始监听 */\n autoStart?: boolean;\n onInitialized?: () => void;\n onResult?: (text: string) => void;\n onPartialResult?: (text: string) => void;\n}\n\nconst defaultSampleRate = 16000;\n\nexport class VoskBrowserManager {\n config: VoskBrowserManagerConfig;\n /** 采样率(每秒采样数)的浮点数,常用值:16000, 32000, 44100, 48000 */\n sampleRate: SampleRate = defaultSampleRate;\n audioManager?: AudioManager;\n autoStart = true;\n\n constructor(config: VoskBrowserManagerConfig) {\n this.config = config;\n this.sampleRate = config.sampleRate || defaultSampleRate;\n this.autoStart = config.autoStart || true;\n this.init(config.vosk);\n }\n\n async init(vosk: typeof Vosk) {\n console.time('load model:');\n const model = await vosk.createModel(this.config.modelUrl);\n console.timeEnd('load model:');\n\n const recognizer = new model.KaldiRecognizer(this.sampleRate);\n recognizer.on('result', (message) => {\n const resultText = (message as any).result.text;\n this.config.onResult?.(resultText);\n });\n recognizer.on('partialresult', (message) => {\n const partialText = (message as any).result.partial;\n this.config.onPartialResult?.(partialText);\n });\n\n this.audioManager = new AudioManager({\n ...omit(this.config, ['vosk', 'modelUrl', 'onResult', 'onPartialResult', 'onInitialized']),\n onFrameRecorded: (data) => {\n recognizer.acceptWaveformFloat(data, this.sampleRate);\n this.config.onFrameRecorded?.(data);\n },\n });\n this.config.onInitialized?.();\n if (this.autoStart) {\n this.start();\n }\n }\n\n start() {\n this.audioManager?.start();\n }\n\n stop() {\n this.audioManager?.stop();\n }\n}\n"],"names":["_b","_a"],"mappings":";;;;;AAeA,MAAM,oBAAoB;AAEnB,MAAM,mBAAmB;AAAA,EAO9B,YAAY,QAAkC;AAN9C;AAEA;AAAA,sCAAyB;AACzB;AACA,qCAAY;AAGV,SAAK,SAAS;AACT,SAAA,aAAa,OAAO,cAAc;AAClC,SAAA,YAAY,OAAO,aAAa;AAChC,SAAA,KAAK,OAAO,IAAI;AAAA,EAAA;AAAA,EAGvB,MAAM,KAAK,MAAmB;;AAC5B,YAAQ,KAAK,aAAa;AAC1B,UAAM,QAAQ,MAAM,KAAK,YAAY,KAAK,OAAO,QAAQ;AACzD,YAAQ,QAAQ,aAAa;AAE7B,UAAM,aAAa,IAAI,MAAM,gBAAgB,KAAK,UAAU;AACjD,eAAA,GAAG,UAAU,CAAC,YAAY;;AAC7B,YAAA,aAAc,QAAgB,OAAO;AACtC,OAAAA,OAAAC,MAAA,KAAA,QAAO,aAAP,gBAAAD,IAAA,KAAAC,KAAkB;AAAA,IAAU,CAClC;AACU,eAAA,GAAG,iBAAiB,CAAC,YAAY;;AACpC,YAAA,cAAe,QAAgB,OAAO;AACvC,OAAAD,OAAAC,MAAA,KAAA,QAAO,oBAAP,gBAAAD,IAAA,KAAAC,KAAyB;AAAA,IAAW,CAC1C;AAEI,SAAA,eAAe,IAAI,aAAa;AAAA,MACnC,GAAG,KAAK,KAAK,QAAQ,CAAC,QAAQ,YAAY,YAAY,mBAAmB,eAAe,CAAC;AAAA,MACzF,iBAAiB,CAAC,SAAS;;AACd,mBAAA,oBAAoB,MAAM,KAAK,UAAU;AAC/C,SAAAD,OAAAC,MAAA,KAAA,QAAO,oBAAP,gBAAAD,IAAA,KAAAC,KAAyB;AAAA,MAAI;AAAA,IACpC,CACD;AACD,qBAAK,QAAO,kBAAZ;AACA,QAAI,KAAK,WAAW;AAClB,WAAK,MAAM;AAAA,IAAA;AAAA,EACb;AAAA,EAGF,QAAQ;;AACN,eAAK,iBAAL,mBAAmB;AAAA,EAAM;AAAA,EAG3B,OAAO;;AACL,eAAK,iBAAL,mBAAmB;AAAA,EAAK;AAE5B;"}
1
+ {"version":3,"file":"voskBrowserManager.es.js","sources":["../../../src/utils/voskBrowserManager/voskBrowserManager.ts"],"sourcesContent":["import { omit } from 'lodash-es';\nimport type * as Vosk from 'vosk-browser';\nimport { AudiManagerConfig, AudioManager, defaultSampleRate } from './AudioManager/AudioManager';\nimport { SampleRate } from './AudioManager/types';\n\ninterface VoskBrowserManagerConfig extends AudiManagerConfig {\n vosk: typeof Vosk;\n modelUrl: string;\n /** 加载模型等初始化配置完成后,自动开始监听 */\n autoStart?: boolean;\n onInitialized?: () => void;\n onResult?: (text: string) => void;\n onPartialResult?: (text: string) => void;\n}\n\nconst pickAudioManagerConfig = (config: VoskBrowserManagerConfig) => {\n return omit(config, [\n 'vosk',\n 'modelUrl',\n 'autoStart',\n 'onResult',\n 'onPartialResult',\n 'onInitialized',\n ]);\n};\n\nexport class VoskBrowserManager {\n config: VoskBrowserManagerConfig;\n /** 采样率(每秒采样数)的浮点数,常用值:16000, 32000, 44100, 48000 */\n sampleRate: SampleRate = defaultSampleRate;\n audioManager?: AudioManager;\n autoStart = true;\n\n constructor(config: VoskBrowserManagerConfig) {\n this.config = config;\n this.sampleRate = config.sampleRate || defaultSampleRate;\n this.autoStart = config.autoStart || true;\n this.init(config.vosk);\n }\n\n setConfig(config: Partial<Pick<VoskBrowserManagerConfig, 'onResult' | 'onPartialResult'>>) {\n this.config = {\n ...this.config,\n ...config,\n };\n }\n\n async init(vosk: typeof Vosk) {\n console.time('load model:');\n const model = await vosk.createModel(this.config.modelUrl);\n console.timeEnd('load model:');\n\n const recognizer = new model.KaldiRecognizer(this.sampleRate);\n recognizer.on('result', (message) => {\n const resultText = (message as any).result.text;\n this.config.onResult?.(resultText);\n });\n recognizer.on('partialresult', (message) => {\n const partialText = (message as any).result.partial;\n this.config.onPartialResult?.(partialText);\n });\n\n this.audioManager = new AudioManager({\n ...pickAudioManagerConfig(this.config),\n sampleRate: this.sampleRate,\n onFrameRecorded: (data) => {\n recognizer.acceptWaveformFloat(data, this.sampleRate);\n this.config.onFrameRecorded?.(data);\n },\n });\n\n this.config.onInitialized?.();\n if (this.autoStart) {\n this.start();\n }\n }\n\n start() {\n this.audioManager?.start();\n }\n\n stop() {\n this.audioManager?.stop();\n }\n}\n"],"names":["_b","_a"],"mappings":";;;;;AAeA,MAAM,yBAAyB,CAAC,WAAqC;AACnE,SAAO,KAAK,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACH;AAEO,MAAM,mBAAmB;AAAA,EAO9B,YAAY,QAAkC;AAN9C;AAEA;AAAA,sCAAyB;AACzB;AACA,qCAAY;AAGV,SAAK,SAAS;AACT,SAAA,aAAa,OAAO,cAAc;AAClC,SAAA,YAAY,OAAO,aAAa;AAChC,SAAA,KAAK,OAAO,IAAI;AAAA,EAAA;AAAA,EAGvB,UAAU,QAAiF;AACzF,SAAK,SAAS;AAAA,MACZ,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EAAA;AAAA,EAGF,MAAM,KAAK,MAAmB;;AAC5B,YAAQ,KAAK,aAAa;AAC1B,UAAM,QAAQ,MAAM,KAAK,YAAY,KAAK,OAAO,QAAQ;AACzD,YAAQ,QAAQ,aAAa;AAE7B,UAAM,aAAa,IAAI,MAAM,gBAAgB,KAAK,UAAU;AACjD,eAAA,GAAG,UAAU,CAAC,YAAY;;AAC7B,YAAA,aAAc,QAAgB,OAAO;AACtC,OAAAA,OAAAC,MAAA,KAAA,QAAO,aAAP,gBAAAD,IAAA,KAAAC,KAAkB;AAAA,IAAU,CAClC;AACU,eAAA,GAAG,iBAAiB,CAAC,YAAY;;AACpC,YAAA,cAAe,QAAgB,OAAO;AACvC,OAAAD,OAAAC,MAAA,KAAA,QAAO,oBAAP,gBAAAD,IAAA,KAAAC,KAAyB;AAAA,IAAW,CAC1C;AAEI,SAAA,eAAe,IAAI,aAAa;AAAA,MACnC,GAAG,uBAAuB,KAAK,MAAM;AAAA,MACrC,YAAY,KAAK;AAAA,MACjB,iBAAiB,CAAC,SAAS;;AACd,mBAAA,oBAAoB,MAAM,KAAK,UAAU;AAC/C,SAAAD,OAAAC,MAAA,KAAA,QAAO,oBAAP,gBAAAD,IAAA,KAAAC,KAAyB;AAAA,MAAI;AAAA,IACpC,CACD;AAED,qBAAK,QAAO,kBAAZ;AACA,QAAI,KAAK,WAAW;AAClB,WAAK,MAAM;AAAA,IAAA;AAAA,EACb;AAAA,EAGF,QAAQ;;AACN,eAAK,iBAAL,mBAAmB;AAAA,EAAM;AAAA,EAG3B,OAAO;;AACL,eAAK,iBAAL,mBAAmB;AAAA,EAAK;AAE5B;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easyv/biz-components",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "type": "module",
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",