ztxkutils 2.10.50 → 2.10.52

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.
@@ -4,4 +4,5 @@ import useTableValidate from './useTableValidate';
4
4
  import useScreenFull from './useScreenFull';
5
5
  import useMutationObserver from './useMutationObserver';
6
6
  import useFileIdToBase64 from './useFileIdToBase64';
7
- export { useTableLinkage, useFetchState, useTableValidate, useScreenFull, useMutationObserver, useFileIdToBase64, };
7
+ import useAsr from './useAsr';
8
+ export { useTableLinkage, useFetchState, useTableValidate, useScreenFull, useMutationObserver, useFileIdToBase64, useAsr, };
@@ -0,0 +1,87 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * 连接讯飞的方法
4
+ * 内部管理状态
5
+ * UNDEFINED 初始化状态
6
+ * CONNECTING 开始准备连接时的状态,会获取ws地址,然后建立ws连接
7
+ * OPEN 表示录音已经开始了,可以发送数据了
8
+ * CLOSED ws连接因为一些异常 发生关闭,需要终止录音
9
+ * CLOSING 表示最后一段录音信息已经接收完毕,可以关闭连接了
10
+ */
11
+ declare type IStatus = 'UNDEFINED' | 'CONNECTING' | 'OPEN' | 'CLOSED' | 'CLOSING';
12
+ interface IRecord {
13
+ /** 开始录音方法 */
14
+ start: () => void;
15
+ /** 关闭录音方法 */
16
+ stop: () => void;
17
+ /** 当前语言 */
18
+ language?: string;
19
+ /** 目标语言 */
20
+ transLanguage?: string;
21
+ }
22
+ export declare function useWs(info?: {
23
+ textResultCallback?: (t: any) => void;
24
+ isDebugger?: boolean;
25
+ getWsUrlRequest?: any;
26
+ }): {
27
+ status: IStatus;
28
+ changeStatus: (s: IStatus) => void;
29
+ connectWebSocket: (recorder: IRecord) => Promise<void>;
30
+ webscoketObjRef: import("react").MutableRefObject<any>;
31
+ resultTextRef: import("react").MutableRefObject<string>;
32
+ };
33
+ /**
34
+ * 录音管理器的相关方法
35
+ */
36
+ export declare function useRecorderManager(options: {
37
+ url?: string;
38
+ startCallback?: () => void;
39
+ frameRecordCallback?: (info?: any) => void;
40
+ stopCallback?: (buffer?: any) => void;
41
+ }): {
42
+ recordRef: import("react").MutableRefObject<any>;
43
+ start: () => Promise<void>;
44
+ stop: () => void;
45
+ };
46
+ /**
47
+ * 定义一个计时器类似的东西
48
+ * 可以开始计时 结束计时
49
+ */
50
+ export declare function useCount(callback: any): {
51
+ start: () => void;
52
+ stop: () => void;
53
+ };
54
+ /**
55
+ * 数据转换
56
+ * 将收到的讯飞语音识别的数据 转换成 标准数据
57
+ */
58
+ export declare function parseWsData(data: any, msgCallback: any, callback: any, isDebugger: any): void;
59
+ /**
60
+ * 返回最新的值 但是是一个ref对象
61
+ */
62
+ export declare function useLastest(value: any): import("react").MutableRefObject<any>;
63
+ /**
64
+ * 返回一个按钮的方法
65
+ * getCmdCallback 将语音识别结果 发送给 后台 获取识别结果
66
+ * recordTextCallback 语音识别结果实时触发
67
+ * isNeedCmd 是否需要后台识别
68
+ * getWsUrlRequest ws url 地址
69
+ * getWsCmdRequest 识别指令接口
70
+ * recordUrl 录音sdk路径
71
+ */
72
+ export default function useStartWs(info: {
73
+ getCmdCallback?: (cmdInfo: any) => void;
74
+ recordTextCallback?: (text: any) => void;
75
+ isNeedCmd?: boolean;
76
+ isDebugger?: boolean;
77
+ getWsUrlRequest: any;
78
+ getWsCmdRequest?: any;
79
+ recordUrl?: any;
80
+ }): {
81
+ onClickHandle: () => Promise<void>;
82
+ status: IStatus;
83
+ loading: boolean;
84
+ isInit: boolean;
85
+ isStarting: boolean;
86
+ };
87
+ export {};
package/dist/hooks.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { _ as __assign, b as __awaiter, c as __generator } from './tslib.es6-35653116.js';
2
2
  import { useState, useEffect, useRef, useCallback } from 'react';
3
3
  export { default as useFileIdToBase64 } from './useFileIdToBase64.js';
4
+ import { message } from 'ztxkui';
5
+ import axios from 'axios';
4
6
  import './fileOperation.js';
5
7
  import './authority-e6bde99f.js';
6
8
  import './tools-09a4d620.js';
@@ -412,4 +414,373 @@ function useMutationObserver(dom, callback) {
412
414
  }, [dom, callback]);
413
415
  }
414
416
 
415
- export { useFetchState, useMutationObserver, useScreenFull, useTableLinkage, useTableValidate };
417
+ function useWs(info) {
418
+ var _this = this;
419
+ var _a = info || {}, textResultCallback = _a.textResultCallback, isDebugger = _a.isDebugger, getWsUrlRequest = _a.getWsUrlRequest;
420
+ var websocketUrlRef = useRef(''); // 长连接地址
421
+ var _b = useState('UNDEFINED'), status = _b[0], setStatus = _b[1]; // 内部状态
422
+ var webscoketObjRef = useRef(null); // ws连接对象
423
+ var resultTextRef = useRef(''); // 识别结果
424
+ var webscoketUrlRef = useRef(); // ws长连接地址
425
+ var textResultCbLastest = useLastest(textResultCallback);
426
+ // 修改状态
427
+ var changeStatus = useCallback(function (s) {
428
+ setStatus(s);
429
+ }, []);
430
+ // 获取讯飞WS长连接地址
431
+ var getWebSocketUrlHandle = useCallback(function () {
432
+ if (!getWsUrlRequest) {
433
+ throw new Error('必须传入获取Ws长连接的方法');
434
+ }
435
+ return new Promise(function (resolve, reject) {
436
+ getWsUrlRequest()
437
+ .then(function (res) {
438
+ var _a, _b;
439
+ if (res.status === 200 && res.data.code === 200) {
440
+ websocketUrlRef.current = "" + ((_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.connectUrl);
441
+ resolve(websocketUrlRef.current);
442
+ }
443
+ else {
444
+ reject({ msg: '获取ws链接地址失败!' });
445
+ }
446
+ })
447
+ .catch(function (err) {
448
+ var _a;
449
+ reject({ msg: ((_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.msg) || '获取ws地址失败!' });
450
+ });
451
+ });
452
+ }, []);
453
+ // 开始连接方法
454
+ var connectWebSocket = useCallback(function (recorder) { return __awaiter(_this, void 0, void 0, function () {
455
+ var websocketUrl, res, err_1;
456
+ var _a;
457
+ return __generator(this, function (_b) {
458
+ switch (_b.label) {
459
+ case 0:
460
+ // SETP 1 将状态设置为 开始连接状态
461
+ // 获取讯飞ws长连接地址
462
+ changeStatus('CONNECTING');
463
+ websocketUrl = webscoketUrlRef.current;
464
+ if (!!websocketUrl) return [3 /*break*/, 4];
465
+ _b.label = 1;
466
+ case 1:
467
+ _b.trys.push([1, 3, , 4]);
468
+ return [4 /*yield*/, getWebSocketUrlHandle()];
469
+ case 2:
470
+ res = _b.sent();
471
+ if (typeof res === 'string') {
472
+ // &lang=${recorder?.language}&transType=normal&transStrategy=2&targetLang=${recorder?.transLanguage}
473
+ websocketUrl = webscoketUrlRef.current = "" + res;
474
+ }
475
+ else {
476
+ changeStatus('CLOSED');
477
+ message.info(((_a = res) === null || _a === void 0 ? void 0 : _a.msg) || '获取ws地址失败!');
478
+ return [2 /*return*/];
479
+ }
480
+ return [3 /*break*/, 4];
481
+ case 3:
482
+ err_1 = _b.sent();
483
+ changeStatus('CLOSED');
484
+ message.info((err_1 === null || err_1 === void 0 ? void 0 : err_1.msg) || '获取ws地址失败!');
485
+ return [2 /*return*/];
486
+ case 4:
487
+ // 长连接不能复用? 发送完 end: true后 长连接就关闭了
488
+ // SETP 2 建立WS长连接
489
+ // 赋值ws对象给Ref
490
+ if ('WebSocket' in window) {
491
+ webscoketObjRef.current = new WebSocket(websocketUrl);
492
+ }
493
+ else if ('MozWebSocket' in window) {
494
+ webscoketObjRef.current = new window.MozWebSocket(websocketUrl);
495
+ }
496
+ else {
497
+ message.info('浏览器不支持WebSocket');
498
+ return [2 /*return*/];
499
+ }
500
+ // SETP 3 监听WS长连接的各种状态
501
+ // 连接建立开始后。开始录音
502
+ webscoketObjRef.current.onopen = function (e) {
503
+ if (isDebugger) {
504
+ console.log('连接建立', e);
505
+ }
506
+ resultTextRef.current = '';
507
+ textResultCbLastest.current &&
508
+ textResultCbLastest.current(resultTextRef.current);
509
+ recorder.start();
510
+ };
511
+ // 处理回调消息
512
+ webscoketObjRef.current.onmessage = function (e) {
513
+ parseWsData(e.data, function (msg) {
514
+ if (msg.code === '0') {
515
+ if (isDebugger) {
516
+ console.log('识别结果:', msg.resultText);
517
+ }
518
+ resultTextRef.current += msg.resultText;
519
+ textResultCbLastest.current &&
520
+ textResultCbLastest.current(resultTextRef.current);
521
+ }
522
+ }, function (err) {
523
+ var _a, _b;
524
+ if (err) {
525
+ if (isDebugger) {
526
+ console.log('ws连接出错了!');
527
+ }
528
+ recorder.stop();
529
+ webscoketObjRef.current.send('{"end": true}');
530
+ changeStatus('CLOSED');
531
+ (_b = (_a = webscoketObjRef.current) === null || _a === void 0 ? void 0 : _a.close) === null || _b === void 0 ? void 0 : _b.call(_a);
532
+ }
533
+ }, isDebugger);
534
+ };
535
+ // 连接异常 处理异常
536
+ // 关闭录音
537
+ // 修改状态为 CLOSED
538
+ webscoketObjRef.current.onerror = function (e) {
539
+ if (isDebugger) {
540
+ console.log('连接异常', e);
541
+ }
542
+ recorder.stop();
543
+ changeStatus('CLOSED');
544
+ };
545
+ // 主动关闭
546
+ // 关闭录音
547
+ // 修改状态为 CLOSED
548
+ webscoketObjRef.current.onclose = function (e) {
549
+ if (isDebugger) {
550
+ console.log('连接关闭', e);
551
+ }
552
+ recorder.stop();
553
+ changeStatus('CLOSED');
554
+ };
555
+ return [2 /*return*/];
556
+ }
557
+ });
558
+ }); }, [changeStatus, getWebSocketUrlHandle, textResultCbLastest, isDebugger]);
559
+ return {
560
+ status: status,
561
+ changeStatus: changeStatus,
562
+ connectWebSocket: connectWebSocket,
563
+ webscoketObjRef: webscoketObjRef,
564
+ resultTextRef: resultTextRef,
565
+ };
566
+ }
567
+ /**
568
+ * 录音管理器的相关方法
569
+ */
570
+ function useRecorderManager(options) {
571
+ var _this = this;
572
+ var _a = options.url, url = _a === void 0 ? '/asrsdk' : _a, startCallback = options.startCallback, frameRecordCallback = options.frameRecordCallback, stopCallback = options.stopCallback;
573
+ // 录音对象
574
+ var recordRef = useRef();
575
+ // 初始化录音对象
576
+ var RecorderManager = window.RecorderManager;
577
+ if (!recordRef.current && RecorderManager) {
578
+ recordRef.current = new RecorderManager(url);
579
+ // 监听录音是否开启
580
+ recordRef.current.onStart = function () {
581
+ startCallback && startCallback();
582
+ };
583
+ // 监听已录制完指定帧大小的文件事件。如果设置了 frameSize,则会回调此事件
584
+ recordRef.current.onFrameRecorded = function (_a) {
585
+ var isLastFrame = _a.isLastFrame, frameBuffer = _a.frameBuffer;
586
+ frameRecordCallback && frameRecordCallback({ isLastFrame: isLastFrame, frameBuffer: frameBuffer });
587
+ };
588
+ // 录音停止触发事件
589
+ recordRef.current.onStop = function (audioBuffers) {
590
+ stopCallback && stopCallback(audioBuffers);
591
+ };
592
+ }
593
+ if (!RecorderManager) {
594
+ console.error('你没有引入路由相关API,请引入!');
595
+ }
596
+ var start = function () { return __awaiter(_this, void 0, void 0, function () {
597
+ var _a, _b;
598
+ return __generator(this, function (_c) {
599
+ (_b = (_a = recordRef.current) === null || _a === void 0 ? void 0 : _a.start) === null || _b === void 0 ? void 0 : _b.call(_a, {
600
+ sampleRate: 16000,
601
+ frameSize: 1280, // 指定帧大小,传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调
602
+ });
603
+ return [2 /*return*/];
604
+ });
605
+ }); };
606
+ var stop = function () {
607
+ var _a, _b;
608
+ (_b = (_a = recordRef.current) === null || _a === void 0 ? void 0 : _a.stop) === null || _b === void 0 ? void 0 : _b.call(_a);
609
+ };
610
+ return {
611
+ recordRef: recordRef,
612
+ start: start,
613
+ stop: stop,
614
+ };
615
+ }
616
+ /**
617
+ * 数据转换
618
+ * 将收到的讯飞语音识别的数据 转换成 标准数据
619
+ */
620
+ function parseWsData(data, msgCallback, callback, isDebugger) {
621
+ var _a, _b, _c, _d;
622
+ try {
623
+ var jsonData = JSON.parse(data);
624
+ if (jsonData.action === 'started') {
625
+ // 握手成功
626
+ if (isDebugger) {
627
+ console.log('握手成功');
628
+ }
629
+ }
630
+ else if (jsonData.action === 'result') {
631
+ var data_1 = JSON.parse(jsonData.data);
632
+ if (isDebugger) {
633
+ console.log('收到讯飞的语音提示', data_1);
634
+ }
635
+ // 类型是 '0' 的话 表示是完整的音频
636
+ // 类型是 '1' 的话 表示是中间的音频
637
+ var type = (_b = (_a = data_1 === null || data_1 === void 0 ? void 0 : data_1.cn) === null || _a === void 0 ? void 0 : _a.st) === null || _b === void 0 ? void 0 : _b.type;
638
+ var resultText_1 = '';
639
+ if ((_d = (_c = data_1 === null || data_1 === void 0 ? void 0 : data_1.cn) === null || _c === void 0 ? void 0 : _c.st) === null || _d === void 0 ? void 0 : _d.rt) {
640
+ data_1.cn.st.rt.forEach(function (j) {
641
+ j.ws.forEach(function (k) {
642
+ k.cw.forEach(function (l) {
643
+ resultText_1 += l.w;
644
+ });
645
+ });
646
+ });
647
+ }
648
+ if (type + '' === '0') {
649
+ // 【最终】识别结果:
650
+ msgCallback({ resultText: resultText_1, code: '0' });
651
+ resultText_1 = '';
652
+ }
653
+ }
654
+ else if (jsonData.action === 'error') {
655
+ // 连接发生错误
656
+ if (isDebugger) {
657
+ console.log('出错了:', jsonData);
658
+ }
659
+ callback({ code: '1', msg: '连接出错了' });
660
+ }
661
+ }
662
+ catch (err) {
663
+ console.log(err);
664
+ }
665
+ }
666
+ /**
667
+ * 返回最新的值 但是是一个ref对象
668
+ */
669
+ function useLastest(value) {
670
+ var ref = useRef(value);
671
+ ref.current = value;
672
+ return ref;
673
+ }
674
+ /**
675
+ * 返回一个按钮的方法
676
+ * getCmdCallback 将语音识别结果 发送给 后台 获取识别结果
677
+ * recordTextCallback 语音识别结果实时触发
678
+ * isNeedCmd 是否需要后台识别
679
+ * getWsUrlRequest ws url 地址
680
+ * getWsCmdRequest 识别指令接口
681
+ * recordUrl 录音sdk路径
682
+ */
683
+ function useStartWs(info) {
684
+ var _this = this;
685
+ var getCmdCallback = info.getCmdCallback, recordTextCallback = info.recordTextCallback, isNeedCmd = info.isNeedCmd, isDebugger = info.isDebugger, getWsUrlRequest = info.getWsUrlRequest, getWsCmdRequest = info.getWsCmdRequest, recordUrl = info.recordUrl;
686
+ // ws连接
687
+ var _a = useWs({
688
+ textResultCallback: recordTextCallback,
689
+ isDebugger: isDebugger,
690
+ getWsUrlRequest: getWsUrlRequest,
691
+ }), status = _a.status, changeStatus = _a.changeStatus, connectWebSocket = _a.connectWebSocket, webscoketObjRef = _a.webscoketObjRef, resultTextRef = _a.resultTextRef;
692
+ var cancelRef = useRef();
693
+ var cbLastest = useLastest(getCmdCallback);
694
+ var statusLastest = useLastest(status);
695
+ // 录音器方法
696
+ var _b = useRecorderManager({
697
+ url: recordUrl,
698
+ startCallback: function () {
699
+ // 录音开始时,表示可以开始发送数据了
700
+ changeStatus('OPEN');
701
+ },
702
+ frameRecordCallback: function (_a) {
703
+ var isLastFrame = _a.isLastFrame, frameBuffer = _a.frameBuffer;
704
+ var webscoketObj = webscoketObjRef.current;
705
+ if (webscoketObj && (webscoketObj === null || webscoketObj === void 0 ? void 0 : webscoketObj.readyState) === (webscoketObj === null || webscoketObj === void 0 ? void 0 : webscoketObj.OPEN)) {
706
+ webscoketObj.send(new Int8Array(frameBuffer));
707
+ if (isLastFrame) {
708
+ if (isDebugger) {
709
+ console.log('收到录音的最后帧!');
710
+ }
711
+ webscoketObj.send('{"end": true}');
712
+ // 最后一段录音结束才可以结束翻译
713
+ changeStatus('CLOSING');
714
+ }
715
+ }
716
+ },
717
+ stopCallback: function () {
718
+ if (isDebugger) {
719
+ console.log(resultTextRef.current.replace(/,|。/g, ''), statusLastest.current);
720
+ }
721
+ // 根据识别结果 获取后台的指令命令
722
+ if (resultTextRef.current &&
723
+ statusLastest.current === 'CLOSED' &&
724
+ isNeedCmd) {
725
+ if (!getWsCmdRequest) {
726
+ throw new Error('你没有传入 获取指令的接口,这将导致错误!');
727
+ }
728
+ if (cancelRef.current) {
729
+ cancelRef.current();
730
+ }
731
+ getWsCmdRequest({ voiceContent: resultTextRef.current.replace(/,|。/g, '') }, {
732
+ cancelToken: new axios.CancelToken(function (c) {
733
+ cancelRef.current = c;
734
+ }),
735
+ })
736
+ .then(function (res) {
737
+ var _a, _b;
738
+ if (res.status === 200 && res.data.code === 200) {
739
+ cbLastest.current && cbLastest.current(res.data.data);
740
+ }
741
+ else {
742
+ message.error(((_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.msg) || '不支持处理该指令,请重说!');
743
+ }
744
+ })
745
+ .catch(function (err) {
746
+ var _a, _b;
747
+ message.error(((_b = (_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.msg) || '不支持处理该指令,请重说!');
748
+ });
749
+ }
750
+ },
751
+ }), start = _b.start, stop = _b.stop;
752
+ var onClick = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
753
+ return __generator(this, function (_a) {
754
+ switch (_a.label) {
755
+ case 0:
756
+ if (!(status === 'UNDEFINED' || status === 'CLOSED')) return [3 /*break*/, 2];
757
+ return [4 /*yield*/, connectWebSocket({
758
+ start: start,
759
+ stop: stop,
760
+ })];
761
+ case 1:
762
+ _a.sent();
763
+ return [3 /*break*/, 3];
764
+ case 2:
765
+ if (status === 'OPEN' || status === 'CONNECTING') {
766
+ // 停止录音
767
+ stop();
768
+ }
769
+ _a.label = 3;
770
+ case 3: return [2 /*return*/];
771
+ }
772
+ });
773
+ }); }, [connectWebSocket, start, status, stop]);
774
+ return {
775
+ onClickHandle: onClick,
776
+ status: status,
777
+ // 识别中
778
+ loading: status === 'CLOSING' || status === 'CONNECTING',
779
+ // 初始状态
780
+ isInit: status === 'UNDEFINED' || status === 'CLOSED',
781
+ // 开启中
782
+ isStarting: status === 'CONNECTING',
783
+ };
784
+ }
785
+
786
+ export { useStartWs as useAsr, useFetchState, useMutationObserver, useScreenFull, useTableLinkage, useTableValidate };
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ export { d as dataModel } from './dataModel-1fbaff40.js';
3
3
  export { t as tools } from './tools-09a4d620.js';
4
4
  export { v as validate } from './validate-18e52490.js';
5
5
  export { r as request } from './request-2c8dff05.js';
6
- export { r as reqUrl } from './reqUrl-787dd9e5.js';
6
+ export { r as reqUrl } from './reqUrl-3792afcd.js';
7
7
  import './tslib.es6-35653116.js';
8
8
  import 'dayjs';
9
9
  import 'axios';
@@ -11,7 +11,7 @@ function getReqUrl(processObj) {
11
11
  var ZT_API_SIM = processObj.REACT_APP_ZT_API_SIM || window.location.origin; // 阶段性环境 http://192.168.0.134:8000
12
12
  var ZT_API_PRODUCT = processObj.REACT_APP_ZT_API_PRODUCT || window.location.origin; // 生产环境 http://dz.zmd.com.cn
13
13
  var ZT_API_PUBLIC_PRODUCT = processObj.REACT_APP_ZT_API_PUBLIC_PRODUCT ||
14
- 'https://m-portal.zmd.com.cn:18998'; // 生产环境外网api地址 http://dz.zmd.com.cn:48000
14
+ 'https://nportal.zmd.com.cn:18998'; // 生产环境外网api地址 https://m-portal.zmd.com.cn:18998 http://dz.zmd.com.cn:48000
15
15
  // 文件服务器
16
16
  var ZT_FILE_PREVIEW_DEV = processObj.REACT_APP_ZT_FILE_PREVIEW_DEV || 'http://192.168.0.83:88'; // 开发环境
17
17
  var ZT_FILE_PREVIEW_TEST = processObj.REACT_APP_ZT_FILE_PREVIEW_TEST || 'http://172.55.5.101:33013'; // 测试环境 https://192.168.0.135:18012
package/dist/reqUrl.js CHANGED
@@ -1 +1 @@
1
- export { g as getReqUrl } from './reqUrl-787dd9e5.js';
1
+ export { g as getReqUrl } from './reqUrl-3792afcd.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ztxkutils",
3
- "version": "2.10.50",
3
+ "version": "2.10.52",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",