hzeng412 Claude Fable 5 commited on
Commit
c3f5082
·
1 Parent(s): e73f2e4

Show the active ASR engine in the UI

Browse files

- New GET /api/v1/system/asr-engine returns language mappings + display name
- Welcome page: glass chip left of the settings button with the engine name
- About tab: ASR model line and repo links now reflect the running engine
(Qwen3-ASR-1.7B vs FunASR Paraformer + Whisper medium)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

assets/www/assets/{index-CqkWbKaX.css → index-B0qFtB1t.css} RENAMED
@@ -1 +1 @@
1
- @charset "UTF-8";html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{-webkit-text-decoration:underline dotted;text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;height:100%;min-height:auto;color:#333;background:#fff}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}.card{border-bottom:solid 2px lightgray;align-items:center;justify-content:center;margin-top:40px;display:flex;max-width:1024px;width:100%}.seg-title{margin:24px 0;font-size:20px;font-weight:500}.seg-co{width:1022px;text-align:left;border-left:solid 6px midnightblue;padding-left:8px;margin-left:2px;margin-top:36px;line-height:24px}#app{margin:0 auto;padding:0;text-align:center;width:100%;height:100%}.ant-btn{padding:4px 12px}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.ant-card{background:#f5f6fa;height:100%}.ant-card-body{padding:24px 36px 12px!important;border-radius:0 0 8px 8px}.ant-card .ant-card-actions{background-color:#e8e8f8cc!important}.ant-popover{max-width:800px!important}.ant-form-item{background:transparent;margin-bottom:40px!important}.ant-form-item .ant-form-item-explain-error{color:#ff4d4f;text-align:left!important}.ant-form-item-label label{font-size:18px!important;color:#1a1a1a!important;font-weight:500!important}.ant-tooltip{max-width:1022px!important}.ant-page-header-heading{width:1022px!important}.highlight{background:#f8f8ff}.ant-layout-sider-collapsed{width:0!important;min-width:0!important;overflow:hidden}.ant-layout-sider-collapsed .ant-menu-item,.ant-layout-sider-collapsed .ant-menu-submenu-title{display:none}.ant-modal .ant-modal-content{background:#ffffff9e!important;backdrop-filter:blur(28px) saturate(140%);-webkit-backdrop-filter:blur(28px) saturate(140%);border:1px solid rgba(255,255,255,.6);border-radius:22px!important;box-shadow:0 16px 48px #1f26872e}.ant-modal .ant-modal-header{background:transparent!important}.ant-modal-mask{background:#14161e1f!important;backdrop-filter:blur(14px) saturate(120%);-webkit-backdrop-filter:blur(14px) saturate(120%)}.ant-select .ant-select-selector,.ant-input,textarea.ant-input,.ant-input-affix-wrapper{background:#ffffff73!important;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.7)!important}.ant-btn:not(.ant-btn-text):not(.ant-btn-link){box-shadow:0 2px 10px #1f26871a}.ant-btn-default{background:#ffffff80!important;border:1px solid rgba(255,255,255,.75)!important;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.ant-btn-text{box-shadow:none!important;background:transparent!important}.ant-radio-group-solid .ant-radio-button-wrapper:first-child{border-top-left-radius:12px;border-bottom-left-radius:12px}.ant-radio-group-solid .ant-radio-button-wrapper:last-child{border-top-right-radius:12px;border-bottom-right-radius:12px}.header-nav[data-v-07594418]{display:flex;align-items:flex-start;justify-content:space-between;width:100vw;height:40px;align-items:center;position:absolute;top:0;left:0;z-index:99;-webkit-app-region:drag;cursor:move}.header-nav .window-controls[data-v-07594418],.header-nav button[data-v-07594418],.header-nav .ant-input-search[data-v-07594418],.header-nav img[data-v-07594418],.header-nav .anticon[data-v-07594418]{-webkit-app-region:no-drag;cursor:pointer}.header-nav .window-controls[data-v-07594418]{top:0;right:0;display:flex;z-index:1000;margin-left:12px}.header-nav .window-controls .window-control-btn[data-v-07594418]{width:46px;height:32px;border:none;background:transparent;color:#666;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.header-nav .window-controls .window-control-btn[data-v-07594418]:hover{background-color:#0000001a}.header-nav .window-controls .window-control-btn.close[data-v-07594418]:hover{background-color:#e81123;color:#fff}.header-nav .window-controls .close-icon.focus[data-v-07594418]{display:none}.header-nav .window-controls:hover .close-icon.default[data-v-07594418],.header-nav .window-controls:focus-within .close-icon.default[data-v-07594418]{display:none}.header-nav .window-controls:hover .close-icon.focus[data-v-07594418],.header-nav .window-controls:focus-within .close-icon.focus[data-v-07594418]{display:inline}.content[data-v-b8a456cb]{background-color:#fff;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:space-between}.not-found-wrapper[data-v-aef52a59]{height:calc(100vh - 104px)}.tab-body[data-v-c6567297]{height:360px;overflow-y:auto;padding:4px 8px 4px 2px}.setting-row[data-v-c6567297]{margin-bottom:20px}.setting-row>label[data-v-c6567297]{display:block;font-size:15px;font-weight:500;margin-bottom:8px}.setting-row>label .label-icon[data-v-c6567297]{margin-right:6px;color:#1890ff}.setting-row .hint[data-v-c6567297]{font-size:12px;color:#999;margin:8px 0 0}.setting-row .row-inline[data-v-c6567297]{display:flex;align-items:center;justify-content:space-between}.voice-group[data-v-c6567297]{display:flex;flex-direction:column;margin-top:8px}.about .about-head[data-v-c6567297]{text-align:center;margin-bottom:24px}.about .about-head .about-name[data-v-c6567297]{font-size:20px;font-weight:600}.about .about-head .about-ver[data-v-c6567297]{font-size:13px;color:#888;margin-top:2px}.about .about-head .about-tagline[data-v-c6567297]{font-size:12px;color:#999;margin-top:4px}.about .about-section[data-v-c6567297]{margin-bottom:20px}.about .about-section .about-section-title[data-v-c6567297]{font-size:13px;font-weight:600;color:#666;margin-bottom:10px}.about .about-item[data-v-c6567297]{margin-bottom:12px}.about .about-item .about-item-label[data-v-c6567297]{font-size:14px;font-weight:500}.about .about-item .about-item-desc[data-v-c6567297]{font-size:12px;color:#777;margin-top:2px;line-height:1.6}.about .about-item .about-item-desc a[data-v-c6567297]{margin-left:6px}.about a[data-v-c6567297]{color:#1677ff;text-decoration:none}.about a[data-v-c6567297]:hover{text-decoration:underline}.about .about-link[data-v-c6567297]{font-size:13px;word-break:break-all}.about .about-copyright[data-v-c6567297]{margin-top:16px;font-size:11px;color:#aaa;text-align:center}.voice-radio[data-v-c6567297]{display:flex;align-items:center;height:40px;line-height:40px}.voice-radio .voice-name[data-v-c6567297]{margin-right:8px}.audio-play-btn[data-v-c6567297]{padding:0 6px;border-radius:4px}.audio-play-btn.playing[data-v-c6567297]{background-color:#f6ffed}.settings-btn[data-v-342c7f16]{width:60px;height:60px;margin-right:24px;border-radius:50%!important;background:#ffffff80!important;border:1px solid rgba(255,255,255,.7)!important;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 4px 16px #1f26871f;display:flex;align-items:center;justify-content:center}.welcome-wrapper[data-v-342c7f16]{width:100%;height:100%;background-image:url(./bg-BmnA8p_e.png);background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center;display:flex;flex-direction:column;align-items:center;justify-content:space-between;color:#fff}.welcome-wrapper .content[data-v-342c7f16]{width:100%;height:80vh;display:flex;flex-direction:column;justify-content:space-around;margin-top:64px}.welcome-wrapper .content .inner-content[data-v-342c7f16]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:20px}.welcome-wrapper .content .inner-content .text-box[data-v-342c7f16]{color:#000;margin-bottom:36px}.welcome-wrapper .content .inner-content .text-box .title[data-v-342c7f16]{font-size:24px;font-weight:600;margin-bottom:24px}.welcome-wrapper .content .inner-content .text-box .sub-title[data-v-342c7f16]{font-size:15px;margin-top:10px}.welcome-wrapper .content .inner-content .btn-box[data-v-342c7f16]{width:224px;height:80px}.welcome-wrapper .actions[data-v-342c7f16]{width:100%;height:100px;margin-bottom:32px;display:flex;align-items:center;justify-content:flex-end}.ball-wrapper[data-v-34c8e583]{width:100%;height:calc(100vh - 100px);display:flex;flex-direction:column;align-items:center;justify-content:space-around}.talk-wrapper[data-v-05da84ae]{width:auto;width:100%;max-width:1000px;margin:0 auto;box-sizing:border-box;height:calc(100vh - 150px);overflow-y:auto;padding:20px 32px 0;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start}.talk-wrapper .cont-left[data-v-05da84ae]{width:100%;margin:24px 0;display:flex;justify-content:flex-start;align-items:flex-start}.talk-wrapper .cont-left .text-left[data-v-05da84ae]{max-width:88%;color:#222;font-size:16px;font-weight:400;text-align:left;line-height:1.8;margin-left:12px;margin-top:6px;word-break:break-word}.talk-wrapper .cont-right[data-v-05da84ae]{width:100%;margin:24px 0;display:flex;justify-content:flex-end;align-items:flex-start}.talk-wrapper .cont-right .text-right[data-v-05da84ae]{max-width:80%;color:#444;font-size:16px;font-weight:400;text-align:start;line-height:1.8;margin-right:12px;background:#ccc;border-radius:8px 0 8px 8px;padding:8px 12px;word-break:break-word}.chat-wrapper[data-v-8b035bf4]{width:100%;height:100%;background-image:url(./bg-BmnA8p_e.png);background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center;display:flex;flex-direction:column;align-items:center;justify-content:space-between;color:#fff}.chat-wrapper .content[data-v-8b035bf4]{width:100%;height:auto;display:flex;flex-direction:column;justify-content:space-around}.chat-wrapper .content .inner-content[data-v-8b035bf4]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:20px}.chat-wrapper .content .inner-content .text-box[data-v-8b035bf4]{color:#000;margin-bottom:36px}.chat-wrapper .content .inner-content .text-box .title[data-v-8b035bf4]{font-size:24px;font-weight:600;margin-bottom:24px}.chat-wrapper .content .inner-content .text-box .sub-title[data-v-8b035bf4]{font-size:15px;margin-top:10px}.chat-wrapper .content .inner-content .btn-box[data-v-8b035bf4]{width:224px;height:80px}.chat-wrapper .actions[data-v-8b035bf4]{width:100%;height:100px;margin-bottom:32px;display:flex;justify-content:space-between;align-items:center}.chat-wrapper .actions .holder[data-v-8b035bf4]{width:64px;height:48px}.chat-wrapper .actions .btns[data-v-8b035bf4]{width:450px;height:96px;display:flex;justify-content:space-around;align-items:center}.chat-wrapper .actions .btns[data-v-8b035bf4] .ant-btn{border-radius:50%!important;background:#ffffff80!important;border:1px solid rgba(255,255,255,.7)!important;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 4px 16px #1f26871f}.chat-wrapper .actions .download-wrapper[data-v-8b035bf4]{width:64px;height:64px;display:flex;justify-content:flex-start;align-items:center;margin-right:0}.chat-wrapper .actions .download-wrapper img[data-v-8b035bf4]{width:24px;height:24px}.content-wrapper[data-v-d41c9ce7]{text-align:left;max-width:800px;min-width:320px;margin-bottom:64px;min-height:calc(100vh - 438px)}.content-wrapper .content-box[data-v-d41c9ce7]{padding:24px;height:240px;background-color:#e8e8e8;border-radius:16px;width:50%;margin:48px auto;min-width:300px}.content-wrapper .video-box[data-v-d41c9ce7]{max-width:800px;min-width:320px;width:90vw;height:auto}
 
1
+ @charset "UTF-8";html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{-webkit-text-decoration:underline dotted;text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;height:100%;min-height:auto;color:#333;background:#fff}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}.card{border-bottom:solid 2px lightgray;align-items:center;justify-content:center;margin-top:40px;display:flex;max-width:1024px;width:100%}.seg-title{margin:24px 0;font-size:20px;font-weight:500}.seg-co{width:1022px;text-align:left;border-left:solid 6px midnightblue;padding-left:8px;margin-left:2px;margin-top:36px;line-height:24px}#app{margin:0 auto;padding:0;text-align:center;width:100%;height:100%}.ant-btn{padding:4px 12px}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.ant-card{background:#f5f6fa;height:100%}.ant-card-body{padding:24px 36px 12px!important;border-radius:0 0 8px 8px}.ant-card .ant-card-actions{background-color:#e8e8f8cc!important}.ant-popover{max-width:800px!important}.ant-form-item{background:transparent;margin-bottom:40px!important}.ant-form-item .ant-form-item-explain-error{color:#ff4d4f;text-align:left!important}.ant-form-item-label label{font-size:18px!important;color:#1a1a1a!important;font-weight:500!important}.ant-tooltip{max-width:1022px!important}.ant-page-header-heading{width:1022px!important}.highlight{background:#f8f8ff}.ant-layout-sider-collapsed{width:0!important;min-width:0!important;overflow:hidden}.ant-layout-sider-collapsed .ant-menu-item,.ant-layout-sider-collapsed .ant-menu-submenu-title{display:none}.ant-modal .ant-modal-content{background:#ffffff9e!important;backdrop-filter:blur(28px) saturate(140%);-webkit-backdrop-filter:blur(28px) saturate(140%);border:1px solid rgba(255,255,255,.6);border-radius:22px!important;box-shadow:0 16px 48px #1f26872e}.ant-modal .ant-modal-header{background:transparent!important}.ant-modal-mask{background:#14161e1f!important;backdrop-filter:blur(14px) saturate(120%);-webkit-backdrop-filter:blur(14px) saturate(120%)}.ant-select .ant-select-selector,.ant-input,textarea.ant-input,.ant-input-affix-wrapper{background:#ffffff73!important;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.7)!important}.ant-btn:not(.ant-btn-text):not(.ant-btn-link){box-shadow:0 2px 10px #1f26871a}.ant-btn-default{background:#ffffff80!important;border:1px solid rgba(255,255,255,.75)!important;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.ant-btn-text{box-shadow:none!important;background:transparent!important}.ant-radio-group-solid .ant-radio-button-wrapper:first-child{border-top-left-radius:12px;border-bottom-left-radius:12px}.ant-radio-group-solid .ant-radio-button-wrapper:last-child{border-top-right-radius:12px;border-bottom-right-radius:12px}.header-nav[data-v-07594418]{display:flex;align-items:flex-start;justify-content:space-between;width:100vw;height:40px;align-items:center;position:absolute;top:0;left:0;z-index:99;-webkit-app-region:drag;cursor:move}.header-nav .window-controls[data-v-07594418],.header-nav button[data-v-07594418],.header-nav .ant-input-search[data-v-07594418],.header-nav img[data-v-07594418],.header-nav .anticon[data-v-07594418]{-webkit-app-region:no-drag;cursor:pointer}.header-nav .window-controls[data-v-07594418]{top:0;right:0;display:flex;z-index:1000;margin-left:12px}.header-nav .window-controls .window-control-btn[data-v-07594418]{width:46px;height:32px;border:none;background:transparent;color:#666;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.header-nav .window-controls .window-control-btn[data-v-07594418]:hover{background-color:#0000001a}.header-nav .window-controls .window-control-btn.close[data-v-07594418]:hover{background-color:#e81123;color:#fff}.header-nav .window-controls .close-icon.focus[data-v-07594418]{display:none}.header-nav .window-controls:hover .close-icon.default[data-v-07594418],.header-nav .window-controls:focus-within .close-icon.default[data-v-07594418]{display:none}.header-nav .window-controls:hover .close-icon.focus[data-v-07594418],.header-nav .window-controls:focus-within .close-icon.focus[data-v-07594418]{display:inline}.content[data-v-b8a456cb]{background-color:#fff;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:space-between}.not-found-wrapper[data-v-aef52a59]{height:calc(100vh - 104px)}.tab-body[data-v-44db86f4]{height:360px;overflow-y:auto;padding:4px 8px 4px 2px}.setting-row[data-v-44db86f4]{margin-bottom:20px}.setting-row>label[data-v-44db86f4]{display:block;font-size:15px;font-weight:500;margin-bottom:8px}.setting-row>label .label-icon[data-v-44db86f4]{margin-right:6px;color:#1890ff}.setting-row .hint[data-v-44db86f4]{font-size:12px;color:#999;margin:8px 0 0}.setting-row .row-inline[data-v-44db86f4]{display:flex;align-items:center;justify-content:space-between}.voice-group[data-v-44db86f4]{display:flex;flex-direction:column;margin-top:8px}.about .about-head[data-v-44db86f4]{text-align:center;margin-bottom:24px}.about .about-head .about-name[data-v-44db86f4]{font-size:20px;font-weight:600}.about .about-head .about-ver[data-v-44db86f4]{font-size:13px;color:#888;margin-top:2px}.about .about-head .about-tagline[data-v-44db86f4]{font-size:12px;color:#999;margin-top:4px}.about .about-section[data-v-44db86f4]{margin-bottom:20px}.about .about-section .about-section-title[data-v-44db86f4]{font-size:13px;font-weight:600;color:#666;margin-bottom:10px}.about .about-item[data-v-44db86f4]{margin-bottom:12px}.about .about-item .about-item-label[data-v-44db86f4]{font-size:14px;font-weight:500}.about .about-item .about-item-desc[data-v-44db86f4]{font-size:12px;color:#777;margin-top:2px;line-height:1.6}.about .about-item .about-item-desc a[data-v-44db86f4]{margin-left:6px}.about a[data-v-44db86f4]{color:#1677ff;text-decoration:none}.about a[data-v-44db86f4]:hover{text-decoration:underline}.about .about-link[data-v-44db86f4]{font-size:13px;word-break:break-all}.about .about-copyright[data-v-44db86f4]{margin-top:16px;font-size:11px;color:#aaa;text-align:center}.voice-radio[data-v-44db86f4]{display:flex;align-items:center;height:40px;line-height:40px}.voice-radio .voice-name[data-v-44db86f4]{margin-right:8px}.audio-play-btn[data-v-44db86f4]{padding:0 6px;border-radius:4px}.audio-play-btn.playing[data-v-44db86f4]{background-color:#f6ffed}.asr-chip[data-v-2fa7cbbe]{display:flex;align-items:center;gap:8px;height:38px;padding:0 18px;margin-right:16px;border-radius:19px;color:#000000a6;font-size:13px;background:#ffffff80;border:1px solid rgba(255,255,255,.7);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 4px 16px #1f26871f}.settings-btn[data-v-2fa7cbbe]{width:60px;height:60px;margin-right:24px;border-radius:50%!important;background:#ffffff80!important;border:1px solid rgba(255,255,255,.7)!important;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 4px 16px #1f26871f;display:flex;align-items:center;justify-content:center}.welcome-wrapper[data-v-2fa7cbbe]{width:100%;height:100%;background-image:url(./bg-BmnA8p_e.png);background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center;display:flex;flex-direction:column;align-items:center;justify-content:space-between;color:#fff}.welcome-wrapper .content[data-v-2fa7cbbe]{width:100%;height:80vh;display:flex;flex-direction:column;justify-content:space-around;margin-top:64px}.welcome-wrapper .content .inner-content[data-v-2fa7cbbe]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:20px}.welcome-wrapper .content .inner-content .text-box[data-v-2fa7cbbe]{color:#000;margin-bottom:36px}.welcome-wrapper .content .inner-content .text-box .title[data-v-2fa7cbbe]{font-size:24px;font-weight:600;margin-bottom:24px}.welcome-wrapper .content .inner-content .text-box .sub-title[data-v-2fa7cbbe]{font-size:15px;margin-top:10px}.welcome-wrapper .content .inner-content .btn-box[data-v-2fa7cbbe]{width:224px;height:80px}.welcome-wrapper .actions[data-v-2fa7cbbe]{width:100%;height:100px;margin-bottom:32px;display:flex;align-items:center;justify-content:flex-end}.ball-wrapper[data-v-34c8e583]{width:100%;height:calc(100vh - 100px);display:flex;flex-direction:column;align-items:center;justify-content:space-around}.talk-wrapper[data-v-05da84ae]{width:auto;width:100%;max-width:1000px;margin:0 auto;box-sizing:border-box;height:calc(100vh - 150px);overflow-y:auto;padding:20px 32px 0;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start}.talk-wrapper .cont-left[data-v-05da84ae]{width:100%;margin:24px 0;display:flex;justify-content:flex-start;align-items:flex-start}.talk-wrapper .cont-left .text-left[data-v-05da84ae]{max-width:88%;color:#222;font-size:16px;font-weight:400;text-align:left;line-height:1.8;margin-left:12px;margin-top:6px;word-break:break-word}.talk-wrapper .cont-right[data-v-05da84ae]{width:100%;margin:24px 0;display:flex;justify-content:flex-end;align-items:flex-start}.talk-wrapper .cont-right .text-right[data-v-05da84ae]{max-width:80%;color:#444;font-size:16px;font-weight:400;text-align:start;line-height:1.8;margin-right:12px;background:#ccc;border-radius:8px 0 8px 8px;padding:8px 12px;word-break:break-word}.chat-wrapper[data-v-8b035bf4]{width:100%;height:100%;background-image:url(./bg-BmnA8p_e.png);background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center;display:flex;flex-direction:column;align-items:center;justify-content:space-between;color:#fff}.chat-wrapper .content[data-v-8b035bf4]{width:100%;height:auto;display:flex;flex-direction:column;justify-content:space-around}.chat-wrapper .content .inner-content[data-v-8b035bf4]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:20px}.chat-wrapper .content .inner-content .text-box[data-v-8b035bf4]{color:#000;margin-bottom:36px}.chat-wrapper .content .inner-content .text-box .title[data-v-8b035bf4]{font-size:24px;font-weight:600;margin-bottom:24px}.chat-wrapper .content .inner-content .text-box .sub-title[data-v-8b035bf4]{font-size:15px;margin-top:10px}.chat-wrapper .content .inner-content .btn-box[data-v-8b035bf4]{width:224px;height:80px}.chat-wrapper .actions[data-v-8b035bf4]{width:100%;height:100px;margin-bottom:32px;display:flex;justify-content:space-between;align-items:center}.chat-wrapper .actions .holder[data-v-8b035bf4]{width:64px;height:48px}.chat-wrapper .actions .btns[data-v-8b035bf4]{width:450px;height:96px;display:flex;justify-content:space-around;align-items:center}.chat-wrapper .actions .btns[data-v-8b035bf4] .ant-btn{border-radius:50%!important;background:#ffffff80!important;border:1px solid rgba(255,255,255,.7)!important;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 4px 16px #1f26871f}.chat-wrapper .actions .download-wrapper[data-v-8b035bf4]{width:64px;height:64px;display:flex;justify-content:flex-start;align-items:center;margin-right:0}.chat-wrapper .actions .download-wrapper img[data-v-8b035bf4]{width:24px;height:24px}.content-wrapper[data-v-d41c9ce7]{text-align:left;max-width:800px;min-width:320px;margin-bottom:64px;min-height:calc(100vh - 438px)}.content-wrapper .content-box[data-v-d41c9ce7]{padding:24px;height:240px;background-color:#e8e8e8;border-radius:16px;width:50%;margin:48px auto;min-width:300px}.content-wrapper .video-box[data-v-d41c9ce7]{max-width:800px;min-width:320px;width:90vw;height:auto}
assets/www/assets/{index-BdT80f9n.js → index-vffghLR3.js} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:80727cdc5679eb2dd15a41b250981f16916aa3ecc51189b7c91bc27fc8436381
3
- size 2305101
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1e7941a809c8dc4932a336ed14b979ba9d0401ced88724c584126c9896630683
3
+ size 2306190
assets/www/index.html CHANGED
@@ -5,8 +5,8 @@
5
  <link rel="icon" type="image/svg+xml" href="./favicon.ico" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
  <title>VoiceDialogue</title>
8
- <script type="module" crossorigin src="./assets/index-BdT80f9n.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-CqkWbKaX.css">
10
  </head>
11
  <body>
12
  <div id="app"></div>
 
5
  <link rel="icon" type="image/svg+xml" href="./favicon.ico" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
  <title>VoiceDialogue</title>
8
+ <script type="module" crossorigin src="./assets/index-vffghLR3.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-B0qFtB1t.css">
10
  </head>
11
  <body>
12
  <div id="app"></div>
frontend/src/views/Welcome/Components/SettingsModal.vue CHANGED
@@ -105,6 +105,29 @@ const fetchInputDevices = async () => {
105
  }
106
  };
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  const fetchPrompts = async () => {
109
  try {
110
  const [cur, def] = await Promise.all([
@@ -196,6 +219,7 @@ watch(
196
  fetchTTSRoles();
197
  fetchInputDevices();
198
  fetchPrompts();
 
199
  }
200
  }
201
  );
@@ -363,9 +387,9 @@ onUnmounted(() => {
363
  <div class="about-item">
364
  <div class="about-item-label">{{ t('settings.about.asr') }}</div>
365
  <div class="about-item-desc">
366
- {{ t('settings.about.asrDesc') }}
367
- <a href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener">whisper.cpp ↗</a>
368
- <a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR ↗</a>
369
  </div>
370
  </div>
371
  <div class="about-item">
 
105
  }
106
  };
107
 
108
+ // 当前实际生效的 ASR 引擎(由后端返回,区分 Qwen / FunASR+Whisper 等)
109
+ const asrEngineName = ref<string>("");
110
+ const asrEngineKeys = ref<string[]>([]);
111
+ const ASR_ENGINE_LINKS: Record<string, { name: string; url: string }> = {
112
+ qwen: { name: "Qwen3-ASR", url: "https://huggingface.co/Qwen/Qwen3-ASR-1.7B" },
113
+ whisper: { name: "whisper.cpp", url: "https://github.com/ggerganov/whisper.cpp" },
114
+ funasr: { name: "FunASR", url: "https://github.com/modelscope/FunASR" },
115
+ };
116
+ const asrEngineLinks = computed(() => {
117
+ const keys = asrEngineKeys.value.length ? asrEngineKeys.value : ["whisper", "funasr"];
118
+ return keys.map((k) => ASR_ENGINE_LINKS[k]).filter(Boolean);
119
+ });
120
+ const fetchAsrEngine = async () => {
121
+ try {
122
+ const res = await fetch(`${base_url}/system/asr-engine`);
123
+ const data = await res.json();
124
+ if (data?.display_name) asrEngineName.value = data.display_name;
125
+ if (data?.mappings) asrEngineKeys.value = [...new Set(Object.values(data.mappings) as string[])].sort();
126
+ } catch (e) {
127
+ console.error("Error fetching ASR engine:", e);
128
+ }
129
+ };
130
+
131
  const fetchPrompts = async () => {
132
  try {
133
  const [cur, def] = await Promise.all([
 
219
  fetchTTSRoles();
220
  fetchInputDevices();
221
  fetchPrompts();
222
+ fetchAsrEngine();
223
  }
224
  }
225
  );
 
387
  <div class="about-item">
388
  <div class="about-item-label">{{ t('settings.about.asr') }}</div>
389
  <div class="about-item-desc">
390
+ {{ asrEngineName || t('settings.about.asrDesc') }}
391
+ <a v-for="link in asrEngineLinks" :key="link.url" :href="link.url" target="_blank"
392
+ rel="noopener">{{ link.name }} ↗</a>
393
  </div>
394
  </div>
395
  <div class="about-item">
frontend/src/views/Welcome/index.vue CHANGED
@@ -2,8 +2,9 @@
2
 
3
  import router from "@/router.ts";
4
  import { useSettingsStore } from "@/stores/config.ts";
5
- import { ref } from "vue";
6
  import { Modal } from 'ant-design-vue';
 
7
  import { useI18n } from "vue-i18n";
8
  import axios from "axios";
9
  import SettingsModal from "./Components/SettingsModal.vue";
@@ -16,6 +17,18 @@ const settingsStore = useSettingsStore();
16
  const settingsOpen = ref<boolean>(false);
17
  const chatLoading = ref<boolean>(false);
18
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  const startAudioChat = async () => {
20
  try {
21
  chatLoading.value = true;
@@ -67,6 +80,10 @@ const chatAction = async () => {
67
  </div>
68
 
69
  <div class="actions">
 
 
 
 
70
  <a-button type="text" @click="settingsOpen = true" class="settings-btn"
71
  :title="t('settings.entry')">
72
  <template #icon>
@@ -80,6 +97,23 @@ const chatAction = async () => {
80
  </template>
81
 
82
  <style lang="scss" scoped>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  .settings-btn {
84
  width: 60px;
85
  height: 60px;
 
2
 
3
  import router from "@/router.ts";
4
  import { useSettingsStore } from "@/stores/config.ts";
5
+ import { ref, onMounted } from "vue";
6
  import { Modal } from 'ant-design-vue';
7
+ import { AudioOutlined } from "@ant-design/icons-vue";
8
  import { useI18n } from "vue-i18n";
9
  import axios from "axios";
10
  import SettingsModal from "./Components/SettingsModal.vue";
 
17
  const settingsOpen = ref<boolean>(false);
18
  const chatLoading = ref<boolean>(false);
19
 
20
+ // 当前实际生效的 ASR 引擎,显示在设置按钮左侧
21
+ const asrEngineName = ref<string>("");
22
+ onMounted(async () => {
23
+ try {
24
+ const res = await fetch(`${base_url}/system/asr-engine`);
25
+ const data = await res.json();
26
+ if (data?.display_name) asrEngineName.value = data.display_name;
27
+ } catch (e) {
28
+ console.error("Error fetching ASR engine:", e);
29
+ }
30
+ });
31
+
32
  const startAudioChat = async () => {
33
  try {
34
  chatLoading.value = true;
 
80
  </div>
81
 
82
  <div class="actions">
83
+ <div v-if="asrEngineName" class="asr-chip" :title="t('settings.about.asr')">
84
+ <AudioOutlined />
85
+ <span>{{ asrEngineName }}</span>
86
+ </div>
87
  <a-button type="text" @click="settingsOpen = true" class="settings-btn"
88
  :title="t('settings.entry')">
89
  <template #icon>
 
97
  </template>
98
 
99
  <style lang="scss" scoped>
100
+ .asr-chip {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 8px;
104
+ height: 38px;
105
+ padding: 0 18px;
106
+ margin-right: 16px;
107
+ border-radius: 19px;
108
+ color: rgba(0, 0, 0, 0.65);
109
+ font-size: 13px;
110
+ background: rgba(255, 255, 255, 0.5);
111
+ border: 1px solid rgba(255, 255, 255, 0.7);
112
+ backdrop-filter: blur(10px);
113
+ -webkit-backdrop-filter: blur(10px);
114
+ box-shadow: 0 4px 16px rgba(31, 38, 135, 0.12);
115
+ }
116
+
117
  .settings-btn {
118
  width: 60px;
119
  height: 60px;
src/voice_dialogue/api/routes/system_routes.py CHANGED
@@ -11,11 +11,18 @@ from voice_dialogue.utils.logger import logger
11
  from ..core.service_factories import get_audio_capture_service_definition, get_speech_monitor_service_definition
12
  from ..schemas.system_schemas import (
13
  SystemStatusResponse, SystemResponse, SystemStartRequest,
14
- AudioInputDevicesResponse, AudioInputDevice
15
  )
16
 
17
  router = APIRouter()
18
 
 
 
 
 
 
 
 
19
  # 全局系统状态
20
  _system_status = {
21
  "status": "stopped",
@@ -82,6 +89,23 @@ async def get_audio_devices():
82
  raise HTTPException(status_code=500, detail=f"获取音频输入设备失败: {str(e)}")
83
 
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  @router.post("/start", response_model=SystemResponse, summary="启动系统")
86
  async def start_system(
87
  request: SystemStartRequest,
 
11
  from ..core.service_factories import get_audio_capture_service_definition, get_speech_monitor_service_definition
12
  from ..schemas.system_schemas import (
13
  SystemStatusResponse, SystemResponse, SystemStartRequest,
14
+ AudioInputDevicesResponse, AudioInputDevice, ASREngineResponse
15
  )
16
 
17
  router = APIRouter()
18
 
19
+ # ASR 引擎注册名 -> 展示名称
20
+ ASR_ENGINE_DISPLAY_NAMES = {
21
+ 'qwen': 'Qwen3-ASR-1.7B',
22
+ 'funasr': 'FunASR Paraformer',
23
+ 'whisper': 'Whisper medium',
24
+ }
25
+
26
  # 全局系统状态
27
  _system_status = {
28
  "status": "stopped",
 
89
  raise HTTPException(status_code=500, detail=f"获取音频输入设备失败: {str(e)}")
90
 
91
 
92
+ @router.get("/asr-engine", response_model=ASREngineResponse, summary="获取当前 ASR 引擎")
93
+ async def get_asr_engine():
94
+ """
95
+ 返回当前生效的 ASR 引擎(语言映射 + 展示名称),
96
+ 供前端在首页和关于页显示实际使用的识别模型。
97
+ """
98
+ try:
99
+ from voice_dialogue.asr import asr_manager
100
+ mappings = asr_manager.get_asr_statistics()['language_mappings']
101
+ engines = sorted(set(mappings.values()))
102
+ display_name = ' + '.join(ASR_ENGINE_DISPLAY_NAMES.get(engine, engine) for engine in engines)
103
+ return ASREngineResponse(mappings=mappings, display_name=display_name)
104
+ except Exception as e:
105
+ logger.error(f"获取ASR引擎信息失败: {e}", exc_info=True)
106
+ raise HTTPException(status_code=500, detail=f"获取ASR引擎信息失败: {str(e)}")
107
+
108
+
109
  @router.post("/start", response_model=SystemResponse, summary="启动系统")
110
  async def start_system(
111
  request: SystemStartRequest,
src/voice_dialogue/api/schemas/system_schemas.py CHANGED
@@ -41,3 +41,9 @@ class SystemResponse(BaseModel):
41
  """系统操作响应"""
42
  success: bool = Field(..., description="操作是否成功")
43
  message: str = Field(..., description="响应消息")
 
 
 
 
 
 
 
41
  """系统操作响应"""
42
  success: bool = Field(..., description="操作是否成功")
43
  message: str = Field(..., description="响应消息")
44
+
45
+
46
+ class ASREngineResponse(BaseModel):
47
+ """当前 ASR 引擎信息"""
48
+ mappings: Dict[str, str] = Field(default_factory=dict, description="语言到 ASR 引擎的映射,如 {'zh': 'qwen'}")
49
+ display_name: str = Field(..., description="当前 ASR 引擎的展示名称")