Compare commits

..

No commits in common. "cb096388c8ff6d43266d40ef63890ff42743d86a" and "6f36719795cf84277eb8c026c50f1c630f61a379" have entirely different histories.

6 changed files with 25 additions and 98 deletions

View file

@ -28,7 +28,6 @@ make -j$(nproc)
## Building ## Building
### Linux / macOS
```bash ```bash
git clone https://github.com/IMbackK/aceradio.git git clone https://github.com/IMbackK/aceradio.git
cd aceradio cd aceradio
@ -37,29 +36,6 @@ cmake ..
make -j$(nproc) 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: ## Setup Paths:
Go to settings->Ace Step->Model Paths and add the paths to the acestep.cpp binaries the models. Go to settings->Ace Step->Model Paths and add the paths to the acestep.cpp binaries the models.

View file

@ -18,14 +18,14 @@ AceStep::AceStep(QObject* parent): QObject(parent)
connect(&ditVaeProcess, &QProcess::finished, this, &AceStep::ditProcFinished); connect(&ditVaeProcess, &QProcess::finished, this, &AceStep::ditProcFinished);
} }
bool AceStep::isGenerating(SongItem* song) bool AceStep::isGenerateing(SongItem* song)
{ {
if(!busy && song) if(!busy && song)
*song = this->request.song; *song = this->request.song;
return busy; return busy;
} }
void AceStep::cancelGeneration() void AceStep::cancleGenerateion()
{ {
qwenProcess.blockSignals(true); qwenProcess.blockSignals(true);
qwenProcess.terminate(); qwenProcess.terminate();
@ -39,7 +39,7 @@ void AceStep::cancelGeneration()
progressUpdate(100); progressUpdate(100);
if(busy) if(busy)
generationCanceled(request.song); generationCancled(request.song);
busy = false; busy = false;
} }
@ -50,18 +50,18 @@ bool AceStep::requestGeneration(SongItem song, QString requestTemplate, QString
{ {
if(busy) if(busy)
{ {
qWarning()<<"Dropping song:"<<song.caption; qWarning()<<"Droping song:"<<song.caption;
return false; return false;
} }
busy = true; busy = true;
request = {song, QRandomGenerator::global()->generate(), aceStepPath, textEncoderModelPath, ditModelPath, vaeModelPath}; request = {song, QRandomGenerator::global()->generate(), aceStepPath, textEncoderModelPath, ditModelPath, vaeModelPath};
QString qwen3Binary = aceStepPath + "/ace-lm" + EXE_EXT; QString qwen3Binary = aceStepPath + "/ace-qwen3";
QFileInfo qwen3Info(qwen3Binary); QFileInfo qwen3Info(qwen3Binary);
if (!qwen3Info.exists() || !qwen3Info.isExecutable()) if (!qwen3Info.exists() || !qwen3Info.isExecutable())
{ {
generationError("ace-lm binary not found at: " + qwen3Binary); generationError("ace-qwen3 binary not found at: " + qwen3Binary);
busy = false; busy = false;
return false; return false;
} }
@ -136,16 +136,16 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status)
if(code != 0) if(code != 0)
{ {
QString errorOutput = qwenProcess.readAllStandardError(); QString errorOutput = qwenProcess.readAllStandardError();
generationError("ace-lm exited with code " + QString::number(code) + ": " + errorOutput); generationError("dit-vae exited with code " + QString::number(code) + ": " + errorOutput);
busy = false; busy = false;
return; return;
} }
QString ditVaeBinary = request.aceStepPath + "/ace-synth" + EXE_EXT; QString ditVaeBinary = request.aceStepPath + "/dit-vae";
QFileInfo ditVaeInfo(ditVaeBinary); QFileInfo ditVaeInfo(ditVaeBinary);
if (!ditVaeInfo.exists() || !ditVaeInfo.isExecutable()) if (!ditVaeInfo.exists() || !ditVaeInfo.isExecutable())
{ {
generationError("ace-synth binary not found at: " + ditVaeBinary); generationError("dit-vae binary not found at: " + ditVaeBinary);
busy = false; busy = false;
return; return;
} }
@ -153,7 +153,7 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status)
request.requestLlmFilePath = tempDir + "/request_" + QString::number(request.uid) + "0.json"; request.requestLlmFilePath = tempDir + "/request_" + QString::number(request.uid) + "0.json";
if (!QFileInfo::exists(request.requestLlmFilePath)) if (!QFileInfo::exists(request.requestLlmFilePath))
{ {
generationError("ace-lm failed to create enhanced request file "+request.requestLlmFilePath); generationError("ace-qwen3 failed to create enhaced request file "+request.requestLlmFilePath);
busy = false; busy = false;
return; return;
} }
@ -175,13 +175,12 @@ void AceStep::qwenProcFinished(int code, QProcess::ExitStatus status)
} }
} }
// Step 2: Run ace-synth to generate audio // Step 2: Run dit-vae to generate audio
QStringList ditVaeArgs; QStringList ditVaeArgs;
ditVaeArgs << "--request"<<request.requestLlmFilePath; ditVaeArgs << "--request"<<request.requestLlmFilePath;
ditVaeArgs << "--text-encoder"<<request.textEncoderModelPath; ditVaeArgs << "--text-encoder"<<request.textEncoderModelPath;
ditVaeArgs << "--dit"<<request.ditModelPath; ditVaeArgs << "--dit"<<request.ditModelPath;
ditVaeArgs << "--vae"<<request.vaeModelPath; ditVaeArgs << "--vae"<<request.vaeModelPath;
ditVaeArgs << "--wav";
progressUpdate(60); progressUpdate(60);
@ -194,7 +193,7 @@ void AceStep::ditProcFinished(int code, QProcess::ExitStatus status)
if (code != 0) if (code != 0)
{ {
QString errorOutput = ditVaeProcess.readAllStandardError(); QString errorOutput = ditVaeProcess.readAllStandardError();
generationError("ace-synth exited with code " + QString::number(code) + ": " + errorOutput); generationError("dit-vae exited with code " + QString::number(code) + ": " + errorOutput);
busy = false; busy = false;
return; return;
} }

View file

@ -13,12 +13,6 @@
#include "SongItem.h" #include "SongItem.h"
#ifdef Q_OS_WIN
inline const QString EXE_EXT = ".exe";
#else
inline const QString EXE_EXT = "";
#endif
class AceStep : public QObject class AceStep : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -45,7 +39,7 @@ class AceStep : public QObject
signals: signals:
void songGenerated(SongItem song); void songGenerated(SongItem song);
void generationCanceled(SongItem song); void generationCancled(SongItem song);
void generationError(QString error); void generationError(QString error);
void progressUpdate(int progress); void progressUpdate(int progress);
@ -56,8 +50,8 @@ public slots:
public: public:
AceStep(QObject* parent = nullptr); AceStep(QObject* parent = nullptr);
bool isGenerating(SongItem* song = nullptr); bool isGenerateing(SongItem* song = nullptr);
void cancelGeneration(); void cancleGenerateion();
private slots: private slots:
void qwenProcFinished(int code, QProcess::ExitStatus status); void qwenProcFinished(int code, QProcess::ExitStatus status);

View file

@ -63,7 +63,7 @@ MainWindow::MainWindow(QWidget *parent)
connect(audioPlayer, &AudioPlayer::positionChanged, this, &MainWindow::updatePosition); connect(audioPlayer, &AudioPlayer::positionChanged, this, &MainWindow::updatePosition);
connect(audioPlayer, &AudioPlayer::durationChanged, this, &MainWindow::updateDuration); connect(audioPlayer, &AudioPlayer::durationChanged, this, &MainWindow::updateDuration);
connect(aceStep, &AceStep::songGenerated, this, &MainWindow::songGenerated); connect(aceStep, &AceStep::songGenerated, this, &MainWindow::songGenerated);
connect(aceStep, &AceStep::generationCanceled, this, &MainWindow::generationCanceld); connect(aceStep, &AceStep::generationCancled, this, &MainWindow::generationCanceld);
connect(aceStep, &AceStep::generationError, this, &MainWindow::generationError); connect(aceStep, &AceStep::generationError, this, &MainWindow::generationError);
connect(aceStep, &AceStep::progressUpdate, ui->progressBar, &QProgressBar::setValue); connect(aceStep, &AceStep::progressUpdate, ui->progressBar, &QProgressBar::setValue);
@ -102,7 +102,7 @@ MainWindow::MainWindow(QWidget *parent)
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
aceStep->cancelGeneration(); aceStep->cancleGenerateion();
autoSavePlaylist(); autoSavePlaylist();
saveSettings(); saveSettings();
@ -523,7 +523,7 @@ void MainWindow::ensureSongsInQueue(bool enqeueCurrent)
SongItem lastSong; SongItem lastSong;
SongItem workerSong; SongItem workerSong;
if(aceStep->isGenerating(&workerSong)) if(aceStep->isGenerateing(&workerSong))
lastSong = workerSong; lastSong = workerSong;
else if(!generatedSongQueue.empty()) else if(!generatedSongQueue.empty())
lastSong = generatedSongQueue.last(); lastSong = generatedSongQueue.last();
@ -553,7 +553,7 @@ void MainWindow::ensureSongsInQueue(bool enqeueCurrent)
void MainWindow::flushGenerationQueue() void MainWindow::flushGenerationQueue()
{ {
generatedSongQueue.clear(); generatedSongQueue.clear();
aceStep->cancelGeneration(); aceStep->cancleGenerateion();
isGeneratingNext = false; isGeneratingNext = false;
} }

View file

@ -24,56 +24,14 @@ SongDialog::SongDialog(QWidget *parent, const QString &caption, const QString &l
// Setup vocal language combo box // Setup vocal language combo box
ui->vocalLanguageCombo->addItem("--", ""); // Unset ui->vocalLanguageCombo->addItem("--", ""); // Unset
ui->vocalLanguageCombo->addItem("English (en)", "en"); ui->vocalLanguageCombo->addItem("English (en)", "en");
ui->vocalLanguageCombo->addItem("Chinese (zh)", "zh");
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("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("Portuguese (pt)", "pt"); ui->vocalLanguageCombo->addItem("Portuguese (pt)", "pt");
ui->vocalLanguageCombo->addItem("Russian (ru)", "ru"); 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 // Set current language if provided
if (!vocalLanguage.isEmpty()) if (!vocalLanguage.isEmpty())

View file

@ -21,7 +21,7 @@ public:
inline SongItem(const QString &caption = "", const QString &lyrics = "") inline SongItem(const QString &caption = "", const QString &lyrics = "")
: caption(caption), lyrics(lyrics) : caption(caption), lyrics(lyrics)
{ {
// Generate a unique ID using a cryptographically secure random number // Generate a unique ID using cryptographically secure random number
uniqueId = QRandomGenerator::global()->generate64(); uniqueId = QRandomGenerator::global()->generate64();
} }
}; };