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
JavaScript
;
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;