@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.
Files changed (42) hide show
  1. package/components/broadcasting-markdown/index.mjs +101 -238
  2. package/components/broadcasting-markdown/src/ctx.d.ts +1 -4
  3. package/components/broadcasting-markdown/src/howler-speech.vue.d.ts +49 -88
  4. package/components/broadcasting-markdown/src/index.vue.d.ts +44 -103
  5. package/components/broadcasting-markdown/src/types.d.ts +1 -1
  6. package/components/broadcasting-markdown/src/use.d.ts +6 -8
  7. package/components/bubble-templates/index.css +4 -0
  8. package/components/bubble-templates/index.mjs +7 -11412
  9. package/components/metahuman-broadcasting/index.mjs +8 -5
  10. package/components/metahuman-broadcasting/src/index.vue.d.ts +62 -114
  11. package/components/pixi-frame/src/apng.vue.d.ts +3 -3
  12. package/components/pixi-frame/src/bitmap.vue.d.ts +5 -5
  13. package/components/pixi-frame/src/core.vue.d.ts +5 -5
  14. package/components/pixi-frame/src/index.vue.d.ts +12 -12
  15. package/components/pixi-frame/src/video.vue.d.ts +3 -3
  16. package/components/typing-markdown/index.mjs +4 -7
  17. package/components/vditor/src/ctx.d.ts +1 -1
  18. package/components/vditor/src/index.vue.d.ts +1 -1
  19. package/index.css +5 -0
  20. package/package.json +4 -1
  21. package/shared/StreamingInferenceService.mjs +4 -1
  22. package/shared/audioToFrames/index.mjs +2 -5
  23. package/shared/audioToFrames/src/audio/StreamingFeatureExtractorService.d.ts +20 -4
  24. package/shared/audioToFrames/src/audio/index.d.ts +0 -2
  25. package/shared/audioToFrames/src/audio/index.mjs +84 -157
  26. package/shared/audioToFrames/src/core/constants.d.ts +0 -22
  27. package/shared/audioToFrames/src/core/index.mjs +16 -2643
  28. package/shared/audioToFrames/src/core/utils.d.ts +1 -68
  29. package/shared/audioToFrames/src/inference/StreamingInferenceService.d.ts +43 -0
  30. package/shared/audioToFrames/src/media/index.d.ts +0 -5
  31. package/shared/audioToFrames/src/media/index.mjs +180 -610
  32. package/shared/constants.mjs +1 -12
  33. package/shared/PredictiveFrameLoader.mjs +0 -367
  34. package/shared/audioToFrames/src/audio/AudioProcessor.d.ts +0 -25
  35. package/shared/audioToFrames/src/audio/FeatureExtractorService.d.ts +0 -31
  36. package/shared/audioToFrames/src/inference/types.d.ts +0 -102
  37. package/shared/audioToFrames/src/media/ImageBitmapPool.d.ts +0 -63
  38. package/shared/audioToFrames/src/media/ImageProcessor.d.ts +0 -47
  39. package/shared/audioToFrames/src/media/PlaybackService.d.ts +0 -56
  40. package/shared/audioToFrames/src/media/WebGLPlaybackService.d.ts +0 -74
  41. package/shared/audioToFrames/src/media/WebGLRenderer.d.ts +0 -66
  42. 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",
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, [sharedData.blendingMaskBitmap, zipBuffer]);
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 { l as loadImageData } from '../PredictiveFrameLoader.mjs';
5
- export { P as PredictiveFrameLoader } from '../PredictiveFrameLoader.mjs';
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 featureExtractor;
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 输入的音频缓冲区。
@@ -2,6 +2,4 @@
2
2
  * @file 音频处理服务模块导出
3
3
  * @author Zhonghan Li
4
4
  */
5
- export * from './AudioProcessor';
6
- export * from './FeatureExtractorService';
7
5
  export * from './StreamingFeatureExtractorService';
@@ -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 { c as createErrorHandler, P as PerformanceTimer } from '../../../utils.mjs';
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.featureExtractor = null;
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.featureExtractor = new FeatureExtractorService();
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.featureExtractor)
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
- try {
365
- this.timer.start(`extract_chunk_${chunkIndex}`);
366
- const result = await this.featureExtractor.process(chunkBuffer);
367
- this.timer.end(`extract_chunk_${chunkIndex}`);
368
- const chunkResult = {
369
- chunkIndex,
370
- features: result.features,
371
- dimensions: result.dimensions,
372
- startTimeSeconds,
373
- endTimeSeconds
374
- };
375
- this.totalFramesProcessed += chunkResult.dimensions[0];
376
- this.chunkResults[chunkIndex] = chunkResult;
377
- this.completedChunks++;
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.featureExtractor) {
413
- this.featureExtractor.terminate();
414
- this.featureExtractor = null;
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.featureExtractor) {
436
- this.featureExtractor.terminate();
437
- this.featureExtractor = null;
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 { FeatureExtractorService, NUM_MEL_BINS, NUM_SEQUENCE_FRAMES, StreamingFeatureExtractorService, createAudioContext, getAudioWindow };
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;