@easyv/biz-components 0.0.46 → 0.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index.es2.js +2 -2
- package/dist/_virtual/index.es3.js +2 -2
- package/dist/_virtual/index.es4.js +2 -2
- package/dist/node_modules/.pnpm/classnames@2.3.2/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/.pnpm/co-web-worker@1.0.1/node_modules/co-web-worker/index.es.js +1 -1
- package/dist/node_modules/.pnpm/prop-types@15.8.1/node_modules/prop-types/index.es.js +1 -1
- package/dist/utils/voskBrowserManager/AudioManager/AudioManager.d.ts +31 -0
- package/dist/utils/voskBrowserManager/AudioManager/test/audioManager.cy.d.ts +1 -0
- package/dist/utils/voskBrowserManager/AudioManager/types.d.ts +2 -0
- package/dist/utils/voskBrowserManager/index.d.ts +1 -0
- package/dist/utils/voskBrowserManager/test/voskBrowserManager.cy.d.ts +1 -0
- package/dist/utils/voskBrowserManager/voskBrowserManager.d.ts +24 -0
- package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.es.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getDefaultExportFromCjs } from "../../../../../_virtual/_commonjsHelpers.es.js";
|
|
2
|
-
import { __module as classnames$1 } from "../../../../../_virtual/index.
|
|
2
|
+
import { __module as classnames$1 } from "../../../../../_virtual/index.es4.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.
|
|
2
|
+
import { __module as coWebWorker } from "../../../../../_virtual/index.es2.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.
|
|
2
|
+
import { __module as propTypes } from "../../../../../_virtual/index.es3.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";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SampleRate } from './types';
|
|
2
|
+
|
|
3
|
+
export interface AudiManagerConfig {
|
|
4
|
+
/** 一个转换成 string js 文件。其内容要符合 AudioWorkletProcessor 的要求。
|
|
5
|
+
* - 需使用 registerProcessor 注册,第一个参数为 “audio-worklet-processor”,如: registerProcessor('audio-worklet-processor', audioToFloat32Processor);
|
|
6
|
+
* - 参考:https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletProcessor
|
|
7
|
+
*/
|
|
8
|
+
workletProcessor?: string;
|
|
9
|
+
/** 采样率(每秒采样数)的浮点数,常用值:16000, 32000, 44100, 48000 */
|
|
10
|
+
sampleRate?: SampleRate;
|
|
11
|
+
onFrameRecorded?: (data: Float32Array) => void;
|
|
12
|
+
onStart?: () => void;
|
|
13
|
+
onStop?: () => void;
|
|
14
|
+
frameSize?: number;
|
|
15
|
+
}
|
|
16
|
+
/** 对实时音频录制进行管理。 */
|
|
17
|
+
export declare class AudioManager {
|
|
18
|
+
workletUrl?: string;
|
|
19
|
+
onFrameRecorded?: (data: Float32Array) => void;
|
|
20
|
+
sampleRate?: SampleRate;
|
|
21
|
+
status: 'init' | 'starting' | 'running' | 'closed';
|
|
22
|
+
audioContext?: AudioContext;
|
|
23
|
+
mediaSource?: MediaStreamAudioSourceNode;
|
|
24
|
+
mediaStream?: MediaStream;
|
|
25
|
+
config: AudiManagerConfig;
|
|
26
|
+
constructor(config: AudiManagerConfig);
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
close(): Promise<void> | undefined;
|
|
30
|
+
destroy(): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AudioManager/AudioManager';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AudiManagerConfig, AudioManager } from './AudioManager/AudioManager';
|
|
2
|
+
import { SampleRate } from './AudioManager/types';
|
|
3
|
+
import type * as Vosk from 'vosk-browser';
|
|
4
|
+
interface VoskBrowserManagerConfig extends AudiManagerConfig {
|
|
5
|
+
vosk: typeof Vosk;
|
|
6
|
+
modelUrl: string;
|
|
7
|
+
/** 加载模型等初始化配置完成后,自动开始监听 */
|
|
8
|
+
autoStart?: boolean;
|
|
9
|
+
onInitialized?: () => void;
|
|
10
|
+
onResult?: (text: string) => void;
|
|
11
|
+
onPartialResult?: (text: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare class VoskBrowserManager {
|
|
14
|
+
config: VoskBrowserManagerConfig;
|
|
15
|
+
/** 采样率(每秒采样数)的浮点数,常用值:16000, 32000, 44100, 48000 */
|
|
16
|
+
sampleRate: SampleRate;
|
|
17
|
+
audioManager?: AudioManager;
|
|
18
|
+
autoStart: boolean;
|
|
19
|
+
constructor(config: VoskBrowserManagerConfig);
|
|
20
|
+
init(vosk: typeof Vosk): Promise<void>;
|
|
21
|
+
start(): void;
|
|
22
|
+
stop(): void;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecorderManager.es.js","sources":["../../../../src/utils/xunFeiVoice/RecorderManager/RecorderManager.js"],"sourcesContent":["/**\n * 录音管理器 - 用于处理音频录制及处理\n */\nimport CrossOriginWorker from 'co-web-worker';\nimport { requestMicrophonePermission } from '../utils';\nimport workerJsString from './processorSource/processor.worker.js?raw';\nimport workletJsString from './processorSource/processor.worklet.js?raw';\n\nconst { AudioWorkletNode } = window;\nconst isAudioWorkletSupported = !!AudioWorkletNode;\n\n/** @type {(type: 'worker' | 'worklet') => string} */\nconst generateWorkletUrl = (type) => {\n const jsStr = type === 'worker' ? workerJsString : workletJsString;\n const blob = new Blob([jsStr], { type: 'application/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n return scriptUrl;\n};\n\n/**\n * 初始化音频处理器\n * @param {AudioContext} audioContext\n * @returns {Promise<AudioWorkletNode|{port: Worker}>}\n */\nasync function initializeAudioProcessor(audioContext) {\n if (isAudioWorkletSupported) {\n if (audioContext.state !== 'closed') {\n await audioContext.audioWorklet.addModule(generateWorkletUrl('worklet'));\n return new AudioWorkletNode(audioContext, 'processor-worklet');\n }\n throw new Error('AudioWorkletNode can not be created, when audioContext is closed.');\n }\n\n const worker = new CrossOriginWorker(generateWorkletUrl('worker'));\n return { port: worker };\n}\n\nconst NOOP = () => {};\n/**\n *
|
|
1
|
+
{"version":3,"file":"RecorderManager.es.js","sources":["../../../../src/utils/xunFeiVoice/RecorderManager/RecorderManager.js"],"sourcesContent":["/**\n * 录音管理器 - 用于处理音频录制及处理\n */\nimport CrossOriginWorker from 'co-web-worker';\nimport { requestMicrophonePermission } from '../utils';\nimport workerJsString from './processorSource/processor.worker.js?raw';\nimport workletJsString from './processorSource/processor.worklet.js?raw';\n\nconst { AudioWorkletNode } = window;\nconst isAudioWorkletSupported = !!AudioWorkletNode;\n\n/** @type {(type: 'worker' | 'worklet') => string} */\nconst generateWorkletUrl = (type) => {\n const jsStr = type === 'worker' ? workerJsString : workletJsString;\n const blob = new Blob([jsStr], { type: 'application/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n return scriptUrl;\n};\n\n/**\n * 初始化音频处理器\n * @param {AudioContext} audioContext\n * @returns {Promise<AudioWorkletNode|{port: Worker}>}\n */\nasync function initializeAudioProcessor(audioContext) {\n if (isAudioWorkletSupported) {\n if (audioContext.state !== 'closed') {\n await audioContext.audioWorklet.addModule(generateWorkletUrl('worklet'));\n return new AudioWorkletNode(audioContext, 'processor-worklet');\n }\n throw new Error('AudioWorkletNode can not be created, when audioContext is closed.');\n }\n\n const worker = new CrossOriginWorker(generateWorkletUrl('worker'));\n return { port: worker };\n}\n\nconst NOOP = () => {};\n/**\n * 录音管理器,仅针对讯飞语音\n */\nexport class RecorderManager {\n /** @type {Array<ArrayBuffer>} */\n audioBuffers = [];\n /** @type {(params: RecordFrameInfo) => void} */\n onFrameRecorded = NOOP;\n onStart = NOOP;\n /** @type {(currStatus: 'stop' | 'closed' | 'initialized' | 'initializing' | 'default') => void} */\n onStop = NOOP;\n /** @type {(data: Array<ArrayBuffer>) => void} */\n onLastFrame = NOOP;\n /** @type {'stop' | 'closed' | 'initialized' | 'initializing' | 'default'} */\n status = 'default';\n /** @type {AudioContext} */\n audioContext = null;\n /** @type {AudioWorkletNode} */\n audioWorkletNode = null;\n /** @type {MediaStreamAudioSourceNode} */\n mediaSource = null;\n /** @type {MediaStream} */\n mediaStream = null;\n constructor() {}\n\n /**\n * 开始录音\n * @param {{\n * sampleRate?: number,\n * frameSize?: number,\n * arrayBufferType?: string\n * }} config 录音配置\n */\n async start(config) {\n this.status = 'initializing';\n try {\n this.audioBuffers = [];\n // 获取音频流并创建处理节点\n const mediaStream = await requestMicrophonePermission();\n this.mediaStream = mediaStream;\n const audioContext = this.createAudioContext(mediaStream, config.sampleRate);\n this.audioContext = audioContext;\n this.audioWorkletNode = await initializeAudioProcessor(audioContext);\n // 防止开始后立刻结束,资源没有得到释放。\n if (this.status === 'stop' || this.status === 'closed') {\n this.close();\n return;\n }\n\n // 初始化音频处理\n this.setupAudioProcessing(audioContext, mediaStream, this.audioWorkletNode, config);\n\n this.status = 'initialized';\n this.onStart?.();\n } catch (error) {\n console.error('Failed to start recording:', error);\n throw error;\n }\n }\n\n /**\n * 创建音频上下文\n * @private\n */\n createAudioContext(mediaStream, targetSampleRate) {\n try {\n const context = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: targetSampleRate,\n });\n context.createMediaStreamSource(mediaStream);\n return context;\n } catch (error) {\n // 回退处理:当目标采样率不支持时使用默认采样率\n const fallbackContext = new (window.AudioContext || window.webkitAudioContext)();\n console.warn(`Using default sample rate: ${fallbackContext.sampleRate}`);\n fallbackContext.createMediaStreamSource(mediaStream);\n return fallbackContext;\n }\n }\n\n /**\n * 配置音频处理管线\n * @private\n */\n setupAudioProcessing(audioContext, mediaStream, audioWorkletNode, config) {\n // 创建媒体流源节点\n const mediaSource = audioContext.createMediaStreamSource(mediaStream);\n this.mediaSource = mediaSource;\n\n // 配置处理器通信\n audioWorkletNode.port.postMessage({\n type: 'init',\n data: {\n frameSize: config.frameSize,\n toSampleRate: config.sampleRate || audioContext.sampleRate,\n fromSampleRate: audioContext.sampleRate,\n arrayBufferType: config.arrayBufferType || 'short16',\n },\n });\n\n // 处理音频数据回调\n audioWorkletNode.port.onmessage = (e) => {\n const { data } = e;\n if (config.frameSize && this.onFrameRecorded) {\n this.onFrameRecorded(data);\n }\n\n if (data.frameBuffer) {\n this.audioBuffers.push(data.frameBuffer);\n }\n\n if (data.isLastFrame) {\n if (!isAudioWorkletSupported) {\n audioWorkletNode.port?.terminate();\n }\n this.mediaSource?.disconnect();\n if (this.audioContext?.state !== 'closed') {\n this.audioContext?.close();\n }\n this.onLastFrame?.(this.audioBuffers);\n }\n };\n\n // 连接音频节点\n if (isAudioWorkletSupported) {\n mediaSource.connect(audioWorkletNode);\n } else {\n const scriptProcessor = audioContext.createScriptProcessor(0, 1, 1);\n scriptProcessor.onaudioprocess = ({ inputBuffer }) => {\n audioWorkletNode.port.postMessage({\n type: 'message',\n data: inputBuffer.getChannelData(0),\n });\n };\n mediaSource.connect(scriptProcessor);\n scriptProcessor.connect(audioContext.destination);\n }\n }\n\n /** 停止录音 */\n stop() {\n this.onStop?.(this.status);\n this.status = 'stop';\n /** 暂停音频上下文对象中的进度,并暂时剥离进程对音频设备硬件的访问权限,减少 CPU 和电池的使用 */\n if (this.audioContext?.state === 'running') {\n this.audioContext.suspend();\n }\n if (this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({ type: 'stop' });\n }\n }\n\n close() {\n this.audioBuffers = [];\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":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@easyv/biz-components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.es.js",
|
|
6
6
|
"module": "dist/index.es.js",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"echarts": "5.4.1",
|
|
27
27
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
28
28
|
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
29
|
-
"socket.io-client": "^4.8.1"
|
|
29
|
+
"socket.io-client": "^4.8.1",
|
|
30
|
+
"vosk-browser": "^0.0.8"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
33
|
"@types/crypto-js": "^4.2.2",
|