@pie-players/pie-section-player 0.3.73 → 0.3.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +395 -149
- package/dist/browser/assets/evaluation-worker-CORp9m0K.js +156459 -0
- package/dist/browser/chunks/ItemToolBar-jx38w99s-58defccc.js +1 -0
- package/dist/browser/chunks/PUA-tLuTiQ7--f2b27953.js +1 -0
- package/dist/browser/chunks/ToolCoordinator-cc2dc319.js +1 -0
- package/dist/browser/chunks/accents-BTUYmhn9-cafeb96e.js +1 -0
- package/dist/browser/chunks/accents-b-i-CngHZsLL-e0eb98fd.js +1 -0
- package/dist/browser/chunks/arabic-BzEHMVZD-30ac1ade.js +1 -0
- package/dist/browser/chunks/arrows-VjxlU-jv-2e17c192.js +1 -0
- package/dist/browser/chunks/base-dfd67c41.js +1 -0
- package/dist/browser/chunks/braille-BeWC_Ruq-a3bb8ef9.js +1 -0
- package/dist/browser/chunks/braille-d-Dk6J96GO-d832bfbf.js +1 -0
- package/dist/browser/chunks/browser-a3c32178.js +37 -0
- package/dist/browser/chunks/calculator-element-271c142f.js +13 -0
- package/dist/browser/chunks/calligraphic-Cew9cU3x-04cf0735.js +1 -0
- package/dist/browser/chunks/catalog-context-46d3e50e.js +1 -0
- package/dist/browser/chunks/catalog-owner-d602f784.js +1 -0
- package/dist/browser/chunks/cherokee-Cny3FYho-4da7d2f3.js +1 -0
- package/dist/browser/chunks/classPrivateFieldGet2-338e0179.js +1 -0
- package/dist/browser/chunks/cyrillic-CfCDulXU-5550df0b.js +1 -0
- package/dist/browser/chunks/cyrillic-ss-lU7bNGG9-12eb0188.js +1 -0
- package/dist/browser/chunks/defineProperty-a20a667d.js +1 -0
- package/dist/browser/chunks/devanagari-CDIz2h-r-18c38725.js +1 -0
- package/dist/browser/chunks/dist-41b39e7f.js +1 -0
- package/dist/browser/chunks/dist-59132a53.js +1 -0
- package/dist/browser/chunks/dist-60d7afef.js +1 -0
- package/dist/browser/chunks/dist-ca9b9622.js +1 -0
- package/dist/browser/chunks/double-struck-BpJEQk8y-500ce8dd.js +1 -0
- package/dist/browser/chunks/en-5ff22e17.js +1 -0
- package/dist/browser/chunks/es-a0ba6cb6.js +1 -0
- package/dist/browser/chunks/focus-trap-44913bf3.js +1 -0
- package/dist/browser/chunks/fraktur-rLEq9DEH-44cc14d8.js +1 -0
- package/dist/browser/chunks/greek-BlraJTyL-90ce8924.js +1 -0
- package/dist/browser/chunks/greek-ss-D-EN2PK0-91610739.js +1 -0
- package/dist/browser/chunks/hebrew-GiQZeybp-b583f555.js +1 -0
- package/dist/browser/chunks/latin-b-BhEnC7R2-d13e06ff.js +1 -0
- package/dist/browser/chunks/latin-bi-DqiIKv3U-1dec8705.js +1 -0
- package/dist/browser/chunks/latin-i-B1xtwaE1-21637466.js +1 -0
- package/dist/browser/chunks/latin-xfWFlLkD-5bcea5cf.js +1 -0
- package/dist/browser/chunks/logger-8b07fb72.js +1 -0
- package/dist/browser/chunks/marrows-DD1NgMQi-15b63755.js +1 -0
- package/dist/browser/chunks/math-DpWn1mbG-38eeb914.js +1 -0
- package/dist/browser/chunks/math-rendering-ready-9a0fd90a.js +1 -0
- package/dist/browser/chunks/mathjax-BKrHE4xs-3ca05bf6.js +232 -0
- package/dist/browser/chunks/module-0191e321.js +74 -0
- package/dist/browser/chunks/module-shim-58659a86.js +0 -0
- package/dist/browser/chunks/module-shim-b4470740.js +12 -0
- package/dist/browser/chunks/monospace-D116QD2a-98d484fd.js +1 -0
- package/dist/browser/chunks/monospace-ex-DcXpouKS-456b403c.js +1 -0
- package/dist/browser/chunks/monospace-l-Ct5wkMDs-f34a4a9e.js +1 -0
- package/dist/browser/chunks/mshapes-DCp86WSX-c0055952.js +1 -0
- package/dist/browser/chunks/nl-NL-364d61b9.js +1 -0
- package/dist/browser/chunks/nl-NL-8b7e6d4b.js +1 -0
- package/dist/browser/chunks/overlay-containment-edaaff13.js +1 -0
- package/dist/browser/chunks/overlay-placement-e8058232.js +1 -0
- package/dist/browser/chunks/phonetics-BwOCw2Y9-d2e3af59.js +1 -0
- package/dist/browser/chunks/phonetics-ss-CRtMn02f-579b6135.js +1 -0
- package/dist/browser/chunks/pie-api-client-687c319a.js +1 -0
- package/dist/browser/chunks/pointer-gesture-ce75f0a7.js +1 -0
- package/dist/browser/chunks/preload-helper-6ad28da3.js +1 -0
- package/dist/browser/chunks/provider-4c704118.js +1 -0
- package/dist/browser/chunks/rolldown-runtime-1287ba31.js +1 -0
- package/dist/browser/chunks/runtime-wcU7KOFU-ac86d7b8.js +8536 -0
- package/dist/browser/chunks/sanitize-svg-icon-b9082bba.js +3 -0
- package/dist/browser/chunks/sans-serif-BYPZKlE9-2efdbcd9.js +1 -0
- package/dist/browser/chunks/sans-serif-b-B0kRKiC--b5530dce.js +1 -0
- package/dist/browser/chunks/sans-serif-bi-DXWul6mu-5370dba4.js +1 -0
- package/dist/browser/chunks/sans-serif-ex-Boux1kMP-aa178f31.js +1 -0
- package/dist/browser/chunks/sans-serif-i-676RFaSO-2db54474.js +1 -0
- package/dist/browser/chunks/sans-serif-r-DrN9xdZt-0fc72eea.js +1 -0
- package/dist/browser/chunks/script-0ohehnXc-526904f4.js +1 -0
- package/dist/browser/chunks/shapes-BG47NodJ-d59b0eca.js +1 -0
- package/dist/browser/chunks/src-BcptuNS5-ed25d7fd.js +191 -0
- package/dist/browser/chunks/sre-0162a7a9.js +53 -0
- package/dist/browser/chunks/sre-engine-ace23548.js +1 -0
- package/dist/browser/chunks/sre-engine-jd8cc08x-42d270e5.js +1 -0
- package/dist/browser/chunks/sre-locales-112320af.js +1 -0
- package/dist/browser/chunks/symbols-BqnUxf_t-83087e87.js +1 -0
- package/dist/browser/chunks/symbols-b-i-eg9k5hmF-9c461ac2.js +1 -0
- package/dist/browser/chunks/tool-annotation-toolbar-997438b4.js +249 -0
- package/dist/browser/chunks/tool-answer-eliminator-35483abd.js +13 -0
- package/dist/browser/chunks/tool-color-scheme-b7de5cdf.js +26 -0
- package/dist/browser/chunks/tool-dictionary-cecff3b4.js +7 -0
- package/dist/browser/chunks/tool-graph-cb0338e8.js +11 -0
- package/dist/browser/chunks/tool-host-contract-b93b482c.js +1 -0
- package/dist/browser/chunks/tool-instance-id-2a92deb0.js +1 -0
- package/dist/browser/chunks/tool-line-reader-f8ef3c6a.js +62 -0
- package/dist/browser/chunks/tool-periodic-table-43b133b8.js +153 -0
- package/dist/browser/chunks/tool-picture-dictionary-33721e91.js +4 -0
- package/dist/browser/chunks/tool-protractor-23f77028.js +17 -0
- package/dist/browser/chunks/tool-ruler-1d9a03a6.js +15 -0
- package/dist/browser/chunks/tool-tts-inline-98c2ce7a.js +179 -0
- package/dist/browser/chunks/tts-runtime-config-a7ab1ad4.js +194 -0
- package/dist/browser/chunks/variants-2LRNhOUP-966fc49d.js +1 -0
- package/dist/browser/chunks/versioned-tag-54a76be9.js +1 -0
- package/dist/browser/pie-section-player.js +1727 -0
- package/dist/browser.d.ts +10 -0
- package/dist/chunks/ItemToolBar-jx38w99s-1287ba31.js +28 -0
- package/dist/chunks/module-shim-58659a86.js +2129 -0
- package/dist/chunks/{nl-NL-9312c316.js → nl-NL-364d61b9.js} +9 -26
- package/dist/chunks/sre-engine-jd8cc08x-42d270e5.js +8 -0
- package/dist/components/shared/composition.d.ts +3 -2
- package/dist/components/shared/framework-error-latch.d.ts +32 -0
- package/dist/components/shared/host-element.d.ts +10 -0
- package/dist/components/shared/kernel-host-default-body.d.ts +14 -0
- package/dist/components/shared/layout-host-methods.d.ts +385 -0
- package/dist/components/shared/missing-tool-providers.d.ts +16 -0
- package/dist/components/shared/player-preload.d.ts +14 -10
- package/dist/components/shared/section-player-backend-delivery.d.ts +1 -1
- package/dist/components/shared/section-player-card-context.d.ts +5 -1
- package/dist/components/shared/section-player-host-runtime.d.ts +32 -19
- package/dist/components/shared/section-player-layout-context.d.ts +77 -0
- package/dist/components/shared/section-player-own-event.d.ts +10 -0
- package/dist/components/shared/section-player-runtime-callbacks.d.ts +1 -1
- package/dist/components/shared/section-player-shell-layout.svelte.d.ts +3 -11
- package/dist/components/shared/section-player-view-state.d.ts +6 -1
- package/dist/components/shared/toolkit-ready-wait.d.ts +16 -0
- package/dist/contracts/host-hooks.d.ts +4 -12
- package/dist/contracts/host-hooks.js +0 -0
- package/dist/contracts/runtime-host-contract.d.ts +0 -5
- package/dist/contracts/runtime-host-contract.js +0 -0
- package/dist/controllers/SectionController.d.ts +14 -0
- package/dist/controllers/toolkit-section-contracts.d.ts +1 -17
- package/dist/controllers/types.d.ts +25 -11
- package/dist/item-section/index.d.ts +22 -0
- package/dist/item-section/index.js +37 -0
- package/dist/pie-section-player.d.ts +4 -6
- package/dist/pie-section-player.js +22006 -41076
- package/dist/policies/index.d.ts +5 -16
- package/dist/policies/index.js +17 -0
- package/dist/policies/types.d.ts +0 -4
- package/package.json +33 -68
- package/dist/chunks/module-a516757f.js +0 -73997
- package/dist/chunks/nl-NL-ef6dd604.js +0 -505
- package/dist/chunks/pie-api-client-22de9d9c.js +0 -168
- package/dist/chunks/rolldown-runtime-1287ba31.js +0 -20
- package/dist/chunks/sre-0162a7a9.js +0 -17637
- package/dist/components/item-shell-element.d.ts +0 -1
- package/dist/components/shared/shell-registration.d.ts +0 -55
- package/dist/contracts/layout-contract.d.ts +0 -17
- package/dist/contracts/layout-parity-metadata.d.ts +0 -4
- package/dist/contracts/public-events.d.ts +0 -93
- package/dist/contracts/stages.d.ts +0 -10
- package/dist/policies/guards.d.ts +0 -2
- package/dist/utils/z-index.d.ts +0 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as h}from"./defineProperty-a20a667d.js";import{r as B,t as W}from"./logger-8b07fb72.js";var A=e=>{const t=Number(e);return Number.isFinite(t)?t:null},E=e=>[...e].sort((t,r)=>t.time!==r.time?t.time-r.time:t.start!==r.start?t.start-r.start:t.end-r.end),N=e=>{const t=[];let r=0;for(const i of e.split(/\r?\n/)){const o=i.trim();if(o)try{const s=JSON.parse(o);if(s.type&&s.type!=="word")continue;const n=A(s.time);if(n===null)continue;const a=typeof s.value=="string"?s.value:"",d=A(s.start)??r,l=A(s.end)??d+Math.max(1,a.length);r=Math.max(l+1,r),t.push({time:n,type:"word",start:d,end:l,value:a})}catch{}}return E(t)},D=e=>{if(e.length<2)return e;const t=e.map(s=>s.time).filter(s=>s>=0),r=t.length?Math.max(...t):0,i=[];for(let s=1;s<t.length;s+=1){const n=t[s]-t[s-1];n>0&&Number.isFinite(n)&&i.push(n)}const o=i.length>0?[...i].sort((s,n)=>s-n)[Math.floor(i.length/2)]:0;return r>0&&r<100&&e.length>3||o>0&&o<10?e.map(s=>({...s,time:s.time*1e3})):e},_=(e,t)=>{if(!e.length||!t.length)return 0;const r=t.toLowerCase(),i=[];let o=0;for(const s of e){const n=s.value.trim().toLowerCase();if(!n)continue;const a=r.indexOf(n,o);if(a<0)continue;const d=s.start-a;if(d>=0&&i.push(d),o=a+n.length,i.length>=8)break}if(i.length>0){const s=[...i].sort((n,a)=>n-a);return s[Math.floor(s.length/2)]}return Math.max(0,Math.floor(e[0].start))},H=(e,t)=>{if(!e.length||!t.length)return e;const r=t.length;if(Math.max(...e.map(o=>o.end))<=r+2)return e;const i=_(e,t);return i<=0?e:e.map(o=>({...o,start:o.start-i,end:o.end-i}))},F=(e,t)=>{if(!t.length)return e;const r=t.length;return E(e.map(i=>{const o=Math.max(0,Math.min(r,Math.floor(i.start))),s=Math.max(o+1,Math.min(r,Math.floor(i.end)));return{...i,start:o,end:s}}))};function $(e,t){const r=N(e),i=D(r),o=H(i,t);return F(o,t)}function O(e,t="medium"){const r=Number(e??1);return Number.isFinite(r)?r<=.95?"slow":r>=1.5?"fast":t:t}var f=W("server-tts-provider",B),p="textToSpeech";function k(e,t){if(typeof e!="string"||e.length===0)return null;try{const r=typeof t.apiEndpoint=="string"&&/^https?:\/\//i.test(t.apiEndpoint)?t.apiEndpoint:void 0,i=r?new URL(e,r):new URL(e);return i.protocol!=="http:"&&i.protocol!=="https:"?null:i}catch{return null}}function L(e,t){const r=Array.isArray(t.assetOrigins)?t.assetOrigins.filter(i=>typeof i=="string"&&i.length>0).map(i=>{try{return new URL(i).origin}catch{return i}}):[];if(r.length===0){if(typeof t.apiEndpoint=="string"&&/^https?:\/\//i.test(t.apiEndpoint))try{return new URL(t.apiEndpoint).origin===e.origin}catch{return!1}return typeof window<"u"&&typeof window.location?.origin=="string"&&window.location.origin===e.origin}return r.includes(e.origin)}function x(e){const t={};for(const[r,i]of Object.entries(e)){const o=r.toLowerCase();o==="authorization"||o==="proxy-authorization"||o==="cookie"||o.startsWith("x-auth-")||(t[r]=i)}return t}function S(e,t=!0){return e.credentials?!t&&e.credentials==="include"?{}:{credentials:e.credentials}:{}}function U(e,t){const r={};if(!t.includeAuthOnAssetFetch)return r;for(const[i,o]of Object.entries(e))i.toLowerCase()==="authorization"&&(r[i]=o);return r}var z=e=>{const t=e.providerOptions?.__pieTelemetry;return typeof t=="function"?t:void 0},j={pie:3e3,custom:3e3},V=new Set(["polly","google"]),q=e=>{if(!e||M(e)!=="pie")return!1;const t=(e.provider||"polly").toLowerCase();return V.has(t)},R=e=>e.replace(/\/+$/,""),J=e=>{const t=R(e.apiEndpoint),r=(e.provider||"").toLowerCase();return r==="polly"||r==="google"?[`${t}/${r}/voices`,`${t}/voices`]:[`${t}/voices`]},M=e=>e.transportMode==="custom"?"custom":e.transportMode==="pie"?"pie":e.provider==="custom"?"custom":"pie",I=(e,t)=>e.endpointMode?e.endpointMode:t==="custom"?"rootPost":"synthesizePath",G=(e,t)=>e.endpointValidationMode?e.endpointValidationMode:t==="custom"?"none":"voices",K=e=>{const t=e.providerOptions?.speedRate;return typeof t=="string"?t:O(e.rate)},C=e=>{const t=e.providerOptions?.contentLanguage;return typeof t=="string"&&t.trim()?t.trim():void 0},X=e=>{if(!Array.isArray(e))return[];const t=[];let r=0;for(const i of e){if(!i||typeof i!="object")continue;const o=typeof i.type=="string"?i.type:"word",s=typeof i.time=="number"&&Number.isFinite(i.time)?i.time:0,n=typeof i.value=="string"?i.value:"",a=typeof i.start=="number"&&Number.isFinite(i.start)?i.start:null,d=typeof i.end=="number"&&Number.isFinite(i.end)?i.end:null,l=a??r,g=d??l+Math.max(1,n.length||1);r=Math.max(r,g+1),t.push({time:s,type:o,start:l,end:g,value:n})}return t.sort((i,o)=>i.time!==o.time?i.time-o.time:i.start!==o.start?i.start-o.start:i.end-o.end)},Y={pie:{id:"pie",resolveSynthesisUrl:e=>{const t=I(e,"pie"),r=R(e.apiEndpoint);return t==="rootPost"?r:`${r}/synthesize`},buildRequestBody:(e,t)=>{const r=t.providerOptions||{},i=typeof t.engine=="string"?t.engine:typeof r.engine=="string"?r.engine:void 0,o=typeof r.sampleRate=="number"&&Number.isFinite(r.sampleRate)?r.sampleRate:void 0,s=r.format==="mp3"||r.format==="ogg"||r.format==="pcm"?r.format:void 0,n=Array.isArray(r.speechMarkTypes)?r.speechMarkTypes.filter(a=>a==="word"||a==="sentence"||a==="ssml"):void 0;return{text:e,provider:t.provider||"polly",voice:t.voice,language:C(t)??t.language,rate:t.rate,engine:i,sampleRate:o,format:s,speechMarkTypes:n,includeSpeechMarks:!0}},parseResponse:async(e,t,r,i,o)=>{const s=await e.json();return{audio:{kind:"base64",data:s.audio,contentType:s.contentType},speechMarks:Array.isArray(s.speechMarks)?s.speechMarks:[]}}},custom:{id:"custom",resolveSynthesisUrl:e=>{const t=I(e,"custom"),r=R(e.apiEndpoint);return t==="synthesizePath"?`${r}/synthesize`:r},buildRequestBody:(e,t)=>{const r=t.providerOptions||{},i=(typeof r.lang_id=="string"&&r.lang_id.trim()?r.lang_id:void 0)??C(t)??(t.language||"en-US"),o=typeof r.cache=="boolean"?r.cache:!0;return{text:e,speedRate:K(t),lang_id:i,langId:i,cache:o}},parseResponse:async(e,t,r,i,o)=>{const s=await e.json(),n=U(r,t);let a=[];const d=X(s.speechMarks);if(d.length>0)a=d;else if(typeof s.word=="string"&&s.word.length>0){const g=k(s.word,t);if(g!==null){const y=L(g,t),c=y?n:x(n),u=await fetch(g.toString(),{headers:c,...S(t,y),signal:i,redirect:"error"});if(u.ok){const m=await u.text();a=$(m,o)}}}const l=k(s.audioContent,t);if(l===null)throw new Error("TTS server returned an invalid audio URL");return{audio:{kind:"url",url:l.toString()},speechMarks:a}}}},Q=class{constructor(e,t){h(this,"config",void 0),h(this,"adapter",void 0),h(this,"currentAudio",null),h(this,"pausedState",!1),h(this,"wordTimings",[]),h(this,"highlightInterval",null),h(this,"highlightCursor",-1),h(this,"intentionallyStopped",!1),h(this,"activeSynthesisController",null),h(this,"startCurrentAudio",null),h(this,"synthesisRunId",0),h(this,"telemetryReporter",void 0),h(this,"onPlaybackStart",void 0),h(this,"onWordBoundary",void 0),this.config=e,this.adapter=t,this.telemetryReporter=z(e)}async emitTelemetry(e,t){try{await this.telemetryReporter?.(e,t)}catch(r){f.warn("telemetry callback failed:",r)}}async speak(e){this.stop(),this.intentionallyStopped=!1;const t=++this.synthesisRunId,r=new AbortController;this.activeSynthesisController=r;let i;try{i=await this.synthesizeSpeech(e,r.signal,t)}catch(n){if(t!==this.synthesisRunId||r.signal.aborted)return;throw n}finally{this.activeSynthesisController===r&&(this.activeSynthesisController=null)}const{audioUrl:o,wordTimings:s}=i;if(t!==this.synthesisRunId){URL.revokeObjectURL(o);return}return this.wordTimings=s,this.highlightCursor=-1,new Promise((n,a)=>{const d=new Audio(o);this.currentAudio=d,this.config.volume!==void 0&&(d.volume=Math.max(0,Math.min(1,this.config.volume)));const l=()=>t!==this.synthesisRunId||this.currentAudio!==d;d.onplaying=()=>{if(!l()){this.pausedState=!1;try{this.onPlaybackStart?.()}catch(y){f.warn("playback-start callback failed:",y)}this.onWordBoundary&&this.wordTimings.length>0&&this.startWordHighlighting()}},d.onended=()=>{URL.revokeObjectURL(o),l()||this.clearCurrentAudio(),n()},d.onerror=()=>{if(URL.revokeObjectURL(o),l()||this.intentionallyStopped){n();return}this.clearCurrentAudio(),a(new Error("Failed to play audio from server"))},d.onpause=()=>{l()||(this.stopWordHighlighting(),this.pausedState=!0)};const g=()=>{d.play().catch(y=>{y?.name==="AbortError"&&this.pausedState&&this.currentAudio===d||a(y)})};this.startCurrentAudio=g,this.pausedState||g()})}async synthesizeSpeech(e,t,r){const i=Date.now();await this.emitTelemetry("pie-tool-backend-call-start",{toolId:p,backend:this.config.provider||"server",operation:"synthesize-speech"});const o={"Content-Type":"application/json",...this.config.headers};this.config.authToken&&(o.Authorization=`Bearer ${this.config.authToken}`);const s=this.adapter.resolveSynthesisUrl(this.config),n=this.adapter.buildRequestBody(e,this.config),a=await(async()=>{try{return await fetch(s,{method:"POST",headers:o,body:JSON.stringify(n),signal:t,...S(this.config)})}catch(c){throw t.aborted||await this.emitTelemetry("pie-tool-backend-call-error",{toolId:p,backend:this.config.provider||"server",operation:"synthesize-speech",duration:Date.now()-i,errorType:"TTSBackendNetworkError",message:c instanceof Error?c.message:String(c)}),c}})();if(!a.ok){const c=await a.text().catch(()=>"");let u={};if(c)try{u=JSON.parse(c)}catch(w){f.warn("non-OK response body was not JSON",{status:a.status,url:s,bodyLength:c.length,parseError:w instanceof Error?w.message:String(w)}),f.debug("non-OK response body",{rawBodyPreview:c.slice(0,500)})}const m=typeof u.message=="string"&&u.message||(typeof u.error?.message=="string"?u.error.message:void 0)||`Server returned ${a.status}`;await this.emitTelemetry("pie-tool-backend-call-error",{toolId:p,backend:this.config.provider||"server",operation:"synthesize-speech",duration:Date.now()-i,statusCode:a.status,errorType:"TTSBackendRequestError",message:m}),f.error("synthesize request failed",{status:a.status,url:s,backend:this.config.provider||"server",message:m,textLength:e.length});const v=e.replace(/\s+/g," ").trim().slice(0,120);throw f.debug("synthesize request failed for text",{responseBody:u,textPreview:v.length<e.length?`${v}…`:v}),new Error(m)}const d=await this.adapter.parseResponse(a,this.config,o,t,e);if(r!==this.synthesisRunId||t.aborted)throw new Error("Synthesis superseded by a newer request");let l;if(d.audio.kind==="base64")l=this.base64ToBlob(d.audio.data,d.audio.contentType);else{const c=d.audio.url,u=Date.now();await this.emitTelemetry("pie-tool-backend-call-start",{toolId:p,backend:this.config.provider||"server",operation:"fetch-synthesized-audio-asset"});const m=U(o,this.config),v=k(c,this.config);if(v===null)throw await this.emitTelemetry("pie-tool-backend-call-error",{toolId:p,backend:this.config.provider||"server",operation:"fetch-synthesized-audio-asset",duration:Date.now()-u,errorType:"TTSAssetInvalidUrl",message:"TTS asset URL rejected (non-http(s) or malformed)"}),new Error("TTS asset URL rejected (non-http(s) or malformed)");const w=L(v,this.config),P=w?m:x(m),b=await(async()=>{try{return await fetch(v.toString(),{headers:P,signal:t,...S(this.config,w),redirect:"error"})}catch(T){throw t.aborted||await this.emitTelemetry("pie-tool-backend-call-error",{toolId:p,backend:this.config.provider||"server",operation:"fetch-synthesized-audio-asset",duration:Date.now()-u,errorType:"TTSAssetNetworkError",message:T instanceof Error?T.message:String(T)}),T}})();if(!b.ok)throw await this.emitTelemetry("pie-tool-backend-call-error",{toolId:p,backend:this.config.provider||"server",operation:"fetch-synthesized-audio-asset",duration:Date.now()-u,statusCode:b.status,errorType:"TTSAssetFetchError",message:`Failed to download synthesized audio (${b.status})`}),new Error(`Failed to download synthesized audio (${b.status})`);l=await b.blob(),await this.emitTelemetry("pie-tool-backend-call-success",{toolId:p,backend:this.config.provider||"server",operation:"fetch-synthesized-audio-asset",duration:Date.now()-u})}const g=URL.createObjectURL(l),y=this.parseSpeechMarks(d.speechMarks);return await this.emitTelemetry("pie-tool-backend-call-success",{toolId:p,backend:this.config.provider||"server",operation:"synthesize-speech",duration:Date.now()-i}),{audioUrl:g,wordTimings:y}}base64ToBlob(e,t){const r=atob(e),i=new Array(r.length);for(let s=0;s<r.length;s++)i[s]=r.charCodeAt(s);const o=new Uint8Array(i);return new Blob([o],{type:t})}parseSpeechMarks(e){return e.filter(t=>t.type==="word").map((t,r)=>({time:t.time,wordIndex:r,charIndex:t.start,length:t.end-t.start,word:t.value}))}startWordHighlighting(){if(this.stopWordHighlighting(),!this.currentAudio||!this.onWordBoundary||this.wordTimings.length===0){f.debug("cannot start word highlighting",{hasAudio:!!this.currentAudio,hasCallback:!!this.onWordBoundary,wordTimingsCount:this.wordTimings.length});return}f.debug("starting word highlighting",{wordTimingsCount:this.wordTimings.length,playbackRate:this.currentAudio.playbackRate}),this.highlightInterval=window.setInterval(()=>{if(!this.currentAudio){this.stopWordHighlighting();return}const e=this.currentAudio.currentTime*1e3,t=this.resolveCurrentWordIndex(e,this.highlightCursor);if(t<0||t===this.highlightCursor)return;this.highlightCursor=t;const r=this.wordTimings[t];f.debug("word boundary",{wordIndex:r.wordIndex,charIndex:r.charIndex,length:r.length,timingMs:r.time,currentTimeMs:e}),this.onWordBoundary?.(r.word,r.charIndex,r.length)},50)}resolveCurrentWordIndex(e,t){const r=this.wordTimings;let i=t<r.length?t:-1;for(i>=0&&e<r[i].time&&(i=-1);i+1<r.length&&r[i+1].time<=e;)i++;return i}stopWordHighlighting(){this.highlightInterval!==null&&(clearInterval(this.highlightInterval),this.highlightInterval=null)}pause(){if(!this.pausedState){if(this.currentAudio)this.currentAudio.pause(),this.stopWordHighlighting();else if(!this.activeSynthesisController)return;this.pausedState=!0}}resume(){this.pausedState&&(this.pausedState=!1,this.currentAudio&&(this.startCurrentAudio?.(),this.onWordBoundary&&this.wordTimings.length>0&&this.startWordHighlighting()))}clearCurrentAudio(){this.stopWordHighlighting(),this.currentAudio=null,this.wordTimings=[],this.highlightCursor=-1}stop(){this.synthesisRunId+=1,this.startCurrentAudio=null,this.activeSynthesisController&&(this.activeSynthesisController.abort(),this.activeSynthesisController=null),this.stopWordHighlighting(),this.currentAudio&&(this.intentionallyStopped=!0,this.currentAudio.pause(),this.currentAudio.src&&URL.revokeObjectURL(this.currentAudio.src),this.currentAudio.src="",this.currentAudio=null),this.pausedState=!1,this.wordTimings=[],this.highlightCursor=-1}isPlaying(){return this.currentAudio!==null&&!this.pausedState}isPaused(){return this.pausedState}updateSettings(e){e.rate!==void 0&&(this.config.rate=e.rate,this.config.providerOptions={...this.config.providerOptions||{},speedRate:O(e.rate)}),e.pitch!==void 0&&(this.config.pitch=e.pitch),e.voice!==void 0&&(this.config.voice=e.voice),e.providerOptions&&"contentLanguage"in e.providerOptions&&(this.config.providerOptions={...this.config.providerOptions,contentLanguage:e.providerOptions.contentLanguage})}},et=class{constructor(){h(this,"providerId","server-tts"),h(this,"providerName","Server TTS"),h(this,"version","1.0.0"),h(this,"config",null),h(this,"adapter",null),h(this,"telemetryReporter",void 0)}async emitTelemetry(e,t){try{await this.telemetryReporter?.(e,t)}catch(r){f.warn("telemetry callback failed:",r)}}async initialize(e){const t=e;if(!t.apiEndpoint)throw new Error("apiEndpoint is required for ServerTTSProvider");this.config=t,this.telemetryReporter=z(t);const r=M(t);if(this.adapter=Y[r],t.validateEndpoint){const i=Date.now();if(await this.emitTelemetry("pie-tool-backend-call-start",{toolId:p,backend:t.provider||"server",operation:"validate-endpoint"}),!await this.testAPIAvailability())throw await this.emitTelemetry("pie-tool-backend-call-error",{toolId:p,backend:t.provider||"server",operation:"validate-endpoint",duration:Date.now()-i,errorType:"TTSEndpointValidationError",message:`Server TTS API not available at ${t.apiEndpoint}`}),new Error(`Server TTS API not available at ${t.apiEndpoint}`);await this.emitTelemetry("pie-tool-backend-call-success",{toolId:p,backend:t.provider||"server",operation:"validate-endpoint",duration:Date.now()-i})}return new Q(t,this.adapter)}async testAPIAvailability(){if(!this.config||!this.adapter)return!1;try{const e={...this.config.headers};this.config.authToken&&(e.Authorization=`Bearer ${this.config.authToken}`);const t=new AbortController,r=setTimeout(()=>t.abort(),5e3),i=G(this.config,this.adapter.id);if(i==="none")return clearTimeout(r),!0;const o=i==="voices"?J(this.config):[this.adapter.resolveSynthesisUrl(this.config)],s=i==="voices"?"GET":"OPTIONS";try{let n=!1;for(const a of o){const d=await fetch(a,{method:s,headers:e,signal:t.signal,...S(this.config)});if(n=d.ok||d.status===405,n||d.status!==404)break}return clearTimeout(r),n}catch{return clearTimeout(r),!1}}catch{return!1}}getCapabilities(){const e=this.config?M(this.config):"pie";return{supportsPause:!0,supportsResume:!0,supportsWordBoundary:!0,supportsVoiceSelection:!0,supportsRateControl:!0,supportsPitchControl:!1,supportsSSML:q(this.config),maxTextLength:j[e]}}destroy(){this.config=null,this.adapter=null,this.telemetryReporter=void 0}};export{et as ServerTTSProvider};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as s,n as k}from"./mathjax-BKrHE4xs-3ca05bf6.js";k.dynamicSetup("","double-struck",s({DS:{normal:{8450:[.704,.019,.722,{sk:.036}],8461:[.685,0,.777,{sk:.011}],8469:[.685,.019,.722,{sk:.022}],8473:[.685,0,.611,{sk:.028}],8474:[.704,.179,.777],8477:[.685,0,.722],8484:[.685,0,.666,{sk:.057}],8508:[.431,0,.517],8509:[.431,.216,.472],8510:[.683,0,.611,{sk:.061}],8511:[.683,0,.667,{sk:.028}],8512:[.683,0,.667,{sk:.021}],8517:[.683,0,.694,{sk:.074}],8518:[.694,.022,.5,{ic:.048,sk:.051}],8519:[.453,.022,.472,{sk:.056}],8520:[.691,0,.279,{ic:.053,sk:.071}],8521:[.691,.216,.379,{ic:.063,sk:.117}],120120:[.704,0,.722,{sk:-.014}],120121:[.685,0,.666],120123:[.685,0,.722,{sk:-.02}],120124:[.685,0,.666],120125:[.685,0,.611,{sk:.03}],120126:[.704,.019,.777],120128:[.685,0,.388],120129:[.685,.075,.5,{sk:.055}],120130:[.685,0,.777,{sk:.015}],120131:[.685,0,.666,{sk:-.148}],120132:[.685,0,.944,{sk:.073}],120134:[.704,.019,.777],120138:[.704,.012,.555,{sk:-.013}],120139:[.685,0,.666],120140:[.685,.019,.722,{sk:.053}],120141:[.685,.019,.722,{sk:.072}],120142:[.685,.019,1,{sk:.048}],120143:[.685,0,.722,{sk:.026}],120144:[.685,0,.722,{sk:.038}],120146:[.453,.022,.5],120147:[.694,.022,.628,{sk:-.169}],120148:[.453,.022,.472],120149:[.694,.022,.5,{sk:.17}],120150:[.453,.022,.472],120151:[.716,0,.389,{sk:.028}],120152:[.453,.216,.5,{sk:-.013}],120153:[.694,0,.572,{sk:-.147}],120154:[.691,0,.279],120155:[.691,.216,.389,{sk:.057}],120156:[.694,0,.544,{sk:-.054}],120157:[.694,0,.279],120158:[.453,0,.722,{sk:.061}],120159:[.453,0,.572,{sk:.06}],120160:[.453,.022,.472],120161:[.453,.194,.628,{sk:.076}],120162:[.453,.194,.5,{sk:-.012}],120163:[.453,0,.544],120164:[.453,.022,.389],120165:[.694,.022,.417,{sk:-.059}],120166:[.431,.022,.528,{sk:.051}],120167:[.431,0,.472,{sk:.051}],120168:[.431,0,.667,{sk:.033}],120169:[.431,0,.472,{sk:.015}],120170:[.431,.216,.472,{sk:.062}],120171:[.431,0,.472,{sk:.038}],120792:[.666,.022,.556],120793:[.644,0,.556],120794:[.666,0,.556],120795:[.666,.022,.556],120796:[.644,0,.556,{sk:.117}],120797:[.644,.022,.556],120798:[.666,.022,.556],120799:[.644,0,.556,{sk:.031}],120800:[.666,.022,.556],120801:[.666,.022,.556]},"double-struck":{305:[.431,0,.279,{sk:.201}],567:[.431,.216,.389,{sk:.181}]}}},"NCM"));
|