const { join } = require('path'); const { whisper } = require('../../../build/Release/addon.node'); const { promisify } = require('util'); const whisperAsync = promisify(whisper); const commonParams = { language: 'en', model: join(__dirname, '../../../models/ggml-base.en.bin'), fname_inp: join(__dirname, '../../../samples/jfk.wav'), use_gpu: true, flash_attn: false, no_prints: true, no_timestamps: false, detect_language: false, audio_ctx: 0, max_len: 0 }; describe('Whisper.cpp Node.js addon with VAD support', () => { test('Basic whisper transcription without VAD', async () => { const params = { ...commonParams, vad: false }; const result = await whisperAsync(params); expect(typeof result).toBe('object'); expect(Array.isArray(result.transcription)).toBe(true); expect(result.transcription.length).toBeGreaterThan(0); // Check that we got some transcription text const text = result.transcription.map(segment => segment[2]).join(' '); expect(text.length).toBeGreaterThan(0); expect(text.toLowerCase()).toContain('ask not'); }, 30000); test('VAD parameters validation', async () => { // Test with invalid VAD model - should return empty transcription const invalidParams = { ...commonParams, vad: true, vad_model: 'non-existent-model.bin', vad_threshold: 0.5 }; // This should handle the error gracefully and return empty transcription const result = await whisperAsync(invalidParams); expect(typeof result).toBe('object'); expect(Array.isArray(result.transcription)).toBe(true); // When VAD model doesn't exist, it should return empty transcription expect(result.transcription.length).toBe(0); }, 10000); test('VAD parameter parsing', async () => { // Test that VAD parameters are properly parsed (even if VAD model doesn't exist) const vadParams = { ...commonParams, vad: false, // Disabled so no model required vad_threshold: 0.7, vad_min_speech_duration_ms: 300, vad_min_silence_duration_ms: 150, vad_max_speech_duration_s: 45.0, vad_speech_pad_ms: 50, vad_samples_overlap: 0.15 }; const result = await whisperAsync(vadParams); expect(typeof result).toBe('object'); expect(Array.isArray(result.transcription)).toBe(true); }, 30000); test('Progress callback with VAD disabled', async () => { let progressCalled = false; let lastProgress = 0; const params = { ...commonParams, vad: false, progress_callback: (progress) => { progressCalled = true; lastProgress = progress; expect(progress).toBeGreaterThanOrEqual(0); expect(progress).toBeLessThanOrEqual(100); } }; const result = await whisperAsync(params); expect(progressCalled).toBe(true); expect(lastProgress).toBe(100); expect(typeof result).toBe('object'); }, 30000); test('Language detection without VAD', async () => { const params = { ...commonParams, vad: false, detect_language: true, language: 'auto' }; const result = await whisperAsync(params); expect(typeof result).toBe('object'); expect(typeof result.language).toBe('string'); expect(result.language.length).toBeGreaterThan(0); }, 30000); test('Basic transcription with all VAD parameters set', async () => { // Test with VAD disabled but all parameters set to ensure no crashes const params = { ...commonParams, vad: false, // Disabled so it works without VAD model vad_model: '', // Empty model path vad_threshold: 0.6, vad_min_speech_duration_ms: 200, vad_min_silence_duration_ms: 80, vad_max_speech_duration_s: 25.0, vad_speech_pad_ms: 40, vad_samples_overlap: 0.08 }; const result = await whisperAsync(params); expect(typeof result).toBe('object'); expect(Array.isArray(result.transcription)).toBe(true); expect(result.transcription.length).toBeGreaterThan(0); }, 30000); });