UNPKG

voice-to-text-converter

Version:

A modern, lightweight Node.js package for speech-to-text conversion with support for multiple engines

116 lines 3.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseSpeechRecognitionEngine = void 0; const events_1 = require("events"); const types_1 = require("../types"); /** * Base class for speech recognition engines */ class BaseSpeechRecognitionEngine extends events_1.EventEmitter { constructor() { super(); this.isRecording = false; this.config = {}; } /** * Validate configuration */ validateConfig(config) { if (config.confidenceThreshold && (config.confidenceThreshold < 0 || config.confidenceThreshold > 1)) { throw new types_1.SpeechRecognitionError(types_1.SpeechRecognitionErrorType.INVALID_CONFIG, 'Confidence threshold must be between 0 and 1'); } if (config.maxAlternatives && config.maxAlternatives < 1) { throw new types_1.SpeechRecognitionError(types_1.SpeechRecognitionErrorType.INVALID_CONFIG, 'Max alternatives must be at least 1'); } if (config.sampleRate && config.sampleRate < 8000) { throw new types_1.SpeechRecognitionError(types_1.SpeechRecognitionErrorType.INVALID_CONFIG, 'Sample rate must be at least 8000 Hz'); } } /** * Validate audio input configuration */ validateAudioConfig(audioConfig) { if (!audioConfig.source) { throw new types_1.SpeechRecognitionError(types_1.SpeechRecognitionErrorType.INVALID_CONFIG, 'Audio source must be specified'); } if (audioConfig.source === 'file' && !audioConfig.filePath) { throw new types_1.SpeechRecognitionError(types_1.SpeechRecognitionErrorType.INVALID_CONFIG, 'File path must be specified for file source'); } if (audioConfig.source === 'stream' && !audioConfig.audioStream) { throw new types_1.SpeechRecognitionError(types_1.SpeechRecognitionErrorType.INVALID_CONFIG, 'Audio stream must be specified for stream source'); } } /** * Emit error event with proper error handling */ emitError(type, message, originalError) { const error = new types_1.SpeechRecognitionError(type, message, originalError); this.emit('error', error); } /** * Emit result event with validation */ emitResult(result) { // Validate result if (!result.transcript) { return; // Skip empty results } // Apply confidence threshold if configured if (this.config.confidenceThreshold && result.confidence < this.config.confidenceThreshold) { return; // Skip low-confidence results } this.emit('result', result); } /** * Get default configuration merged with provided config */ getConfig(config) { return { language: 'en-US', sampleRate: 16000, continuous: false, interimResults: false, maxAlternatives: 1, confidenceThreshold: 0.0, encoding: 'LINEAR16', ...this.config, ...config }; } /** * Check if currently recording */ get isActive() { return this.isRecording; } /** * Set recording state */ setRecordingState(recording) { this.isRecording = recording; } /** * Clean up resources */ cleanup() { this.removeAllListeners(); this.isRecording = false; } /** * Type-safe event emitter methods */ emit(event, ...args) { return super.emit(event, ...args); } on(event, listener) { return super.on(event, listener); } once(event, listener) { return super.once(event, listener); } off(event, listener) { return super.off(event, listener); } } exports.BaseSpeechRecognitionEngine = BaseSpeechRecognitionEngine; //# sourceMappingURL=base-engine.js.map