@vunk/plus 1.7.3 → 1.7.5
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/components/broadcasting-markdown/index.mjs +101 -238
- package/components/broadcasting-markdown/src/ctx.d.ts +1 -4
- package/components/broadcasting-markdown/src/howler-speech.vue.d.ts +49 -88
- package/components/broadcasting-markdown/src/index.vue.d.ts +44 -103
- package/components/broadcasting-markdown/src/types.d.ts +1 -1
- package/components/broadcasting-markdown/src/use.d.ts +6 -8
- package/components/bubble-templates/index.css +4 -0
- package/components/bubble-templates/index.mjs +7 -11412
- package/components/metahuman-broadcasting/index.mjs +8 -5
- package/components/metahuman-broadcasting/src/index.vue.d.ts +62 -114
- package/components/pixi-frame/src/apng.vue.d.ts +3 -3
- package/components/pixi-frame/src/bitmap.vue.d.ts +5 -5
- package/components/pixi-frame/src/core.vue.d.ts +5 -5
- package/components/pixi-frame/src/index.vue.d.ts +12 -12
- package/components/pixi-frame/src/video.vue.d.ts +3 -3
- package/components/typing-markdown/index.mjs +4 -7
- package/components/vditor/src/ctx.d.ts +1 -1
- package/components/vditor/src/index.vue.d.ts +1 -1
- package/index.css +5 -0
- package/package.json +4 -1
- package/shared/StreamingInferenceService.mjs +4 -1
- package/shared/audioToFrames/index.mjs +2 -5
- package/shared/audioToFrames/src/audio/StreamingFeatureExtractorService.d.ts +20 -4
- package/shared/audioToFrames/src/audio/index.d.ts +0 -2
- package/shared/audioToFrames/src/audio/index.mjs +84 -157
- package/shared/audioToFrames/src/core/constants.d.ts +0 -22
- package/shared/audioToFrames/src/core/index.mjs +16 -2643
- package/shared/audioToFrames/src/core/utils.d.ts +1 -68
- package/shared/audioToFrames/src/inference/StreamingInferenceService.d.ts +43 -0
- package/shared/audioToFrames/src/media/index.d.ts +0 -5
- package/shared/audioToFrames/src/media/index.mjs +180 -610
- package/shared/constants.mjs +1 -12
- package/shared/PredictiveFrameLoader.mjs +0 -367
- package/shared/audioToFrames/src/audio/AudioProcessor.d.ts +0 -25
- package/shared/audioToFrames/src/audio/FeatureExtractorService.d.ts +0 -31
- package/shared/audioToFrames/src/inference/types.d.ts +0 -102
- package/shared/audioToFrames/src/media/ImageBitmapPool.d.ts +0 -63
- package/shared/audioToFrames/src/media/ImageProcessor.d.ts +0 -47
- package/shared/audioToFrames/src/media/PlaybackService.d.ts +0 -56
- package/shared/audioToFrames/src/media/WebGLPlaybackService.d.ts +0 -74
- package/shared/audioToFrames/src/media/WebGLRenderer.d.ts +0 -66
- package/shared/utils.mjs +0 -123
package/index.css
CHANGED
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
.el-timeline{--el-timeline-node-size-normal:12px;--el-timeline-node-size-large:14px;--el-timeline-node-color:var(--el-border-color-light);font-size:var(--el-font-size-base);list-style:none;margin:0}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline .el-timeline-item__center{align-items:center;display:flex}.el-timeline .el-timeline-item__center .el-timeline-item__wrapper{width:100%}.el-timeline .el-timeline-item__center .el-timeline-item__tail{top:0}.el-timeline .el-timeline-item__center:first-child .el-timeline-item__tail{height:calc(50% + 10px);top:calc(50% - 10px)}.el-timeline .el-timeline-item__center:last-child .el-timeline-item__tail{display:block;height:calc(50% - 10px)}.el-timeline-item{padding-bottom:20px;position:relative}.el-timeline-item__wrapper{padding-left:28px;position:relative;top:-3px}.el-timeline-item__tail{border-left:2px solid var(--el-timeline-node-color);height:100%;left:4px;position:absolute}.el-timeline-item .el-timeline-item__icon{color:var(--el-color-white);font-size:var(--el-font-size-small)}.el-timeline-item__node{align-items:center;background-color:var(--el-timeline-node-color);border-color:var(--el-timeline-node-color);border-radius:50%;box-sizing:border-box;display:flex;justify-content:center;position:absolute}.el-timeline-item__node--normal{height:var(--el-timeline-node-size-normal);left:-1px;width:var(--el-timeline-node-size-normal)}.el-timeline-item__node--large{height:var(--el-timeline-node-size-large);left:-2px;width:var(--el-timeline-node-size-large)}.el-timeline-item__node.is-hollow{background:var(--el-color-white);border-style:solid;border-width:2px}.el-timeline-item__node--primary{background-color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-timeline-item__node--success{background-color:var(--el-color-success);border-color:var(--el-color-success)}.el-timeline-item__node--warning{background-color:var(--el-color-warning);border-color:var(--el-color-warning)}.el-timeline-item__node--danger{background-color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-timeline-item__node--info{background-color:var(--el-color-info);border-color:var(--el-color-info)}.el-timeline-item__dot{align-items:center;display:flex;justify-content:center;position:absolute}.el-timeline-item__content{color:var(--el-text-color-primary)}.el-timeline-item__timestamp{color:var(--el-text-color-secondary);font-size:var(--el-font-size-small);line-height:1}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-collapse{--el-collapse-border-color:var(--el-border-color-lighter);--el-collapse-header-height:48px;--el-collapse-header-bg-color:var(--el-fill-color-blank);--el-collapse-header-text-color:var(--el-text-color-primary);--el-collapse-header-font-size:13px;--el-collapse-content-bg-color:var(--el-fill-color-blank);--el-collapse-content-font-size:13px;--el-collapse-content-text-color:var(--el-text-color-primary);border-bottom:1px solid var(--el-collapse-border-color);border-top:1px solid var(--el-collapse-border-color)}.el-collapse-item.is-disabled .el-collapse-item__header{color:var(--el-text-color-disabled);cursor:not-allowed}.el-collapse-item__header{align-items:center;background-color:var(--el-collapse-header-bg-color);border:none;border-bottom:1px solid var(--el-collapse-border-color);color:var(--el-collapse-header-text-color);cursor:pointer;display:flex;font-size:var(--el-collapse-header-font-size);font-weight:500;height:var(--el-collapse-header-height);line-height:var(--el-collapse-header-height);outline:none;padding:0;transition:border-bottom-color var(--el-transition-duration);width:100%}.el-collapse-item__arrow{font-weight:300;transition:transform var(--el-transition-duration)}.el-collapse-item__arrow.is-active{transform:rotate(90deg)}.el-collapse-item__title{flex:auto;text-align:left}.el-collapse-item__header.focusing:focus:not(:hover){color:var(--el-color-primary)}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{background-color:var(--el-collapse-content-bg-color);border-bottom:1px solid var(--el-collapse-border-color);box-sizing:border-box;overflow:hidden;will-change:height}.el-collapse-item__content{color:var(--el-collapse-content-text-color);font-size:var(--el-collapse-content-font-size);line-height:1.7692307692;padding-bottom:25px}.el-collapse-item:last-child{margin-bottom:-1px}.el-collapse-icon-position-left .el-collapse-item__header{gap:8px}.el-collapse-icon-position-left .el-collapse-item__title{order:1}.el-collapse-icon-position-right .el-collapse-item__header{padding-right:8px}.el-thought-chain-item-dot[data-v-5de7a0b5] .el-button{cursor:default!important}.el-thought-chain-item-dot[data-v-5de7a0b5] .el-button:active,.el-thought-chain-item-dot[data-v-5de7a0b5] .el-button:hover{background-color:var(--custom-background-color)!important;border-color:var(--custom-border-color)!important}.el-thought-chain-item-dot[data-v-5de7a0b5] .el-button .el-icon svg path{fill:#fff}.el-thought-chain[data-v-5de7a0b5] .el-collapse{border:none}.el-thought-chain[data-v-5de7a0b5] .el-collapse .el-collapse-item__header{height:20px;font-weight:400}.el-thought-chain[data-v-5de7a0b5] .el-collapse .el-collapse-item__arrow{margin:0 0 0 8px}.el-thought-chain[data-v-5de7a0b5] .el-collapse .el-collapse-item__header{margin-bottom:5px}.el-thought-chain[data-v-5de7a0b5] .el-collapse .el-collapse-item__header,.el-thought-chain[data-v-5de7a0b5] .el-collapse .el-collapse-item__wrap{border:none}.el-thought-chain[data-v-5de7a0b5] .el-collapse .el-collapse-item__content{color:var(--el-text-color-secondary);padding:0}.el-thought-chain[data-v-5de7a0b5] .el-timeline{padding:10px 0 0 5px}.el-thought-chain[data-v-5de7a0b5] .el-timeline-item__timestamp{color:var(--el-text-color-primary)}.el-thought-chain[data-v-5de7a0b5] .el-timeline-item__content{color:var(--el-text-color-secondary)}.thought-chain-move[data-v-5de7a0b5],.thought-chain-enter-active[data-v-5de7a0b5],.thought-chain-leave-active[data-v-5de7a0b5]{transition:all .5s ease}.thought-chain-enter-from[data-v-5de7a0b5],.thought-chain-leave-to[data-v-5de7a0b5]{opacity:0;transform:translateY(10px) scaleY(.9)}.thought-chain-leave-active[data-v-5de7a0b5]{position:absolute}.thought-chain-loading[data-v-5de7a0b5]{animation:rotating-5de7a0b5 1.5s linear infinite;transform-origin:center center;will-change:transform;backface-visibility:hidden;-webkit-font-smoothing:antialiased}@keyframes rotating-5de7a0b5{0%{transform:rotate(0)}25%{transform:rotate(90deg)}50%{transform:rotate(180deg)}75%{transform:rotate(270deg)}to{transform:rotate(360deg)}}.el-thought-chain-item-dot[data-v-5de7a0b5]{margin:var(--03c46b3e)}
|
|
22
22
|
@charset "UTF-8";.elx-highlight-code-wrapper{display:flex;background:transparent;overflow:hidden}.elx-highlight-code-wrapper .line-numbers{-webkit-user-select:none;user-select:none;display:flex;flex-direction:column;align-items:flex-end;margin-right:1rem}.elx-highlight-code-wrapper .line-numbers .line-number{display:inline-block;text-align:right;padding:0 0 0 .3em;-webkit-user-select:none;user-select:none;flex-shrink:0;color:var(--el-text-color-secondary)}.elx-highlight-code-wrapper .elx-highlight-code-scrollbar .code-lines{white-space:pre}.elx-highlight-code-wrapper .elx-highlight-code-scrollbar .code-lines>span{width:max-content;display:block}.elx-highlight-code-wrapper .elx-highlight-code-scrollbar .code-lines>span .line{width:max-content;display:inline-block;white-space:pre}.elx-highlight-code-wrapper .elx-highlight-code-scrollbar .code-lines>span .line span{display:inline-block}.el-drawer{--el-drawer-bg-color:var(--el-dialog-bg-color,var(--el-bg-color));--el-drawer-padding-primary:var(--el-dialog-padding-primary,20px);background-color:var(--el-drawer-bg-color);box-shadow:var(--el-box-shadow-dark);box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden;position:absolute;transition:all var(--el-transition-duration)}.el-drawer .btt,.el-drawer .ltr,.el-drawer .rtl,.el-drawer .ttb{transform:translate(0)}.el-drawer__sr-focus:focus{outline:none!important}.el-drawer__header{align-items:center;color:var(--el-text-color-primary);display:flex;margin-bottom:32px;padding:var(--el-drawer-padding-primary);padding-bottom:0}.el-drawer__header>:first-child{flex:1}.el-drawer__title{flex:1;font-size:16px;line-height:inherit;margin:0}.el-drawer__footer{padding:var(--el-drawer-padding-primary);padding-top:10px;text-align:right}.el-drawer__close-btn{background-color:transparent;border:none;color:inherit;cursor:pointer;display:inline-flex;font-size:var(--el-font-size-extra-large);outline:none}.el-drawer__close-btn:focus i,.el-drawer__close-btn:hover i{color:var(--el-color-primary)}.el-drawer__body{flex:1;overflow:auto;padding:var(--el-drawer-padding-primary)}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{bottom:0;height:100%;top:0}.el-drawer.btt,.el-drawer.ttb{left:0;right:0;width:100%}.el-drawer.ltr{left:0}.el-drawer.rtl{right:0}.el-drawer.ttb{top:0}.el-drawer.btt{bottom:0}.el-drawer-fade-enter-active,.el-drawer-fade-leave-active{transition:all var(--el-transition-duration)}.el-drawer-fade-enter-active,.el-drawer-fade-enter-from,.el-drawer-fade-enter-to,.el-drawer-fade-leave-active,.el-drawer-fade-leave-from,.el-drawer-fade-leave-to{overflow:hidden!important}.el-drawer-fade-enter-from,.el-drawer-fade-leave-to{background-color:transparent!important}.el-drawer-fade-enter-from .rtl,.el-drawer-fade-leave-to .rtl{transform:translate(100%)}.el-drawer-fade-enter-from .ltr,.el-drawer-fade-leave-to .ltr{transform:translate(-100%)}.el-drawer-fade-enter-from .ttb,.el-drawer-fade-leave-to .ttb{transform:translateY(-100%)}.el-drawer-fade-enter-from .btt,.el-drawer-fade-leave-to .btt{transform:translateY(100%)}.el-overlay{background-color:var(--el-overlay-color-lighter);bottom:0;height:100%;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:2000}.el-overlay .el-overlay-root{height:0}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.dot-spinner[data-v-623b4e7e]{--uib-size: 2.8rem;--uib-speed: .9s;--uib-color: var(--el-color-primary);position:relative;display:flex;align-items:center;justify-content:flex-start;height:var(--uib-size);width:var(--uib-size)}.dot-spinner__dot[data-v-623b4e7e]{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:flex-start;height:100%;width:100%}.dot-spinner__dot[data-v-623b4e7e]:before{content:"";height:20%;width:20%;border-radius:50%;background-color:var(--uib-color);transform:scale(0);opacity:.5;animation:pulse0112-623b4e7e calc(var(--uib-speed) * 1.311) ease-in-out infinite;box-shadow:0 0 20px #121f354d}.dot-spinner__dot[data-v-623b4e7e]:nth-child(2){transform:rotate(45deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(2):before{animation-delay:calc(var(--uib-speed) * -.875)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(3){transform:rotate(90deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(3):before{animation-delay:calc(var(--uib-speed) * -.75)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(4){transform:rotate(135deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(4):before{animation-delay:calc(var(--uib-speed) * -.625)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(5){transform:rotate(180deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(5):before{animation-delay:calc(var(--uib-speed) * -.5)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(6){transform:rotate(225deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(6):before{animation-delay:calc(var(--uib-speed) * -.375)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(7){transform:rotate(270deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(7):before{animation-delay:calc(var(--uib-speed) * -.25)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(8){transform:rotate(315deg)}.dot-spinner__dot[data-v-623b4e7e]:nth-child(8):before{animation-delay:calc(var(--uib-speed) * -.125)}@keyframes pulse0112-623b4e7e{0%,to{transform:scale(0);opacity:.5}50%{transform:scale(1);opacity:1}}.custom-style .el-segmented{--el-segmented-item-selected-color: white;--el-border-radius-base: var(--shiki-custom-brr)}body.dark .custom-style .el-segmented{--el-segmented-item-selected-bg-color: #409eff;--el-segmented-item-selected-color: white;--el-segmented-item-hover-bg-color: #4e4e4e;--el-segmented-item-active-bg-color: #4e4e4e;--el-fill-color-light: #39393a}body.dark .custom-style .el-segmented .el-segmented__item-label{color:#fff}body.dark .elx-run-code-content-scrollbar{background-color:var(--shiki-dark-bg)!important}.elx-run-code-content-scrollbar{background-color:var(--shiki-bg)!important}.elx-run-code-content{width:100%;height:80vh!important;padding:0!important}.elx-run-code-content .elx-run-code-content-code{overflow:visible!important;padding:10px 0}.elx-run-code-content pre{white-space:nowrap!important;margin:0!important}.elx-run-code-content pre div.pre-md{width:100%;height:100%!important;border:none!important}.elx-run-code-content .code-line{display:flex;align-items:flex-start;white-space:pre}.elx-run-code-content .line-content{flex:1}.iframe-loading-mask{display:flex;justify-content:center;align-items:center;width:100%;height:79.8vh}.el-segmented--vertical{flex-direction:column}.el-segmented--vertical .el-segmented__item{padding:11px}.el-segmented{--el-segmented-color:var(--el-text-color-regular);--el-segmented-bg-color:var(--el-fill-color-light);--el-segmented-padding:2px;--el-segmented-item-selected-color:var(--el-color-white);--el-segmented-item-selected-bg-color:var(--el-color-primary);--el-segmented-item-selected-disabled-bg-color:var(--el-color-primary-light-5);--el-segmented-item-hover-color:var(--el-text-color-primary);--el-segmented-item-hover-bg-color:var(--el-fill-color-dark);--el-segmented-item-active-bg-color:var(--el-fill-color-darker);--el-segmented-item-disabled-color:var(--el-text-color-placeholder);align-items:stretch;background:var(--el-segmented-bg-color);border-radius:var(--el-border-radius-base);box-sizing:border-box;color:var(--el-segmented-color);display:inline-flex;font-size:14px;min-height:32px;padding:var(--el-segmented-padding)}.el-segmented__group{align-items:stretch;display:flex;position:relative;width:100%}.el-segmented__item-selected{background:var(--el-segmented-item-selected-bg-color);border-radius:calc(var(--el-border-radius-base) - 2px);height:100%;left:0;pointer-events:none;position:absolute;top:0;transition:all .3s;width:10px}.el-segmented__item-selected.is-disabled{background:var(--el-segmented-item-selected-disabled-bg-color)}.el-segmented__item-selected.is-focus-visible:before{border-radius:inherit;bottom:0;content:"";left:0;outline:2px solid var(--el-segmented-item-selected-bg-color);outline-offset:1px;position:absolute;right:0;top:0}.el-segmented__item{align-items:center;border-radius:calc(var(--el-border-radius-base) - 2px);cursor:pointer;display:flex;flex:1;padding:0 11px}.el-segmented__item:not(.is-disabled):not(.is-selected):hover{background:var(--el-segmented-item-hover-bg-color);color:var(--el-segmented-item-hover-color)}.el-segmented__item:not(.is-disabled):not(.is-selected):active{background:var(--el-segmented-item-active-bg-color)}.el-segmented__item.is-selected,.el-segmented__item.is-selected.is-disabled{color:var(--el-segmented-item-selected-color)}.el-segmented__item.is-disabled{color:var(--el-segmented-item-disabled-color);cursor:not-allowed}.el-segmented__item-input{height:0;margin:0;opacity:0;pointer-events:none;position:absolute;width:0}.el-segmented__item-label{flex:1;line-height:normal;overflow:hidden;text-align:center;text-overflow:ellipsis;transition:color .3s;white-space:nowrap;z-index:1}.el-segmented.is-block{display:flex}.el-segmented.is-block .el-segmented__item{min-width:0}.el-segmented--large{border-radius:var(--el-border-radius-base);font-size:16px;min-height:40px}.el-segmented--large .el-segmented__item-selected{border-radius:calc(var(--el-border-radius-base) - 2px)}.el-segmented--large .el-segmented--vertical .el-segmented__item{padding:11px}.el-segmented--large .el-segmented__item{border-radius:calc(var(--el-border-radius-base) - 2px);padding:0 11px}.el-segmented--small{border-radius:calc(var(--el-border-radius-base) - 1px);font-size:14px;min-height:24px}.el-segmented--small .el-segmented__item-selected{border-radius:calc(var(--el-border-radius-base) - 3px)}.el-segmented--small .el-segmented--vertical .el-segmented__item{padding:7px}.el-segmented--small .el-segmented__item{border-radius:calc(var(--el-border-radius-base) - 3px);padding:0 7px}.elx-run-code-dialog,.elx-run-code-drawer{width:75%!important;background-color:var(--shiki-code-header-bg)!important}.elx-run-code-dialog .el-dialog__body,.elx-run-code-drawer .el-dialog__body,.elx-run-code-dialog .el-drawer__body,.elx-run-code-drawer .el-drawer__body{overflow:auto;border-radius:var(--shiki-custom-brr)}.elx-run-code-dialog .el-drawer__header,.elx-run-code-drawer .el-drawer__header{position:relative;margin-bottom:0!important}.elx-run-code-dialog .el-dialog__headerbtn,.elx-run-code-dialog .el-drawer__close-btn,.elx-run-code-drawer .el-dialog__headerbtn,.elx-run-code-drawer .el-drawer__close-btn{color:var(--shiki-code-header-span-color);width:32px;height:32px;padding:5px;box-sizing:border-box;right:10px;top:15px;font-size:20px;border-radius:var(--shiki-custom-brr)}.elx-run-code-dialog .el-dialog__headerbtn:hover,.elx-run-code-dialog .el-drawer__close-btn:hover,.elx-run-code-drawer .el-dialog__headerbtn:hover,.elx-run-code-drawer .el-drawer__close-btn:hover{background-color:var(--shiki-code-header-btn-bg)}.elx-run-code-dialog .view-code-close-btn,.elx-run-code-drawer .view-code-close-btn{background-color:transparent;border:none;position:absolute;width:32px;height:32px;padding:5px;box-sizing:border-box;right:10px;top:15px;font-size:20px;border-radius:var(--shiki-custom-brr)}.elx-run-code-dialog .view-code-close-btn span,.elx-run-code-drawer .view-code-close-btn span{color:var(--shiki-code-header-span-color);width:32px;height:32px}.elx-run-code-dialog .view-code-close-btn span:hover,.elx-run-code-drawer .view-code-close-btn span:hover{color:var(--el-color-primary)}.elx-run-code-dialog .view-code-close-btn:hover,.elx-run-code-drawer .view-code-close-btn:hover{background-color:var(--shiki-code-header-btn-bg)}.elx-run-code-dialog .customCloseBtn:hover,.elx-run-code-drawer .customCloseBtn:hover{background-color:transparent!important}@media (max-width: 768px){.elx-run-code-dialog,.elx-run-code-drawer{width:100%!important}}.elx-run-code-content-view-iframe{height:713px;overflow:hidden}.elx-run-code-dialog-view .el-dialog__body,.elx-run-code-dialog-view .el-drawer__body{border:1px solid transparent!important}body{--shiki-custom-brr-mini: 3px;--shiki-custom-brr: 5px;--shiki-custom-blur: 10px;--shiki-code-header-bg: #fafafa;--shiki-code-header-span-color: #575757;--shiki-code-header-btn-bg: #ebedf0}body.dark{--shiki-custom-brr-mini: 3px;--shiki-custom-brr: 5px;--shiki-custom-blur: 10px;--shiki-code-header-bg: #272727;--shiki-code-header-span-color: #fafafa;--shiki-code-header-btn-bg: #3b3b3b}body.dark .shiki,body.dark .shiki span{color:var(--shiki-dark)!important;background-color:var(--shiki-dark-bg)!important;font-style:var(--shiki-dark-font-style)!important;font-weight:var(--shiki-dark-font-weight)!important;text-decoration:var(--shiki-dark-text-decoration)!important}.shiki{position:relative}.elx-xmarkdown-container{color:#000;padding:5px 10px;border-radius:var(--shiki-custom-brr)}.elx-xmarkdown-container table{border-collapse:collapse;width:100%;border:1px solid #ddd}.elx-xmarkdown-container th{background-color:#fff;border:1px solid #ddd;padding:8px;text-align:left}.elx-xmarkdown-container td{border:1px solid #ddd;padding:8px}.elx-xmarkdown-container tbody tr:nth-child(2n){background-color:#fff}.elx-xmarkdown-container tbody tr:nth-child(odd){background-color:var(--el-fill-color-lighter)}.elx-xmarkdown-container pre code{text-shadow:none!important}.elx-xmarkdown-container pre code span{font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1rem;line-height:1.5rem;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.elx-xmarkdown-container pre div.pre-md{position:relative;border-radius:var(--shiki-custom-brr-mini);border:1px solid var(--el-border-color);min-width:180px!important}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div{box-sizing:content-box!important;position:sticky;top:0;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;padding:5px 5px 5px 8px;border-radius:var(--shiki-custom-brr-mini);-webkit-backdrop-filter:blur(var(--shiki-custom-blur));backdrop-filter:blur(var(--shiki-custom-blur));margin:0;background-color:var(--shiki-code-header-bg);z-index:1}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div span{box-shadow:none!important;background-color:transparent!important}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .markdown-elxLanguage-header-span{font-size:14px;font-family:sans-serif;color:var(--shiki-code-header-span-color)!important;font-weight:700!important;background-color:transparent!important;-webkit-user-select:none;user-select:none}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .markdown-elxLanguage-header-span:hover{cursor:pointer!important}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .markdown-elxLanguage-header-space-start,.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .markdown-elxLanguage-header-space{display:flex;justify-content:flex-end;align-items:center}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .markdown-elxLanguage-header-space-start{justify-content:flex-start}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button{border:1px solid transparent;border-radius:var(--shiki-custom-brr);background-color:transparent;width:fit-content!important;padding:0 3px;height:24px;opacity:1;transition:color .3s ease-in-out;cursor:pointer}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button .el-icon{font-size:15px!important}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button svg{width:15px;height:15px}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button .el-icon,.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button span{background-color:transparent!important;color:var(--shiki-code-header-span-color)!important}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button:hover{background-color:var(--shiki-code-header-btn-bg)}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button span{width:16px;height:16px}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .shiki-header-button-expand span{width:12px;height:12px}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .markdown-elxLanguage-header-toggle-expand{margin:2px 0 0;transition:transform .3s ease-in-out;transform:rotate(-90deg)}.elx-xmarkdown-container pre div.pre-md .markdown-elxLanguage-header-div .copied{color:var(--el-color-success)}.elx-xmarkdown-container pre div.pre-md code{flex:1;box-sizing:border-box;width:100%;height:0}.elx-xmarkdown-container pre div.is-expanded{height:auto!important}.elx-xmarkdown-container pre div.is-expanded code{padding:8px!important;height:auto!important}.elx-xmarkdown-container pre div.is-expanded .markdown-elxLanguage-header-toggle-expand{transform:rotate(0)!important}.inline-code-tag[data-v-7ca0e1bd]{display:inline;background:#d7e2f8;color:#376fde;padding:0 4px;margin:0 4px;border-radius:4px;font-weight:500;border:1px solid #d7e2f8;word-wrap:break-word;word-break:break-all;line-height:2}.el-tabs{--el-tabs-header-height:40px;display:flex}.el-tabs__header{align-items:center;display:flex;justify-content:space-between;margin:0 0 15px;padding:0;position:relative}.el-tabs__header-vertical{flex-direction:column}.el-tabs__active-bar{background-color:var(--el-color-primary);bottom:0;height:2px;left:0;list-style:none;position:absolute;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);z-index:1}.el-tabs__new-tab{align-items:center;border:1px solid var(--el-border-color);border-radius:3px;color:var(--el-text-color-primary);cursor:pointer;display:flex;flex-shrink:0;font-size:12px;height:20px;justify-content:center;line-height:20px;margin:10px 0 10px 10px;text-align:center;transition:all .15s;width:20px}.el-tabs__new-tab .is-icon-plus{height:inherit;transform:scale(.8);width:inherit}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__new-tab-vertical{margin-left:0}.el-tabs__nav-wrap{flex:1 auto;margin-bottom:-1px;overflow:hidden;position:relative}.el-tabs__nav-wrap:after{background-color:var(--el-border-color-light);bottom:0;content:"";height:2px;left:0;position:absolute;width:100%;z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-scrollable{box-sizing:border-box;padding:0 20px}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{color:var(--el-text-color-secondary);cursor:pointer;font-size:12px;line-height:44px;position:absolute;text-align:center;width:20px}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{display:flex;float:left;position:relative;transition:transform var(--el-transition-duration);white-space:nowrap;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{display:flex;min-width:100%}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{align-items:center;box-sizing:border-box;color:var(--el-text-color-primary);display:flex;font-size:var(--el-font-size-base);font-weight:500;height:var(--el-tabs-header-height);justify-content:center;list-style:none;padding:0 20px;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus-visible{border-radius:3px;box-shadow:0 0 2px 2px var(--el-color-primary) inset}.el-tabs__item .is-icon-close{border-radius:50%;margin-left:5px;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs__item .is-icon-close:before{display:inline-block;transform:scale(.9)}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active,.el-tabs__item:hover{color:var(--el-color-primary)}.el-tabs__item:hover{cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{flex-grow:1;overflow:hidden;position:relative}.el-tabs--bottom>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:0}.el-tabs--bottom>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top>.el-tabs__header .el-tabs__item:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);box-sizing:border-box;height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{font-size:12px;height:14px;overflow:hidden;position:relative;right:-2px;transform-origin:100% 50%;width:0}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);margin-top:-1px;transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{border:1px solid transparent;color:var(--el-text-color-secondary);margin-top:-1px;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{background-color:var(--el-bg-color-overlay);border-left-color:var(--el-border-color);border-right-color:var(--el-border-color);color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom{flex-direction:column}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-bottom:0;margin-top:-1px}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{bottom:auto;height:auto;top:0;width:2px}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{cursor:pointer;height:30px;line-height:30px;text-align:center;width:100%}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{bottom:0;right:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{bottom:auto;height:100%;top:0;width:2px}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left{flex-direction:row}.el-tabs--left .el-tabs__header.is-left{margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-bottom:none;border-left:none;border-right:1px solid var(--el-border-color-light);border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:none;border-right:1px solid #fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-radius:4px 0 0 4px;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:rgb(209,219,229) transparent}.el-tabs--left>.el-tabs__content+.el-tabs__header{order:-1}.el-tabs--right .el-tabs__header.is-right{margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:1px solid #fff;border-right:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-left:none;border-radius:0 4px 4px 0}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:rgb(209,219,229) transparent}.el-tabs--top{flex-direction:column}.el-tabs--top>.el-tabs__content+.el-tabs__header{order:-1}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{animation:slideInRight-leave var(--el-transition-duration);left:0;position:absolute;right:0}.slideInLeft-enter{animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{animation:slideInLeft-leave var(--el-transition-duration);left:0;position:absolute;right:0}@keyframes slideInRight-enter{0%{opacity:0;transform:translate(100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@keyframes slideInRight-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(100%);transform-origin:0 0}}@keyframes slideInLeft-enter{0%{opacity:0;transform:translate(-100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@keyframes slideInLeft-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(-100%);transform-origin:0 0}}.mermaid-toolbar[data-v-c91486b5]{display:flex;align-items:center;height:42px;background:#ebecef;border-radius:3px 3px 0 0;padding:0 12px;pointer-events:auto;position:relative;z-index:10}.mermaid-toolbar .toolbar-left[data-v-c91486b5]{flex:1}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__header{margin:0;border-bottom:none}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__nav{background:#dddee1;padding:2px;border-radius:10px}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__nav-wrap:after{display:none}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__item{height:32px;line-height:32px;padding:0 12px;font-size:12px;border:none;color:var(--tab-text-color, var(--el-text-color-regular));width:60px;text-align:center;box-sizing:border-box;font-weight:700}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__item.is-active{color:var(--tab-text-color, var(--el-text-color-primary));background:var(--tab-active-bg, rgba(255, 255, 255, .8));border-radius:10px}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__item:hover:not(.is-active){color:var(--tab-text-color, var(--el-text-color-primary));background:#d1d2d5;border-radius:10px}.mermaid-toolbar .toolbar-left .toolbar-tabs[data-v-c91486b5] .el-tabs__active-bar{display:none}.mermaid-toolbar .toolbar-right[data-v-c91486b5]{display:flex;align-items:center;gap:0}.mermaid-toolbar .toolbar-right .toolbar-action-btn[data-v-c91486b5]{display:flex;align-items:center;justify-content:center;width:32px;height:32px;cursor:pointer;transition:all .2s ease;color:var(--el-text-color-regular);border-radius:4px;position:relative}.mermaid-toolbar .toolbar-right .toolbar-action-btn[data-v-c91486b5]:hover:not(.disabled){color:var(--custom-icon-color, var(--el-text-color-primary))}.mermaid-toolbar .toolbar-right .toolbar-action-btn[data-v-c91486b5]:hover:not(.disabled):before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:24px;height:24px;background:#dddee1;border-radius:4px;z-index:-1}.mermaid-toolbar .toolbar-right .toolbar-action-btn[data-v-c91486b5]:active:not(.disabled){transform:scale(.95)}.mermaid-toolbar .toolbar-right .toolbar-action-btn.disabled[data-v-c91486b5]{opacity:.4;cursor:not-allowed;transform:none!important;background:none!important}.mermaid-toolbar .toolbar-right .toolbar-action-btn.toolbar-action-btn-last[data-v-c91486b5]{margin-right:0}.mermaid-toolbar .toolbar-right .toolbar-action-btn.copy-success[data-v-c91486b5]{cursor:default;transform:none!important}.mermaid-toolbar .toolbar-right .toolbar-divider[data-v-c91486b5]{width:1px;height:16px;background:var(--el-border-color);margin:0 8px}.markdown-mermaid:hover .mermaid-toolbar{opacity:1;visibility:visible}.markdown-mermaid:fullscreen .mermaid-toolbar{background:#000c;border-bottom-color:#ffffff1a}.markdown-mermaid:fullscreen .mermaid-toolbar{color:#fff;background:#ffffff1a}.markdown-mermaid:fullscreen .mermaid-toolbar{color:#ffffffe6}.markdown-mermaid:fullscreen .mermaid-toolbar{color:#ffffffb3}.markdown-mermaid:fullscreen .mermaid-toolbar{background:#ffffff1a;color:#fff}.markdown-mermaid:fullscreen .mermaid-toolbar{background:#fff3}.markdown-mermaid{position:relative;width:100%;height:100%;min-width:100px;min-height:100px;background-color:#f5f5f5;border-radius:4px;overflow:hidden;display:flex;flex-direction:column}.markdown-mermaid .toolbar-container{position:relative;z-index:10;flex-shrink:0;background:#fff}.markdown-mermaid .toolbar-container .custom-mermaid-header{position:relative;z-index:11}.markdown-mermaid .toolbar-container .mermaid-language-tag{display:inline-block;padding:8px 12px;background:#f0f9ff;border:1px solid #e0f2fe;border-radius:4px;font-size:12px;color:#0891b2;margin-right:8px}.markdown-mermaid .toolbar-container .mermaid-default-toolbar{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#fff}.markdown-mermaid .toolbar-container .mermaid-default-toolbar .toolbar-buttons{display:flex;gap:4px}.markdown-mermaid .toolbar-container .mermaid-default-toolbar .toolbar-buttons button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid #d1d5db;border-radius:4px;background:#fff;color:#374151;font-size:12px;cursor:pointer;transition:all .2s ease}.markdown-mermaid .toolbar-container .mermaid-default-toolbar .toolbar-buttons button:hover{background:#f3f4f6;border-color:#9ca3af}.markdown-mermaid .toolbar-container .mermaid-default-toolbar .toolbar-buttons button:active{background:#e5e7eb}.markdown-mermaid .mermaid-content{position:relative;z-index:1;flex:1;min-height:200px;cursor:grab;display:flex;align-items:center;justify-content:flex-start;overflow:hidden}.markdown-mermaid .mermaid-content:active{cursor:grabbing}.markdown-mermaid .mermaid-content svg{transform-origin:center center;position:relative;max-width:100%;max-height:100%}.markdown-mermaid .mermaid-content.rendering svg{opacity:.8;pointer-events:none}.markdown-mermaid:fullscreen .mermaid-content{max-height:100vh;justify-content:center}.markdown-mermaid.dragging .mermaid-content{cursor:grabbing}.markdown-mermaid.zoom-limit .mermaid-content{transform-origin:center center}.markdown-mermaid .mermaid-source-code{position:relative;z-index:1;flex:1;width:100%;margin:0;padding:16px;background-color:#f8f9fa;border:1px solid #e9ecef;border-radius:4px;font-family:Courier New,monospace;font-size:14px;line-height:1.5;color:#333;overflow:auto;white-space:pre-wrap;word-wrap:break-word;box-sizing:border-box}.content-enter-active{transition:opacity .2s ease-out}.content-leave-active{transition:opacity .15s ease-in}.content-enter-from,.content-leave-to{opacity:0}.toolbar-enter-active,.toolbar-leave-active{transition:all .3s ease}.toolbar-enter-from,.toolbar-leave-to{opacity:0;transform:translateY(-10px)}.katex-error{color:var(--el-text-color-secondary)!important}.katex-html{overflow:auto hidden;padding:3px}
|
|
23
23
|
|
|
24
|
+
.vk-echart-x {
|
|
25
|
+
height: 500px;
|
|
26
|
+
width: 100%;
|
|
27
|
+
}
|
|
28
|
+
|
|
24
29
|
.vk-chat-independent-main__bubbles {
|
|
25
30
|
padding: 8px 8px 0 12px;
|
|
26
31
|
height: 100%;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vunk/plus",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "ISC",
|
|
@@ -191,6 +191,9 @@
|
|
|
191
191
|
"./components/chat-independent/index.css": {
|
|
192
192
|
"import": "./components/chat-independent/index.css"
|
|
193
193
|
},
|
|
194
|
+
"./components/bubble-templates/index.css": {
|
|
195
|
+
"import": "./components/bubble-templates/index.css"
|
|
196
|
+
},
|
|
194
197
|
"./components/bubble-list/index.css": {
|
|
195
198
|
"import": "./components/bubble-list/index.css"
|
|
196
199
|
}
|
|
@@ -107,7 +107,10 @@ class StreamingInferenceService {
|
|
|
107
107
|
blendingMaskBitmap: sharedData.blendingMaskBitmap,
|
|
108
108
|
startImageIndex
|
|
109
109
|
};
|
|
110
|
-
this.worker.postMessage(message, [
|
|
110
|
+
this.worker.postMessage(message, [
|
|
111
|
+
sharedData.blendingMaskBitmap,
|
|
112
|
+
zipBuffer
|
|
113
|
+
]);
|
|
111
114
|
}
|
|
112
115
|
/**
|
|
113
116
|
* 添加一个chunk进行推理。
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { createAudioContext, StreamingFeatureExtractorService } from './src/audio/index.mjs';
|
|
2
2
|
export { w as workerConfig } from '../config.mjs';
|
|
3
3
|
export { S as StreamingInferenceService } from '../StreamingInferenceService.mjs';
|
|
4
|
-
import {
|
|
5
|
-
export {
|
|
6
|
-
import 'onnxruntime-web';
|
|
7
|
-
import 'vue';
|
|
4
|
+
import { loadImageData } from './src/media/index.mjs';
|
|
5
|
+
export { PredictiveFrameLoader } from './src/media/index.mjs';
|
|
8
6
|
import '../constants.mjs';
|
|
9
|
-
import '../utils.mjs';
|
|
10
7
|
import '@vunk/shared/promise';
|
|
11
8
|
|
|
12
9
|
var maskUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAAAAADH8yjkAAADsElEQVRoBbXBsaoYBAwF0KTP0vBQgppBNGNn6VTu5Cj55ODoFDoV545RHKIuUlLqq/5EPIfp2cPzh2f0f/j09PHpEz97ePEonzHd+/efff/hiZ+/sG/t8YHuPb2f3+YDP37+8vuXXz2nex//fPfLu7/5iy9f/fDqmxd078Pvb39++xfr169/fP2d0L399c1Pb/5gNQRc6N52ZQ2rIeBC97Yra1gNARe6t11Zw2oIuNC97coaVkPAhe5tV9awGgIudG+7sobVEHChe9uVNayGgAvd266sYTUEXOjedmUNqyHgQve2K2tYDQEXurddWcNqCLjQve3KGlZDwIXubVfWsBoCLnRvu7KG1RBwoXvblTWshoAL3duurGE1BFzo3nZlDash4EL3titrWA0BF7q3XVnDagi40L3tyhpWQ8CF7m1X1rAaAi50b7uyhtUQcKF725U1rIaAC93brqxhNQRc6N52ZQ2rIeBC97Yra1gNARe6t11Zw2oIuNC97coaVkPAhe5tV9awGgIudG+7sobVEHChe9uVNayGgAvd266sYTUEXOjedmUNqyHgQve2K2tYDQEXurddWcNqCLjQve3KGlZDwIXubVfWsBoCLnRvu7KG1RBwoXvblTWshoAL3duurGE1BFzo3nZlDash4EL3titrWA0BF7q3XVnDagi40L3tyhpWQ8CF7m1X1rAaAi50b7uyhtUQcKF725U1rIaAC93brqxhNQRc6N52ZQ2rIeBC97Yra1gNARe6t11Zw2oIuNC97coaVkPAhe5tV9awGgIudG+7sobVEHChe9uVNayGgAvd266sYTUEXOjedmUNqyHgQve2K2tYDQEXurddWcNqCLjQve3KGlZDwIXubVfWsBoCLnRvu7KG1RBwoXvblTWshoAL3duurGE1BFzo3nZlDash4EL3titrWA0BF7q3XVnDagi40L3tyhpWQ8CF7m1X1rAaAi50b7uyhtUQcKF725U1rIaAC93brqxhNQRc6N52ZQ2rIeBC97Yra1gNARe6t11Zw2oIuNC97coaVkPAhe5tV9awGgIudG+7sobVEHChe9uVNayGgAvd266sYTUEXOjedmUNqyHgQve2K2tYDQEXurddWcNqCLjQve3KGtavX//4+juhe/vrm5/e/MFffPnqh1ffvKB7H35/+/Pbv/jx85ffv/zqOd37+Oe7X979zc9f2Lf2+ED3nt7Pb/OBnz28eJTPmO79+8++//DE9Ozh+cMz+j98evr49Ok/l/tDxY3JIlEAAAAASUVORK5CYII=";
|
|
@@ -8,6 +8,18 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @author Zhonghan Li
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* 创建AudioContext的兼容函数,处理Safari的限制。
|
|
13
|
+
* 在Safari中,AudioContext需要在用户交互后才能创建。
|
|
14
|
+
*/
|
|
15
|
+
export declare function createAudioContext(): Promise<AudioContext>;
|
|
16
|
+
/**
|
|
17
|
+
* 特征提取结果接口
|
|
18
|
+
*/
|
|
19
|
+
export interface FeatureExtractionResult {
|
|
20
|
+
features: Float32Array;
|
|
21
|
+
dimensions: number[];
|
|
22
|
+
}
|
|
11
23
|
/**
|
|
12
24
|
* 单个chunk的特征提取结果结构体。
|
|
13
25
|
*/
|
|
@@ -57,8 +69,6 @@ export declare class StreamingFeatureExtractorService {
|
|
|
57
69
|
private queue;
|
|
58
70
|
/** 回调函数集合 */
|
|
59
71
|
private callbacks;
|
|
60
|
-
/** 性能计时器 */
|
|
61
|
-
private timer;
|
|
62
72
|
/** 存储每个chunk的处理结果,用于最终合并 */
|
|
63
73
|
private chunkResults;
|
|
64
74
|
/** 音频总chunk数 */
|
|
@@ -73,8 +83,8 @@ export declare class StreamingFeatureExtractorService {
|
|
|
73
83
|
private audioBuffer;
|
|
74
84
|
/** 音频上下文实例,用于创建AudioBuffer */
|
|
75
85
|
private audioContext;
|
|
76
|
-
/**
|
|
77
|
-
private
|
|
86
|
+
/** 复用的Worker实例,以提高性能 */
|
|
87
|
+
private worker;
|
|
78
88
|
/**
|
|
79
89
|
* 创建AudioBuffer的兼容方法,处理Safari的限制。
|
|
80
90
|
* @param numberOfChannels 声道数
|
|
@@ -83,6 +93,12 @@ export declare class StreamingFeatureExtractorService {
|
|
|
83
93
|
* @returns AudioBuffer实例
|
|
84
94
|
*/
|
|
85
95
|
private createAudioBuffer;
|
|
96
|
+
/**
|
|
97
|
+
* 使用Worker处理AudioBuffer,提取特征
|
|
98
|
+
* @param audioBuffer 输入的AudioBuffer
|
|
99
|
+
* @returns Promise<FeatureExtractionResult>
|
|
100
|
+
*/
|
|
101
|
+
private processWithWorker;
|
|
86
102
|
/**
|
|
87
103
|
* 启动流式音频特征提取。
|
|
88
104
|
* @param audioBuffer 输入的音频缓冲区。
|
|
@@ -1,111 +1,5 @@
|
|
|
1
|
-
import { W as WINDOW_NUM_CHUNKS, d as WINDOW_NUM_CHUNKS_HALF, C as CHUNK_DURATION_SECONDS, a as NUM_SEQUENCE_FRAMES, N as NUM_MEL_BINS } from '../../../constants.mjs';
|
|
2
1
|
import { w as workerConfig } from '../../../config.mjs';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
function getAudioWindow(allAudioFeatures, allAudioDims, centerChunkIndex) {
|
|
6
|
-
if (allAudioDims.length !== 3) {
|
|
7
|
-
throw new Error(
|
|
8
|
-
"Invalid dimensions array provided to getAudioWindow. Expected length 3."
|
|
9
|
-
);
|
|
10
|
-
}
|
|
11
|
-
const [numChunks, chunkSize, melBins] = allAudioDims;
|
|
12
|
-
const finalWindowData = new Float32Array(
|
|
13
|
-
WINDOW_NUM_CHUNKS * chunkSize * melBins
|
|
14
|
-
);
|
|
15
|
-
const chunkTotalSize = chunkSize * melBins;
|
|
16
|
-
for (let j = 0; j < WINDOW_NUM_CHUNKS; j++) {
|
|
17
|
-
const sourceChunkIndex = centerChunkIndex - WINDOW_NUM_CHUNKS_HALF + j;
|
|
18
|
-
const clampedSourceIndex = Math.max(
|
|
19
|
-
0,
|
|
20
|
-
Math.min(sourceChunkIndex, numChunks - 1)
|
|
21
|
-
);
|
|
22
|
-
const sourceChunkStart = clampedSourceIndex * chunkTotalSize;
|
|
23
|
-
const sourceChunkEnd = sourceChunkStart + chunkTotalSize;
|
|
24
|
-
const chunkData = allAudioFeatures.subarray(
|
|
25
|
-
sourceChunkStart,
|
|
26
|
-
sourceChunkEnd
|
|
27
|
-
);
|
|
28
|
-
const destChunkStart = j * chunkTotalSize;
|
|
29
|
-
finalWindowData.set(chunkData, destChunkStart);
|
|
30
|
-
}
|
|
31
|
-
return finalWindowData;
|
|
32
|
-
}
|
|
33
|
-
async function createAudioContext() {
|
|
34
|
-
const AudioContextClass = window.AudioContext || window.webkitAudioContext;
|
|
35
|
-
if (!AudioContextClass) {
|
|
36
|
-
throw new Error("\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301Web Audio API");
|
|
37
|
-
}
|
|
38
|
-
const audioContext = new AudioContextClass();
|
|
39
|
-
if (audioContext.state === "suspended") {
|
|
40
|
-
await audioContext.resume();
|
|
41
|
-
}
|
|
42
|
-
return audioContext;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
class FeatureExtractorService {
|
|
46
|
-
constructor() {
|
|
47
|
-
this.errorHandler = createErrorHandler("FeatureExtractorService");
|
|
48
|
-
this.worker = new Worker(
|
|
49
|
-
/* @vite-ignore */
|
|
50
|
-
`${workerConfig.path}/feature.worker.js`,
|
|
51
|
-
{ type: "module" }
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 处理 AudioBuffer,在后台线程中提取特征。
|
|
56
|
-
* @param audioBuffer Web Audio API 的 AudioBuffer 对象。
|
|
57
|
-
* @returns 一个 Promise,成功时解析为特征结果,失败时拒绝并返回错误信息。
|
|
58
|
-
*/
|
|
59
|
-
async process(audioBuffer) {
|
|
60
|
-
try {
|
|
61
|
-
const leftChannel = audioBuffer.getChannelData(0);
|
|
62
|
-
const rightChannel = audioBuffer.numberOfChannels > 1 ? audioBuffer.getChannelData(1) : void 0;
|
|
63
|
-
const message = {
|
|
64
|
-
leftChannel,
|
|
65
|
-
rightChannel,
|
|
66
|
-
sampleRate: audioBuffer.sampleRate
|
|
67
|
-
};
|
|
68
|
-
const transferList = [leftChannel.buffer, rightChannel?.buffer].filter(Boolean);
|
|
69
|
-
const result = await this.createWorkerPromise(
|
|
70
|
-
message,
|
|
71
|
-
transferList
|
|
72
|
-
);
|
|
73
|
-
return result;
|
|
74
|
-
} catch (error) {
|
|
75
|
-
throw this.errorHandler(error);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* 创建Worker Promise,直接处理消息传递
|
|
80
|
-
*/
|
|
81
|
-
createWorkerPromise(message, transferList) {
|
|
82
|
-
return new Promise((resolve, reject) => {
|
|
83
|
-
const handleMessage = (event) => {
|
|
84
|
-
this.worker.removeEventListener("message", handleMessage);
|
|
85
|
-
this.worker.removeEventListener("error", handleError);
|
|
86
|
-
if (event.data.status === "success") {
|
|
87
|
-
resolve(event.data.payload);
|
|
88
|
-
} else {
|
|
89
|
-
reject(new Error(event.data.error || "Unknown worker error"));
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
function handleError(error) {
|
|
93
|
-
this.worker.removeEventListener("message", handleMessage);
|
|
94
|
-
this.worker.removeEventListener("error", handleError);
|
|
95
|
-
reject(error);
|
|
96
|
-
}
|
|
97
|
-
this.worker.addEventListener("message", handleMessage);
|
|
98
|
-
this.worker.addEventListener("error", handleError);
|
|
99
|
-
this.worker.postMessage(message, transferList);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 终止Worker
|
|
104
|
-
*/
|
|
105
|
-
terminate() {
|
|
106
|
-
this.worker.terminate();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
2
|
+
import { C as CHUNK_DURATION_SECONDS, a as NUM_SEQUENCE_FRAMES, N as NUM_MEL_BINS } from '../../../constants.mjs';
|
|
109
3
|
|
|
110
4
|
var __defProp = Object.defineProperty;
|
|
111
5
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
@@ -239,13 +133,22 @@ var _AsyncQueue = class _AsyncQueue {
|
|
|
239
133
|
__name(_AsyncQueue, "AsyncQueue");
|
|
240
134
|
var AsyncQueue = _AsyncQueue;
|
|
241
135
|
|
|
136
|
+
async function createAudioContext() {
|
|
137
|
+
const AudioContextClass = window.AudioContext || window.webkitAudioContext;
|
|
138
|
+
if (!AudioContextClass) {
|
|
139
|
+
throw new Error("\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301Web Audio API");
|
|
140
|
+
}
|
|
141
|
+
const audioContext = new AudioContextClass();
|
|
142
|
+
if (audioContext.state === "suspended") {
|
|
143
|
+
await audioContext.resume();
|
|
144
|
+
}
|
|
145
|
+
return audioContext;
|
|
146
|
+
}
|
|
242
147
|
class StreamingFeatureExtractorService {
|
|
243
148
|
constructor() {
|
|
244
149
|
this.queue = new AsyncQueue();
|
|
245
150
|
/** 回调函数集合 */
|
|
246
151
|
this.callbacks = {};
|
|
247
|
-
/** 性能计时器 */
|
|
248
|
-
this.timer = new PerformanceTimer();
|
|
249
152
|
/** 存储每个chunk的处理结果,用于最终合并 */
|
|
250
153
|
this.chunkResults = [];
|
|
251
154
|
/** 音频总chunk数 */
|
|
@@ -260,8 +163,8 @@ class StreamingFeatureExtractorService {
|
|
|
260
163
|
this.audioBuffer = null;
|
|
261
164
|
/** 音频上下文实例,用于创建AudioBuffer */
|
|
262
165
|
this.audioContext = null;
|
|
263
|
-
/**
|
|
264
|
-
this.
|
|
166
|
+
/** 复用的Worker实例,以提高性能 */
|
|
167
|
+
this.worker = null;
|
|
265
168
|
}
|
|
266
169
|
/**
|
|
267
170
|
* 创建AudioBuffer的兼容方法,处理Safari的限制。
|
|
@@ -289,6 +192,47 @@ class StreamingFeatureExtractorService {
|
|
|
289
192
|
);
|
|
290
193
|
}
|
|
291
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* 使用Worker处理AudioBuffer,提取特征
|
|
197
|
+
* @param audioBuffer 输入的AudioBuffer
|
|
198
|
+
* @returns Promise<FeatureExtractionResult>
|
|
199
|
+
*/
|
|
200
|
+
async processWithWorker(audioBuffer) {
|
|
201
|
+
if (!this.worker) {
|
|
202
|
+
throw new Error("Worker not initialized");
|
|
203
|
+
}
|
|
204
|
+
return new Promise((resolve, reject) => {
|
|
205
|
+
const cleanup = () => {
|
|
206
|
+
if (this.worker) {
|
|
207
|
+
this.worker.removeEventListener("message", handleMessage);
|
|
208
|
+
this.worker.removeEventListener("error", handleError);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
function handleMessage(event) {
|
|
212
|
+
cleanup();
|
|
213
|
+
if (event.data.status === "success") {
|
|
214
|
+
resolve(event.data.payload);
|
|
215
|
+
} else {
|
|
216
|
+
reject(new Error(event.data.error || "Unknown worker error"));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function handleError(error) {
|
|
220
|
+
cleanup();
|
|
221
|
+
reject(error);
|
|
222
|
+
}
|
|
223
|
+
this.worker.addEventListener("message", handleMessage);
|
|
224
|
+
this.worker.addEventListener("error", handleError);
|
|
225
|
+
const leftChannel = audioBuffer.getChannelData(0);
|
|
226
|
+
const rightChannel = audioBuffer.numberOfChannels > 1 ? audioBuffer.getChannelData(1) : void 0;
|
|
227
|
+
const message = {
|
|
228
|
+
leftChannel,
|
|
229
|
+
rightChannel,
|
|
230
|
+
sampleRate: audioBuffer.sampleRate
|
|
231
|
+
};
|
|
232
|
+
const transferList = [leftChannel.buffer, rightChannel?.buffer].filter(Boolean);
|
|
233
|
+
this.worker.postMessage(message, transferList);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
292
236
|
/**
|
|
293
237
|
* 启动流式音频特征提取。
|
|
294
238
|
* @param audioBuffer 输入的音频缓冲区。
|
|
@@ -305,22 +249,24 @@ class StreamingFeatureExtractorService {
|
|
|
305
249
|
this.chunkResults = [];
|
|
306
250
|
this.completedChunks = 0;
|
|
307
251
|
this.totalFramesProcessed = 0;
|
|
308
|
-
this.
|
|
252
|
+
if (!this.worker) {
|
|
253
|
+
this.worker = new Worker(
|
|
254
|
+
/* @vite-ignore */
|
|
255
|
+
`${workerConfig.path}/feature.worker.js`,
|
|
256
|
+
{ type: "module" }
|
|
257
|
+
);
|
|
258
|
+
}
|
|
309
259
|
const durationSeconds = audioBuffer.duration;
|
|
310
260
|
this.totalChunks = Math.ceil(durationSeconds / CHUNK_DURATION_SECONDS);
|
|
311
261
|
try {
|
|
312
|
-
this.timer.start("totalProcessing");
|
|
313
262
|
for (let chunkIndex = 0; chunkIndex < this.totalChunks; chunkIndex++) {
|
|
314
263
|
if (!this.isRunning)
|
|
315
264
|
break;
|
|
316
|
-
this.timer.start(`chunk_${chunkIndex}`);
|
|
317
265
|
await this.processChunk(chunkIndex);
|
|
318
|
-
this.timer.end(`chunk_${chunkIndex}`);
|
|
319
266
|
}
|
|
320
267
|
if (this.isRunning) {
|
|
321
268
|
await this.finalize();
|
|
322
269
|
}
|
|
323
|
-
this.timer.end("totalProcessing");
|
|
324
270
|
} catch (error) {
|
|
325
271
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
326
272
|
this.callbacks.onError?.(errorMessage);
|
|
@@ -334,7 +280,7 @@ class StreamingFeatureExtractorService {
|
|
|
334
280
|
* @param chunkIndex chunk的索引(从0开始)。
|
|
335
281
|
*/
|
|
336
282
|
async processChunk(chunkIndex) {
|
|
337
|
-
if (!this.audioBuffer || !this.
|
|
283
|
+
if (!this.audioBuffer || !this.worker)
|
|
338
284
|
return;
|
|
339
285
|
const startTimeSeconds = chunkIndex * CHUNK_DURATION_SECONDS;
|
|
340
286
|
const endTimeSeconds = Math.min(
|
|
@@ -346,11 +292,6 @@ class StreamingFeatureExtractorService {
|
|
|
346
292
|
);
|
|
347
293
|
const endSample = Math.floor(endTimeSeconds * this.audioBuffer.sampleRate);
|
|
348
294
|
const chunkLength = endSample - startSample;
|
|
349
|
-
console.log(
|
|
350
|
-
`\u5904\u7406chunk ${chunkIndex}: ${startTimeSeconds.toFixed(
|
|
351
|
-
2
|
|
352
|
-
)}s - ${endTimeSeconds.toFixed(2)}s`
|
|
353
|
-
);
|
|
354
295
|
const chunkBuffer = await this.createAudioBuffer(
|
|
355
296
|
this.audioBuffer.numberOfChannels,
|
|
356
297
|
chunkLength,
|
|
@@ -361,36 +302,25 @@ class StreamingFeatureExtractorService {
|
|
|
361
302
|
const chunkData = chunkBuffer.getChannelData(channel);
|
|
362
303
|
chunkData.set(sourceData.subarray(startSample, endSample));
|
|
363
304
|
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
console.log(
|
|
379
|
-
`Chunk ${chunkIndex} \u5B8C\u6210\uFF0C\u7279\u5F81\u7EF4\u5EA6: [${result.dimensions.join(", ")}]`
|
|
380
|
-
);
|
|
381
|
-
this.callbacks.onChunkComplete?.(chunkResult);
|
|
382
|
-
this.callbacks.onProgress?.(this.completedChunks, this.totalChunks);
|
|
383
|
-
this.chunkResults[chunkIndex] = null;
|
|
384
|
-
} catch (error) {
|
|
385
|
-
console.error(`\u5904\u7406chunk ${chunkIndex} \u65F6\u53D1\u751F\u9519\u8BEF:`, error);
|
|
386
|
-
throw error;
|
|
387
|
-
}
|
|
305
|
+
const result = await this.processWithWorker(chunkBuffer);
|
|
306
|
+
const chunkResult = {
|
|
307
|
+
chunkIndex,
|
|
308
|
+
features: result.features,
|
|
309
|
+
dimensions: result.dimensions,
|
|
310
|
+
startTimeSeconds,
|
|
311
|
+
endTimeSeconds
|
|
312
|
+
};
|
|
313
|
+
this.totalFramesProcessed += chunkResult.dimensions[0];
|
|
314
|
+
this.chunkResults[chunkIndex] = chunkResult;
|
|
315
|
+
this.completedChunks++;
|
|
316
|
+
this.callbacks.onChunkComplete?.(chunkResult);
|
|
317
|
+
this.callbacks.onProgress?.(this.completedChunks, this.totalChunks);
|
|
318
|
+
this.chunkResults[chunkIndex] = null;
|
|
388
319
|
}
|
|
389
320
|
/**
|
|
390
321
|
* 所有chunk处理完成后,合并特征并调用onComplete。
|
|
391
322
|
*/
|
|
392
323
|
async finalize() {
|
|
393
|
-
console.log("\u6700\u7EC8\u786E\u5B9A\u6240\u6709chunk\u7684\u5904\u7406...");
|
|
394
324
|
if (this.completedChunks === 0) {
|
|
395
325
|
this.callbacks.onError?.("No chunks were processed.");
|
|
396
326
|
return;
|
|
@@ -400,7 +330,6 @@ class StreamingFeatureExtractorService {
|
|
|
400
330
|
NUM_SEQUENCE_FRAMES,
|
|
401
331
|
NUM_MEL_BINS
|
|
402
332
|
];
|
|
403
|
-
console.log(`\u7279\u5F81\u5904\u7406\u5B8C\u6210, \u603B\u7EF4\u5EA6: [${totalDimensions.join(", ")}]`);
|
|
404
333
|
this.callbacks.onComplete?.(totalDimensions);
|
|
405
334
|
}
|
|
406
335
|
/**
|
|
@@ -409,9 +338,9 @@ class StreamingFeatureExtractorService {
|
|
|
409
338
|
cleanup() {
|
|
410
339
|
this.isRunning = false;
|
|
411
340
|
this.audioBuffer = null;
|
|
412
|
-
if (this.
|
|
413
|
-
this.
|
|
414
|
-
this.
|
|
341
|
+
if (this.worker) {
|
|
342
|
+
this.worker.terminate();
|
|
343
|
+
this.worker = null;
|
|
415
344
|
}
|
|
416
345
|
this.chunkResults.forEach((chunk) => {
|
|
417
346
|
if (chunk && chunk.features) {
|
|
@@ -423,18 +352,16 @@ class StreamingFeatureExtractorService {
|
|
|
423
352
|
this.completedChunks = 0;
|
|
424
353
|
this.totalChunks = 0;
|
|
425
354
|
this.totalFramesProcessed = 0;
|
|
426
|
-
this.timer.reset();
|
|
427
355
|
}
|
|
428
356
|
/**
|
|
429
357
|
* 停止当前的流式处理。
|
|
430
358
|
*/
|
|
431
359
|
stop() {
|
|
432
360
|
if (this.isRunning) {
|
|
433
|
-
console.log("\u505C\u6B62\u6D41\u5F0F\u97F3\u9891\u5904\u7406");
|
|
434
361
|
this.isRunning = false;
|
|
435
|
-
if (this.
|
|
436
|
-
this.
|
|
437
|
-
this.
|
|
362
|
+
if (this.worker) {
|
|
363
|
+
this.worker.terminate();
|
|
364
|
+
this.worker = null;
|
|
438
365
|
}
|
|
439
366
|
this.callbacks = {};
|
|
440
367
|
this.chunkResults = [];
|
|
@@ -445,4 +372,4 @@ class StreamingFeatureExtractorService {
|
|
|
445
372
|
}
|
|
446
373
|
}
|
|
447
374
|
|
|
448
|
-
export {
|
|
375
|
+
export { StreamingFeatureExtractorService, createAudioContext };
|
|
@@ -11,29 +11,7 @@ export declare const NUM_MEL_BINS = 80;
|
|
|
11
11
|
export declare const NUM_SEQUENCE_FRAMES = 4;
|
|
12
12
|
/** 每个chunk的时长(秒) */
|
|
13
13
|
export declare const CHUNK_DURATION_SECONDS = 5;
|
|
14
|
-
/** 目标帧率 (FPS) */
|
|
15
|
-
export declare const TARGET_FPS = 25;
|
|
16
|
-
/** 每帧之间的间隔时间 (毫秒) */
|
|
17
|
-
export declare const FRAME_INTERVAL_MS: number;
|
|
18
|
-
/** 音频采样率 (Hz) */
|
|
19
|
-
export declare const SAMPLE_RATE = 16000;
|
|
20
|
-
/** 音频帧长度 (毫秒) */
|
|
21
|
-
export declare const FRAME_LENGTH_MS = 25;
|
|
22
|
-
/** 音频帧移 (毫秒) */
|
|
23
|
-
export declare const FRAME_SHIFT_MS = 10;
|
|
24
|
-
/** 能量下限,用于防止在对数计算中出现 log(0) 的情况 */
|
|
25
|
-
export declare const ENERGY_FLOOR = 1e-10;
|
|
26
|
-
/** 预加重系数 */
|
|
27
|
-
export declare const PREEMPH_COEFF = 0.97;
|
|
28
14
|
/** 上下文窗口中的总块数 */
|
|
29
15
|
export declare const WINDOW_NUM_CHUNKS = 32;
|
|
30
16
|
/** 上下文窗口的单边块数(半径) */
|
|
31
17
|
export declare const WINDOW_NUM_CHUNKS_HALF: number;
|
|
32
|
-
/** 批处理大小,用于批量推理以提高吞吐量 */
|
|
33
|
-
export declare const BATCH_SIZE = 32;
|
|
34
|
-
/** 默认的低频截止频率 (Hz) */
|
|
35
|
-
export declare const DEFAULT_LOW_FREQ = 20;
|
|
36
|
-
/** 是否移除直流分量(DC offset) */
|
|
37
|
-
export declare const REMOVE_DC_OFFSET = true;
|
|
38
|
-
/** FFT 计算大小是否向上舍入到最近的2的幂 */
|
|
39
|
-
export declare const ROUND_TO_POWER_OF_TWO = true;
|