whisper fix
This commit is contained in:
		
							parent
							
								
									aa9d49136d
								
							
						
					
					
						commit
						1ab3ebe88d
					
				@ -48,7 +48,11 @@ class WhisperService extends LocalAIServiceBase {
 | 
			
		||||
            
 | 
			
		||||
            this.modelsDir = path.join(whisperDir, 'models');
 | 
			
		||||
            this.tempDir = path.join(whisperDir, 'temp');
 | 
			
		||||
            this.whisperPath = path.join(whisperDir, 'bin', 'whisper');
 | 
			
		||||
            
 | 
			
		||||
            // Windows에서는 .exe 확장자 필요
 | 
			
		||||
            const platform = this.getPlatform();
 | 
			
		||||
            const whisperExecutable = platform === 'win32' ? 'whisper.exe' : 'whisper';
 | 
			
		||||
            this.whisperPath = path.join(whisperDir, 'bin', whisperExecutable);
 | 
			
		||||
 | 
			
		||||
            await this.ensureDirectories();
 | 
			
		||||
            await this.ensureWhisperBinary();
 | 
			
		||||
@ -304,17 +308,112 @@ class WhisperService extends LocalAIServiceBase {
 | 
			
		||||
        const tempFile = path.join(this.tempDir, 'whisper-binary.zip');
 | 
			
		||||
        
 | 
			
		||||
        try {
 | 
			
		||||
            console.log('[WhisperService] Step 1: Downloading Whisper binary...');
 | 
			
		||||
            await this.downloadWithRetry(binaryUrl, tempFile);
 | 
			
		||||
            const extractDir = path.dirname(this.whisperPath);
 | 
			
		||||
            await spawnAsync('powershell', ['-command', `Expand-Archive -Path '${tempFile}' -DestinationPath '${extractDir}' -Force`]);
 | 
			
		||||
            await fsPromises.unlink(tempFile);
 | 
			
		||||
            
 | 
			
		||||
            console.log('[WhisperService] Step 2: Extracting archive...');
 | 
			
		||||
            const extractDir = path.join(this.tempDir, 'extracted');
 | 
			
		||||
            
 | 
			
		||||
            // 임시 압축 해제 디렉토리 생성
 | 
			
		||||
            await fsPromises.mkdir(extractDir, { recursive: true });
 | 
			
		||||
            
 | 
			
		||||
            // PowerShell 명령에서 경로를 올바르게 인용
 | 
			
		||||
            const expandCommand = `Expand-Archive -Path "${tempFile}" -DestinationPath "${extractDir}" -Force`;
 | 
			
		||||
            await spawnAsync('powershell', ['-command', expandCommand]);
 | 
			
		||||
            
 | 
			
		||||
            console.log('[WhisperService] Step 3: Finding and moving whisper executable...');
 | 
			
		||||
            
 | 
			
		||||
            // 압축 해제된 디렉토리에서 whisper.exe 파일 찾기
 | 
			
		||||
            const whisperExecutables = await this.findWhisperExecutables(extractDir);
 | 
			
		||||
            
 | 
			
		||||
            if (whisperExecutables.length === 0) {
 | 
			
		||||
                throw new Error('whisper.exe not found in extracted files');
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            // 첫 번째로 찾은 whisper.exe를 목표 위치로 복사
 | 
			
		||||
            const sourceExecutable = whisperExecutables[0];
 | 
			
		||||
            const targetDir = path.dirname(this.whisperPath);
 | 
			
		||||
            await fsPromises.mkdir(targetDir, { recursive: true });
 | 
			
		||||
            await fsPromises.copyFile(sourceExecutable, this.whisperPath);
 | 
			
		||||
            
 | 
			
		||||
            console.log('[WhisperService] Step 4: Verifying installation...');
 | 
			
		||||
            
 | 
			
		||||
            // 설치 검증
 | 
			
		||||
            await fsPromises.access(this.whisperPath, fs.constants.F_OK);
 | 
			
		||||
            
 | 
			
		||||
            // whisper.exe 실행 테스트
 | 
			
		||||
            try {
 | 
			
		||||
                await spawnAsync(this.whisperPath, ['--help']);
 | 
			
		||||
                console.log('[WhisperService] Whisper executable verified successfully');
 | 
			
		||||
            } catch (testError) {
 | 
			
		||||
                console.warn('[WhisperService] Whisper executable test failed, but file exists:', testError.message);
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            console.log('[WhisperService] Step 5: Cleanup...');
 | 
			
		||||
            
 | 
			
		||||
            // 임시 파일 정리
 | 
			
		||||
            await fsPromises.unlink(tempFile).catch(() => {});
 | 
			
		||||
            await this.removeDirectory(extractDir).catch(() => {});
 | 
			
		||||
            
 | 
			
		||||
            console.log('[WhisperService] Whisper installed successfully on Windows');
 | 
			
		||||
            return true;
 | 
			
		||||
            
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.error('[WhisperService] Windows installation failed:', error);
 | 
			
		||||
            
 | 
			
		||||
            // 실패 시 임시 파일 정리
 | 
			
		||||
            await fsPromises.unlink(tempFile).catch(() => {});
 | 
			
		||||
            await this.removeDirectory(path.join(this.tempDir, 'extracted')).catch(() => {});
 | 
			
		||||
            
 | 
			
		||||
            throw new Error(`Failed to install Whisper on Windows: ${error.message}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // 압축 해제된 디렉토리에서 whisper.exe 파일들을 재귀적으로 찾기
 | 
			
		||||
    async findWhisperExecutables(dir) {
 | 
			
		||||
        const executables = [];
 | 
			
		||||
        
 | 
			
		||||
        try {
 | 
			
		||||
            const items = await fsPromises.readdir(dir, { withFileTypes: true });
 | 
			
		||||
            
 | 
			
		||||
            for (const item of items) {
 | 
			
		||||
                const fullPath = path.join(dir, item.name);
 | 
			
		||||
                
 | 
			
		||||
                if (item.isDirectory()) {
 | 
			
		||||
                    const subExecutables = await this.findWhisperExecutables(fullPath);
 | 
			
		||||
                    executables.push(...subExecutables);
 | 
			
		||||
                } else if (item.isFile() && (item.name === 'whisper.exe' || item.name === 'main.exe')) {
 | 
			
		||||
                    // main.exe도 포함 (일부 빌드에서 whisper 실행파일이 main.exe로 명명됨)
 | 
			
		||||
                    executables.push(fullPath);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.warn('[WhisperService] Error reading directory:', dir, error.message);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return executables;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // 디렉토리 재귀적 삭제
 | 
			
		||||
    async removeDirectory(dir) {
 | 
			
		||||
        try {
 | 
			
		||||
            const items = await fsPromises.readdir(dir, { withFileTypes: true });
 | 
			
		||||
            
 | 
			
		||||
            for (const item of items) {
 | 
			
		||||
                const fullPath = path.join(dir, item.name);
 | 
			
		||||
                
 | 
			
		||||
                if (item.isDirectory()) {
 | 
			
		||||
                    await this.removeDirectory(fullPath);
 | 
			
		||||
                } else {
 | 
			
		||||
                    await fsPromises.unlink(fullPath);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            await fsPromises.rmdir(dir);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.warn('[WhisperService] Error removing directory:', dir, error.message);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async installLinux() {
 | 
			
		||||
        console.log('[WhisperService] Installing Whisper on Linux...');
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user