woolball-client
Version:
Client-side library for Woolball enabling secure browser resource sharing for distributed AI task processing
66 lines (65 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.browserSpeechRecognition = void 0;
async function browserSpeechRecognition(data) {
const { input, language = 'en-US', continuous = false, interimResults = false } = data;
if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {
throw new Error('Web Speech API is not supported in this browser.');
}
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
recognition.lang = language;
recognition.continuous = continuous;
recognition.interimResults = interimResults;
return new Promise((resolve, reject) => {
let finalTranscript = '';
if (input) {
try {
const audio = new Audio(`data:audio/wav;base64,${input}`);
audio.addEventListener('ended', () => {
recognition.stop();
});
audio.play().catch((error) => {
reject(new Error(`Failed to play audio: ${error.message}`));
});
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
reject(new Error(`Failed to process audio input: ${errorMessage}`));
}
}
recognition.onresult = (event) => {
let interimTranscript = '';
for (let i = event.resultIndex; i < event.results.length; i++) {
const transcript = event.results[i][0].transcript;
if (event.results[i].isFinal) {
finalTranscript += transcript;
}
else {
interimTranscript += transcript;
}
}
if (interimResults) {
resolve({
text: finalTranscript,
interimText: interimTranscript,
isFinal: false
});
}
};
recognition.onend = () => {
resolve({
text: finalTranscript,
isFinal: true
});
};
recognition.onerror = (event) => {
reject(new Error(`Speech recognition error: ${event.error}`));
};
recognition.start();
if (!input) {
console.log('Listening via microphone...');
}
});
}
exports.browserSpeechRecognition = browserSpeechRecognition;