@easyv/biz-components 0.0.9 → 0.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.
|
@@ -32,8 +32,8 @@ export interface WebSocketConnectMethodConfig {
|
|
|
32
32
|
mode?: '2pass' | 'online' | 'offline';
|
|
33
33
|
/** 是否是文件上传模式,当前模式暂不支持 */
|
|
34
34
|
isFileMode?: boolean;
|
|
35
|
-
/**
|
|
36
|
-
hotWords?: string
|
|
35
|
+
/** 热词设置,key 是热词,value 是权重 */
|
|
36
|
+
hotWords?: Record<string, number>;
|
|
37
37
|
}
|
|
38
38
|
export interface RecorderConfig {
|
|
39
39
|
/**
|
|
@@ -66,8 +66,13 @@ export interface RecorderConfig {
|
|
|
66
66
|
*/
|
|
67
67
|
onProcess?: (...arg: any[]) => void;
|
|
68
68
|
}
|
|
69
|
+
export interface ErrorInfo {
|
|
70
|
+
type: 'webSocketError' | 'startRecord';
|
|
71
|
+
msg: string;
|
|
72
|
+
isUserNotAllowed?: boolean;
|
|
73
|
+
}
|
|
69
74
|
export interface RecorderResult {
|
|
70
|
-
open: (fn: () => void) => void;
|
|
75
|
+
open: (fn: () => void, errFn?: (errMsg: string, isUserNotAllowed?: boolean) => void) => void;
|
|
71
76
|
close: (fn?: () => void) => void;
|
|
72
77
|
stop: (fn?: (blob: Blob, duration?: number) => void, errFn?: (errMsg: string) => void) => void;
|
|
73
78
|
start: () => void;
|
|
@@ -78,14 +83,14 @@ export interface RecorderResult {
|
|
|
78
83
|
data: Int16Array<ArrayBuffer>;
|
|
79
84
|
};
|
|
80
85
|
}
|
|
81
|
-
export declare const getWebSocketConnectForFunASR: (config: WebSocketConnectMethodConfig
|
|
86
|
+
export declare const getWebSocketConnectForFunASR: (config: WebSocketConnectMethodConfig & {
|
|
87
|
+
onError: (errMsg: string) => void;
|
|
88
|
+
}) => WebSocketConnectMethodInstance;
|
|
82
89
|
interface RecorderFn {
|
|
83
90
|
(config: RecorderConfig): RecorderResult;
|
|
84
91
|
Destroy: () => void;
|
|
85
92
|
}
|
|
86
93
|
export declare class FunASRManager {
|
|
87
|
-
socketConfig: WebSocketConnectMethodConfig;
|
|
88
|
-
recorderConfig: RecorderConfig;
|
|
89
94
|
wsInstance: WebSocketConnectMethodInstance | null;
|
|
90
95
|
recorderInstance: RecorderResult | null;
|
|
91
96
|
sampleBuf: Int16Array<ArrayBuffer>;
|
|
@@ -93,9 +98,17 @@ export declare class FunASRManager {
|
|
|
93
98
|
Recorder: RecorderFn;
|
|
94
99
|
status: 'live' | 'stop';
|
|
95
100
|
timer: NodeJS.Timeout | number;
|
|
96
|
-
|
|
101
|
+
propsOnError: undefined | ((errorInfo: ErrorInfo) => void);
|
|
102
|
+
socketConfig: WebSocketConnectMethodConfig;
|
|
103
|
+
recorderConfig: RecorderConfig;
|
|
104
|
+
constructor(params: {
|
|
105
|
+
socketConfig: WebSocketConnectMethodConfig;
|
|
106
|
+
recorderConfig?: RecorderConfig;
|
|
107
|
+
onError?: (errorInfo: ErrorInfo) => void;
|
|
108
|
+
});
|
|
97
109
|
init(): void;
|
|
98
110
|
destroy(): void;
|
|
111
|
+
onError(errorObj: ErrorInfo): void;
|
|
99
112
|
startRecord(): void;
|
|
100
113
|
stopRecord(): void;
|
|
101
114
|
private recordProcess;
|
|
@@ -1,78 +1,103 @@
|
|
|
1
|
-
var
|
|
2
|
-
var w = (
|
|
3
|
-
var
|
|
4
|
-
import { pcmEnhanceRecorder as
|
|
5
|
-
import { Recorder as
|
|
6
|
-
import { wavEnhanceRecorder as
|
|
1
|
+
var l = Object.defineProperty;
|
|
2
|
+
var w = (i, e, t) => e in i ? l(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
|
|
3
|
+
var o = (i, e, t) => w(i, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { pcmEnhanceRecorder as R } from "./pcm.es.js";
|
|
5
|
+
import { Recorder as I } from "./recorder.es.js";
|
|
6
|
+
import { wavEnhanceRecorder as k } from "./wav.es.js";
|
|
7
7
|
import { WebSocketConnectMethod as S } from "./wsConnecter.es.js";
|
|
8
|
-
const
|
|
9
|
-
class
|
|
10
|
-
constructor(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
this
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
8
|
+
const y = (i) => new S(i);
|
|
9
|
+
class A {
|
|
10
|
+
constructor(e) {
|
|
11
|
+
o(this, "wsInstance", null);
|
|
12
|
+
o(this, "recorderInstance", null);
|
|
13
|
+
o(this, "sampleBuf", new Int16Array());
|
|
14
|
+
o(this, "isRec", !1);
|
|
15
|
+
o(this, "Recorder", I);
|
|
16
|
+
o(this, "status", "stop");
|
|
17
|
+
o(this, "timer", 0);
|
|
18
|
+
o(this, "propsOnError");
|
|
19
|
+
o(this, "socketConfig");
|
|
20
|
+
o(this, "recorderConfig", { type: "pcm" });
|
|
21
|
+
const { socketConfig: t, recorderConfig: r = { type: "pcm" }, onError: n } = e;
|
|
22
|
+
this.socketConfig = t, r && (this.recorderConfig = r), this.init(), this.wsInstance = y({
|
|
23
|
+
...t,
|
|
24
|
+
onError: (s) => {
|
|
25
|
+
this.onError({
|
|
26
|
+
type: "webSocketError",
|
|
27
|
+
msg: s
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}), this.recorderInstance = this.Recorder({
|
|
31
|
+
...r,
|
|
32
|
+
onProcess: (...s) => r.onProcess ? r.onProcess(...s) : this.recordProcess(s[0], s[1], s[2], s[3], s[4], s[5])
|
|
33
|
+
}), this.propsOnError = n;
|
|
22
34
|
}
|
|
23
35
|
init() {
|
|
24
|
-
|
|
36
|
+
R(this.Recorder), k(this.Recorder), this.status = "live";
|
|
25
37
|
}
|
|
26
38
|
destroy() {
|
|
39
|
+
var e;
|
|
40
|
+
(e = this.wsInstance) == null || e.wsStop(), this.Recorder.Destroy(), this.status = "stop";
|
|
41
|
+
}
|
|
42
|
+
onError(e) {
|
|
27
43
|
var t;
|
|
28
|
-
(t = this.
|
|
44
|
+
console.error("FunASRManager error:", e), (t = this.propsOnError) == null || t.call(this, e);
|
|
29
45
|
}
|
|
30
46
|
startRecord() {
|
|
31
|
-
var
|
|
32
|
-
this.status !== "stop" && (((
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
var e, t, r, n;
|
|
48
|
+
this.status !== "stop" && (((t = (e = this.wsInstance) == null ? void 0 : e.getSocket()) == null ? void 0 : t.readyState) !== WebSocket.OPEN && ((r = this.wsInstance) == null || r.wsStart()), (n = this.recorderInstance) == null || n.open(
|
|
49
|
+
() => {
|
|
50
|
+
var s;
|
|
51
|
+
(s = this.recorderInstance) == null || s.start(), this.isRec = !0;
|
|
52
|
+
},
|
|
53
|
+
(s, h) => {
|
|
54
|
+
this.onError({
|
|
55
|
+
type: "startRecord",
|
|
56
|
+
msg: s,
|
|
57
|
+
isUserNotAllowed: h
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
));
|
|
36
61
|
}
|
|
37
62
|
stopRecord() {
|
|
38
|
-
var
|
|
39
|
-
if (this.status === "stop" || ((
|
|
63
|
+
var r;
|
|
64
|
+
if (this.status === "stop" || ((r = this.recorderInstance) == null ? void 0 : r.state) === 0)
|
|
40
65
|
return;
|
|
41
|
-
const
|
|
66
|
+
const e = this;
|
|
42
67
|
this.timer && clearTimeout(this.timer);
|
|
43
|
-
const
|
|
44
|
-
var
|
|
45
|
-
(
|
|
46
|
-
var
|
|
47
|
-
const
|
|
68
|
+
const t = () => {
|
|
69
|
+
var n;
|
|
70
|
+
(n = this.recorderInstance) == null || n.stop(() => {
|
|
71
|
+
var c, a;
|
|
72
|
+
const h = {
|
|
48
73
|
chunk_size: [5, 10, 5],
|
|
49
74
|
wav_name: "h5",
|
|
50
75
|
is_speaking: !1,
|
|
51
76
|
chunk_interval: 10,
|
|
52
|
-
mode:
|
|
77
|
+
mode: e.socketConfig.mode
|
|
53
78
|
};
|
|
54
|
-
|
|
79
|
+
e.sampleBuf.length > 0 && ((c = e.wsInstance) == null || c.wsSend(e.sampleBuf), e.sampleBuf = new Int16Array()), (a = e.wsInstance) == null || a.wsSend(JSON.stringify(h)), this.isRec = !1;
|
|
55
80
|
});
|
|
56
81
|
};
|
|
57
82
|
this.timer = setTimeout(() => {
|
|
58
|
-
|
|
83
|
+
t();
|
|
59
84
|
}, 1e3);
|
|
60
85
|
}
|
|
61
|
-
recordProcess(
|
|
62
|
-
var
|
|
86
|
+
recordProcess(e, t, r, n, s, h) {
|
|
87
|
+
var c, a;
|
|
63
88
|
if (this.status !== "stop" && this.isRec === !0) {
|
|
64
|
-
const
|
|
65
|
-
this.sampleBuf = Int16Array.from([...this.sampleBuf, ...
|
|
66
|
-
const
|
|
67
|
-
for (; this.sampleBuf.length >=
|
|
68
|
-
const
|
|
69
|
-
this.sampleBuf = this.sampleBuf.slice(
|
|
89
|
+
const u = e[e.length - 1], f = new Array(u), d = ((c = this.Recorder) == null ? void 0 : c.SampleData(f, n, 16e3).data) || [];
|
|
90
|
+
this.sampleBuf = Int16Array.from([...this.sampleBuf, ...d]);
|
|
91
|
+
const p = 960;
|
|
92
|
+
for (; this.sampleBuf.length >= p; ) {
|
|
93
|
+
const m = this.sampleBuf.slice(0, p);
|
|
94
|
+
this.sampleBuf = this.sampleBuf.slice(p, this.sampleBuf.length), (a = this.wsInstance) == null || a.wsSend(m);
|
|
70
95
|
}
|
|
71
96
|
}
|
|
72
97
|
}
|
|
73
98
|
}
|
|
74
99
|
export {
|
|
75
|
-
|
|
76
|
-
|
|
100
|
+
A as FunASRManager,
|
|
101
|
+
y as getWebSocketConnectForFunASR
|
|
77
102
|
};
|
|
78
103
|
//# sourceMappingURL=funASRManager.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funASRManager.es.js","sources":["../../../src/utils/funASR/funASRManager.ts"],"sourcesContent":["import { pcmEnhanceRecorder } from './pcm';\nimport { Recorder as OriginRecorder } from './recorder';\nimport { wavEnhanceRecorder } from './wav';\nimport { WebSocketConnectMethod } from './wsConnecter';\n\nexport interface WebSocketConnectMethodInstance {\n wsSend: (msg: string | Int16Array<ArrayBuffer>) => void;\n wsStop: () => void;\n /** 1 is ok, 0 is error */\n wsStart: () => 0 | 1;\n getSocket: () => WebSocket | undefined;\n}\n\nexport interface JsonMsg {\n data: string;\n}\nexport interface WebSocketConnectMethodConfig {\n msgHandle: (jsonMsg: JsonMsg) => void;\n /**\n * 0: 成功\n * 1: 关闭\n * 2: 连接失败\n */\n stateHandle: (state: number) => void;\n uri: string;\n /**\n * 逆文本标准化, 默认 true\n * 标准化文本恢复成符合自然语言表达习惯的形式。\n * 如: “一百二十三元五角” 这样的表述,经过 ITN 处理后,会变成 “123.5 元”\n */\n itn?: boolean;\n /**\n * 默认 2pass\n * 2pass 模式:该模式也叫两步解码模式,通常包含两个步骤。第一步进行快速的初步解码,利用较为简单的语言模型和声学模型快速生成一个大致的识别结果;第二步基于第一步的结果,使用更复杂、更精确的语言模型进行重新解码和优化,从而得到最终更准确的识别结果。\n * online 模式:采用流式处理方式,在语音数据输入的过程中,系统会逐块对语音进行实时识别。只要有新的语音数据块到达,就立即对其进行处理并输出部分识别结果,而无需等待整个语音输入结束。\n * offline 模式:需要等待完整的语音数据全部输入后,才开始进行识别处理。在处理过程中,系统会对整个语音数据进行全面的分析和处理,以得出最终的识别结果。\n */\n mode?: '2pass' | 'online' | 'offline';\n /** 是否是文件上传模式,当前模式暂不支持 */\n isFileMode?: boolean;\n /** 一行一个关键字,空格隔开权重,如 \"阿里巴巴 20\" */\n hotWords?: string;\n}\nexport interface RecorderConfig {\n /**\n * 输出类型:mp3,wav,wav输出文件尺寸超大不推荐使用,但mp3编码支持会导致js文件超大,如果不需支持mp3可以使js文件大幅减小\n * pcm 文件无法直接播放,转成wav文件来播放,已提供转换函数 Recorder.pcm2wav\n */\n type?: 'mp3' | 'wav' | 'pcm';\n /**\n * 比特率 wav:16或8位,MP3:8kbps 1k/s,8kbps 2k/s 录音文件很小\n */\n bitRate?: number;\n /**\n * 采样率,wav格式大小=sampleRate*时间;mp3此项对低比特率有影响,高比特率几乎无影响。\n * wav任意值,mp3取值范围:48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000\n * 采样率参考https://www.cnblogs.com/devin87/p/mp3-recorder.html\n */\n sampleRate?: number;\n /**\n * 有默认值,可以不传 \\n\n * fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd)\n * buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;\n * powerLevel:当前缓冲的音量级别0-100,\n * bufferDuration:已缓冲时长,\n * bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);\n * newBufferIdx:本次回调新增的buffer起始索引;\n * asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。\n * onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),\n * 在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,\n * 处理完成后写回buffers中本次回调的结尾位置。\n */\n onProcess?: (...arg: any[]) => void;\n}\nexport interface RecorderResult {\n open: (fn: () => void) => void;\n close: (fn?: () => void) => void;\n stop: (fn?: (blob: Blob, duration?: number) => void, errFn?: (errMsg: string) => void) => void;\n start: () => void;\n pcm2wav: (...params: any) => void;\n /** 0未录音 1录音中 2暂停 3等待ctx激活 */\n state: 0 | 1 | 2;\n SampleData: (\n array: Array<any>,\n sampleRate: number,\n targetSampleRate: number,\n ) => { data: Int16Array<ArrayBuffer> };\n}\n\nexport const getWebSocketConnectForFunASR = (config: WebSocketConnectMethodConfig) => {\n return new WebSocketConnectMethod(config) as unknown as WebSocketConnectMethodInstance;\n};\n\ninterface RecorderFn {\n (config: RecorderConfig): RecorderResult;\n Destroy: () => void;\n}\n\nexport class FunASRManager {\n wsInstance: WebSocketConnectMethodInstance | null = null;\n recorderInstance: RecorderResult | null = null;\n sampleBuf = new Int16Array();\n isRec = false;\n Recorder = OriginRecorder as RecorderFn;\n status: 'live' | 'stop' = 'stop';\n timer: NodeJS.Timeout | number = 0;\n\n constructor(\n public socketConfig: WebSocketConnectMethodConfig,\n public recorderConfig: RecorderConfig = { type: 'pcm' },\n ) {\n console.log('%c 🐱 cat ==== fun asr manager ', 'color: orange; font-size: 16px;', this);\n this.init();\n this.wsInstance = getWebSocketConnectForFunASR(socketConfig);\n this.recorderInstance = this.Recorder({\n ...recorderConfig,\n onProcess: (...args) => {\n if (recorderConfig.onProcess) {\n return recorderConfig.onProcess(...args);\n }\n return this.recordProcess(args[0], args[1], args[2], args[3], args[4], args[5]);\n },\n }) as unknown as RecorderResult;\n }\n\n init() {\n pcmEnhanceRecorder(this.Recorder);\n wavEnhanceRecorder(this.Recorder);\n this.status = 'live';\n }\n\n destroy() {\n this.wsInstance?.wsStop();\n this.Recorder.Destroy();\n this.status = 'stop';\n }\n\n public startRecord() {\n if (this.status === 'stop') {\n return;\n }\n if (this.wsInstance?.getSocket()?.readyState !== WebSocket.OPEN) {\n this.wsInstance?.wsStart();\n }\n this.recorderInstance?.open(() => {\n this.recorderInstance?.start();\n this.isRec = true;\n });\n }\n public stopRecord() {\n if (this.status === 'stop' || this.recorderInstance?.state === 0) {\n return;\n }\n const that = this;\n if (this.timer) {\n clearTimeout(this.timer);\n }\n const stopFn = () => {\n this.recorderInstance?.stop(() => {\n const chunk_size = [5, 10, 5];\n const request = {\n chunk_size: chunk_size,\n wav_name: 'h5',\n is_speaking: false,\n chunk_interval: 10,\n mode: that.socketConfig.mode,\n };\n if (that.sampleBuf.length > 0) {\n that.wsInstance?.wsSend(that.sampleBuf);\n console.log('sampleBuf.length' + that.sampleBuf.length);\n that.sampleBuf = new Int16Array();\n }\n that.wsInstance?.wsSend(JSON.stringify(request));\n this.isRec = false;\n });\n };\n // 延迟 1s 等待录音结束\n this.timer = setTimeout(() => {\n stopFn();\n }, 1000);\n }\n\n private recordProcess(\n buffer: string | any[],\n _powerLevel: any,\n _bufferDuration: any,\n bufferSampleRate: number,\n _newBufferIdx: any,\n _asyncEnd: any,\n ) {\n if (this.status === 'stop') {\n return;\n }\n if (this.isRec === true) {\n const data_48k = buffer[buffer.length - 1];\n\n const array_48k = new Array(data_48k);\n const data_16k =\n (this.Recorder as any)?.SampleData(array_48k, bufferSampleRate, 16000).data || [];\n\n this.sampleBuf = Int16Array.from([...this.sampleBuf, ...data_16k]);\n const chunk_size = 960; // for asr chunk_size [5, 10, 5]\n while (this.sampleBuf.length >= chunk_size) {\n const sendBuf = this.sampleBuf.slice(0, chunk_size);\n this.sampleBuf = this.sampleBuf.slice(chunk_size, this.sampleBuf.length);\n this.wsInstance?.wsSend(sendBuf);\n }\n }\n }\n}\n"],"names":["getWebSocketConnectForFunASR","config","WebSocketConnectMethod","FunASRManager","socketConfig","recorderConfig","__publicField","OriginRecorder","args","pcmEnhanceRecorder","wavEnhanceRecorder","_a","_b","_c","_d","that","stopFn","request","buffer","_powerLevel","_bufferDuration","bufferSampleRate","_newBufferIdx","_asyncEnd","data_48k","array_48k","data_16k","chunk_size","sendBuf"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"funASRManager.es.js","sources":["../../../src/utils/funASR/funASRManager.ts"],"sourcesContent":["import { pcmEnhanceRecorder } from './pcm';\nimport { Recorder as OriginRecorder } from './recorder';\nimport { wavEnhanceRecorder } from './wav';\nimport { WebSocketConnectMethod } from './wsConnecter';\n\nexport interface WebSocketConnectMethodInstance {\n wsSend: (msg: string | Int16Array<ArrayBuffer>) => void;\n wsStop: () => void;\n /** 1 is ok, 0 is error */\n wsStart: () => 0 | 1;\n getSocket: () => WebSocket | undefined;\n}\n\nexport interface JsonMsg {\n data: string;\n}\nexport interface WebSocketConnectMethodConfig {\n msgHandle: (jsonMsg: JsonMsg) => void;\n /**\n * 0: 成功\n * 1: 关闭\n * 2: 连接失败\n */\n stateHandle: (state: number) => void;\n uri: string;\n /**\n * 逆文本标准化, 默认 true\n * 标准化文本恢复成符合自然语言表达习惯的形式。\n * 如: “一百二十三元五角” 这样的表述,经过 ITN 处理后,会变成 “123.5 元”\n */\n itn?: boolean;\n /**\n * 默认 2pass\n * 2pass 模式:该模式也叫两步解码模式,通常包含两个步骤。第一步进行快速的初步解码,利用较为简单的语言模型和声学模型快速生成一个大致的识别结果;第二步基于第一步的结果,使用更复杂、更精确的语言模型进行重新解码和优化,从而得到最终更准确的识别结果。\n * online 模式:采用流式处理方式,在语音数据输入的过程中,系统会逐块对语音进行实时识别。只要有新的语音数据块到达,就立即对其进行处理并输出部分识别结果,而无需等待整个语音输入结束。\n * offline 模式:需要等待完整的语音数据全部输入后,才开始进行识别处理。在处理过程中,系统会对整个语音数据进行全面的分析和处理,以得出最终的识别结果。\n */\n mode?: '2pass' | 'online' | 'offline';\n /** 是否是文件上传模式,当前模式暂不支持 */\n isFileMode?: boolean;\n /** 热词设置,key 是热词,value 是权重 */\n hotWords?: Record<string, number>;\n}\nexport interface RecorderConfig {\n /**\n * 输出类型:mp3,wav,wav输出文件尺寸超大不推荐使用,但mp3编码支持会导致js文件超大,如果不需支持mp3可以使js文件大幅减小\n * pcm 文件无法直接播放,转成wav文件来播放,已提供转换函数 Recorder.pcm2wav\n */\n type?: 'mp3' | 'wav' | 'pcm';\n /**\n * 比特率 wav:16或8位,MP3:8kbps 1k/s,8kbps 2k/s 录音文件很小\n */\n bitRate?: number;\n /**\n * 采样率,wav格式大小=sampleRate*时间;mp3此项对低比特率有影响,高比特率几乎无影响。\n * wav任意值,mp3取值范围:48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000\n * 采样率参考https://www.cnblogs.com/devin87/p/mp3-recorder.html\n */\n sampleRate?: number;\n /**\n * 有默认值,可以不传 \\n\n * fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd)\n * buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;\n * powerLevel:当前缓冲的音量级别0-100,\n * bufferDuration:已缓冲时长,\n * bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);\n * newBufferIdx:本次回调新增的buffer起始索引;\n * asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。\n * onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),\n * 在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,\n * 处理完成后写回buffers中本次回调的结尾位置。\n */\n onProcess?: (...arg: any[]) => void;\n}\nexport interface ErrorInfo {\n type: 'webSocketError' | 'startRecord';\n msg: string;\n isUserNotAllowed?: boolean;\n}\nexport interface RecorderResult {\n open: (fn: () => void, errFn?: (errMsg: string, isUserNotAllowed?: boolean) => void) => void;\n close: (fn?: () => void) => void;\n stop: (fn?: (blob: Blob, duration?: number) => void, errFn?: (errMsg: string) => void) => void;\n start: () => void;\n pcm2wav: (...params: any) => void;\n /** 0未录音 1录音中 2暂停 3等待ctx激活 */\n state: 0 | 1 | 2;\n SampleData: (\n array: Array<any>,\n sampleRate: number,\n targetSampleRate: number,\n ) => { data: Int16Array<ArrayBuffer> };\n}\n\nexport const getWebSocketConnectForFunASR = (\n config: WebSocketConnectMethodConfig & {\n onError: (errMsg: string) => void;\n },\n) => {\n return new WebSocketConnectMethod(config) as unknown as WebSocketConnectMethodInstance;\n};\n\ninterface RecorderFn {\n (config: RecorderConfig): RecorderResult;\n Destroy: () => void;\n}\n\nexport class FunASRManager {\n wsInstance: WebSocketConnectMethodInstance | null = null;\n recorderInstance: RecorderResult | null = null;\n sampleBuf = new Int16Array();\n isRec = false;\n Recorder = OriginRecorder as RecorderFn;\n status: 'live' | 'stop' = 'stop';\n timer: NodeJS.Timeout | number = 0;\n propsOnError: undefined | ((errorInfo: ErrorInfo) => void);\n socketConfig: WebSocketConnectMethodConfig;\n recorderConfig: RecorderConfig = { type: 'pcm' };\n\n constructor(params: {\n socketConfig: WebSocketConnectMethodConfig;\n recorderConfig?: RecorderConfig;\n onError?: (errorInfo: ErrorInfo) => void;\n }) {\n const { socketConfig, recorderConfig = { type: 'pcm' }, onError } = params;\n this.socketConfig = socketConfig;\n if (recorderConfig) {\n this.recorderConfig = recorderConfig;\n }\n this.init();\n this.wsInstance = getWebSocketConnectForFunASR({\n ...socketConfig,\n onError: (errMsg) => {\n this.onError({\n type: 'webSocketError',\n msg: errMsg,\n });\n },\n });\n this.recorderInstance = this.Recorder({\n ...recorderConfig,\n onProcess: (...args) => {\n if (recorderConfig.onProcess) {\n return recorderConfig.onProcess(...args);\n }\n return this.recordProcess(args[0], args[1], args[2], args[3], args[4], args[5]);\n },\n }) as unknown as RecorderResult;\n this.propsOnError = onError;\n }\n\n init() {\n pcmEnhanceRecorder(this.Recorder);\n wavEnhanceRecorder(this.Recorder);\n this.status = 'live';\n }\n\n destroy() {\n this.wsInstance?.wsStop();\n this.Recorder.Destroy();\n this.status = 'stop';\n }\n\n onError(errorObj: ErrorInfo) {\n console.error('FunASRManager error:', errorObj);\n this.propsOnError?.(errorObj);\n }\n\n public startRecord() {\n if (this.status === 'stop') {\n return;\n }\n if (this.wsInstance?.getSocket()?.readyState !== WebSocket.OPEN) {\n this.wsInstance?.wsStart();\n }\n this.recorderInstance?.open(\n () => {\n this.recorderInstance?.start();\n this.isRec = true;\n },\n (errMsg, isUserNotAllowed) => {\n this.onError({\n type: 'startRecord',\n msg: errMsg,\n isUserNotAllowed,\n });\n },\n );\n }\n public stopRecord() {\n if (this.status === 'stop' || this.recorderInstance?.state === 0) {\n return;\n }\n const that = this;\n if (this.timer) {\n clearTimeout(this.timer);\n }\n const stopFn = () => {\n this.recorderInstance?.stop(() => {\n const chunk_size = [5, 10, 5];\n const request = {\n chunk_size: chunk_size,\n wav_name: 'h5',\n is_speaking: false,\n chunk_interval: 10,\n mode: that.socketConfig.mode,\n };\n if (that.sampleBuf.length > 0) {\n that.wsInstance?.wsSend(that.sampleBuf);\n that.sampleBuf = new Int16Array();\n }\n that.wsInstance?.wsSend(JSON.stringify(request));\n this.isRec = false;\n });\n };\n // 延迟 1s 等待录音结束\n this.timer = setTimeout(() => {\n stopFn();\n }, 1000);\n }\n\n private recordProcess(\n buffer: string | any[],\n _powerLevel: any,\n _bufferDuration: any,\n bufferSampleRate: number,\n _newBufferIdx: any,\n _asyncEnd: any,\n ) {\n if (this.status === 'stop') {\n return;\n }\n if (this.isRec === true) {\n const data_48k = buffer[buffer.length - 1];\n\n const array_48k = new Array(data_48k);\n const data_16k =\n (this.Recorder as any)?.SampleData(array_48k, bufferSampleRate, 16000).data || [];\n\n this.sampleBuf = Int16Array.from([...this.sampleBuf, ...data_16k]);\n const chunk_size = 960; // for asr chunk_size [5, 10, 5]\n while (this.sampleBuf.length >= chunk_size) {\n const sendBuf = this.sampleBuf.slice(0, chunk_size);\n this.sampleBuf = this.sampleBuf.slice(chunk_size, this.sampleBuf.length);\n this.wsInstance?.wsSend(sendBuf);\n }\n }\n }\n}\n"],"names":["getWebSocketConnectForFunASR","config","WebSocketConnectMethod","FunASRManager","params","__publicField","OriginRecorder","socketConfig","recorderConfig","onError","errMsg","args","pcmEnhanceRecorder","wavEnhanceRecorder","_a","errorObj","_b","_c","_d","isUserNotAllowed","that","stopFn","request","buffer","_powerLevel","_bufferDuration","bufferSampleRate","_newBufferIdx","_asyncEnd","data_48k","array_48k","data_16k","chunk_size","sendBuf"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
function
|
|
1
|
+
function h(t) {
|
|
2
2
|
let e;
|
|
3
|
-
const c = t.msgHandle,
|
|
3
|
+
const c = t.msgHandle, r = t.stateHandle, l = t.onError;
|
|
4
4
|
this.getSocket = function() {
|
|
5
5
|
return e;
|
|
6
6
|
}, this.wsStart = function() {
|
|
@@ -9,22 +9,32 @@ function d(t) {
|
|
|
9
9
|
console.log("Uri" + n);
|
|
10
10
|
else
|
|
11
11
|
return alert("请检查wss地址正确性"), 0;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
if (e && e.readyState === WebSocket.OPEN)
|
|
13
|
+
return 1;
|
|
14
|
+
if ("WebSocket" in window) {
|
|
15
|
+
try {
|
|
16
|
+
e = new WebSocket(n), e.onopen = function(o) {
|
|
17
|
+
u(o);
|
|
18
|
+
}, e.onclose = function(o) {
|
|
19
|
+
console.log("onclose ws!"), a(o);
|
|
20
|
+
}, e.onmessage = function(o) {
|
|
21
|
+
f(o);
|
|
22
|
+
}, e.onerror = function(o) {
|
|
23
|
+
d(o);
|
|
24
|
+
};
|
|
25
|
+
} catch (o) {
|
|
26
|
+
l(o.message);
|
|
27
|
+
}
|
|
28
|
+
return 1;
|
|
29
|
+
} else
|
|
30
|
+
return alert("当前浏览器不支持 WebSocket"), 0;
|
|
21
31
|
}, this.wsStop = function() {
|
|
22
32
|
e != null && (console.log("stop ws!"), e.close());
|
|
23
33
|
}, this.wsSend = function(n) {
|
|
24
34
|
if (e != null && e.readyState === 1)
|
|
25
35
|
return e.send(n);
|
|
26
36
|
};
|
|
27
|
-
function
|
|
37
|
+
function u(n) {
|
|
28
38
|
const s = {
|
|
29
39
|
chunk_size: [5, 10, 5],
|
|
30
40
|
wav_name: "h5",
|
|
@@ -34,20 +44,20 @@ function d(t) {
|
|
|
34
44
|
mode: t.mode || "2pass"
|
|
35
45
|
};
|
|
36
46
|
t.isFileMode && (s.wav_format = file_ext, file_ext == "wav" && (s.wav_format = "PCM", s.audio_fs = file_sample_rate));
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
function u(n) {
|
|
41
|
-
i(1);
|
|
47
|
+
const i = t.hotWords ? JSON.stringify(t.hotWords) : "";
|
|
48
|
+
i != null && (s.hotwords = i), console.log(JSON.stringify(s)), e.send(JSON.stringify(s)), console.log("连接成功"), r(0);
|
|
42
49
|
}
|
|
43
50
|
function a(n) {
|
|
44
|
-
|
|
51
|
+
r(1);
|
|
45
52
|
}
|
|
46
53
|
function f(n) {
|
|
47
|
-
|
|
54
|
+
c(n);
|
|
55
|
+
}
|
|
56
|
+
function d(n) {
|
|
57
|
+
console.error("socket error:", n), r(2);
|
|
48
58
|
}
|
|
49
59
|
}
|
|
50
60
|
export {
|
|
51
|
-
|
|
61
|
+
h as WebSocketConnectMethod
|
|
52
62
|
};
|
|
53
63
|
//# sourceMappingURL=wsConnecter.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsConnecter.es.js","sources":["../../../src/utils/funASR/wsConnecter.js"],"sourcesContent":["/**\n * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights\n * Reserved. MIT License (https://opensource.org/licenses/MIT)\n */\n/* 2021-2023 by zhaoming,mali aihealthx.com */\n\nexport function WebSocketConnectMethod(config) {\n //定义socket连接方法类\n\n let speechSokt;\n let connKeeperID;\n\n const msgHandle = config.msgHandle;\n const stateHandle = config.stateHandle;\n\n this.getSocket = function () {\n return speechSokt;\n };\n\n this.wsStart = function () {\n const Uri = config.uri; //\"wss://111.205.137.58:5821/wss/\" //设置wss asr online接口地址 如 wss://X.X.X.X:port/wss/\n if (Uri.match(/wss:\\S*|ws:\\S*/)) {\n console.log('Uri' + Uri);\n } else {\n alert('请检查wss地址正确性');\n return 0;\n }\n\n if (speechSokt && speechSokt.readyState === WebSocket.OPEN) {\n return 1;\n }\n\n if ('WebSocket' in window) {\n speechSokt = new WebSocket(Uri); // 定义socket连接对象\n
|
|
1
|
+
{"version":3,"file":"wsConnecter.es.js","sources":["../../../src/utils/funASR/wsConnecter.js"],"sourcesContent":["/**\n * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights\n * Reserved. MIT License (https://opensource.org/licenses/MIT)\n */\n/* 2021-2023 by zhaoming,mali aihealthx.com */\n\nexport function WebSocketConnectMethod(config) {\n //定义socket连接方法类\n\n let speechSokt;\n let connKeeperID;\n\n const msgHandle = config.msgHandle;\n const stateHandle = config.stateHandle;\n const propsOnError = config.onError;\n\n this.getSocket = function () {\n return speechSokt;\n };\n\n this.wsStart = function () {\n const Uri = config.uri; //\"wss://111.205.137.58:5821/wss/\" //设置wss asr online接口地址 如 wss://X.X.X.X:port/wss/\n if (Uri.match(/wss:\\S*|ws:\\S*/)) {\n console.log('Uri' + Uri);\n } else {\n alert('请检查wss地址正确性');\n return 0;\n }\n\n if (speechSokt && speechSokt.readyState === WebSocket.OPEN) {\n return 1;\n }\n\n if ('WebSocket' in window) {\n try {\n speechSokt = new WebSocket(Uri); // 定义socket连接对象\n speechSokt.onopen = function (e) {\n onOpen(e);\n }; // 定义响应函数\n speechSokt.onclose = function (e) {\n console.log('onclose ws!');\n onClose(e);\n };\n speechSokt.onmessage = function (e) {\n onMessage(e);\n };\n speechSokt.onerror = function (e) {\n onError(e);\n };\n } catch (error) {\n propsOnError(error.message);\n }\n return 1;\n } else {\n alert('当前浏览器不支持 WebSocket');\n return 0;\n }\n };\n\n // 定义停止与发送函数\n this.wsStop = function () {\n if (speechSokt != undefined) {\n console.log('stop ws!');\n speechSokt.close();\n }\n };\n\n this.wsSend = function (oneData) {\n if (speechSokt == undefined) return;\n if (speechSokt.readyState === 1) {\n // 0:CONNECTING, 1:OPEN, 2:CLOSING, 3:CLOSED\n\n return speechSokt.send(oneData);\n }\n };\n\n // SOCEKT连接中的消息与状态响应\n function onOpen(e) {\n // 发送json\n const chunk_size = [5, 10, 5];\n const request = {\n chunk_size: chunk_size,\n wav_name: 'h5',\n is_speaking: true,\n chunk_interval: 10,\n itn: config.itn || true,\n mode: config.mode || '2pass',\n };\n if (config.isFileMode) {\n request.wav_format = file_ext;\n if (file_ext == 'wav') {\n request.wav_format = 'PCM';\n request.audio_fs = file_sample_rate;\n }\n }\n\n const hotwords = config.hotWords ? JSON.stringify(config.hotWords) : '';\n\n if (hotwords != null) {\n request.hotwords = hotwords;\n }\n console.log(JSON.stringify(request));\n speechSokt.send(JSON.stringify(request));\n console.log('连接成功');\n stateHandle(0);\n }\n\n function onClose(e) {\n stateHandle(1);\n }\n\n function onMessage(e) {\n msgHandle(e);\n }\n\n function onError(e) {\n console.error('socket error:', e);\n stateHandle(2);\n }\n}\n"],"names":["WebSocketConnectMethod","config","speechSokt","msgHandle","stateHandle","propsOnError","Uri","e","onOpen","onClose","onMessage","onError","error","oneData","request","hotwords"],"mappings":"AAMO,SAASA,EAAuBC,GAAQ;AAG7C,MAAIC;AAGJ,QAAMC,IAAYF,EAAO,WACnBG,IAAcH,EAAO,aACrBI,IAAeJ,EAAO;AAE5B,OAAK,YAAY,WAAY;AAC3B,WAAOC;AAAA,EACR,GAED,KAAK,UAAU,WAAY;AACzB,UAAMI,IAAML,EAAO;AACnB,QAAIK,EAAI,MAAM,gBAAgB;AAC5B,cAAQ,IAAI,QAAQA,CAAG;AAAA;AAEvB,mBAAM,aAAa,GACZ;AAGT,QAAIJ,KAAcA,EAAW,eAAe,UAAU;AACpD,aAAO;AAGT,QAAI,eAAe,QAAQ;AACzB,UAAI;AACF,QAAAA,IAAa,IAAI,UAAUI,CAAG,GAC9BJ,EAAW,SAAS,SAAUK,GAAG;AAC/B,UAAAC,EAAOD,CAAC;AAAA,QAClB,GACQL,EAAW,UAAU,SAAUK,GAAG;AAChC,kBAAQ,IAAI,aAAa,GACzBE,EAAQF,CAAC;AAAA,QACV,GACDL,EAAW,YAAY,SAAUK,GAAG;AAClC,UAAAG,EAAUH,CAAC;AAAA,QACZ,GACDL,EAAW,UAAU,SAAUK,GAAG;AAChC,UAAAI,EAAQJ,CAAC;AAAA,QACV;AAAA,MACF,SAAQK,GAAO;AACd,QAAAP,EAAaO,EAAM,OAAO;AAAA,MAClC;AACM,aAAO;AAAA,IACb;AACM,mBAAM,oBAAoB,GACnB;AAAA,EAEV,GAGD,KAAK,SAAS,WAAY;AACxB,IAAIV,KAAc,SAChB,QAAQ,IAAI,UAAU,GACtBA,EAAW,MAAO;AAAA,EAErB,GAED,KAAK,SAAS,SAAUW,GAAS;AAC/B,QAAIX,KAAc,QACdA,EAAW,eAAe;AAG5B,aAAOA,EAAW,KAAKW,CAAO;AAAA,EAEjC;AAGD,WAASL,EAAOD,GAAG;AAGjB,UAAMO,IAAU;AAAA,MACd,YAFiB,CAAC,GAAG,IAAI,CAAC;AAAA,MAG1B,UAAU;AAAA,MACV,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,KAAKb,EAAO,OAAO;AAAA,MACnB,MAAMA,EAAO,QAAQ;AAAA,IACtB;AACD,IAAIA,EAAO,eACTa,EAAQ,aAAa,UACjB,YAAY,UACdA,EAAQ,aAAa,OACrBA,EAAQ,WAAW;AAIvB,UAAMC,IAAWd,EAAO,WAAW,KAAK,UAAUA,EAAO,QAAQ,IAAI;AAErE,IAAIc,KAAY,SACdD,EAAQ,WAAWC,IAErB,QAAQ,IAAI,KAAK,UAAUD,CAAO,CAAC,GACnCZ,EAAW,KAAK,KAAK,UAAUY,CAAO,CAAC,GACvC,QAAQ,IAAI,MAAM,GAClBV,EAAY,CAAC;AAAA,EACjB;AAEE,WAASK,EAAQF,GAAG;AAClB,IAAAH,EAAY,CAAC;AAAA,EACjB;AAEE,WAASM,EAAUH,GAAG;AACpB,IAAAJ,EAAUI,CAAC;AAAA,EACf;AAEE,WAASI,EAAQJ,GAAG;AAClB,YAAQ,MAAM,iBAAiBA,CAAC,GAChCH,EAAY,CAAC;AAAA,EACjB;AACA;"}
|