UNPKG

woolball-client

Version:

Client-side library for Woolball enabling secure browser resource sharing for distributed AI task processing

74 lines (73 loc) 3.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.browserSpeechSynthesis = void 0; const media_1 = require("../../../media"); async function browserSpeechSynthesis(data) { const { input, language = 'en-US', voice = '', rate = 1, pitch = 1, volume = 1 } = data; if (!('speechSynthesis' in window)) { throw new Error('Web Speech Synthesis API is not supported in this browser.'); } return new Promise((resolve, reject) => { try { const utterance = new window.SpeechSynthesisUtterance(input); utterance.lang = language; utterance.rate = rate; utterance.pitch = pitch; utterance.volume = volume; if (voice) { const voices = window.speechSynthesis.getVoices(); const selectedVoice = voices.find(v => v.name.toLowerCase() === voice.toLowerCase() || v.voiceURI.toLowerCase() === voice.toLowerCase()); if (selectedVoice) { utterance.voice = selectedVoice; } else { console.warn(`Voice "${voice}" not found. Using default voice.`); } } const AudioContextClass = window.AudioContext || window.webkitAudioContext; const audioContext = new AudioContextClass(); const mediaStreamDestination = audioContext.createMediaStreamDestination(); const mediaRecorder = new MediaRecorder(mediaStreamDestination.stream); const audioChunks = []; mediaRecorder.ondataavailable = (event) => { if (event.data.size > 0) { audioChunks.push(event.data); } }; mediaRecorder.onstop = async () => { const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); try { const arrayBuffer = await audioBlob.arrayBuffer(); const base64Audio = (0, media_1.bufferToBase64)(arrayBuffer); resolve({ audio: base64Audio, format: 'wav', sampleRate: audioContext.sampleRate, channels: 1 }); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); reject(new Error(`Failed to process audio data: ${errorMessage}`)); } }; mediaRecorder.start(); utterance.onend = () => { mediaRecorder.stop(); audioContext.close(); }; utterance.onerror = (event) => { mediaRecorder.stop(); audioContext.close(); reject(new Error(`Speech synthesis error: ${event.error}`)); }; window.speechSynthesis.speak(utterance); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); reject(new Error(`Failed to synthesize speech: ${errorMessage}`)); } }); } exports.browserSpeechSynthesis = browserSpeechSynthesis;