@easyv/biz-components 1.0.9 → 1.0.11

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 +1 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }body .biz-flex{display:flex}body .biz-contents{display:contents}body .biz-h-3\.5{height:.875rem}body .biz-h-6{height:1.5rem}body .biz-h-full{height:100%}body .biz-min-h-10{min-height:2.5rem}body .biz-w-3\.5{width:.875rem}body .biz-w-6{width:1.5rem}body .biz-w-\[0\.4rem\]{width:.4rem}body .biz-cursor-pointer{cursor:pointer}body .biz-select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}body .biz-flex-col{flex-direction:column}body .biz-items-center{align-items:center}body .biz-justify-center{justify-content:center}body .biz-justify-between{justify-content:space-between}body .biz-gap-1{gap:.25rem}body .biz-gap-3{gap:.75rem}body .biz-whitespace-pre-wrap{white-space:pre-wrap}body .biz-rounded-full{border-radius:9999px}body .biz-rounded-lg{border-radius:.5rem}body .biz-rounded-md{border-radius:.375rem}body .biz-bg-\[\#FFFFFF14\]{background-color:#ffffff14}body .biz-px-4{padding-left:1rem;padding-right:1rem}body .biz-py-3{padding-bottom:.75rem;padding-top:.75rem}body .biz-text-text-2{--tw-text-opacity:1;color:rgb(180 183 193/var(--tw-text-opacity,1))}
1
+ *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }body .biz-flex{display:flex}body .biz-contents{display:contents}body .biz-h-3\.5{height:.875rem}body .biz-h-6{height:1.5rem}body .biz-h-full{height:100%}body .biz-min-h-10{min-height:2.5rem}body .biz-w-3\.5{width:.875rem}body .biz-w-6{width:1.5rem}body .biz-w-\[0\.4rem\]{width:.4rem}body .biz-cursor-pointer{cursor:pointer}body .biz-select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}body .biz-flex-col{flex-direction:column}body .biz-items-center{align-items:center}body .biz-justify-center{justify-content:center}body .biz-justify-between{justify-content:space-between}body .biz-gap-1{gap:.25rem}body .biz-gap-3{gap:.75rem}body .biz-whitespace-pre-wrap{white-space:pre-wrap}body .biz-rounded-full{border-radius:9999px}body .biz-rounded-lg{border-radius:.5rem}body .biz-rounded-md{border-radius:.375rem}body .biz-bg-\[\#FFFFFF14\]{background-color:#ffffff14}body .biz-bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity,1))}body .biz-px-4{padding-left:1rem;padding-right:1rem}body .biz-py-3{padding-bottom:.75rem;padding-top:.75rem}body .biz-text-text-2{--tw-text-opacity:1;color:rgb(180 183 193/var(--tw-text-opacity,1))}
@@ -50,15 +50,16 @@ class AudioManager {
50
50
  this.mediaStream = mediaStream;
51
51
  }
52
52
  async start() {
53
- var _a, _b, _c, _d;
53
+ var _a, _b, _c, _d, _e;
54
54
  try {
55
55
  if (((_a = this.audioContext) == null ? void 0 : _a.state) === "suspended") {
56
56
  this.audioContext.resume();
57
57
  }
58
58
  if (((_b = this.audioContext) == null ? void 0 : _b.state) === "closed" || !this.audioContext) {
59
59
  await this.init();
60
+ await ((_c = this.audioContext) == null ? void 0 : _c.resume());
60
61
  }
61
- (_d = (_c = this.config).onStart) == null ? void 0 : _d.call(_c);
62
+ (_e = (_d = this.config).onStart) == null ? void 0 : _e.call(_d);
62
63
  } catch (error) {
63
64
  console.error("Failed to start recording:", error);
64
65
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"audio-manager.es.js","sources":["../../../../src/utils/vosk-browser-manager/audio-manager/audio-manager.ts"],"sourcesContent":["import { requestMicrophonePermission } from '../../xun-fei-voice/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 audioContext?: AudioContext;\n mediaSource?: MediaStreamAudioSourceNode;\n mediaStream?: MediaStream;\n config: AudiManagerConfig = {};\n\n constructor(config: AudiManagerConfig) {\n const processorStr = config.workletProcessor || defaultWorkletProcessorStr;\n this.workletUrl = generateWorkletUrl(processorStr);\n this.sampleRate = config.sampleRate;\n this.config = config;\n }\n\n async init() {\n if (this.audioContext) {\n await this.destroy();\n }\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 }\n\n async start() {\n try {\n if (this.audioContext?.state === 'suspended') {\n this.audioContext.resume();\n }\n if (this.audioContext?.state === 'closed' || !this.audioContext) {\n await this.init();\n }\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 /** 暂停音频上下文对象中的进度,并暂时剥离进程对音频设备硬件的访问权限,减少 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 if (this.audioContext && this.audioContext.state !== 'closed') {\n return this.audioContext.close();\n }\n }\n\n async destroy() {\n await this.close();\n this.mediaStream?.getTracks()?.forEach((track) => track.stop());\n }\n}\n"],"names":[],"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,EAQxB,YAAY,QAA2B;AAPvC;AACA,sCAA0B;AAC1B;AACA;AACA;AACA,kCAA4B,CAAC;AAGrB,UAAA,eAAe,OAAO,oBAAoB;AAC3C,SAAA,aAAa,mBAAmB,YAAY;AACjD,SAAK,aAAa,OAAO;AACzB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGhB,MAAM,OAAO;AACX,QAAI,KAAK,cAAc;AACrB,YAAM,KAAK,QAAQ;AAAA,IAAA;AAGf,UAAA,eAAe,IAAI,OAAO,aAAa;AAAA,MAC3C,YAAY,KAAK;AAAA,IAAA,CAClB;AACG,QAAA,CAAC,KAAK,YAAY;AACpB,YAAM,MAAM,yBAAyB;AAAA,IAAA;AAGvC,UAAM,aAAa,aAAa,UAAU,KAAK,UAAU;AACzD,UAAM,mBAAmB,IAAI,iBAAiB,cAAc,yBAAyB;AAE/E,UAAA,cAAc,MAAM,4BAA4B;AAChD,UAAA,cAAc,aAAa,wBAAwB,WAAW;AAEpE,qBAAiB,KAAK,YAAY;AAAA,MAChC,MAAM;AAAA,MACN,WAAW,KAAK,OAAO;AAAA,IAAA,CACxB;AAEgB,qBAAA,KAAK,YAAY,CAAC,MAAM;;AAClC,uBAAA,QAAO,oBAAP,4BAAyB,EAAE;AAAA,IAClC;AAEA,gBAAY,QAAQ,gBAAgB;AAEpC,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,cAAc;AAAA,EAAA;AAAA,EAGrB,MAAM,QAAQ;;AACR,QAAA;AACE,YAAA,UAAK,iBAAL,mBAAmB,WAAU,aAAa;AAC5C,aAAK,aAAa,OAAO;AAAA,MAAA;AAE3B,YAAI,UAAK,iBAAL,mBAAmB,WAAU,YAAY,CAAC,KAAK,cAAc;AAC/D,cAAM,KAAK,KAAK;AAAA,MAAA;AAElB,uBAAK,QAAO,YAAZ;AAAA,aACO,OAAO;AACN,cAAA,MAAM,8BAA8B,KAAK;AAC3C,YAAA;AAAA,IAAA;AAAA,EACR;AAAA,EAGF,MAAM,OAAO;;AAEP,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,QAAI,KAAK,gBAAgB,KAAK,aAAa,UAAU,UAAU;AACtD,aAAA,KAAK,aAAa,MAAM;AAAA,IAAA;AAAA,EACjC;AAAA,EAGF,MAAM,UAAU;;AACd,UAAM,KAAK,MAAM;AACZ,qBAAA,gBAAA,mBAAa,gBAAb,mBAA0B,QAAQ,CAAC,UAAU,MAAM;EAAM;AAElE;"}
1
+ {"version":3,"file":"audio-manager.es.js","sources":["../../../../src/utils/vosk-browser-manager/audio-manager/audio-manager.ts"],"sourcesContent":["import { requestMicrophonePermission } from '../../xun-fei-voice/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 audioContext?: AudioContext;\n mediaSource?: MediaStreamAudioSourceNode;\n mediaStream?: MediaStream;\n config: AudiManagerConfig = {};\n\n constructor(config: AudiManagerConfig) {\n const processorStr = config.workletProcessor || defaultWorkletProcessorStr;\n this.workletUrl = generateWorkletUrl(processorStr);\n this.sampleRate = config.sampleRate;\n this.config = config;\n }\n\n async init() {\n if (this.audioContext) {\n await this.destroy();\n }\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 }\n\n async start() {\n try {\n if (this.audioContext?.state === 'suspended') {\n this.audioContext.resume();\n }\n if (this.audioContext?.state === 'closed' || !this.audioContext) {\n await this.init();\n await this.audioContext?.resume();\n }\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 /** 暂停音频上下文对象中的进度,并暂时剥离进程对音频设备硬件的访问权限,减少 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 if (this.audioContext && this.audioContext.state !== 'closed') {\n return this.audioContext.close();\n }\n }\n\n async destroy() {\n await this.close();\n this.mediaStream?.getTracks()?.forEach((track) => track.stop());\n }\n}\n"],"names":[],"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,EAQxB,YAAY,QAA2B;AAPvC;AACA,sCAA0B;AAC1B;AACA;AACA;AACA,kCAA4B,CAAC;AAGrB,UAAA,eAAe,OAAO,oBAAoB;AAC3C,SAAA,aAAa,mBAAmB,YAAY;AACjD,SAAK,aAAa,OAAO;AACzB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGhB,MAAM,OAAO;AACX,QAAI,KAAK,cAAc;AACrB,YAAM,KAAK,QAAQ;AAAA,IAAA;AAGf,UAAA,eAAe,IAAI,OAAO,aAAa;AAAA,MAC3C,YAAY,KAAK;AAAA,IAAA,CAClB;AACG,QAAA,CAAC,KAAK,YAAY;AACpB,YAAM,MAAM,yBAAyB;AAAA,IAAA;AAGvC,UAAM,aAAa,aAAa,UAAU,KAAK,UAAU;AACzD,UAAM,mBAAmB,IAAI,iBAAiB,cAAc,yBAAyB;AAE/E,UAAA,cAAc,MAAM,4BAA4B;AAChD,UAAA,cAAc,aAAa,wBAAwB,WAAW;AAEpE,qBAAiB,KAAK,YAAY;AAAA,MAChC,MAAM;AAAA,MACN,WAAW,KAAK,OAAO;AAAA,IAAA,CACxB;AAEgB,qBAAA,KAAK,YAAY,CAAC,MAAM;;AAClC,uBAAA,QAAO,oBAAP,4BAAyB,EAAE;AAAA,IAClC;AAEA,gBAAY,QAAQ,gBAAgB;AAEpC,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,cAAc;AAAA,EAAA;AAAA,EAGrB,MAAM,QAAQ;;AACR,QAAA;AACE,YAAA,UAAK,iBAAL,mBAAmB,WAAU,aAAa;AAC5C,aAAK,aAAa,OAAO;AAAA,MAAA;AAE3B,YAAI,UAAK,iBAAL,mBAAmB,WAAU,YAAY,CAAC,KAAK,cAAc;AAC/D,cAAM,KAAK,KAAK;AACV,gBAAA,UAAK,iBAAL,mBAAmB;AAAA,MAAO;AAElC,uBAAK,QAAO,YAAZ;AAAA,aACO,OAAO;AACN,cAAA,MAAM,8BAA8B,KAAK;AAC3C,YAAA;AAAA,IAAA;AAAA,EACR;AAAA,EAGF,MAAM,OAAO;;AAEP,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,QAAI,KAAK,gBAAgB,KAAK,aAAa,UAAU,UAAU;AACtD,aAAA,KAAK,aAAa,MAAM;AAAA,IAAA;AAAA,EACjC;AAAA,EAGF,MAAM,UAAU;;AACd,UAAM,KAAK,MAAM;AACZ,qBAAA,gBAAA,mBAAa,gBAAb,mBAA0B,QAAQ,CAAC,UAAU,MAAM;EAAM;AAElE;"}
@@ -20,12 +20,12 @@ class VoskBrowserManager {
20
20
  __publicField(this, "sampleRate", defaultSampleRate);
21
21
  __publicField(this, "audioManager");
22
22
  __publicField(this, "model");
23
- __publicField(this, "autoStart", true);
23
+ __publicField(this, "autoStart", false);
24
24
  __publicField(this, "startResolve");
25
25
  __publicField(this, "status");
26
26
  this.config = config;
27
27
  this.sampleRate = config.sampleRate || defaultSampleRate;
28
- this.autoStart = config.autoStart ?? true;
28
+ this.autoStart = config.autoStart ?? false;
29
29
  this.init(config.vosk);
30
30
  }
31
31
  setConfig(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"vosk-browser-manager.es.js","sources":["../../../src/utils/vosk-browser-manager/vosk-browser-manager.ts"],"sourcesContent":["import { omit } from 'lodash-es';\nimport type * as Vosk from 'vosk-browser';\nimport { AudiManagerConfig, AudioManager, defaultSampleRate } from './audio-manager/audio-manager';\nimport { SampleRate } from './audio-manager/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 hotWords?: string[];\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 model?: Vosk.Model;\n autoStart = true;\n startResolve?: (value?: unknown) => void;\n status?: 'initializing' | 'initialized';\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 if (this.model) {\n this.model.terminate();\n }\n this.status = 'initializing';\n console.time('load model:');\n this.model = await vosk.createModel(this.config.modelUrl);\n console.timeEnd('load model:');\n\n const hotWords = this.config.hotWords ? JSON.stringify(this.config.hotWords) : undefined;\n const recognizer = new this.model.KaldiRecognizer(this.sampleRate, hotWords);\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 if (this.audioManager) {\n this.audioManager.destroy();\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 this.startResolve?.();\n this.status = 'initialized';\n if (this.autoStart) {\n this.start();\n }\n }\n\n async start() {\n if (this.status === 'initialized') {\n await this.audioManager?.start();\n } else {\n await new Promise((resolve) => {\n this.startResolve = resolve;\n });\n await this.audioManager?.start();\n }\n }\n\n stop() {\n this.audioManager?.stop();\n }\n\n destroy() {\n this.audioManager?.destroy();\n this.model?.terminate();\n }\n}\n"],"names":["_b","_a"],"mappings":";;;;;AAiBA,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,EAU9B,YAAY,QAAkC;AAT9C;AAEA;AAAA,sCAAyB;AACzB;AACA;AACA,qCAAY;AACZ;AACA;AAGE,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,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,UAAU;AAAA,IAAA;AAEvB,SAAK,SAAS;AACd,YAAQ,KAAK,aAAa;AAC1B,SAAK,QAAQ,MAAM,KAAK,YAAY,KAAK,OAAO,QAAQ;AACxD,YAAQ,QAAQ,aAAa;AAEvB,UAAA,WAAW,KAAK,OAAO,WAAW,KAAK,UAAU,KAAK,OAAO,QAAQ,IAAI;AAC/E,UAAM,aAAa,IAAI,KAAK,MAAM,gBAAgB,KAAK,YAAY,QAAQ;AAChE,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;AAED,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,QAAQ;AAAA,IAAA;AAEvB,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,eAAK,iBAAL;AACA,SAAK,SAAS;AACd,QAAI,KAAK,WAAW;AAClB,WAAK,MAAM;AAAA,IAAA;AAAA,EACb;AAAA,EAGF,MAAM,QAAQ;;AACR,QAAA,KAAK,WAAW,eAAe;AAC3B,cAAA,UAAK,iBAAL,mBAAmB;AAAA,IAAM,OAC1B;AACC,YAAA,IAAI,QAAQ,CAAC,YAAY;AAC7B,aAAK,eAAe;AAAA,MAAA,CACrB;AACK,cAAA,UAAK,iBAAL,mBAAmB;AAAA,IAAM;AAAA,EACjC;AAAA,EAGF,OAAO;;AACL,eAAK,iBAAL,mBAAmB;AAAA,EAAK;AAAA,EAG1B,UAAU;;AACR,eAAK,iBAAL,mBAAmB;AACnB,eAAK,UAAL,mBAAY;AAAA,EAAU;AAE1B;"}
1
+ {"version":3,"file":"vosk-browser-manager.es.js","sources":["../../../src/utils/vosk-browser-manager/vosk-browser-manager.ts"],"sourcesContent":["import { omit } from 'lodash-es';\nimport type * as Vosk from 'vosk-browser';\nimport { AudiManagerConfig, AudioManager, defaultSampleRate } from './audio-manager/audio-manager';\nimport { SampleRate } from './audio-manager/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 hotWords?: string[];\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 model?: Vosk.Model;\n autoStart = false;\n startResolve?: (value?: unknown) => void;\n status?: 'initializing' | 'initialized';\n\n constructor(config: VoskBrowserManagerConfig) {\n this.config = config;\n this.sampleRate = config.sampleRate || defaultSampleRate;\n this.autoStart = config.autoStart ?? false;\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 if (this.model) {\n this.model.terminate();\n }\n this.status = 'initializing';\n console.time('load model:');\n this.model = await vosk.createModel(this.config.modelUrl);\n console.timeEnd('load model:');\n\n const hotWords = this.config.hotWords ? JSON.stringify(this.config.hotWords) : undefined;\n const recognizer = new this.model.KaldiRecognizer(this.sampleRate, hotWords);\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 if (this.audioManager) {\n this.audioManager.destroy();\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 this.startResolve?.();\n this.status = 'initialized';\n if (this.autoStart) {\n this.start();\n }\n }\n\n async start() {\n if (this.status === 'initialized') {\n await this.audioManager?.start();\n } else {\n await new Promise((resolve) => {\n this.startResolve = resolve;\n });\n await this.audioManager?.start();\n }\n }\n\n stop() {\n this.audioManager?.stop();\n }\n\n destroy() {\n this.audioManager?.destroy();\n this.model?.terminate();\n }\n}\n"],"names":["_b","_a"],"mappings":";;;;;AAiBA,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,EAU9B,YAAY,QAAkC;AAT9C;AAEA;AAAA,sCAAyB;AACzB;AACA;AACA,qCAAY;AACZ;AACA;AAGE,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,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,UAAU;AAAA,IAAA;AAEvB,SAAK,SAAS;AACd,YAAQ,KAAK,aAAa;AAC1B,SAAK,QAAQ,MAAM,KAAK,YAAY,KAAK,OAAO,QAAQ;AACxD,YAAQ,QAAQ,aAAa;AAEvB,UAAA,WAAW,KAAK,OAAO,WAAW,KAAK,UAAU,KAAK,OAAO,QAAQ,IAAI;AAC/E,UAAM,aAAa,IAAI,KAAK,MAAM,gBAAgB,KAAK,YAAY,QAAQ;AAChE,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;AAED,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,QAAQ;AAAA,IAAA;AAEvB,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,eAAK,iBAAL;AACA,SAAK,SAAS;AACd,QAAI,KAAK,WAAW;AAClB,WAAK,MAAM;AAAA,IAAA;AAAA,EACb;AAAA,EAGF,MAAM,QAAQ;;AACR,QAAA,KAAK,WAAW,eAAe;AAC3B,cAAA,UAAK,iBAAL,mBAAmB;AAAA,IAAM,OAC1B;AACC,YAAA,IAAI,QAAQ,CAAC,YAAY;AAC7B,aAAK,eAAe;AAAA,MAAA,CACrB;AACK,cAAA,UAAK,iBAAL,mBAAmB;AAAA,IAAM;AAAA,EACjC;AAAA,EAGF,OAAO;;AACL,eAAK,iBAAL,mBAAmB;AAAA,EAAK;AAAA,EAG1B,UAAU;;AACR,eAAK,iBAAL,mBAAmB;AACnB,eAAK,UAAL,mBAAY;AAAA,EAAU;AAE1B;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easyv/biz-components",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "type": "module",
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",