@imgly/plugin-ai-audio-generation-web 0.1.7 → 0.1.9

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/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
- # Changelog
1
+ # Changelog - AI Plugins
2
2
 
3
- ## [0.1.0-rc.1] - 2025-03-20
3
+ ## [Unreleased]
4
4
 
5
- ### Added
6
- - Initial release
5
+ ## [0.1.9] - 2025-06-05
6
+
7
+ - [all] Add support for custom headers
8
+
9
+ ## [0.1.8] - 2025-05-26
10
+
11
+ - [ai-apps] Handle `sceneMode` change in upcoming CE.SDK version 1.52.0
12
+
13
+ ## [0.1.0] - 2025-04-17
14
+
15
+ - [all] Initial release
@@ -1,14 +1,11 @@
1
- import { type Provider, type AudioOutput, Middleware } from '@imgly/plugin-ai-generation-web';
1
+ import { type Provider, type AudioOutput, CommonProviderConfiguration } from '@imgly/plugin-ai-generation-web';
2
2
  import CreativeEditorSDK from '@cesdk/cesdk-js';
3
3
  type ElevenlabsInput = {
4
4
  prompt: string;
5
5
  voice_id: string;
6
6
  speed: number;
7
7
  };
8
- type ProviderConfiguration = {
9
- proxyUrl: string;
10
- debug?: boolean;
11
- middleware?: Middleware<ElevenlabsInput, AudioOutput>[];
8
+ interface ProviderConfiguration extends CommonProviderConfiguration<ElevenlabsInput, AudioOutput> {
12
9
  /**
13
10
  * Base URL used for the UI assets used in the plugin.
14
11
  *
@@ -16,7 +13,7 @@ type ProviderConfiguration = {
16
13
  * from the `/assets` folder to your own server and set the base URL to your server.
17
14
  */
18
15
  baseURL?: string;
19
- };
16
+ }
20
17
  export declare function ElevenMultilingualV2(config: ProviderConfiguration): (context: {
21
18
  cesdk: CreativeEditorSDK;
22
19
  }) => Promise<Provider<'audio', ElevenlabsInput, AudioOutput>>;
@@ -1,14 +1,11 @@
1
- import { type Provider, type AudioOutput, Middleware } from '@imgly/plugin-ai-generation-web';
1
+ import { type Provider, type AudioOutput, CommonProviderConfiguration } from '@imgly/plugin-ai-generation-web';
2
2
  import CreativeEditorSDK from '@cesdk/cesdk-js';
3
3
  type ElevenlabsInput = {
4
4
  text: string;
5
5
  duration_seconds: number;
6
6
  };
7
- type ProviderConfiguration = {
8
- proxyUrl: string;
9
- debug?: boolean;
10
- middleware?: Middleware<ElevenlabsInput, AudioOutput>[];
11
- };
7
+ interface ProviderConfiguration extends CommonProviderConfiguration<ElevenlabsInput, AudioOutput> {
8
+ }
12
9
  export declare function ElevenSoundEffects(config: ProviderConfiguration): (context: {
13
10
  cesdk: CreativeEditorSDK;
14
11
  }) => Promise<Provider<'audio', ElevenlabsInput, AudioOutput>>;
@@ -1,2 +1,2 @@
1
- var E={openapi:"3.0.0",info:{title:"Elevenlabs API",version:"1.0.0",description:"Elevenlabs API"},components:{schemas:{ElevenlabsInput:{title:"TextToSpeechInput",type:"object",properties:{prompt:{title:"Prompt",type:"string","x-imgly-builder":{component:"TextArea"}},voice_id:{title:"Voice",type:"string",description:"The voice ID to use for the speech synthesis.",default:"JBFqnCBsd6RMkjVDRZzb"},speed:{title:"Speed",type:"number",description:"The speed of the speech synthesis.",default:1,"x-imgly-step":.05,minimum:.7,maximum:1.2}},"x-elevenlabs-order-properties":["prompt","style","image_size"],required:["prompt","voice_id"]}}}};var I={version:"2.0.0",id:"ly.img.voices.eleventlabs",assets:[{id:"JBFqnCBsd6RMkjVDRZzb",label:{en:"George"},tags:{en:["British Accent","warm","middle aged","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/e6206d1a-0721-4787-aafb-06a6e705cac5.mp3",thumbUri:"{{base_url}}george.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.42"}},{id:"FGY2WhTYpPnrIDTdsKH5",label:{en:"Laura"},tags:{en:["American Accent","upbeat","young","female","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/FGY2WhTYpPnrIDTdsKH5/67341759-ad08-41a5-be6e-de12fe448618.mp3",thumbUri:"{{base_url}}laura.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.04"}},{id:"IKne3meq5aSn9XLyUdCD",label:{en:"Charlie"},tags:{en:["Australian Accent","natural","middle aged","male","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/102de6f2-22ed-43e0-a1f1-111fa75c5481.mp3",thumbUri:"{{base_url}}charlie.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.53"}},{id:"9BWtsMINqrJLrRacOk9x",label:{en:"Aria"},tags:{en:["American Accent","expressive","middle-aged","female","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/405766b8-1f4e-4d3c-aba1-6f25333823ec.mp3",thumbUri:"{{base_url}}aria.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.71"}},{id:"EXAVITQu4vr4xnSDxMaL",label:{en:"Sarah"},tags:{en:["american Accent","soft","young","female","news"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/01a3e33c-6e99-4ee7-8543-ff2216a32186.mp3",thumbUri:"{{base_url}}sarah2.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.53"}},{id:"SAz9YHcvj6GT2YYXdXww",label:{en:"River"},tags:{en:["American Accent","confident","middle-aged","non-binary","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/SAz9YHcvj6GT2YYXdXww/e6c95f0b-2227-491a-b3d7-2249240decb7.mp3",thumbUri:"{{base_url}}river.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.53"}},{id:"XrExE9yKIg1WjnnlVkGX",label:{en:"Matilda"},tags:{en:["American Accent","friendly","middle-aged","female","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/b930e18d-6b4d-466e-bab2-0ae97c6d8535.mp3",thumbUri:"{{base_url}}matilda.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.64"}},{id:"N2lVS1w4EtoT3dr4eOWO",label:{en:"Callum"},tags:{en:["Transatlantic Accent","intense","middle-aged","male","characters"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/ac833bd8-ffda-4938-9ebc-b0f99ca25481.mp3",thumbUri:"{{base_url}}callum.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"4.18"}},{id:"TX3LPaxmHKxFdv7VOQHJ",label:{en:"Liam"},tags:{en:["American Accent","articulate","young","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/63148076-6363-42db-aea8-31424308b92c.mp3",thumbUri:"{{base_url}}liam.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"4.13"}},{id:"XB0fDUnXU5powFXDhCwa",label:{en:"Charlotte"},tags:{en:["Swedish Accent","seductive","young","female","characters"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/XB0fDUnXU5powFXDhCwa/942356dc-f10d-4d89-bda5-4f8505ee038b.mp3",thumbUri:"{{base_url}}charlotte.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.25"}},{id:"CwhRBWXzGAHq8TQ4Fs17",label:{en:"Roger"},tags:{en:["American Accent","confident","middle-aged","male","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/CwhRBWXzGAHq8TQ4Fs17/58ee3ff5-f6f2-4628-93b8-e38eb31806b0.mp3",thumbUri:"{{base_url}}roger.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.89"}},{id:"nPczCjzI2devNBz1zQrb",label:{en:"Brian"},tags:{en:["American Accent","deep","middle-aged","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/nPczCjzI2devNBz1zQrb/2dd3e72c-4fd3-42f1-93ea-abc5d4e5aa1d.mp3",thumbUri:"{{base_url}}brian.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.46"}},{id:"cgSgspJ2msm6clMCkdW9",label:{en:"Jessica"},tags:{en:["American Accent","expressive","young","female","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/cgSgspJ2msm6clMCkdW9/56a97bf8-b69b-448f-846c-c3a11683d45a.mp3",thumbUri:"{{base_url}}jessica.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.89"}},{id:"Xb7hH8MSUJpSbSDYk0k2",label:{en:"Alice"},tags:{en:["British Accent","confident","middle-aged","female","news"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/Xb7hH8MSUJpSbSDYk0k2/d10f7534-11f6-41fe-a012-2de1e482d336.mp3",thumbUri:"{{base_url}}alice.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.53"}},{id:"pFZP5JQG7iQjIQuC4Bku",label:{en:"Lily"},tags:{en:["British Accent","warm","middle-aged","female","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/pFZP5JQG7iQjIQuC4Bku/89b68b35-b3dd-4348-a84a-a3c13a3c2b30.mp3",thumbUri:"{{base_url}}lily.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.11"}},{id:"cjVigY5qzO86Huf0OWal",label:{en:"Eric"},tags:{en:["American Accent","friendly","middle-aged","male","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/cjVigY5qzO86Huf0OWal/d098fda0-6456-4030-b3d8-63aa048c9070.mp3",thumbUri:"{{base_url}}eric.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.32"}},{id:"bIHbv24MWmeRgasZH58o",label:{en:"Will"},tags:{en:["American Accent","friendly","young","male","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/bIHbv24MWmeRgasZH58o/8caf8f3d-ad29-4980-af41-53f20c72d7a4.mp3",thumbUri:"{{base_url}}will.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.74"}},{id:"iP95p4xoKVk53GoZ742B",label:{en:"Chris"},tags:{en:["American Accent","casual","middle-aged","male","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/iP95p4xoKVk53GoZ742B/3f4bde72-cc48-40dd-829f-57fbf906f4d7.mp3",thumbUri:"{{base_url}}chris.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.29"}},{id:"pqHfZKP75CvOlQylNhV4",label:{en:"Bill"},tags:{en:["American Accent","trustworthy","old","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/pqHfZKP75CvOlQylNhV4/d782b3ff-84ba-4029-848c-acf01285524d.mp3",thumbUri:"{{base_url}}bill.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.51"}},{id:"onwK4e9ZLuTAKqWW03F9",label:{en:"Daniel"},tags:{en:["British Accent","authoritative","middle-aged","male","news"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/7eee0236-1a72-4b86-b303-5dcadc007ba9.mp3",thumbUri:"{{base_url}}daniel.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.75"}}]};function C(e,i,a){return Math.min(Math.max(e,i),a)}async function T(e){return new Promise((i,a)=>{let o=new Audio;o.src=e,o.addEventListener("loadedmetadata",()=>{let t=o.duration;i(t)}),o.addEventListener("error",t=>{a(new Error(`Failed to load audio metadata: ${t.message}`))})})}var V={width:256,height:256,backgroundColor:"transparent",waveformColor:"black",pixelsPerSecond:100};async function A(e,i={}){let{width:a,height:o,backgroundColor:t,waveformColor:s,pixelsPerSecond:r}={...V,...i},m=new AudioContext,n=await e.arrayBuffer(),l=await m.decodeAudioData(n),d=l.duration,u=Math.max(a,Math.ceil(d*r)),f=l.sampleRate*d/u,g=document.createElement("canvas");g.width=a,g.height=o;let c=g.getContext("2d");c.fillStyle=t,c.fillRect(0,0,a,o);let D=l.getChannelData(0),y=o/2,_=l.length;c.strokeStyle=s,c.beginPath(),c.moveTo(0,y);for(let p=0;p<a;p++){let h=1,v=-1;for(let S=0;S<f;S++){let P=Math.floor(p*f+S);if(P<_){let x=D[P];x<h&&(h=x),x>v&&(v=x)}}let q=y-h*y,O=y-v*y;c.lineTo(p,O),c.lineTo(p,q)}return c.stroke(),new Promise((p,h)=>{g.toBlob(v=>{v?p(v):h(new Error("Canvas to Blob conversion failed"))})})}function w(e,i,a={}){let{ellipsis:o="...",preserveSentences:t=!1,minLength:s=0}=a;if(!e||e.length<=s||e.length<=i)return e;let r=i-o.length;if(t){let l=/[.!?](?:\s|$)/g,d,u=0;for(;(d=l.exec(e))!==null&&!(d.index>r);)u=d.index+1;if(u>0)return e.substring(0,u)+o}let m=e.substring(0,r),n=m.lastIndexOf(" ");return n>0&&(m=m.substring(0,n)),m+o}function U(e){return async({cesdk:i})=>K(i,e)}function K(e,i){let a=i.baseURL??"https://cdn.img.ly/assets/plugins/plugin-ai-audio-generation-web/v1/elevenlabs/",o="ly.img.ai/audio-generation/speech/elevenlabs",t=`${o}.voiceSelection`,s=M(e,a),r="elevenlabs/monolingual/v1";return e.setTranslations({en:{[`panel.${r}`]:"AI Voice",[`panel.${t}`]:"Select a Voice"}}),{id:r,kind:"audio",initialize:async()=>{e.ui.addAssetLibraryEntry({id:s,sourceIds:[s],gridColumns:3}),e.ui.registerPanel(t,({builder:n,payload:l})=>{n.Library(`${o}.voiceSelection.library`,{searchable:!0,entries:[s],onSelect:async d=>{let{id:u,label:b}=d;l?.onSelect(u,b??u,d.meta?.thumbUri),e.ui.closePanel(t)}})})},input:{panel:{type:"schema",document:E,inputReference:"#/components/schemas/ElevenlabsInput",useFlow:"generation-only",renderCustomProperty:{voice_id:n=>{let l=n.experimental.global("voice",{voiceId:"JBFqnCBsd6RMkjVDRZzb",name:"George",thumbnail:`${a}george.webp`});return n.builder.Button(`${o}.openVoiceSelection`,{inputLabel:"Voice",icon:"@imgly/Appearance",trailingIcon:"@imgly/ChevronRight",labelAlignment:"left",label:l.value.name,onClick:()=>{e.ui.openPanel(t,{payload:{id:l.value.voiceId,onSelect:(d,u,b)=>{l.setValue({voiceId:d,name:u,thumbnail:b})}}})}}),()=>({id:"voice_id",type:"string",value:l.value.voiceId})}},getBlockInput:async n=>({audio:{label:w(n.prompt,25)}})}},output:{abortable:!0,history:"@imgly/indexedDB",middleware:i.middleware,generate:async(n,{abortSignal:l})=>{let d=await F(n.prompt,n.voice_id,{speed:parseFloat(n.speed.toFixed(10))},i,l),u=URL.createObjectURL(d),[b,f]=await Promise.all([A(d,{width:512,height:128}),T(u)]),g=URL.createObjectURL(b);return{kind:"audio",url:u,duration:f,thumbnailUrl:g}}},config:i}}async function F(e,i,a,o,t){let s=`${o.proxyUrl}/v1/text-to-speech/${i}`,r=await fetch(s,{signal:t,method:"POST",headers:{Accept:"audio/mpeg","Content-Type":"application/json"},body:JSON.stringify({text:e,model_id:"eleven_multilingual_v2",voice_settings:{speed:C(a?.speed||1,.7,1.2),stability:a?.stability||.5,similarity_boost:a?.similarityBoost||.5}})});if(!r.ok){let m=await r.text();throw new Error(`API error: ${r.status} - ${m}`)}return r.blob()}function M(e,i){let{id:a,assets:o}=I;return e.engine.asset.addLocalSource(a),o.map(async t=>{e.engine.asset.addAssetToSource(a,{...t,meta:{...t.meta,thumbUri:t.meta.thumbUri.replace("{{base_url}}",`${i}thumbnails/`)}})}),a}var k={openapi:"3.0.0",info:{title:"Elevenlabs Sound Effects API",version:"1.0.0",description:"Elevenlabs Sound Effects API"},components:{schemas:{TextToSoundInput:{title:"TextToSoundInput",type:"object",properties:{text:{title:"Prompt",type:"string","x-imgly-builder":{component:"TextArea"}},duration_seconds:{title:"Duration (sec.)",type:"number",minimum:.6,maximum:22,default:2}},"x-elevenlabs-order-properties":["text"],required:["text"]}}}};function B(e){return async({cesdk:i})=>X(i,e)}function X(e,i){let a="elevenlabs/sound-generation";return e.setTranslations({en:{[`panel.${a}`]:"Generate Sound"}}),{id:a,kind:"audio",initialize:async()=>{},input:{panel:{type:"schema",document:k,inputReference:"#/components/schemas/TextToSoundInput",useFlow:"generation-only",getBlockInput:async t=>({audio:{label:w(t.text,25)}})}},output:{abortable:!0,history:"@imgly/indexedDB",middleware:i.middleware,generate:async(t,{abortSignal:s})=>{let r=await W(t.text,t.duration_seconds,i,s),m=URL.createObjectURL(r),[n,l]=await Promise.all([A(r,{width:512,height:128}),T(m)]),d=URL.createObjectURL(n);return{kind:"audio",url:m,duration:l,thumbnailUrl:d}}},config:i}}async function W(e,i,a,o){let t=`${a.proxyUrl}/v1/sound-generation`,s=await fetch(t,{signal:o,method:"POST",headers:{Accept:"audio/mpeg","Content-Type":"application/json"},body:JSON.stringify({text:e,duration_seconds:i})});if(!s.ok){let r=await s.text();throw new Error(`API error: ${s.status} - ${r}`)}return s.blob()}var z={ElevenMultilingualV2:U,ElevenSoundEffects:B},re=z;export{re as default};
1
+ var C={openapi:"3.0.0",info:{title:"Elevenlabs API",version:"1.0.0",description:"Elevenlabs API"},components:{schemas:{ElevenlabsInput:{title:"TextToSpeechInput",type:"object",properties:{prompt:{title:"Prompt",type:"string","x-imgly-builder":{component:"TextArea"}},voice_id:{title:"Voice",type:"string",description:"The voice ID to use for the speech synthesis.",default:"JBFqnCBsd6RMkjVDRZzb"},speed:{title:"Speed",type:"number",description:"The speed of the speech synthesis.",default:1,"x-imgly-step":.05,minimum:.7,maximum:1.2}},"x-elevenlabs-order-properties":["prompt","style","image_size"],required:["prompt","voice_id"]}}}};var E={version:"2.0.0",id:"ly.img.voices.eleventlabs",assets:[{id:"JBFqnCBsd6RMkjVDRZzb",label:{en:"George"},tags:{en:["British Accent","warm","middle aged","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/e6206d1a-0721-4787-aafb-06a6e705cac5.mp3",thumbUri:"{{base_url}}george.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.42"}},{id:"FGY2WhTYpPnrIDTdsKH5",label:{en:"Laura"},tags:{en:["American Accent","upbeat","young","female","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/FGY2WhTYpPnrIDTdsKH5/67341759-ad08-41a5-be6e-de12fe448618.mp3",thumbUri:"{{base_url}}laura.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.04"}},{id:"IKne3meq5aSn9XLyUdCD",label:{en:"Charlie"},tags:{en:["Australian Accent","natural","middle aged","male","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/102de6f2-22ed-43e0-a1f1-111fa75c5481.mp3",thumbUri:"{{base_url}}charlie.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.53"}},{id:"9BWtsMINqrJLrRacOk9x",label:{en:"Aria"},tags:{en:["American Accent","expressive","middle-aged","female","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/405766b8-1f4e-4d3c-aba1-6f25333823ec.mp3",thumbUri:"{{base_url}}aria.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.71"}},{id:"EXAVITQu4vr4xnSDxMaL",label:{en:"Sarah"},tags:{en:["american Accent","soft","young","female","news"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/01a3e33c-6e99-4ee7-8543-ff2216a32186.mp3",thumbUri:"{{base_url}}sarah2.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.53"}},{id:"SAz9YHcvj6GT2YYXdXww",label:{en:"River"},tags:{en:["American Accent","confident","middle-aged","non-binary","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/SAz9YHcvj6GT2YYXdXww/e6c95f0b-2227-491a-b3d7-2249240decb7.mp3",thumbUri:"{{base_url}}river.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.53"}},{id:"XrExE9yKIg1WjnnlVkGX",label:{en:"Matilda"},tags:{en:["American Accent","friendly","middle-aged","female","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/b930e18d-6b4d-466e-bab2-0ae97c6d8535.mp3",thumbUri:"{{base_url}}matilda.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.64"}},{id:"N2lVS1w4EtoT3dr4eOWO",label:{en:"Callum"},tags:{en:["Transatlantic Accent","intense","middle-aged","male","characters"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/ac833bd8-ffda-4938-9ebc-b0f99ca25481.mp3",thumbUri:"{{base_url}}callum.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"4.18"}},{id:"TX3LPaxmHKxFdv7VOQHJ",label:{en:"Liam"},tags:{en:["American Accent","articulate","young","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/63148076-6363-42db-aea8-31424308b92c.mp3",thumbUri:"{{base_url}}liam.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"4.13"}},{id:"XB0fDUnXU5powFXDhCwa",label:{en:"Charlotte"},tags:{en:["Swedish Accent","seductive","young","female","characters"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/XB0fDUnXU5powFXDhCwa/942356dc-f10d-4d89-bda5-4f8505ee038b.mp3",thumbUri:"{{base_url}}charlotte.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.25"}},{id:"CwhRBWXzGAHq8TQ4Fs17",label:{en:"Roger"},tags:{en:["American Accent","confident","middle-aged","male","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/CwhRBWXzGAHq8TQ4Fs17/58ee3ff5-f6f2-4628-93b8-e38eb31806b0.mp3",thumbUri:"{{base_url}}roger.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.89"}},{id:"nPczCjzI2devNBz1zQrb",label:{en:"Brian"},tags:{en:["American Accent","deep","middle-aged","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/nPczCjzI2devNBz1zQrb/2dd3e72c-4fd3-42f1-93ea-abc5d4e5aa1d.mp3",thumbUri:"{{base_url}}brian.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.46"}},{id:"cgSgspJ2msm6clMCkdW9",label:{en:"Jessica"},tags:{en:["American Accent","expressive","young","female","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/cgSgspJ2msm6clMCkdW9/56a97bf8-b69b-448f-846c-c3a11683d45a.mp3",thumbUri:"{{base_url}}jessica.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.89"}},{id:"Xb7hH8MSUJpSbSDYk0k2",label:{en:"Alice"},tags:{en:["British Accent","confident","middle-aged","female","news"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/Xb7hH8MSUJpSbSDYk0k2/d10f7534-11f6-41fe-a012-2de1e482d336.mp3",thumbUri:"{{base_url}}alice.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.53"}},{id:"pFZP5JQG7iQjIQuC4Bku",label:{en:"Lily"},tags:{en:["British Accent","warm","middle-aged","female","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/pFZP5JQG7iQjIQuC4Bku/89b68b35-b3dd-4348-a84a-a3c13a3c2b30.mp3",thumbUri:"{{base_url}}lily.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.11"}},{id:"cjVigY5qzO86Huf0OWal",label:{en:"Eric"},tags:{en:["American Accent","friendly","middle-aged","male","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/cjVigY5qzO86Huf0OWal/d098fda0-6456-4030-b3d8-63aa048c9070.mp3",thumbUri:"{{base_url}}eric.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.32"}},{id:"bIHbv24MWmeRgasZH58o",label:{en:"Will"},tags:{en:["American Accent","friendly","young","male","social media"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/bIHbv24MWmeRgasZH58o/8caf8f3d-ad29-4980-af41-53f20c72d7a4.mp3",thumbUri:"{{base_url}}will.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"2.74"}},{id:"iP95p4xoKVk53GoZ742B",label:{en:"Chris"},tags:{en:["American Accent","casual","middle-aged","male","conversational"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/iP95p4xoKVk53GoZ742B/3f4bde72-cc48-40dd-829f-57fbf906f4d7.mp3",thumbUri:"{{base_url}}chris.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"3.29"}},{id:"pqHfZKP75CvOlQylNhV4",label:{en:"Bill"},tags:{en:["American Accent","trustworthy","old","male","narration"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/pqHfZKP75CvOlQylNhV4/d782b3ff-84ba-4029-848c-acf01285524d.mp3",thumbUri:"{{base_url}}bill.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.51"}},{id:"onwK4e9ZLuTAKqWW03F9",label:{en:"Daniel"},tags:{en:["British Accent","authoritative","middle-aged","male","news"]},meta:{uri:"https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/7eee0236-1a72-4b86-b303-5dcadc007ba9.mp3",thumbUri:"{{base_url}}daniel.webp",blockType:"//ly.img.ubq/audio",mimeType:"audio/x-m4a",duration:"5.75"}}]};function I(e,i,a){return Math.min(Math.max(e,i),a)}async function T(e){return new Promise((i,a)=>{let o=new Audio;o.src=e,o.addEventListener("loadedmetadata",()=>{let t=o.duration;i(t)}),o.addEventListener("error",t=>{a(new Error(`Failed to load audio metadata: ${t.message}`))})})}var V={width:256,height:256,backgroundColor:"transparent",waveformColor:"black",pixelsPerSecond:100};async function A(e,i={}){let{width:a,height:o,backgroundColor:t,waveformColor:s,pixelsPerSecond:r}={...V,...i},m=new AudioContext,n=await e.arrayBuffer(),l=await m.decodeAudioData(n),d=l.duration,u=Math.max(a,Math.ceil(d*r)),f=l.sampleRate*d/u,g=document.createElement("canvas");g.width=a,g.height=o;let c=g.getContext("2d");c.fillStyle=t,c.fillRect(0,0,a,o);let D=l.getChannelData(0),y=o/2,_=l.length;c.strokeStyle=s,c.beginPath(),c.moveTo(0,y);for(let p=0;p<a;p++){let h=1,v=-1;for(let S=0;S<f;S++){let P=Math.floor(p*f+S);if(P<_){let x=D[P];x<h&&(h=x),x>v&&(v=x)}}let q=y-h*y,O=y-v*y;c.lineTo(p,O),c.lineTo(p,q)}return c.stroke(),new Promise((p,h)=>{g.toBlob(v=>{v?p(v):h(new Error("Canvas to Blob conversion failed"))})})}function w(e,i,a={}){let{ellipsis:o="...",preserveSentences:t=!1,minLength:s=0}=a;if(!e||e.length<=s||e.length<=i)return e;let r=i-o.length;if(t){let l=/[.!?](?:\s|$)/g,d,u=0;for(;(d=l.exec(e))!==null&&!(d.index>r);)u=d.index+1;if(u>0)return e.substring(0,u)+o}let m=e.substring(0,r),n=m.lastIndexOf(" ");return n>0&&(m=m.substring(0,n)),m+o}function k(e){return async({cesdk:i})=>K(i,e)}function K(e,i){let a=i.baseURL??"https://cdn.img.ly/assets/plugins/plugin-ai-audio-generation-web/v1/elevenlabs/",o="ly.img.ai/audio-generation/speech/elevenlabs",t=`${o}.voiceSelection`,s=j(e,a),r="elevenlabs/monolingual/v1";return e.setTranslations({en:{[`panel.${r}`]:"AI Voice",[`panel.${t}`]:"Select a Voice"}}),{id:r,kind:"audio",initialize:async()=>{e.ui.addAssetLibraryEntry({id:s,sourceIds:[s],gridColumns:3}),e.ui.registerPanel(t,({builder:n,payload:l})=>{n.Library(`${o}.voiceSelection.library`,{searchable:!0,entries:[s],onSelect:async d=>{let{id:u,label:b}=d;l?.onSelect(u,b??u,d.meta?.thumbUri),e.ui.closePanel(t)}})})},input:{panel:{type:"schema",document:C,inputReference:"#/components/schemas/ElevenlabsInput",useFlow:"generation-only",renderCustomProperty:{voice_id:n=>{let l=n.experimental.global("voice",{voiceId:"JBFqnCBsd6RMkjVDRZzb",name:"George",thumbnail:`${a}george.webp`});return n.builder.Button(`${o}.openVoiceSelection`,{inputLabel:"Voice",icon:"@imgly/Appearance",trailingIcon:"@imgly/ChevronRight",labelAlignment:"left",label:l.value.name,onClick:()=>{e.ui.openPanel(t,{payload:{id:l.value.voiceId,onSelect:(d,u,b)=>{l.setValue({voiceId:d,name:u,thumbnail:b})}}})}}),()=>({id:"voice_id",type:"string",value:l.value.voiceId})}},getBlockInput:async n=>({audio:{label:w(n.prompt,25)}})}},output:{abortable:!0,history:"@imgly/indexedDB",middleware:i.middleware,generate:async(n,{abortSignal:l})=>{let d=await F(n.prompt,n.voice_id,{speed:parseFloat(n.speed.toFixed(10))},i,l),u=URL.createObjectURL(d),[b,f]=await Promise.all([A(d,{width:512,height:128}),T(u)]),g=URL.createObjectURL(b);return{kind:"audio",url:u,duration:f,thumbnailUrl:g}}},config:i}}async function F(e,i,a,o,t){let s=`${o.proxyUrl}/v1/text-to-speech/${i}`,r=await fetch(s,{signal:t,method:"POST",headers:{Accept:"audio/mpeg","Content-Type":"application/json",...o.headers??{}},body:JSON.stringify({text:e,model_id:"eleven_multilingual_v2",voice_settings:{speed:I(a?.speed||1,.7,1.2),stability:a?.stability||.5,similarity_boost:a?.similarityBoost||.5}})});if(!r.ok){let m=await r.text();throw new Error(`API error: ${r.status} - ${m}`)}return r.blob()}function j(e,i){let{id:a,assets:o}=E;return e.engine.asset.addLocalSource(a),o.map(async t=>{e.engine.asset.addAssetToSource(a,{...t,meta:{...t.meta,thumbUri:t.meta.thumbUri.replace("{{base_url}}",`${i}thumbnails/`)}})}),a}var U={openapi:"3.0.0",info:{title:"Elevenlabs Sound Effects API",version:"1.0.0",description:"Elevenlabs Sound Effects API"},components:{schemas:{TextToSoundInput:{title:"TextToSoundInput",type:"object",properties:{text:{title:"Prompt",type:"string","x-imgly-builder":{component:"TextArea"}},duration_seconds:{title:"Duration (sec.)",type:"number",minimum:.6,maximum:22,default:2}},"x-elevenlabs-order-properties":["text"],required:["text"]}}}};function B(e){return async({cesdk:i})=>M(i,e)}function M(e,i){let a="elevenlabs/sound-generation";return e.setTranslations({en:{[`panel.${a}`]:"Generate Sound"}}),{id:a,kind:"audio",initialize:async()=>{},input:{panel:{type:"schema",document:U,inputReference:"#/components/schemas/TextToSoundInput",useFlow:"generation-only",getBlockInput:async t=>({audio:{label:w(t.text,25)}})}},output:{abortable:!0,history:"@imgly/indexedDB",middleware:i.middleware,generate:async(t,{abortSignal:s})=>{let r=await W(t.text,t.duration_seconds,i,s),m=URL.createObjectURL(r),[n,l]=await Promise.all([A(r,{width:512,height:128}),T(m)]),d=URL.createObjectURL(n);return{kind:"audio",url:m,duration:l,thumbnailUrl:d}}},config:i}}async function W(e,i,a,o){let t=`${a.proxyUrl}/v1/sound-generation`,s=await fetch(t,{signal:o,method:"POST",headers:{Accept:"audio/mpeg","Content-Type":"application/json",...a.headers??{}},body:JSON.stringify({text:e,duration_seconds:i})});if(!s.ok){let r=await s.text();throw new Error(`API error: ${s.status} - ${r}`)}return s.blob()}var z={ElevenMultilingualV2:k,ElevenSoundEffects:B},re=z;export{re as default};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/elevenlabs/ElevenMultilingualV2.json", "../../src/elevenlabs/ElevenMultilingualV2.voices.json", "../../src/elevenlabs/utils.ts", "../../src/elevenlabs/ElevenMultilingualV2.ts", "../../src/elevenlabs/ElevenSoundEffects.json", "../../src/elevenlabs/ElevenSoundEffects.ts", "../../src/elevenlabs/index.ts"],
4
- "sourcesContent": ["{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"Elevenlabs API\",\n \"version\": \"1.0.0\",\n \"description\": \"Elevenlabs API\"\n },\n \"components\": {\n \"schemas\": {\n \"ElevenlabsInput\": {\n \"title\": \"TextToSpeechInput\",\n \"type\": \"object\",\n \"properties\": {\n \"prompt\": {\n \"title\": \"Prompt\",\n \"type\": \"string\",\n \"x-imgly-builder\": {\n \"component\": \"TextArea\"\n }\n },\n \"voice_id\": {\n \"title\": \"Voice\",\n \"type\": \"string\",\n \"description\": \"The voice ID to use for the speech synthesis.\",\n \"default\": \"JBFqnCBsd6RMkjVDRZzb\"\n },\n \"speed\": {\n \"title\": \"Speed\",\n \"type\": \"number\",\n \"description\": \"The speed of the speech synthesis.\",\n \"default\": 1,\n \"x-imgly-step\": 0.05,\n \"minimum\": 0.7,\n \"maximum\": 1.2\n }\n },\n \"x-elevenlabs-order-properties\": [\"prompt\", \"style\", \"image_size\"],\n \"required\": [\"prompt\", \"voice_id\"]\n }\n }\n }\n}\n", "{\n \"version\": \"2.0.0\",\n \"id\": \"ly.img.voices.eleventlabs\",\n \"assets\": [\n {\n \"id\": \"JBFqnCBsd6RMkjVDRZzb\",\n \"label\": {\n \"en\": \"George\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"warm\", \"middle aged\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/e6206d1a-0721-4787-aafb-06a6e705cac5.mp3\",\n \"thumbUri\": \"{{base_url}}george.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.42\"\n }\n },\n {\n \"id\": \"FGY2WhTYpPnrIDTdsKH5\",\n \"label\": {\n \"en\": \"Laura\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"upbeat\", \"young\", \"female\", \"social media\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/FGY2WhTYpPnrIDTdsKH5/67341759-ad08-41a5-be6e-de12fe448618.mp3\",\n \"thumbUri\": \"{{base_url}}laura.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.04\"\n }\n },\n {\n \"id\": \"IKne3meq5aSn9XLyUdCD\",\n \"label\": {\n \"en\": \"Charlie\"\n },\n \"tags\": {\n \"en\": [\n \"Australian Accent\",\n \"natural\",\n \"middle aged\",\n \"male\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/102de6f2-22ed-43e0-a1f1-111fa75c5481.mp3\",\n \"thumbUri\": \"{{base_url}}charlie.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.53\"\n }\n },\n {\n \"id\": \"9BWtsMINqrJLrRacOk9x\",\n \"label\": {\n \"en\": \"Aria\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"expressive\",\n \"middle-aged\",\n \"female\",\n \"social media\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/405766b8-1f4e-4d3c-aba1-6f25333823ec.mp3\",\n \"thumbUri\": \"{{base_url}}aria.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.71\"\n }\n },\n {\n \"id\": \"EXAVITQu4vr4xnSDxMaL\",\n \"label\": {\n \"en\": \"Sarah\"\n },\n \"tags\": {\n \"en\": [\"american Accent\", \"soft\", \"young\", \"female\", \"news\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/01a3e33c-6e99-4ee7-8543-ff2216a32186.mp3\",\n \"thumbUri\": \"{{base_url}}sarah2.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.53\"\n }\n },\n {\n \"id\": \"SAz9YHcvj6GT2YYXdXww\",\n \"label\": {\n \"en\": \"River\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"confident\",\n \"middle-aged\",\n \"non-binary\",\n \"social media\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/SAz9YHcvj6GT2YYXdXww/e6c95f0b-2227-491a-b3d7-2249240decb7.mp3\",\n \"thumbUri\": \"{{base_url}}river.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.53\"\n }\n },\n {\n \"id\": \"XrExE9yKIg1WjnnlVkGX\",\n \"label\": {\n \"en\": \"Matilda\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"friendly\",\n \"middle-aged\",\n \"female\",\n \"narration\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/b930e18d-6b4d-466e-bab2-0ae97c6d8535.mp3\",\n \"thumbUri\": \"{{base_url}}matilda.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.64\"\n }\n },\n {\n \"id\": \"N2lVS1w4EtoT3dr4eOWO\",\n \"label\": {\n \"en\": \"Callum\"\n },\n \"tags\": {\n \"en\": [\n \"Transatlantic Accent\",\n \"intense\",\n \"middle-aged\",\n \"male\",\n \"characters\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/ac833bd8-ffda-4938-9ebc-b0f99ca25481.mp3\",\n \"thumbUri\": \"{{base_url}}callum.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"4.18\"\n }\n },\n {\n \"id\": \"TX3LPaxmHKxFdv7VOQHJ\",\n \"label\": {\n \"en\": \"Liam\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"articulate\", \"young\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/63148076-6363-42db-aea8-31424308b92c.mp3\",\n \"thumbUri\": \"{{base_url}}liam.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"4.13\"\n }\n },\n {\n \"id\": \"XB0fDUnXU5powFXDhCwa\",\n \"label\": {\n \"en\": \"Charlotte\"\n },\n \"tags\": {\n \"en\": [\"Swedish Accent\", \"seductive\", \"young\", \"female\", \"characters\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/XB0fDUnXU5powFXDhCwa/942356dc-f10d-4d89-bda5-4f8505ee038b.mp3\",\n \"thumbUri\": \"{{base_url}}charlotte.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.25\"\n }\n },\n {\n \"id\": \"CwhRBWXzGAHq8TQ4Fs17\",\n \"label\": {\n \"en\": \"Roger\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"confident\",\n \"middle-aged\",\n \"male\",\n \"social media\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/CwhRBWXzGAHq8TQ4Fs17/58ee3ff5-f6f2-4628-93b8-e38eb31806b0.mp3\",\n \"thumbUri\": \"{{base_url}}roger.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.89\"\n }\n },\n {\n \"id\": \"nPczCjzI2devNBz1zQrb\",\n \"label\": {\n \"en\": \"Brian\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"deep\", \"middle-aged\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/nPczCjzI2devNBz1zQrb/2dd3e72c-4fd3-42f1-93ea-abc5d4e5aa1d.mp3\",\n \"thumbUri\": \"{{base_url}}brian.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.46\"\n }\n },\n {\n \"id\": \"cgSgspJ2msm6clMCkdW9\",\n \"label\": {\n \"en\": \"Jessica\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"expressive\",\n \"young\",\n \"female\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cgSgspJ2msm6clMCkdW9/56a97bf8-b69b-448f-846c-c3a11683d45a.mp3\",\n \"thumbUri\": \"{{base_url}}jessica.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.89\"\n }\n },\n {\n \"id\": \"Xb7hH8MSUJpSbSDYk0k2\",\n \"label\": {\n \"en\": \"Alice\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"confident\", \"middle-aged\", \"female\", \"news\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/Xb7hH8MSUJpSbSDYk0k2/d10f7534-11f6-41fe-a012-2de1e482d336.mp3\",\n \"thumbUri\": \"{{base_url}}alice.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.53\"\n }\n },\n {\n \"id\": \"pFZP5JQG7iQjIQuC4Bku\",\n \"label\": {\n \"en\": \"Lily\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"warm\", \"middle-aged\", \"female\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pFZP5JQG7iQjIQuC4Bku/89b68b35-b3dd-4348-a84a-a3c13a3c2b30.mp3\",\n \"thumbUri\": \"{{base_url}}lily.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.11\"\n }\n },\n {\n \"id\": \"cjVigY5qzO86Huf0OWal\",\n \"label\": {\n \"en\": \"Eric\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"friendly\",\n \"middle-aged\",\n \"male\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cjVigY5qzO86Huf0OWal/d098fda0-6456-4030-b3d8-63aa048c9070.mp3\",\n \"thumbUri\": \"{{base_url}}eric.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.32\"\n }\n },\n {\n \"id\": \"bIHbv24MWmeRgasZH58o\",\n \"label\": {\n \"en\": \"Will\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"friendly\", \"young\", \"male\", \"social media\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/bIHbv24MWmeRgasZH58o/8caf8f3d-ad29-4980-af41-53f20c72d7a4.mp3\",\n \"thumbUri\": \"{{base_url}}will.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.74\"\n }\n },\n {\n \"id\": \"iP95p4xoKVk53GoZ742B\",\n \"label\": {\n \"en\": \"Chris\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"casual\",\n \"middle-aged\",\n \"male\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/iP95p4xoKVk53GoZ742B/3f4bde72-cc48-40dd-829f-57fbf906f4d7.mp3\",\n \"thumbUri\": \"{{base_url}}chris.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.29\"\n }\n },\n {\n \"id\": \"pqHfZKP75CvOlQylNhV4\",\n \"label\": {\n \"en\": \"Bill\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"trustworthy\", \"old\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pqHfZKP75CvOlQylNhV4/d782b3ff-84ba-4029-848c-acf01285524d.mp3\",\n \"thumbUri\": \"{{base_url}}bill.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.51\"\n }\n },\n {\n \"id\": \"onwK4e9ZLuTAKqWW03F9\",\n \"label\": {\n \"en\": \"Daniel\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"authoritative\", \"middle-aged\", \"male\", \"news\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/7eee0236-1a72-4b86-b303-5dcadc007ba9.mp3\",\n \"thumbUri\": \"{{base_url}}daniel.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.75\"\n }\n }\n ]\n}\n", "/**\n * Clamps a value between a minimum and maximum value\n * @param {number} value - The value to clamp\n * @param {number} min - The minimum allowed value\n * @param {number} max - The maximum allowed value\n * @returns {number} The clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Returns the duration of an audio blob in seconds\n * @param audioBlob - The audio blob to get the duration from\n * @returns A promise that resolves to the duration in seconds\n */\nexport async function getAudioDuration(audioUrl: string): Promise<number> {\n return new Promise((resolve, reject) => {\n // Create an audio element\n const audio = new Audio();\n\n // Set the audio source to the blob URL\n audio.src = audioUrl;\n\n // Listen for the metadata to load\n audio.addEventListener('loadedmetadata', () => {\n // Get the duration\n const duration = audio.duration;\n\n // Revoke the URL to free memory\n\n // Resolve with the duration\n resolve(duration);\n });\n\n // Handle errors\n audio.addEventListener('error', (error) => {\n // Revoke the URL to free memory\n\n // Reject with the error\n reject(new Error(`Failed to load audio metadata: ${error.message}`));\n });\n });\n}\n\nconst DEFAULT_OPTIONS = {\n width: 256,\n height: 256,\n backgroundColor: 'transparent',\n waveformColor: 'black',\n pixelsPerSecond: 100\n};\n\nexport async function createThumbnailFromAudio(\n audio: Blob,\n options: Partial<typeof DEFAULT_OPTIONS> = {}\n): Promise<Blob> {\n const { width, height, backgroundColor, waveformColor, pixelsPerSecond } = {\n ...DEFAULT_OPTIONS,\n ...options\n };\n\n // Create an AudioContext to decode the audio\n const audioContext = new AudioContext();\n const data = await audio.arrayBuffer();\n const audioBuffer = await audioContext.decodeAudioData(data);\n\n // Calculate effective width of the waveform\n const totalDuration = audioBuffer.duration;\n const effectiveWidth = Math.max(\n width,\n Math.ceil(totalDuration * pixelsPerSecond)\n );\n const sampleRate = audioBuffer.sampleRate;\n const samplesPerPixel = (sampleRate * totalDuration) / effectiveWidth;\n\n // Create a canvas element\n const canvas = document.createElement('canvas');\n canvas.width = width; // Use the provided width for the canvas\n canvas.height = height;\n const context = canvas.getContext('2d')!;\n\n // Draw background\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, width, height);\n\n // Draw the waveform\n const dataArray = audioBuffer.getChannelData(0); // Use the first channel\n const amp = height / 2;\n const numSamples = audioBuffer.length;\n\n context.strokeStyle = waveformColor;\n context.beginPath();\n context.moveTo(0, amp);\n\n for (let i = 0; i < width; i++) {\n let min = 1.0;\n let max = -1.0;\n for (let j = 0; j < samplesPerPixel; j++) {\n const index = Math.floor(i * samplesPerPixel + j);\n if (index < numSamples) {\n const datum = dataArray[index];\n if (datum < min) min = datum;\n if (datum > max) max = datum;\n }\n }\n const yLow = amp - min * amp;\n const yHigh = amp - max * amp;\n context.lineTo(i, yHigh);\n context.lineTo(i, yLow);\n }\n\n context.stroke();\n\n // Convert canvas to a blob\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error('Canvas to Blob conversion failed'));\n }\n });\n });\n}\n\n/**\n * Smartly truncates text to a specified length while preserving word boundaries\n * and adding an ellipsis to indicate truncation.\n *\n * @param {string} text - The text to truncate\n * @param {number} maxLength - Maximum length of the truncated text (including ellipsis)\n * @param {Object} options - Optional configuration\n * @param {string} options.ellipsis - The ellipsis string (default: '...')\n * @param {boolean} options.preserveSentences - Try to truncate at sentence boundaries (default: false)\n * @param {number} options.minLength - Minimum length before truncation (default: 0)\n * @return {string} The truncated text with ellipsis if truncated\n */\nexport function truncate(\n text: string,\n maxLength: number,\n options: {\n ellipsis?: string;\n preserveSentences?: boolean;\n minLength?: number;\n } = {}\n): string {\n // Default options\n const {\n ellipsis = '...',\n preserveSentences = false,\n minLength = 0\n } = options;\n\n // Return original text if it's shorter than minLength or maxLength\n if (!text || text.length <= minLength || text.length <= maxLength) {\n return text;\n }\n\n // Calculate maximum content length (accounting for ellipsis)\n const maxContentLength = maxLength - ellipsis.length;\n\n // If preserving sentences is enabled, try to find a sentence boundary\n if (preserveSentences) {\n // Common sentence ending patterns\n const sentenceEndings = /[.!?](?:\\s|$)/g;\n let match;\n let lastValidEnd = 0;\n\n // Find the last sentence ending within maxContentLength\n // eslint-disable-next-line no-cond-assign\n while ((match = sentenceEndings.exec(text)) !== null) {\n if (match.index > maxContentLength) break;\n lastValidEnd = match.index + 1; // Include the punctuation\n }\n\n // If we found a sentence ending, use it\n if (lastValidEnd > 0) {\n return text.substring(0, lastValidEnd) + ellipsis;\n }\n }\n\n // Otherwise, truncate at word boundary\n let truncatedText = text.substring(0, maxContentLength);\n\n // Find the last space to avoid cutting words in half\n const lastSpace = truncatedText.lastIndexOf(' ');\n\n if (lastSpace > 0) {\n truncatedText = truncatedText.substring(0, lastSpace);\n }\n\n return truncatedText + ellipsis;\n}\n", "import {\n type Provider,\n type AudioOutput,\n Middleware\n} from '@imgly/plugin-ai-generation-web';\nimport CreativeEditorSDK from '@cesdk/cesdk-js';\nimport schema from './ElevenMultilingualV2.json';\nimport voices from './ElevenMultilingualV2.voices.json';\nimport {\n clamp,\n getAudioDuration,\n createThumbnailFromAudio,\n truncate\n} from './utils';\n\ntype ElevenlabsInput = {\n prompt: string;\n voice_id: string;\n speed: number;\n};\n\ntype ProviderConfiguration = {\n proxyUrl: string;\n debug?: boolean;\n middleware?: Middleware<ElevenlabsInput, AudioOutput>[];\n\n /**\n * Base URL used for the UI assets used in the plugin.\n *\n * By default, we load the assets from the IMG.LY CDN You can copy the assets.\n * from the `/assets` folder to your own server and set the base URL to your server.\n */\n baseURL?: string;\n};\n\nexport function ElevenMultilingualV2(\n config: ProviderConfiguration\n): (context: {\n cesdk: CreativeEditorSDK;\n}) => Promise<Provider<'audio', ElevenlabsInput, AudioOutput>> {\n return async ({ cesdk }: { cesdk: CreativeEditorSDK }) => {\n return getProvider(cesdk, config);\n };\n}\n\nfunction getProvider(\n cesdk: CreativeEditorSDK,\n config: ProviderConfiguration\n): Provider<'audio', ElevenlabsInput, AudioOutput> {\n const baseURL =\n config.baseURL ??\n 'https://cdn.img.ly/assets/plugins/plugin-ai-audio-generation-web/v1/elevenlabs/';\n\n const prefix = 'ly.img.ai/audio-generation/speech/elevenlabs';\n const voiceSelectionPanelId = `${prefix}.voiceSelection`;\n const voiceAssetSourceId = createVoicesAssetSource(cesdk, baseURL);\n const modelKey = 'elevenlabs/monolingual/v1';\n\n cesdk.setTranslations({\n en: {\n [`panel.${modelKey}`]: 'AI Voice',\n [`panel.${voiceSelectionPanelId}`]: 'Select a Voice'\n }\n });\n\n const provider: Provider<'audio', ElevenlabsInput, AudioOutput> = {\n id: modelKey,\n kind: 'audio',\n initialize: async () => {\n cesdk.ui.addAssetLibraryEntry({\n id: voiceAssetSourceId,\n sourceIds: [voiceAssetSourceId],\n gridColumns: 3\n });\n\n cesdk.ui.registerPanel<{\n id: string;\n onSelect: (voiceId: string, name: string, thumbnail?: string) => void;\n }>(voiceSelectionPanelId, ({ builder, payload }) => {\n builder.Library(`${prefix}.voiceSelection.library`, {\n searchable: true,\n entries: [voiceAssetSourceId],\n onSelect: async (entry) => {\n const { id, label } = entry;\n payload?.onSelect(\n id,\n label ?? id,\n entry.meta?.thumbUri as string | undefined\n );\n cesdk.ui.closePanel(voiceSelectionPanelId);\n }\n });\n });\n },\n input: {\n panel: {\n type: 'schema',\n // @ts-ignore\n document: schema,\n inputReference: '#/components/schemas/ElevenlabsInput',\n useFlow: 'generation-only',\n\n renderCustomProperty: {\n voice_id: (context) => {\n const voiceState = context.experimental.global<{\n voiceId: string;\n name: string;\n thumbnail?: string;\n }>('voice', {\n voiceId: 'JBFqnCBsd6RMkjVDRZzb',\n name: 'George',\n thumbnail: `${baseURL}george.webp`\n });\n\n context.builder.Button(`${prefix}.openVoiceSelection`, {\n inputLabel: 'Voice',\n icon: '@imgly/Appearance',\n trailingIcon: '@imgly/ChevronRight',\n labelAlignment: 'left',\n label: voiceState.value.name,\n onClick: () => {\n cesdk.ui.openPanel(voiceSelectionPanelId, {\n payload: {\n id: voiceState.value.voiceId,\n onSelect: (\n voiceId: string,\n name: string,\n thumbnail?: string\n ) => {\n voiceState.setValue({ voiceId, name, thumbnail });\n }\n }\n });\n }\n });\n\n return () => {\n return {\n id: 'voice_id',\n type: 'string',\n value: voiceState.value.voiceId\n };\n };\n }\n },\n\n getBlockInput: async (input) => {\n // Thumbnail and duration needs to be determined from the\n // audio output.\n return {\n audio: {\n label: truncate(input.prompt, 25)\n }\n };\n }\n }\n },\n output: {\n abortable: true,\n history: '@imgly/indexedDB',\n middleware: config.middleware,\n generate: async (\n input: ElevenlabsInput,\n { abortSignal }: { abortSignal?: AbortSignal }\n ) => {\n const audioBlob = await generateSpeech(\n input.prompt,\n input.voice_id,\n {\n speed: parseFloat(input.speed.toFixed(10))\n },\n config,\n abortSignal\n );\n\n // TODO: Use upload!\n const audioUrl = URL.createObjectURL(audioBlob);\n\n const [thumbnailBlob, audioDuration] = await Promise.all([\n createThumbnailFromAudio(audioBlob, { width: 512, height: 128 }),\n getAudioDuration(audioUrl)\n ]);\n\n const thumbnailUrl = URL.createObjectURL(thumbnailBlob);\n\n return {\n kind: 'audio',\n url: audioUrl,\n duration: audioDuration,\n thumbnailUrl\n };\n }\n },\n config\n };\n\n return provider;\n}\n\n// Function to generate speech using ElevenLabs API\nexport async function generateSpeech(\n text: string,\n voiceId: string,\n options: {\n stability?: number;\n speed?: number;\n similarityBoost?: number;\n },\n config: ProviderConfiguration,\n abortSignal?: AbortSignal\n) {\n const url = `${config.proxyUrl}/v1/text-to-speech/${voiceId}`;\n\n const response = await fetch(url, {\n signal: abortSignal,\n method: 'POST',\n headers: {\n Accept: 'audio/mpeg',\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n text,\n model_id: 'eleven_multilingual_v2',\n voice_settings: {\n speed: clamp(options?.speed || 1, 0.7, 1.2),\n stability: options?.stability || 0.5,\n similarity_boost: options?.similarityBoost || 0.5\n }\n })\n });\n\n if (!response.ok) {\n const errorData = await response.text();\n throw new Error(`API error: ${response.status} - ${errorData}`);\n }\n\n return response.blob();\n}\n\nfunction createVoicesAssetSource(\n cesdk: CreativeEditorSDK,\n baseURL: string\n): string {\n const { id, assets } = voices;\n cesdk.engine.asset.addLocalSource(id);\n assets.map(async (asset) => {\n cesdk.engine.asset.addAssetToSource(id, {\n ...asset,\n meta: {\n ...asset.meta,\n thumbUri: asset.meta.thumbUri.replace(\n '{{base_url}}',\n `${baseURL}thumbnails/`\n )\n }\n });\n });\n return id;\n}\nexport default getProvider;\n", "{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"Elevenlabs Sound Effects API\",\n \"version\": \"1.0.0\",\n \"description\": \"Elevenlabs Sound Effects API\"\n },\n \"components\": {\n \"schemas\": {\n \"TextToSoundInput\": {\n \"title\": \"TextToSoundInput\",\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"title\": \"Prompt\",\n \"type\": \"string\",\n \"x-imgly-builder\": {\n \"component\": \"TextArea\"\n }\n },\n \"duration_seconds\": {\n \"title\": \"Duration (sec.)\",\n \"type\": \"number\",\n \"minimum\": 0.6,\n \"maximum\": 22,\n \"default\": 2\n }\n },\n \"x-elevenlabs-order-properties\": [\"text\"],\n \"required\": [\"text\"]\n }\n }\n }\n}\n", "import {\n type Provider,\n type AudioOutput,\n Middleware\n} from '@imgly/plugin-ai-generation-web';\nimport CreativeEditorSDK from '@cesdk/cesdk-js';\nimport schema from './ElevenSoundEffects.json';\nimport { getAudioDuration, createThumbnailFromAudio, truncate } from './utils';\n\ntype ElevenlabsInput = {\n text: string;\n duration_seconds: number;\n};\n\ntype ProviderConfiguration = {\n proxyUrl: string;\n debug?: boolean;\n middleware?: Middleware<ElevenlabsInput, AudioOutput>[];\n};\n\nexport function ElevenSoundEffects(\n config: ProviderConfiguration\n): (context: {\n cesdk: CreativeEditorSDK;\n}) => Promise<Provider<'audio', ElevenlabsInput, AudioOutput>> {\n return async ({ cesdk }: { cesdk: CreativeEditorSDK }) => {\n return getProvider(cesdk, config);\n };\n}\n\nfunction getProvider(\n cesdk: CreativeEditorSDK,\n config: ProviderConfiguration\n): Provider<'audio', ElevenlabsInput, AudioOutput> {\n const modelKey = 'elevenlabs/sound-generation';\n\n cesdk.setTranslations({\n en: {\n [`panel.${modelKey}`]: 'Generate Sound'\n }\n });\n\n const provider: Provider<'audio', ElevenlabsInput, AudioOutput> = {\n id: modelKey,\n kind: 'audio',\n initialize: async () => {},\n input: {\n panel: {\n type: 'schema',\n // @ts-ignore\n document: schema,\n inputReference: '#/components/schemas/TextToSoundInput',\n useFlow: 'generation-only',\n\n getBlockInput: async (input) => {\n // Thumbnail and duration needs to be determined from the\n // audio output.\n return {\n audio: {\n label: truncate(input.text, 25)\n }\n };\n }\n }\n },\n output: {\n abortable: true,\n history: '@imgly/indexedDB',\n middleware: config.middleware,\n generate: async (\n input: ElevenlabsInput,\n { abortSignal }: { abortSignal?: AbortSignal }\n ) => {\n const audioBlob = await generateSound(\n input.text,\n input.duration_seconds,\n config,\n abortSignal\n );\n\n // TODO: Use upload!\n const audioUrl = URL.createObjectURL(audioBlob);\n\n const [thumbnailBlob, audioDuration] = await Promise.all([\n createThumbnailFromAudio(audioBlob, { width: 512, height: 128 }),\n getAudioDuration(audioUrl)\n ]);\n\n const thumbnailUrl = URL.createObjectURL(thumbnailBlob);\n\n return {\n kind: 'audio',\n url: audioUrl,\n duration: audioDuration,\n thumbnailUrl\n };\n }\n },\n config\n };\n\n return provider;\n}\n\n// Function to generate speech using ElevenLabs API\nexport async function generateSound(\n text: string,\n duration: number | null,\n config: ProviderConfiguration,\n abortSignal?: AbortSignal\n) {\n const url = `${config.proxyUrl}/v1/sound-generation`;\n\n const response = await fetch(url, {\n signal: abortSignal,\n method: 'POST',\n headers: {\n Accept: 'audio/mpeg',\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n text,\n duration_seconds: duration\n })\n });\n\n if (!response.ok) {\n const errorData = await response.text();\n throw new Error(`API error: ${response.status} - ${errorData}`);\n }\n\n return response.blob();\n}\n\nexport default getProvider;\n", "import { ElevenMultilingualV2 } from './ElevenMultilingualV2';\nimport { ElevenSoundEffects } from './ElevenSoundEffects';\n\nconst Elevenlabs = {\n ElevenMultilingualV2,\n ElevenSoundEffects\n};\n\nexport default Elevenlabs;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"Elevenlabs API\",\n \"version\": \"1.0.0\",\n \"description\": \"Elevenlabs API\"\n },\n \"components\": {\n \"schemas\": {\n \"ElevenlabsInput\": {\n \"title\": \"TextToSpeechInput\",\n \"type\": \"object\",\n \"properties\": {\n \"prompt\": {\n \"title\": \"Prompt\",\n \"type\": \"string\",\n \"x-imgly-builder\": {\n \"component\": \"TextArea\"\n }\n },\n \"voice_id\": {\n \"title\": \"Voice\",\n \"type\": \"string\",\n \"description\": \"The voice ID to use for the speech synthesis.\",\n \"default\": \"JBFqnCBsd6RMkjVDRZzb\"\n },\n \"speed\": {\n \"title\": \"Speed\",\n \"type\": \"number\",\n \"description\": \"The speed of the speech synthesis.\",\n \"default\": 1,\n \"x-imgly-step\": 0.05,\n \"minimum\": 0.7,\n \"maximum\": 1.2\n }\n },\n \"x-elevenlabs-order-properties\": [\"prompt\", \"style\", \"image_size\"],\n \"required\": [\"prompt\", \"voice_id\"]\n }\n }\n }\n}\n", "{\n \"version\": \"2.0.0\",\n \"id\": \"ly.img.voices.eleventlabs\",\n \"assets\": [\n {\n \"id\": \"JBFqnCBsd6RMkjVDRZzb\",\n \"label\": {\n \"en\": \"George\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"warm\", \"middle aged\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/e6206d1a-0721-4787-aafb-06a6e705cac5.mp3\",\n \"thumbUri\": \"{{base_url}}george.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.42\"\n }\n },\n {\n \"id\": \"FGY2WhTYpPnrIDTdsKH5\",\n \"label\": {\n \"en\": \"Laura\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"upbeat\", \"young\", \"female\", \"social media\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/FGY2WhTYpPnrIDTdsKH5/67341759-ad08-41a5-be6e-de12fe448618.mp3\",\n \"thumbUri\": \"{{base_url}}laura.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.04\"\n }\n },\n {\n \"id\": \"IKne3meq5aSn9XLyUdCD\",\n \"label\": {\n \"en\": \"Charlie\"\n },\n \"tags\": {\n \"en\": [\n \"Australian Accent\",\n \"natural\",\n \"middle aged\",\n \"male\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/102de6f2-22ed-43e0-a1f1-111fa75c5481.mp3\",\n \"thumbUri\": \"{{base_url}}charlie.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.53\"\n }\n },\n {\n \"id\": \"9BWtsMINqrJLrRacOk9x\",\n \"label\": {\n \"en\": \"Aria\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"expressive\",\n \"middle-aged\",\n \"female\",\n \"social media\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/405766b8-1f4e-4d3c-aba1-6f25333823ec.mp3\",\n \"thumbUri\": \"{{base_url}}aria.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.71\"\n }\n },\n {\n \"id\": \"EXAVITQu4vr4xnSDxMaL\",\n \"label\": {\n \"en\": \"Sarah\"\n },\n \"tags\": {\n \"en\": [\"american Accent\", \"soft\", \"young\", \"female\", \"news\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/01a3e33c-6e99-4ee7-8543-ff2216a32186.mp3\",\n \"thumbUri\": \"{{base_url}}sarah2.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.53\"\n }\n },\n {\n \"id\": \"SAz9YHcvj6GT2YYXdXww\",\n \"label\": {\n \"en\": \"River\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"confident\",\n \"middle-aged\",\n \"non-binary\",\n \"social media\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/SAz9YHcvj6GT2YYXdXww/e6c95f0b-2227-491a-b3d7-2249240decb7.mp3\",\n \"thumbUri\": \"{{base_url}}river.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.53\"\n }\n },\n {\n \"id\": \"XrExE9yKIg1WjnnlVkGX\",\n \"label\": {\n \"en\": \"Matilda\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"friendly\",\n \"middle-aged\",\n \"female\",\n \"narration\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/b930e18d-6b4d-466e-bab2-0ae97c6d8535.mp3\",\n \"thumbUri\": \"{{base_url}}matilda.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.64\"\n }\n },\n {\n \"id\": \"N2lVS1w4EtoT3dr4eOWO\",\n \"label\": {\n \"en\": \"Callum\"\n },\n \"tags\": {\n \"en\": [\n \"Transatlantic Accent\",\n \"intense\",\n \"middle-aged\",\n \"male\",\n \"characters\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/ac833bd8-ffda-4938-9ebc-b0f99ca25481.mp3\",\n \"thumbUri\": \"{{base_url}}callum.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"4.18\"\n }\n },\n {\n \"id\": \"TX3LPaxmHKxFdv7VOQHJ\",\n \"label\": {\n \"en\": \"Liam\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"articulate\", \"young\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/63148076-6363-42db-aea8-31424308b92c.mp3\",\n \"thumbUri\": \"{{base_url}}liam.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"4.13\"\n }\n },\n {\n \"id\": \"XB0fDUnXU5powFXDhCwa\",\n \"label\": {\n \"en\": \"Charlotte\"\n },\n \"tags\": {\n \"en\": [\"Swedish Accent\", \"seductive\", \"young\", \"female\", \"characters\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/XB0fDUnXU5powFXDhCwa/942356dc-f10d-4d89-bda5-4f8505ee038b.mp3\",\n \"thumbUri\": \"{{base_url}}charlotte.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.25\"\n }\n },\n {\n \"id\": \"CwhRBWXzGAHq8TQ4Fs17\",\n \"label\": {\n \"en\": \"Roger\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"confident\",\n \"middle-aged\",\n \"male\",\n \"social media\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/CwhRBWXzGAHq8TQ4Fs17/58ee3ff5-f6f2-4628-93b8-e38eb31806b0.mp3\",\n \"thumbUri\": \"{{base_url}}roger.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.89\"\n }\n },\n {\n \"id\": \"nPczCjzI2devNBz1zQrb\",\n \"label\": {\n \"en\": \"Brian\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"deep\", \"middle-aged\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/nPczCjzI2devNBz1zQrb/2dd3e72c-4fd3-42f1-93ea-abc5d4e5aa1d.mp3\",\n \"thumbUri\": \"{{base_url}}brian.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.46\"\n }\n },\n {\n \"id\": \"cgSgspJ2msm6clMCkdW9\",\n \"label\": {\n \"en\": \"Jessica\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"expressive\",\n \"young\",\n \"female\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cgSgspJ2msm6clMCkdW9/56a97bf8-b69b-448f-846c-c3a11683d45a.mp3\",\n \"thumbUri\": \"{{base_url}}jessica.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.89\"\n }\n },\n {\n \"id\": \"Xb7hH8MSUJpSbSDYk0k2\",\n \"label\": {\n \"en\": \"Alice\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"confident\", \"middle-aged\", \"female\", \"news\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/Xb7hH8MSUJpSbSDYk0k2/d10f7534-11f6-41fe-a012-2de1e482d336.mp3\",\n \"thumbUri\": \"{{base_url}}alice.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.53\"\n }\n },\n {\n \"id\": \"pFZP5JQG7iQjIQuC4Bku\",\n \"label\": {\n \"en\": \"Lily\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"warm\", \"middle-aged\", \"female\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pFZP5JQG7iQjIQuC4Bku/89b68b35-b3dd-4348-a84a-a3c13a3c2b30.mp3\",\n \"thumbUri\": \"{{base_url}}lily.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.11\"\n }\n },\n {\n \"id\": \"cjVigY5qzO86Huf0OWal\",\n \"label\": {\n \"en\": \"Eric\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"friendly\",\n \"middle-aged\",\n \"male\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cjVigY5qzO86Huf0OWal/d098fda0-6456-4030-b3d8-63aa048c9070.mp3\",\n \"thumbUri\": \"{{base_url}}eric.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.32\"\n }\n },\n {\n \"id\": \"bIHbv24MWmeRgasZH58o\",\n \"label\": {\n \"en\": \"Will\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"friendly\", \"young\", \"male\", \"social media\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/bIHbv24MWmeRgasZH58o/8caf8f3d-ad29-4980-af41-53f20c72d7a4.mp3\",\n \"thumbUri\": \"{{base_url}}will.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"2.74\"\n }\n },\n {\n \"id\": \"iP95p4xoKVk53GoZ742B\",\n \"label\": {\n \"en\": \"Chris\"\n },\n \"tags\": {\n \"en\": [\n \"American Accent\",\n \"casual\",\n \"middle-aged\",\n \"male\",\n \"conversational\"\n ]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/iP95p4xoKVk53GoZ742B/3f4bde72-cc48-40dd-829f-57fbf906f4d7.mp3\",\n \"thumbUri\": \"{{base_url}}chris.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"3.29\"\n }\n },\n {\n \"id\": \"pqHfZKP75CvOlQylNhV4\",\n \"label\": {\n \"en\": \"Bill\"\n },\n \"tags\": {\n \"en\": [\"American Accent\", \"trustworthy\", \"old\", \"male\", \"narration\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pqHfZKP75CvOlQylNhV4/d782b3ff-84ba-4029-848c-acf01285524d.mp3\",\n \"thumbUri\": \"{{base_url}}bill.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.51\"\n }\n },\n {\n \"id\": \"onwK4e9ZLuTAKqWW03F9\",\n \"label\": {\n \"en\": \"Daniel\"\n },\n \"tags\": {\n \"en\": [\"British Accent\", \"authoritative\", \"middle-aged\", \"male\", \"news\"]\n },\n \"meta\": {\n \"uri\": \"https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/7eee0236-1a72-4b86-b303-5dcadc007ba9.mp3\",\n \"thumbUri\": \"{{base_url}}daniel.webp\",\n \"blockType\": \"//ly.img.ubq/audio\",\n \"mimeType\": \"audio/x-m4a\",\n \"duration\": \"5.75\"\n }\n }\n ]\n}\n", "/**\n * Clamps a value between a minimum and maximum value\n * @param {number} value - The value to clamp\n * @param {number} min - The minimum allowed value\n * @param {number} max - The maximum allowed value\n * @returns {number} The clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Returns the duration of an audio blob in seconds\n * @param audioBlob - The audio blob to get the duration from\n * @returns A promise that resolves to the duration in seconds\n */\nexport async function getAudioDuration(audioUrl: string): Promise<number> {\n return new Promise((resolve, reject) => {\n // Create an audio element\n const audio = new Audio();\n\n // Set the audio source to the blob URL\n audio.src = audioUrl;\n\n // Listen for the metadata to load\n audio.addEventListener('loadedmetadata', () => {\n // Get the duration\n const duration = audio.duration;\n\n // Revoke the URL to free memory\n\n // Resolve with the duration\n resolve(duration);\n });\n\n // Handle errors\n audio.addEventListener('error', (error) => {\n // Revoke the URL to free memory\n\n // Reject with the error\n reject(new Error(`Failed to load audio metadata: ${error.message}`));\n });\n });\n}\n\nconst DEFAULT_OPTIONS = {\n width: 256,\n height: 256,\n backgroundColor: 'transparent',\n waveformColor: 'black',\n pixelsPerSecond: 100\n};\n\nexport async function createThumbnailFromAudio(\n audio: Blob,\n options: Partial<typeof DEFAULT_OPTIONS> = {}\n): Promise<Blob> {\n const { width, height, backgroundColor, waveformColor, pixelsPerSecond } = {\n ...DEFAULT_OPTIONS,\n ...options\n };\n\n // Create an AudioContext to decode the audio\n const audioContext = new AudioContext();\n const data = await audio.arrayBuffer();\n const audioBuffer = await audioContext.decodeAudioData(data);\n\n // Calculate effective width of the waveform\n const totalDuration = audioBuffer.duration;\n const effectiveWidth = Math.max(\n width,\n Math.ceil(totalDuration * pixelsPerSecond)\n );\n const sampleRate = audioBuffer.sampleRate;\n const samplesPerPixel = (sampleRate * totalDuration) / effectiveWidth;\n\n // Create a canvas element\n const canvas = document.createElement('canvas');\n canvas.width = width; // Use the provided width for the canvas\n canvas.height = height;\n const context = canvas.getContext('2d')!;\n\n // Draw background\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, width, height);\n\n // Draw the waveform\n const dataArray = audioBuffer.getChannelData(0); // Use the first channel\n const amp = height / 2;\n const numSamples = audioBuffer.length;\n\n context.strokeStyle = waveformColor;\n context.beginPath();\n context.moveTo(0, amp);\n\n for (let i = 0; i < width; i++) {\n let min = 1.0;\n let max = -1.0;\n for (let j = 0; j < samplesPerPixel; j++) {\n const index = Math.floor(i * samplesPerPixel + j);\n if (index < numSamples) {\n const datum = dataArray[index];\n if (datum < min) min = datum;\n if (datum > max) max = datum;\n }\n }\n const yLow = amp - min * amp;\n const yHigh = amp - max * amp;\n context.lineTo(i, yHigh);\n context.lineTo(i, yLow);\n }\n\n context.stroke();\n\n // Convert canvas to a blob\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error('Canvas to Blob conversion failed'));\n }\n });\n });\n}\n\n/**\n * Smartly truncates text to a specified length while preserving word boundaries\n * and adding an ellipsis to indicate truncation.\n *\n * @param {string} text - The text to truncate\n * @param {number} maxLength - Maximum length of the truncated text (including ellipsis)\n * @param {Object} options - Optional configuration\n * @param {string} options.ellipsis - The ellipsis string (default: '...')\n * @param {boolean} options.preserveSentences - Try to truncate at sentence boundaries (default: false)\n * @param {number} options.minLength - Minimum length before truncation (default: 0)\n * @return {string} The truncated text with ellipsis if truncated\n */\nexport function truncate(\n text: string,\n maxLength: number,\n options: {\n ellipsis?: string;\n preserveSentences?: boolean;\n minLength?: number;\n } = {}\n): string {\n // Default options\n const {\n ellipsis = '...',\n preserveSentences = false,\n minLength = 0\n } = options;\n\n // Return original text if it's shorter than minLength or maxLength\n if (!text || text.length <= minLength || text.length <= maxLength) {\n return text;\n }\n\n // Calculate maximum content length (accounting for ellipsis)\n const maxContentLength = maxLength - ellipsis.length;\n\n // If preserving sentences is enabled, try to find a sentence boundary\n if (preserveSentences) {\n // Common sentence ending patterns\n const sentenceEndings = /[.!?](?:\\s|$)/g;\n let match;\n let lastValidEnd = 0;\n\n // Find the last sentence ending within maxContentLength\n // eslint-disable-next-line no-cond-assign\n while ((match = sentenceEndings.exec(text)) !== null) {\n if (match.index > maxContentLength) break;\n lastValidEnd = match.index + 1; // Include the punctuation\n }\n\n // If we found a sentence ending, use it\n if (lastValidEnd > 0) {\n return text.substring(0, lastValidEnd) + ellipsis;\n }\n }\n\n // Otherwise, truncate at word boundary\n let truncatedText = text.substring(0, maxContentLength);\n\n // Find the last space to avoid cutting words in half\n const lastSpace = truncatedText.lastIndexOf(' ');\n\n if (lastSpace > 0) {\n truncatedText = truncatedText.substring(0, lastSpace);\n }\n\n return truncatedText + ellipsis;\n}\n", "import {\n type Provider,\n type AudioOutput,\n CommonProviderConfiguration\n} from '@imgly/plugin-ai-generation-web';\nimport CreativeEditorSDK from '@cesdk/cesdk-js';\nimport schema from './ElevenMultilingualV2.json';\nimport voices from './ElevenMultilingualV2.voices.json';\nimport {\n clamp,\n getAudioDuration,\n createThumbnailFromAudio,\n truncate\n} from './utils';\n\ntype ElevenlabsInput = {\n prompt: string;\n voice_id: string;\n speed: number;\n};\n\ninterface ProviderConfiguration\n extends CommonProviderConfiguration<ElevenlabsInput, AudioOutput> {\n /**\n * Base URL used for the UI assets used in the plugin.\n *\n * By default, we load the assets from the IMG.LY CDN You can copy the assets.\n * from the `/assets` folder to your own server and set the base URL to your server.\n */\n baseURL?: string;\n}\n\nexport function ElevenMultilingualV2(\n config: ProviderConfiguration\n): (context: {\n cesdk: CreativeEditorSDK;\n}) => Promise<Provider<'audio', ElevenlabsInput, AudioOutput>> {\n return async ({ cesdk }: { cesdk: CreativeEditorSDK }) => {\n return getProvider(cesdk, config);\n };\n}\n\nfunction getProvider(\n cesdk: CreativeEditorSDK,\n config: ProviderConfiguration\n): Provider<'audio', ElevenlabsInput, AudioOutput> {\n const baseURL =\n config.baseURL ??\n 'https://cdn.img.ly/assets/plugins/plugin-ai-audio-generation-web/v1/elevenlabs/';\n\n const prefix = 'ly.img.ai/audio-generation/speech/elevenlabs';\n const voiceSelectionPanelId = `${prefix}.voiceSelection`;\n const voiceAssetSourceId = createVoicesAssetSource(cesdk, baseURL);\n const modelKey = 'elevenlabs/monolingual/v1';\n\n cesdk.setTranslations({\n en: {\n [`panel.${modelKey}`]: 'AI Voice',\n [`panel.${voiceSelectionPanelId}`]: 'Select a Voice'\n }\n });\n\n const provider: Provider<'audio', ElevenlabsInput, AudioOutput> = {\n id: modelKey,\n kind: 'audio',\n initialize: async () => {\n cesdk.ui.addAssetLibraryEntry({\n id: voiceAssetSourceId,\n sourceIds: [voiceAssetSourceId],\n gridColumns: 3\n });\n\n cesdk.ui.registerPanel<{\n id: string;\n onSelect: (voiceId: string, name: string, thumbnail?: string) => void;\n }>(voiceSelectionPanelId, ({ builder, payload }) => {\n builder.Library(`${prefix}.voiceSelection.library`, {\n searchable: true,\n entries: [voiceAssetSourceId],\n onSelect: async (entry) => {\n const { id, label } = entry;\n payload?.onSelect(\n id,\n label ?? id,\n entry.meta?.thumbUri as string | undefined\n );\n cesdk.ui.closePanel(voiceSelectionPanelId);\n }\n });\n });\n },\n input: {\n panel: {\n type: 'schema',\n // @ts-ignore\n document: schema,\n inputReference: '#/components/schemas/ElevenlabsInput',\n useFlow: 'generation-only',\n\n renderCustomProperty: {\n voice_id: (context) => {\n const voiceState = context.experimental.global<{\n voiceId: string;\n name: string;\n thumbnail?: string;\n }>('voice', {\n voiceId: 'JBFqnCBsd6RMkjVDRZzb',\n name: 'George',\n thumbnail: `${baseURL}george.webp`\n });\n\n context.builder.Button(`${prefix}.openVoiceSelection`, {\n inputLabel: 'Voice',\n icon: '@imgly/Appearance',\n trailingIcon: '@imgly/ChevronRight',\n labelAlignment: 'left',\n label: voiceState.value.name,\n onClick: () => {\n cesdk.ui.openPanel(voiceSelectionPanelId, {\n payload: {\n id: voiceState.value.voiceId,\n onSelect: (\n voiceId: string,\n name: string,\n thumbnail?: string\n ) => {\n voiceState.setValue({ voiceId, name, thumbnail });\n }\n }\n });\n }\n });\n\n return () => {\n return {\n id: 'voice_id',\n type: 'string',\n value: voiceState.value.voiceId\n };\n };\n }\n },\n\n getBlockInput: async (input) => {\n // Thumbnail and duration needs to be determined from the\n // audio output.\n return {\n audio: {\n label: truncate(input.prompt, 25)\n }\n };\n }\n }\n },\n output: {\n abortable: true,\n history: '@imgly/indexedDB',\n middleware: config.middleware,\n generate: async (\n input: ElevenlabsInput,\n { abortSignal }: { abortSignal?: AbortSignal }\n ) => {\n const audioBlob = await generateSpeech(\n input.prompt,\n input.voice_id,\n {\n speed: parseFloat(input.speed.toFixed(10))\n },\n config,\n abortSignal\n );\n\n // TODO: Use upload!\n const audioUrl = URL.createObjectURL(audioBlob);\n\n const [thumbnailBlob, audioDuration] = await Promise.all([\n createThumbnailFromAudio(audioBlob, { width: 512, height: 128 }),\n getAudioDuration(audioUrl)\n ]);\n\n const thumbnailUrl = URL.createObjectURL(thumbnailBlob);\n\n return {\n kind: 'audio',\n url: audioUrl,\n duration: audioDuration,\n thumbnailUrl\n };\n }\n },\n config\n };\n\n return provider;\n}\n\n// Function to generate speech using ElevenLabs API\nexport async function generateSpeech(\n text: string,\n voiceId: string,\n options: {\n stability?: number;\n speed?: number;\n similarityBoost?: number;\n },\n config: ProviderConfiguration,\n abortSignal?: AbortSignal\n) {\n const url = `${config.proxyUrl}/v1/text-to-speech/${voiceId}`;\n\n const response = await fetch(url, {\n signal: abortSignal,\n method: 'POST',\n headers: {\n Accept: 'audio/mpeg',\n 'Content-Type': 'application/json',\n ...(config.headers ?? {})\n },\n body: JSON.stringify({\n text,\n model_id: 'eleven_multilingual_v2',\n voice_settings: {\n speed: clamp(options?.speed || 1, 0.7, 1.2),\n stability: options?.stability || 0.5,\n similarity_boost: options?.similarityBoost || 0.5\n }\n })\n });\n\n if (!response.ok) {\n const errorData = await response.text();\n throw new Error(`API error: ${response.status} - ${errorData}`);\n }\n\n return response.blob();\n}\n\nfunction createVoicesAssetSource(\n cesdk: CreativeEditorSDK,\n baseURL: string\n): string {\n const { id, assets } = voices;\n cesdk.engine.asset.addLocalSource(id);\n assets.map(async (asset) => {\n cesdk.engine.asset.addAssetToSource(id, {\n ...asset,\n meta: {\n ...asset.meta,\n thumbUri: asset.meta.thumbUri.replace(\n '{{base_url}}',\n `${baseURL}thumbnails/`\n )\n }\n });\n });\n return id;\n}\nexport default getProvider;\n", "{\n \"openapi\": \"3.0.0\",\n \"info\": {\n \"title\": \"Elevenlabs Sound Effects API\",\n \"version\": \"1.0.0\",\n \"description\": \"Elevenlabs Sound Effects API\"\n },\n \"components\": {\n \"schemas\": {\n \"TextToSoundInput\": {\n \"title\": \"TextToSoundInput\",\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"title\": \"Prompt\",\n \"type\": \"string\",\n \"x-imgly-builder\": {\n \"component\": \"TextArea\"\n }\n },\n \"duration_seconds\": {\n \"title\": \"Duration (sec.)\",\n \"type\": \"number\",\n \"minimum\": 0.6,\n \"maximum\": 22,\n \"default\": 2\n }\n },\n \"x-elevenlabs-order-properties\": [\"text\"],\n \"required\": [\"text\"]\n }\n }\n }\n}\n", "import {\n type Provider,\n type AudioOutput,\n CommonProviderConfiguration\n} from '@imgly/plugin-ai-generation-web';\nimport CreativeEditorSDK from '@cesdk/cesdk-js';\nimport schema from './ElevenSoundEffects.json';\nimport { getAudioDuration, createThumbnailFromAudio, truncate } from './utils';\n\ntype ElevenlabsInput = {\n text: string;\n duration_seconds: number;\n};\n\ninterface ProviderConfiguration\n extends CommonProviderConfiguration<ElevenlabsInput, AudioOutput> {}\n\nexport function ElevenSoundEffects(\n config: ProviderConfiguration\n): (context: {\n cesdk: CreativeEditorSDK;\n}) => Promise<Provider<'audio', ElevenlabsInput, AudioOutput>> {\n return async ({ cesdk }: { cesdk: CreativeEditorSDK }) => {\n return getProvider(cesdk, config);\n };\n}\n\nfunction getProvider(\n cesdk: CreativeEditorSDK,\n config: ProviderConfiguration\n): Provider<'audio', ElevenlabsInput, AudioOutput> {\n const modelKey = 'elevenlabs/sound-generation';\n\n cesdk.setTranslations({\n en: {\n [`panel.${modelKey}`]: 'Generate Sound'\n }\n });\n\n const provider: Provider<'audio', ElevenlabsInput, AudioOutput> = {\n id: modelKey,\n kind: 'audio',\n initialize: async () => {},\n input: {\n panel: {\n type: 'schema',\n // @ts-ignore\n document: schema,\n inputReference: '#/components/schemas/TextToSoundInput',\n useFlow: 'generation-only',\n\n getBlockInput: async (input) => {\n // Thumbnail and duration needs to be determined from the\n // audio output.\n return {\n audio: {\n label: truncate(input.text, 25)\n }\n };\n }\n }\n },\n output: {\n abortable: true,\n history: '@imgly/indexedDB',\n middleware: config.middleware,\n generate: async (\n input: ElevenlabsInput,\n { abortSignal }: { abortSignal?: AbortSignal }\n ) => {\n const audioBlob = await generateSound(\n input.text,\n input.duration_seconds,\n config,\n abortSignal\n );\n\n // TODO: Use upload!\n const audioUrl = URL.createObjectURL(audioBlob);\n\n const [thumbnailBlob, audioDuration] = await Promise.all([\n createThumbnailFromAudio(audioBlob, { width: 512, height: 128 }),\n getAudioDuration(audioUrl)\n ]);\n\n const thumbnailUrl = URL.createObjectURL(thumbnailBlob);\n\n return {\n kind: 'audio',\n url: audioUrl,\n duration: audioDuration,\n thumbnailUrl\n };\n }\n },\n config\n };\n\n return provider;\n}\n\n// Function to generate speech using ElevenLabs API\nexport async function generateSound(\n text: string,\n duration: number | null,\n config: ProviderConfiguration,\n abortSignal?: AbortSignal\n) {\n const url = `${config.proxyUrl}/v1/sound-generation`;\n\n const response = await fetch(url, {\n signal: abortSignal,\n method: 'POST',\n headers: {\n Accept: 'audio/mpeg',\n 'Content-Type': 'application/json',\n ...(config.headers ?? {})\n },\n body: JSON.stringify({\n text,\n duration_seconds: duration\n })\n });\n\n if (!response.ok) {\n const errorData = await response.text();\n throw new Error(`API error: ${response.status} - ${errorData}`);\n }\n\n return response.blob();\n}\n\nexport default getProvider;\n", "import { ElevenMultilingualV2 } from './ElevenMultilingualV2';\nimport { ElevenSoundEffects } from './ElevenSoundEffects';\n\nconst Elevenlabs = {\n ElevenMultilingualV2,\n ElevenSoundEffects\n};\n\nexport default Elevenlabs;\n"],
5
+ "mappings": "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",
6
6
  "names": ["ElevenMultilingualV2_default", "ElevenMultilingualV2_voices_default", "clamp", "value", "min", "max", "getAudioDuration", "audioUrl", "resolve", "reject", "audio", "duration", "error", "DEFAULT_OPTIONS", "createThumbnailFromAudio", "options", "width", "height", "backgroundColor", "waveformColor", "pixelsPerSecond", "audioContext", "data", "audioBuffer", "totalDuration", "effectiveWidth", "samplesPerPixel", "canvas", "context", "dataArray", "amp", "numSamples", "i", "j", "index", "datum", "yLow", "yHigh", "blob", "truncate", "text", "maxLength", "ellipsis", "preserveSentences", "minLength", "maxContentLength", "sentenceEndings", "match", "lastValidEnd", "truncatedText", "lastSpace", "ElevenMultilingualV2", "config", "cesdk", "getProvider", "baseURL", "prefix", "voiceSelectionPanelId", "voiceAssetSourceId", "createVoicesAssetSource", "modelKey", "builder", "payload", "entry", "id", "label", "ElevenMultilingualV2_default", "context", "voiceState", "voiceId", "name", "thumbnail", "input", "truncate", "abortSignal", "audioBlob", "generateSpeech", "audioUrl", "thumbnailBlob", "audioDuration", "createThumbnailFromAudio", "getAudioDuration", "thumbnailUrl", "text", "options", "url", "response", "clamp", "errorData", "assets", "ElevenMultilingualV2_voices_default", "asset", "ElevenSoundEffects_default", "ElevenSoundEffects", "config", "cesdk", "getProvider", "modelKey", "ElevenSoundEffects_default", "input", "truncate", "abortSignal", "audioBlob", "generateSound", "audioUrl", "thumbnailBlob", "audioDuration", "createThumbnailFromAudio", "getAudioDuration", "thumbnailUrl", "text", "duration", "url", "response", "errorData", "Elevenlabs", "ElevenMultilingualV2", "ElevenSoundEffects", "elevenlabs_default"]
7
7
  }