Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ __pycache__/
*.egg
dist/
build/
*.spec
# *.spec -> We want to track VoxFlow.spec
!VoxFlow.spec

# Virtual environments
venv/
Expand Down
146 changes: 82 additions & 64 deletions BUILD_EXE.bat
Original file line number Diff line number Diff line change
@@ -1,91 +1,109 @@
@echo off
title VoxFlow - Building .exe + Installer (AI Evolution Polska)
chcp 65001 >nul
cd /d "%~dp0"
title VoxFlow — Build Installer

echo.
echo ╔═══════════════════════════════════════════════════╗
echo ║ 🔨 Building VoxFlow .exe + Installer ║
echo ║ by AI Evolution Polska
echo ╚═══════════════════════════════════════════════════╝
echo ╔══════════════════════════════════════════════════════════
echo ║ VoxFlow — Build Setup.exe Installer
echo ║ by AI Evolution Polska ║
echo ╚══════════════════════════════════════════════════════════
echo.

REM Activate virtual environment
REM ─── Step 0: Check venv ─────────────────────────────────────────
if not exist "venv\Scripts\activate.bat" (
echo ❌ Środowisko venv nie istnieje. Uruchom najpierw install.bat
pause & exit /b 1
)
call venv\Scripts\activate.bat

REM Install PyInstaller if needed
pip install pyinstaller --quiet --disable-pip-version-check 2>nul
REM ─── Step 1: Install/update build tools ─────────────────────────
echo [1/4] Instalowanie narzędzi build...
pip install pyinstaller --quiet --disable-pip-version-check
if %errorlevel% neq 0 (
echo ❌ Błąd instalacji PyInstaller!
pause & exit /b 1
)
echo ✅ PyInstaller gotowy

REM ─── Step 2: Clean previous build ───────────────────────────────
echo.
echo [2/4] Czyszczenie poprzedniego buildu...
if exist "dist\VoxFlow" rmdir /s /q "dist\VoxFlow"
if exist "build" rmdir /s /q "build"
echo ✅ Wyczyszczono

REM ─── Step 3: Build EXE with PyInstaller ─────────────────────────
echo.
echo ═══════════════════════════════════════════
echo STEP 1: Building VoxFlow .exe
echo ═══════════════════════════════════════════
echo [3/4] Budowanie VoxFlow.exe przez PyInstaller...
echo (To może potrwać 2-5 minut — proszę czekać)
echo.

pyinstaller ^
--name "VoxFlow" ^
--icon "assets\voxflow.ico" ^
--onedir ^
--windowed ^
--noconfirm ^
--clean ^
--add-data "voxflow;voxflow" ^
--add-data "assets;assets" ^
--hidden-import "faster_whisper" ^
--hidden-import "ctranslate2" ^
--hidden-import "huggingface_hub" ^
--hidden-import "tokenizers" ^
--hidden-import "sounddevice" ^
--hidden-import "customtkinter" ^
--hidden-import "pystray" ^
--hidden-import "keyboard" ^
--hidden-import "pyperclip" ^
--hidden-import "_sounddevice_data" ^
--hidden-import "scipy" ^
--collect-all "customtkinter" ^
--collect-all "faster_whisper" ^
--collect-all "ctranslate2" ^
voxflow/main.py
pyinstaller VoxFlow.spec --noconfirm --clean

if %errorlevel% neq 0 (
echo.
echo ❌ PyInstaller build failed!
deactivate
pause
exit /b 1
echo ❌ PyInstaller zakończył się błędem!
echo Sprawdź logi powyżej.
pause & exit /b 1
)
if not exist "dist\VoxFlow\VoxFlow.exe" (
echo ❌ Nie znaleziono dist\VoxFlow\VoxFlow.exe!
pause & exit /b 1
)

echo.
echo ✅ .exe built successfully at: dist\VoxFlow\VoxFlow.exe
echo.
echo ✅ VoxFlow.exe zbudowany pomyślnie

echo ═══════════════════════════════════════════
echo STEP 2: Creating Installer (optional)
echo ═══════════════════════════════════════════
REM ─── Step 4: Build Installer with Inno Setup ────────────────────
echo.
echo [4/4] Tworzenie instalatora VoxFlow_Setup.exe...
echo.

REM Check if Inno Setup is installed
REM Possible Inno Setup locations
set ISCC=""
if exist "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" (
echo 📦 Inno Setup found! Building installer...
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss
if %errorlevel% equ 0 (
echo.
echo ✅ Installer created at: installer_output\VoxFlow_Setup_v1.0.0.exe
) else (
echo ⚠️ Installer build failed. You can still use the portable .exe.
)
) else (
echo ℹ️ Inno Setup not found. Skipping installer creation.
echo Install from: https://jrsoftware.org/isinfo.php
echo Then re-run this script to create an installer.
set ISCC="C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
)
if exist "C:\Program Files\Inno Setup 6\ISCC.exe" (
set ISCC="C:\Program Files\Inno Setup 6\ISCC.exe"
)

if %ISCC%=="" (
echo ⚠️ Inno Setup nie jest zainstalowany!
echo.
echo Pobierz Inno Setup 6 ze strony:
echo https://jrsoftware.org/isinfo.php
echo.
echo Następnie uruchom ten skrypt ponownie, aby stworzyć
echo plik instalacyjny VoxFlow_Setup.exe
echo.
echo Gotowy EXE znajduje się w: dist\VoxFlow\VoxFlow.exe
pause
start "" explorer "dist\VoxFlow"
exit /b 0
)

if not exist "installer_output" mkdir installer_output

%ISCC% installer.iss /Q

if %errorlevel% neq 0 (
echo.
echo 💡 You can still use the portable .exe at: dist\VoxFlow\VoxFlow.exe
echo ❌ Inno Setup zakończył się błędem!
echo Sprawdź plik installer.iss
pause & exit /b 1
)

echo.
echo ══════════════════════════════════════
echo 📂 Output files:
echo dist\VoxFlow\VoxFlow.exe (portable)
if exist "installer_output\VoxFlow_Setup_v1.0.0.exe" echo installer_output\VoxFlow_Setup_v1.0.0.exe (installer)
echo ══════════════════════════════════════
echo ╔══════════════════════════════════════════════════════════╗
echo ║ ║
echo ║ ✅ GOTOWE! VoxFlow_Setup.exe zbudowany pomyślnie ║
echo ║ ║
echo ║ Lokalizacja: installer_output\VoxFlow_Setup_v*.exe ║
echo ║ ║
echo ╚══════════════════════════════════════════════════════════╝
echo.

deactivate
start "" explorer "installer_output"
pause
31 changes: 30 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,35 @@ Wszystkie istotne zmiany w projekcie są dokumentowane w tym pliku.
Format oparty na [Keep a Changelog](https://keepachangelog.com/pl/1.0.0/),
wersjonowanie zgodne z [Semantic Versioning](https://semver.org/lang/pl/).

---

## [1.1.0] — 2026-02-20

### ✨ Dodane
- 🎤 Wybór mikrofonu — dropdown z listą urządzeń audio
- ⌨️ Interaktywny hotkey picker — naciśnij dowolny klawisz aby ustawić
- 🔑 Wsparcie kombinacji klawiszy (Ctrl+Space, Ctrl+Shift+Space itp.)
- 🖥️ Zapamiętywanie rozmiaru okna między sesjami
- ⚠️ Automatyczny fallback mikrofonu gdy wybrany jest niedostępny

### 🐛 Naprawiono
- **[Krytyczny]** Hotkey resetował się do F2 po każdym restarcie — walidacja
konfiguracji blokowała własne klawisze użytkownika
- **[Krytyczny]** Fallback mikrofonu nie aktualizował konfiguracji trwale —
problem powtarzał się przy każdym uruchomieniu
- **[Krytyczny]** `keyboard.read_event()` bez timeout mogło zawiesić wątek UI
podczas hotkey capture — naprawiono przez threading.Event z limitem czasu
- **[Ważny]** Settings panel wstawiał się w losowe miejsce — naprawiono przez
przechowywanie referencji do `footer_frame`
- Graceful degradation gdy `pystray` lub `autostart` są niedostępne (brak crashu)

### 🔧 Poprawki jakości
- Escape anuluje teraz hotkey capture
- Debounced zapis rozmiaru okna (400ms po ostatnim zdarzeniu resize)
- Tray guard — aplikacja działa poprawnie bez system tray

---

## [1.0.0] — 2026-02-16

### ✨ Dodane
Expand Down Expand Up @@ -38,4 +67,4 @@ wersjonowanie zgodne z [Semantic Versioning](https://semver.org/lang/pl/).

---

*Zbudowane przez [AI Evolution Polska](https://github.com/AI-Evolution-Polska)*
*Zbudowane przez [AI Evolution Polska](https://github.com/aievolutionpl)*
2 changes: 1 addition & 1 deletion CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ Ten kodeks oparty jest na [Contributor Covenant v2.1](https://www.contributor-co

---

*Projekt [AI Evolution Polska](https://github.com/AI-Evolution-Polska)*
*Projekt [AI Evolution Polska](https://github.com/aievolutionpl)*
133 changes: 133 additions & 0 deletions CREATE_PORTABLE.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
@echo off
chcp 65001 >nul
cd /d "%~dp0"
title VoxFlow — Tworzenie wersji Portable

echo.
echo ╔══════════════════════════════════════════════════════════╗
echo ║ VoxFlow — Tworzenie wersji Portable ║
echo ║ by AI Evolution Polska ║
echo ╚══════════════════════════════════════════════════════════╝
echo.

REM ─── Ustal wersję ──────────────────────────────────────────────
set VER=1.1.0
set PORTABLE_DIR=dist\VoxFlow_Portable_v%VER%
set PORTABLE_APP=%PORTABLE_DIR%\VoxFlow

REM ─── Krok 0: Sprawdź venv ──────────────────────────────────────
if not exist "venv\Scripts\activate.bat" (
echo ❌ Nie znaleziono środowiska venv.
echo Uruchom najpierw install.bat
echo.
pause & exit /b 1
)
call venv\Scripts\activate.bat

REM ─── Krok 1: Zbuduj EXE jeśli nie istnieje ────────────────────
echo [1/4] Sprawdzam czy VoxFlow.exe jest zbudowany...
if exist "dist\VoxFlow\VoxFlow.exe" (
echo ✅ VoxFlow.exe już istnieje — pomijam build
) else (
echo ⏳ Buduję VoxFlow.exe przez PyInstaller...
echo (To może potrwać 3-6 minut)
pip install pyinstaller --quiet --disable-pip-version-check
pyinstaller VoxFlow.spec --noconfirm --clean
if %errorlevel% neq 0 (
echo ❌ Build nie powiódł się!
pause & exit /b 1
)
if not exist "dist\VoxFlow\VoxFlow.exe" (
echo ❌ Nie znaleziono dist\VoxFlow\VoxFlow.exe
pause & exit /b 1
)
echo ✅ VoxFlow.exe zbudowany
)

REM ─── Krok 2: Wyczyść stary portable folder ────────────────────
echo.
echo [2/4] Przygotowanie katalogu portable...
if exist "%PORTABLE_DIR%" (
echo 🗑 Usuwam stary folder %PORTABLE_DIR%...
rmdir /s /q "%PORTABLE_DIR%"
)
mkdir "%PORTABLE_DIR%"

REM ─── Krok 3: Kopiuj pliki ─────────────────────────────────────
echo.
echo [3/4] Kopiowanie plików VoxFlow...
xcopy "dist\VoxFlow\*" "%PORTABLE_APP%\" /E /I /Q
if %errorlevel% neq 0 (
echo ❌ Błąd kopiowania plików!
pause & exit /b 1
)

REM ─── Stwórz launcher START_VOXFLOW.bat ────────────────────────
echo @echo off > "%PORTABLE_DIR%\START_VOXFLOW.bat"
echo chcp 65001 ^>nul >> "%PORTABLE_DIR%\START_VOXFLOW.bat"
echo cd /d "%%~dp0VoxFlow" >> "%PORTABLE_DIR%\START_VOXFLOW.bat"
echo start "" "VoxFlow.exe" >> "%PORTABLE_DIR%\START_VOXFLOW.bat"

REM ─── Stwórz README_PORTABLE.txt ───────────────────────────────
(
echo VoxFlow %VER% — Wersja Portable
echo ================================
echo.
echo JAK URUCHOMIĆ:
echo 1. Kliknij dwukrotnie START_VOXFLOW.bat
echo (lub uruchom VoxFlow\VoxFlow.exe bezpośrednio)
echo.
echo JAK DZIAŁA:
echo - Przytrzymaj F2 i mów - pojawi sie animacja nagrywania na dole ekranu
echo - Zwolnij F2 - tekst zostanie wklejony w aktywnym oknie
echo - Kliknij przycisk klawisza w UI zeby zmienić skrót klawiszowy
echo - Ikona w zasobniku - kliknij prawym przyciskiem dla opcji
echo.
echo WYMAGANIA:
echo - Windows 10/11 (64-bit)
echo - Mikrofon
echo - Połączenie z internetem (TYLKO przy pierwszym uruchomieniu
echo - do pobrania modelu AI ~500 MB)
echo.
echo WAŻNE:
echo - NIE przenoś samego VoxFlow.exe bez całego folderu VoxFlow\
echo - Możesz przenieść cały folder VoxFlow_Portable_v%VER% gdzie chcesz
echo - Ustawienia są zapisywane w: %%APPDATA%%\VoxFlow\
echo.
echo by AI Evolution Polska - https://github.com/aievolutionpl/VoxFlow
) > "%PORTABLE_DIR%\README_PORTABLE.txt"

echo.
echo [4/4] Gotowe!
echo.

REM ─── Zapytaj czy zipować ──────────────────────────────────────
set /p DOZIP="Czy spakować do ZIP? [T/n]: "
if /i "%DOZIP%"=="n" goto :done

echo.
echo 📦 Pakuję do ZIP...

REM Użyj PowerShell do zipowania
powershell -Command "Compress-Archive -Path '%PORTABLE_DIR%' -DestinationPath 'dist\VoxFlow_Portable_v%VER%.zip' -Force"

if %errorlevel% equ 0 (
echo ✅ ZIP stworzony: dist\VoxFlow_Portable_v%VER%.zip
) else (
echo ⚠️ Nie udało się stworzyć ZIP. Folder istnieje: %PORTABLE_DIR%
)

:done
echo.
echo ╔══════════════════════════════════════════════════════════╗
echo ║ ║
echo ║ ✅ Wersja Portable gotowa! ║
echo ║ ║
echo ║ Folder: %PORTABLE_DIR% ║
echo ║ Launcher: START_VOXFLOW.bat ║
echo ║ ║
echo ╚══════════════════════════════════════════════════════════╝
echo.

start "" explorer "%PORTABLE_DIR%"
pause
Loading