airi / assets /aliyun-nls-transcription-BDaEju68.js
nekomeowww's picture
release: build 6e4b0916d4aceb6a7f68cd28e6a152aa95ae5496
a558565
import{A as e,C as t,H as n,J as r,K as i,O as a,Pt as o,S as s,b as c,jt as ee,k as l,kt as u,lt as d,m as f,w as p,wt as m,x as h,xt as g,yt as te}from"./vue.runtime.esm-bundler-_ZPRHVd_.js";import"./widgets-C0YByt49.js";import{c as ne,d as _,r as v}from"./src-DYQXbDgu.js";import{a as y}from"./resettable-CbXzRviW.js";import"./environment-CyZLTg97.js";import"./src-C83SCWbW.js";import{G as b,U as x,W as re,gt as S}from"./components-CeE-UiLT.js";import{i as ie}from"./speech-6W29lyZ_.js";import"./purify.es-Dld0-TNF.js";import"./stream-transcription-_Xuw_VzN.js";import"./settings-73vyHOZs.js";import"./__vite-browser-external-BaycPy5b.js";import{n as ae}from"./hearing-BH9rth_f.js";import{t as C}from"./route-block-CpjdOEnv.js";import{t as oe}from"./process.worklet-Cmmnc6Go.js";import{t as se}from"./use-provider-validation-DbXr83wX.js";var ce={class:`flex flex-col gap-6 md:flex-row`},le={class:`whitespace-pre-wrap break-all`},ue={class:`w-full flex flex-1 flex-col gap-6`},de={class:`border border-neutral-200/80 rounded-xl bg-neutral-50/60 p-4 dark:border-neutral-700 dark:bg-neutral-900/40`},fe={class:`flex flex-wrap items-center justify-between gap-3`},pe={class:`space-x-3`},me={class:`text-sm text-neutral-500 dark:text-neutral-400`},he={key:0,class:`rounded bg-red-500/10 px-2 py-0.5 text-xs text-red-500`},ge={key:1,class:`rounded bg-blue-500/10 px-2 py-0.5 text-xs text-blue-500`},_e={key:0,class:`mt-3 text-sm text-red-500`},ve={class:`border border-neutral-200/80 rounded-xl bg-neutral-50/60 p-4 dark:border-neutral-700 dark:bg-neutral-900/40`},ye={key:0,class:`mt-3 text-sm text-neutral-500 dark:text-neutral-400`},be={class:`mt-1 font-medium`},xe={key:1,class:`mt-3 text-sm text-neutral-400 dark:text-neutral-600`},Se={class:`mt-4 text-sm space-y-3`},Ce={class:`mt-0.5 rounded bg-neutral-200/80 px-2 py-0.5 text-xs text-neutral-700 dark:bg-neutral-800/70 dark:text-neutral-200`},we={key:0,class:`text-xs text-neutral-400`},w=`aliyun-nls-transcription`,Te=`aliyun-nls-v1`,T=16e3,E=e({__name:`aliyun-nls-transcription`,setup(e){let C=[{label:`cn-shanghai`,value:`cn-shanghai`},{label:`cn-beijing`,value:`cn-beijing`},{label:`cn-shenzhen`,value:`cn-shenzhen`},{label:`cn-shanghai (internal)`,value:`cn-shanghai-internal`},{label:`cn-beijing (internal)`,value:`cn-beijing-internal`},{label:`cn-shenzhen (internal)`,value:`cn-shenzhen-internal`}],E=ae(),D=ie(),{providers:O}=y(D);D.initializeProvider(w);let k=te({get accessKeyId(){return O.value[w]?.accessKeyId||``},set accessKeyId(e){A(),O.value[w].accessKeyId=e},get accessKeySecret(){return O.value[w]?.accessKeySecret||``},set accessKeySecret(e){A(),O.value[w].accessKeySecret=e},get appKey(){return O.value[w]?.appKey||``},set appKey(e){A(),O.value[w].appKey=e},get region(){return O.value[w]?.region||`cn-shanghai`},set region(e){A(),O.value[w].region=e}});function A(){O.value[w]||(O.value[w]={accessKeyId:``,accessKeySecret:``,appKey:``,region:`cn-shanghai`})}let Ee=c(()=>!!(k.accessKeyId.trim()&&k.accessKeySecret.trim()&&k.appKey.trim())),j=g(!1),M=g(!1),N=g(null),P=g(``),F=g([]),I=m(),L=m(),R=m(),z=m(),B=m(),V=m(),H=m(null),U=m(null),W=c(()=>Ee.value&&!j.value&&!M.value),De=c(()=>j.value||M.value),Oe=c(()=>M.value&&!!V.value),{t:G,router:ke,providerMetadata:K,isValidating:q,isValid:J,validationMessage:Y,handleResetSettings:Ae}=se(w);function je(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++){let r=Math.max(-1,Math.min(1,e[n]));t[n]=r<0?r*32768:r*32767}return t}async function Me(e){let t=new AudioContext({sampleRate:T,latencyHint:`interactive`});await t.audioWorklet.addModule(oe);let n=new AudioWorkletNode(t,`vad-audio-worklet-processor`);n.port.onmessage=({data:e})=>{let t=e.buffer,n=B.value;if(!t||!n)return;let r=je(t);n.enqueue(r.buffer.slice(0))};let r=t.createMediaStreamSource(e);r.connect(n);let i=t.createGain();i.gain.value=0,n.connect(i),i.connect(t.destination),I.value=t,L.value=n,z.value=r}function Ne(){P.value=``,F.value=[]}function X(e){switch(e.header.name){case`TranscriptionResultChanged`:{let t=e.payload;P.value=t.result,Z(t.index,t.result,!1);break}case`SentenceEnd`:{let t=e.payload;P.value=``,Z(t.index,t.result,!0);break}default:break}}function Z(e,t,n){let r=F.value.findIndex(t=>t.index===e);if(r>=0){let i=F.value[r];F.value.splice(r,1,{index:e,text:t,final:i.final||n})}else F.value.push({index:e,text:t,final:n});F.value.sort((e,t)=>e.index-t.index)}async function Pe(){if(!W.value)return;N.value=null,Ne();let e=new AbortController;V.value=e;let t=new ReadableStream({start(e){B.value=e},cancel:()=>{B.value=void 0}});try{let n=await D.getProviderInstance(w);if(!n)throw Error(`Failed to initialize Aliyun NLS provider.`);let r=await E.transcription(w,n,Te,{inputAudioStream:t},void 0,{providerOptions:{abortSignal:e.signal,hooks:{onServerEvent:e=>{X(e)}},onSessionTerminated:async e=>{e&&(N.value=e instanceof Error?e.message:String(e)),M.value=!1,V.value=void 0},sessionOptions:{format:`pcm`,sample_rate:T,enable_punctuation_prediction:!0}}});if(r.mode!==`stream`)throw Error(`Aliyun NLS returned a non-streaming result unexpectedly.`);H.value=r,U.value=r.text.catch(e=>{throw N.value=e instanceof Error?e.message:String(e),e});let i=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,sampleRate:T,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});R.value=i,await Me(i),I.value?.state===`suspended`&&await I.value.resume(),j.value=!0,M.value=!0}catch(e){N.value=e instanceof Error?e.message:String(e),await Q()}}async function Q(){try{L.value?.port.postMessage({type:`stop`})}catch{}if(z.value&&=(z.value.disconnect(),void 0),L.value&&=(L.value.port.onmessage=null,L.value.disconnect(),void 0),R.value&&=(R.value.getTracks().forEach(e=>e.stop()),void 0),I.value){try{await I.value.close()}catch{}I.value=void 0}if(B.value?.close(),B.value=void 0,j.value=!1,U.value)try{await U.value}catch{}finally{U.value=null}M.value=!1,V.value=void 0,H.value=null}function $(){let e=V.value;e&&(e.abort(new DOMException(`Aborted by user`,`AbortError`)),B.value?.error(new DOMException(`Aborted by user`,`AbortError`)),B.value=void 0,Q())}return n(async()=>{$(),await Q()}),(e,n)=>(i(),s(u(x),{"provider-name":u(K)?.localizedName,"provider-icon":u(K)?.icon,"provider-icon-color":u(K)?.iconColor,"on-back":()=>u(ke).back()},{default:d(()=>[h(`div`,ce,[l(u(re),{class:`w-full md:w-[40%] space-y-6`},{default:d(()=>[l(u(b),{title:u(G)(`settings.pages.providers.common.section.basic.title`),description:u(G)(`settings.pages.providers.common.section.basic.description`),"on-reset":u(Ae)},{default:d(()=>[l(u(_),{modelValue:k.accessKeyId,"onUpdate:modelValue":n[0]||=e=>k.accessKeyId=e,label:`Access Key ID`,placeholder:`LTAI...`},null,8,[`modelValue`]),l(u(_),{modelValue:k.accessKeySecret,"onUpdate:modelValue":n[1]||=e=>k.accessKeySecret=e,label:`Access Key Secret`,type:`password`,placeholder:`****************`},null,8,[`modelValue`]),l(u(_),{modelValue:k.appKey,"onUpdate:modelValue":n[2]||=e=>k.appKey=e,label:`App Key`,placeholder:`请输入 AppKey`},null,8,[`modelValue`]),l(u(ne),{modelValue:k.region,"onUpdate:modelValue":n[3]||=e=>k.region=e,label:`Region`,options:C,layout:`vertical`},null,8,[`modelValue`])]),_:1},8,[`title`,`description`,`on-reset`]),!u(J)&&u(q)===0&&u(Y)?(i(),s(u(S),{key:0,type:`error`},{title:d(()=>[a(o(u(G)(`settings.dialogs.onboarding.validationFailed`)),1)]),content:d(()=>[h(`div`,le,o(u(Y)),1)]),_:1})):t(``,!0),u(J)&&u(q)===0?(i(),s(u(S),{key:1,type:`success`},{title:d(()=>[a(o(u(G)(`settings.dialogs.onboarding.validationSuccess`)),1)]),_:1})):t(``,!0)]),_:1}),h(`div`,ue,[h(`div`,de,[h(`div`,fe,[h(`div`,pe,[l(u(v),{disabled:!W.value,variant:`primary`,onClick:Pe},{default:d(()=>[a(o(j.value?`Streaming...`:`Start Realtime Transcription`),1)]),_:1},8,[`disabled`]),l(u(v),{disabled:!De.value,variant:`secondary`,onClick:Q},{default:d(()=>[...n[4]||=[a(` Stop `,-1)]]),_:1},8,[`disabled`]),M.value?(i(),s(u(v),{key:0,disabled:!Oe.value,onClick:$},{default:d(()=>[...n[5]||=[a(` Abort Session `,-1)]]),_:1},8,[`disabled`])):t(``,!0)]),h(`div`,me,[j.value?(i(),p(`span`,he,` Recording `)):M.value?(i(),p(`span`,ge,` Connected `)):t(``,!0)])]),N.value?(i(),p(`p`,_e,o(N.value),1)):t(``,!0)]),h(`div`,ve,[n[7]||=h(`h2`,{class:`text-lg font-semibold`},` Transcripts `,-1),P.value?(i(),p(`div`,ye,[n[6]||=h(`div`,{class:`text-xs text-neutral-400 tracking-wide uppercase dark:text-neutral-500`},` Partial `,-1),h(`div`,be,o(P.value),1)])):t(``,!0),!F.value.length&&!P.value?(i(),p(`div`,xe,` Waiting for audio... `)):t(``,!0),h(`ul`,Se,[(i(!0),p(f,null,r(F.value,e=>(i(),p(`li`,{key:e.index,class:`flex items-start gap-3`},[h(`span`,Ce,` #`+o(e.index),1),h(`div`,null,[h(`div`,{class:ee([`font-medium`,e.final?``:`italic text-neutral-500 dark:text-neutral-400`])},o(e.text),3),e.final?t(``,!0):(i(),p(`div`,we,` Awaiting final result... `))])]))),128))])])])])]),_:1},8,[`provider-name`,`provider-icon`,`provider-icon-color`,`on-back`]))}});typeof C==`function`&&C(E);var D=E;export{D as default};