import { get } from "svelte/store"; import { alertError } from "../alert"; import { DataBase, type character } from "../database"; let sourceNode:AudioBufferSourceNode = null export async function sayTTS(character:character,text:string) { let db = get(DataBase) text = text.replace(/\*/g,'') if(character.ttsReadOnlyQuoted){ const matches = text.match(/"(.*?)"/g) if(matches.length > 0){ text = matches.map(match => match.slice(1, -1)).join(""); } else{ text = '' } } switch(character.ttsMode){ case "webspeech":{ if(speechSynthesis && SpeechSynthesisUtterance){ const utterThis = new SpeechSynthesisUtterance(text); const voices = speechSynthesis.getVoices(); let voiceIndex = 0 for(let i=0;i= 200 && da.status < 300){ const audioBuffer = await audioContext.decodeAudioData(await da.arrayBuffer()) sourceNode = audioContext.createBufferSource(); sourceNode.buffer = audioBuffer; sourceNode.connect(audioContext.destination); sourceNode.start(); } else{ alertError(await da.text()) } } } } export function stopTTS(){ if(sourceNode){ sourceNode.stop() } if(speechSynthesis && SpeechSynthesisUtterance){ speechSynthesis.cancel() } } export function getWebSpeechTTSVoices() { return speechSynthesis.getVoices().map(v => { return v.name }) } export async function getElevenTTSVoices() { let db = get(DataBase) const data = await fetch('https://api.elevenlabs.io/v1/voices', { headers: { 'xi-api-key': db.elevenLabKey || undefined } }) const res = await data.json() console.log(res) return res.voices }