UNPKG

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
"use strict"; 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;