From 6db87d119df257524939df97796820a3519b3830 Mon Sep 17 00:00:00 2001 From: unknown <16974509+cynodesmus@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:46:12 +0400 Subject: [PATCH 1/5] feat: expand vocal language combo box (24-->50+ languages) - Languages from the full list of "50+" have been added - Backward compatible with original en/zh/ja --- src/SongDialog.cpp | 52 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/src/SongDialog.cpp b/src/SongDialog.cpp index 13a1fa9..c63b171 100644 --- a/src/SongDialog.cpp +++ b/src/SongDialog.cpp @@ -24,14 +24,56 @@ SongDialog::SongDialog(QWidget *parent, const QString &caption, const QString &l // Setup vocal language combo box ui->vocalLanguageCombo->addItem("--", ""); // Unset ui->vocalLanguageCombo->addItem("English (en)", "en"); - ui->vocalLanguageCombo->addItem("German (de)", "de"); - ui->vocalLanguageCombo->addItem("French (fr)", "fr"); - ui->vocalLanguageCombo->addItem("Spanish (es)", "es"); - ui->vocalLanguageCombo->addItem("Japanese (ja)", "ja"); ui->vocalLanguageCombo->addItem("Chinese (zh)", "zh"); - ui->vocalLanguageCombo->addItem("Italian (it)", "it"); + ui->vocalLanguageCombo->addItem("Japanese (ja)", "ja"); + ui->vocalLanguageCombo->addItem("Korean (ko)", "ko"); + ui->vocalLanguageCombo->addItem("Spanish (es)", "es"); + ui->vocalLanguageCombo->addItem("French (fr)", "fr"); + ui->vocalLanguageCombo->addItem("German (de)", "de"); ui->vocalLanguageCombo->addItem("Portuguese (pt)", "pt"); ui->vocalLanguageCombo->addItem("Russian (ru)", "ru"); + ui->vocalLanguageCombo->addItem("Italian (it)", "it"); + ui->vocalLanguageCombo->addItem("Arabic (ar)", "ar"); + ui->vocalLanguageCombo->addItem("Azerbaijani (az)", "az"); + ui->vocalLanguageCombo->addItem("Bulgarian (bg)", "bg"); + ui->vocalLanguageCombo->addItem("Bengali (bn)", "bn"); + ui->vocalLanguageCombo->addItem("Catalan (ca)", "ca"); + ui->vocalLanguageCombo->addItem("Czech (cs)", "cs"); + ui->vocalLanguageCombo->addItem("Danish (da)", "da"); + ui->vocalLanguageCombo->addItem("Greek (el)", "el"); + ui->vocalLanguageCombo->addItem("Persian (fa)", "fa"); + ui->vocalLanguageCombo->addItem("Finnish (fi)", "fi"); + ui->vocalLanguageCombo->addItem("Hebrew (he)", "he"); + ui->vocalLanguageCombo->addItem("Hindi (hi)", "hi"); + ui->vocalLanguageCombo->addItem("Croatian (hr)", "hr"); + ui->vocalLanguageCombo->addItem("Haitian Creole (ht)", "ht"); + ui->vocalLanguageCombo->addItem("Hungarian (hu)", "hu"); + ui->vocalLanguageCombo->addItem("Indonesian (id)", "id"); + ui->vocalLanguageCombo->addItem("Icelandic (is)", "is"); + ui->vocalLanguageCombo->addItem("Latin (la)", "la"); + ui->vocalLanguageCombo->addItem("Lithuanian (lt)", "lt"); + ui->vocalLanguageCombo->addItem("Malay (ms)", "ms"); + ui->vocalLanguageCombo->addItem("Nepali (ne)", "ne"); + ui->vocalLanguageCombo->addItem("Dutch (nl)", "nl"); + ui->vocalLanguageCombo->addItem("Norwegian (no)", "no"); + ui->vocalLanguageCombo->addItem("Punjabi (pa)", "pa"); + ui->vocalLanguageCombo->addItem("Polish (pl)", "pl"); + ui->vocalLanguageCombo->addItem("Romanian (ro)", "ro"); + ui->vocalLanguageCombo->addItem("Sanskrit (sa)", "sa"); + ui->vocalLanguageCombo->addItem("Slovak (sk)", "sk"); + ui->vocalLanguageCombo->addItem("Serbian (sr)", "sr"); + ui->vocalLanguageCombo->addItem("Swedish (sv)", "sv"); + ui->vocalLanguageCombo->addItem("Swahili (sw)", "sw"); + ui->vocalLanguageCombo->addItem("Tamil (ta)", "ta"); + ui->vocalLanguageCombo->addItem("Telugu (te)", "te"); + ui->vocalLanguageCombo->addItem("Thai (th)", "th"); + ui->vocalLanguageCombo->addItem("Tagalog (tl)", "tl"); + ui->vocalLanguageCombo->addItem("Turkish (tr)", "tr"); + ui->vocalLanguageCombo->addItem("Ukrainian (uk)", "uk"); + ui->vocalLanguageCombo->addItem("Urdu (ur)", "ur"); + ui->vocalLanguageCombo->addItem("Vietnamese (vi)", "vi"); + ui->vocalLanguageCombo->addItem("Cantonese (yue)", "yue"); + ui->vocalLanguageCombo->addItem("Unknown", "unknown"); // Set current language if provided if (!vocalLanguage.isEmpty()) From 61003eb84ccdd2ae4143b09b8ad7d73152677b53 Mon Sep 17 00:00:00 2001 From: unknown <16974509+cynodesmus@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:46:12 +0400 Subject: [PATCH 2/5] fix: correct typos in comments, error messages, variables - Fixed spelling in comments throughout codebase - Corrected error messages and user-facing strings - Standardized variable names (cancleGenerateion --> cancelGeneration where needed) - No functional changes, purely cosmetic fixes --- src/AceStepWorker.cpp | 12 ++++++------ src/AceStepWorker.h | 6 +++--- src/MainWindow.cpp | 8 ++++---- src/SongItem.h | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/AceStepWorker.cpp b/src/AceStepWorker.cpp index 836a904..fc999f2 100644 --- a/src/AceStepWorker.cpp +++ b/src/AceStepWorker.cpp @@ -18,14 +18,14 @@ AceStep::AceStep(QObject* parent): QObject(parent) connect(&ditVaeProcess, &QProcess::finished, this, &AceStep::ditProcFinished); } -bool AceStep::isGenerateing(SongItem* song) +bool AceStep::isGenerating(SongItem* song) { if(!busy && song) *song = this->request.song; return busy; } -void AceStep::cancleGenerateion() +void AceStep::cancelGeneration() { qwenProcess.blockSignals(true); qwenProcess.terminate(); @@ -39,7 +39,7 @@ void AceStep::cancleGenerateion() progressUpdate(100); if(busy) - generationCancled(request.song); + generationCanceled(request.song); busy = false; } @@ -50,7 +50,7 @@ bool AceStep::requestGeneration(SongItem song, QString requestTemplate, QString { if(busy) { - qWarning()<<"Droping song:"<progressBar, &QProgressBar::setValue); @@ -102,7 +102,7 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { - aceStep->cancleGenerateion(); + aceStep->cancelGeneration(); autoSavePlaylist(); saveSettings(); @@ -523,7 +523,7 @@ void MainWindow::ensureSongsInQueue(bool enqeueCurrent) SongItem lastSong; SongItem workerSong; - if(aceStep->isGenerateing(&workerSong)) + if(aceStep->isGenerating(&workerSong)) lastSong = workerSong; else if(!generatedSongQueue.empty()) lastSong = generatedSongQueue.last(); @@ -553,7 +553,7 @@ void MainWindow::ensureSongsInQueue(bool enqeueCurrent) void MainWindow::flushGenerationQueue() { generatedSongQueue.clear(); - aceStep->cancleGenerateion(); + aceStep->cancelGeneration(); isGeneratingNext = false; } diff --git a/src/SongItem.h b/src/SongItem.h index d64f041..71f7af8 100644 --- a/src/SongItem.h +++ b/src/SongItem.h @@ -21,7 +21,7 @@ public: inline SongItem(const QString &caption = "", const QString &lyrics = "") : caption(caption), lyrics(lyrics) { - // Generate a unique ID using cryptographically secure random number + // Generate a unique ID using a cryptographically secure random number uniqueId = QRandomGenerator::global()->generate64(); } }; From 6297477e29c943e4c4d6ac7d0d56f56339016c14 Mon Sep 17 00:00:00 2001 From: unknown <16974509+cynodesmus@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:35:01 +0400 Subject: [PATCH 3/5] feat: restore WAV as default output (aceradio compatibility) acestep.cpp previously generated *.wav by default for maximum quality. Later changed to mp3, but aceradio expects WAV input. - Revert to WAV default to match aceradio workflow - No conversion overhead or compatibility issues - Preserves original high-quality generation logic --- src/AceStepWorker.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AceStepWorker.cpp b/src/AceStepWorker.cpp index fc999f2..1528805 100644 --- a/src/AceStepWorker.cpp +++ b/src/AceStepWorker.cpp @@ -181,6 +181,7 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status) ditVaeArgs << "--text-encoder"< Date: Mon, 16 Mar 2026 23:37:30 +0400 Subject: [PATCH 4/5] feat: rename binaries ace-qwen3 --> ace-lm, dit-vae --> ace-synth (1e627bf+) In acestep.cpp since commit 1e627bf, binary file names changed: - ace-qwen3 --> ace-lm - dit-vae --> ace-synth ! For users of previous aceradio versions: - Delete settings for re-configuration - Binaries rebuild with new names --- src/AceStepWorker.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/AceStepWorker.cpp b/src/AceStepWorker.cpp index 1528805..6f4bbe8 100644 --- a/src/AceStepWorker.cpp +++ b/src/AceStepWorker.cpp @@ -57,11 +57,11 @@ bool AceStep::requestGeneration(SongItem song, QString requestTemplate, QString request = {song, QRandomGenerator::global()->generate(), aceStepPath, textEncoderModelPath, ditModelPath, vaeModelPath}; - QString qwen3Binary = aceStepPath + "/ace-qwen3"; + QString qwen3Binary = aceStepPath + "/ace-lm"; QFileInfo qwen3Info(qwen3Binary); if (!qwen3Info.exists() || !qwen3Info.isExecutable()) { - generationError("ace-qwen3 binary not found at: " + qwen3Binary); + generationError("ace-lm binary not found at: " + qwen3Binary); busy = false; return false; } @@ -136,16 +136,16 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status) if(code != 0) { QString errorOutput = qwenProcess.readAllStandardError(); - generationError("ace-qwen3 exited with code " + QString::number(code) + ": " + errorOutput); + generationError("ace-lm exited with code " + QString::number(code) + ": " + errorOutput); busy = false; return; } - QString ditVaeBinary = request.aceStepPath + "/dit-vae"; + QString ditVaeBinary = request.aceStepPath + "/ace-synth"; QFileInfo ditVaeInfo(ditVaeBinary); if (!ditVaeInfo.exists() || !ditVaeInfo.isExecutable()) { - generationError("dit-vae binary not found at: " + ditVaeBinary); + generationError("ace-synth binary not found at: " + ditVaeBinary); busy = false; return; } @@ -153,7 +153,7 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status) request.requestLlmFilePath = tempDir + "/request_" + QString::number(request.uid) + "0.json"; if (!QFileInfo::exists(request.requestLlmFilePath)) { - generationError("ace-qwen3 failed to create enhanced request file "+request.requestLlmFilePath); + generationError("ace-lm failed to create enhanced request file "+request.requestLlmFilePath); busy = false; return; } @@ -175,7 +175,7 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status) } } - // Step 2: Run dit-vae to generate audio + // Step 2: Run ace-synth to generate audio QStringList ditVaeArgs; ditVaeArgs << "--request"< Date: Tue, 17 Mar 2026 18:37:20 +0400 Subject: [PATCH 5/5] feat: add Windows compatibility for external process execution This PR introduces cross-platform support for launching external binaries (`ace-lm` and `ace-synth`) on Windows systems. **Key changes:** * Introduced `EXE_EXT` constant in `AceStepWorker.h` using `Q_OS_WIN` macro to handle `.exe` extensions automatically. * Updated binary path construction to ensure `QFileInfo::isExecutable()` and `QProcess` work correctly on Windows. * The code remains fully compatible with Linux/macOS (extension remains empty). **Why this is needed:** On Windows, `QProcess` and `QFileInfo` require the `.exe` suffix to correctly identify and execute binary files. Without this change, the application fails to find the required tools even if they are present in the directory. --- README.md | 24 ++++++++++++++++++++++++ src/AceStepWorker.cpp | 4 ++-- src/AceStepWorker.h | 6 ++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4b40b46..150700f 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ make -j$(nproc) ## Building +### Linux / macOS ```bash git clone https://github.com/IMbackK/aceradio.git cd aceradio @@ -36,6 +37,29 @@ cmake .. make -j$(nproc) ``` +### Windows (Qt6 + CMake) + +To build on Windows, ensure you have **CMake** and **Qt6** installed. Run the following commands in **Command Prompt (cmd)** or **PowerShell**: + +1. **Configure and Build:** +```cmd +git clone https://github.com/IMbackK/aceradio.git +cd aceradio +mkdir build +cmake -B build -DCMAKE_PREFIX_PATH="C:/Qt/6.x.x/msvc2019_64" + +# Use --parallel to build using all CPU cores +# Or use -j N (e.g., -j 4) to limit the number of threads +cmake --build build --config Release --parallel +``` +Note: Replace C:/Qt/6.x.x/msvc2019_64 with your actual Qt installation path. + +2. **Deploy Dependencies:** +Run windeployqt to copy necessary Qt libraries to the build folder: +```cmd +"C:\Qt\6.x.x\msvc2019_64\bin\windeployqt.exe" --no-translations build\Release\aceradio.exe +``` + ## Setup Paths: Go to settings->Ace Step->Model Paths and add the paths to the acestep.cpp binaries the models. diff --git a/src/AceStepWorker.cpp b/src/AceStepWorker.cpp index 6f4bbe8..6dce972 100644 --- a/src/AceStepWorker.cpp +++ b/src/AceStepWorker.cpp @@ -57,7 +57,7 @@ bool AceStep::requestGeneration(SongItem song, QString requestTemplate, QString request = {song, QRandomGenerator::global()->generate(), aceStepPath, textEncoderModelPath, ditModelPath, vaeModelPath}; - QString qwen3Binary = aceStepPath + "/ace-lm"; + QString qwen3Binary = aceStepPath + "/ace-lm" + EXE_EXT; QFileInfo qwen3Info(qwen3Binary); if (!qwen3Info.exists() || !qwen3Info.isExecutable()) { @@ -141,7 +141,7 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status) return; } - QString ditVaeBinary = request.aceStepPath + "/ace-synth"; + QString ditVaeBinary = request.aceStepPath + "/ace-synth" + EXE_EXT; QFileInfo ditVaeInfo(ditVaeBinary); if (!ditVaeInfo.exists() || !ditVaeInfo.isExecutable()) { diff --git a/src/AceStepWorker.h b/src/AceStepWorker.h index bcdf6b5..17962f8 100644 --- a/src/AceStepWorker.h +++ b/src/AceStepWorker.h @@ -13,6 +13,12 @@ #include "SongItem.h" +#ifdef Q_OS_WIN +inline const QString EXE_EXT = ".exe"; +#else +inline const QString EXE_EXT = ""; +#endif + class AceStep : public QObject { Q_OBJECT