Fix generation of second song by using a uid isntead of the pid for the request

This commit is contained in:
Carl Philipp Klemm 2026-03-04 19:31:55 +01:00
parent d9190ed756
commit 5fcb6a4149
4 changed files with 65 additions and 30 deletions

View file

@ -7,6 +7,8 @@
#include <QStandardPaths> #include <QStandardPaths>
#include <QDebug> #include <QDebug>
#include <QCoreApplication> #include <QCoreApplication>
#include <QRandomGenerator>
#include <cstdint>
AceStepWorker::AceStepWorker(QObject *parent) AceStepWorker::AceStepWorker(QObject *parent)
: QObject(parent), : QObject(parent),
@ -48,10 +50,10 @@ void AceStepWorker::workerFinished()
// Worker implementation // Worker implementation
void AceStepWorker::Worker::run() void AceStepWorker::Worker::run()
{ {
uint64_t uid = QRandomGenerator::global()->generate();
// Create temporary JSON file for the request // Create temporary JSON file for the request
QString tempDir = QStandardPaths::writableLocation(QStandardPaths::TempLocation); QString tempDir = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
QString requestFile = tempDir + "/request_" + QString::number(QCoreApplication::applicationPid()) + ".json"; QString requestFile = tempDir + "/request_" + QString::number(uid) + ".json";
// Parse and modify the template // Parse and modify the template
QJsonParseError parseError; QJsonParseError parseError;
@ -139,10 +141,10 @@ void AceStepWorker::Worker::run()
return; return;
} }
if (!qwen3Process.waitForFinished(30000)) { // 30 second timeout if (!qwen3Process.waitForFinished(60000)) { // 60 second timeout
qwen3Process.terminate(); qwen3Process.terminate();
qwen3Process.waitForFinished(5000); qwen3Process.waitForFinished(5000);
emit parent->generationError("ace-qwen3 timed out after 30 seconds"); emit parent->generationError("ace-qwen3 timed out after 60 seconds");
return; return;
} }
@ -153,12 +155,18 @@ void AceStepWorker::Worker::run()
return; return;
} }
QString requestLmOutputFile = tempDir + "/request_" + QString::number(uid) + "0.json";
if (!QFileInfo::exists(requestLmOutputFile)) {
emit parent->generationError("ace-qwen3 failed to create enhaced request file "+requestLmOutputFile);
return;
}
emit parent->progressUpdate(50); emit parent->progressUpdate(50);
// Step 2: Run dit-vae to generate audio // Step 2: Run dit-vae to generate audio
QProcess ditVaeProcess; QProcess ditVaeProcess;
QStringList ditVaeArgs; QStringList ditVaeArgs;
ditVaeArgs << "--request" << requestFile; ditVaeArgs << "--request" << requestLmOutputFile;
ditVaeArgs << "--text-encoder" << textEncoderModel; ditVaeArgs << "--text-encoder" << textEncoderModel;
ditVaeArgs << "--dit" << ditModel; ditVaeArgs << "--dit" << ditModel;
ditVaeArgs << "--vae" << vaeModel; ditVaeArgs << "--vae" << vaeModel;
@ -188,17 +196,14 @@ void AceStepWorker::Worker::run()
emit parent->progressUpdate(90); emit parent->progressUpdate(90);
// Find the generated WAV file // Find the generated WAV file
QDir requestDir(QFileInfo(requestFile).absolutePath()); QString wavFile = QFileInfo(requestFile).absolutePath()+"/request_" + QString::number(uid) + "00.wav";
QStringList wavFiles = requestDir.entryList(QStringList("request*.wav"), QDir::Files, QDir::Name); if (!QFileInfo::exists(wavFile)) {
emit parent->generationError("No WAV file generated at "+wavFile);
if (wavFiles.isEmpty()) {
emit parent->generationError("No WAV file generated");
return; return;
} }
QString wavFile = requestDir.absoluteFilePath(wavFiles.first());
// Clean up temporary files // Clean up temporary files
QFile::remove(requestLmOutputFile);
QFile::remove(requestFile); QFile::remove(requestFile);
emit parent->progressUpdate(100); emit parent->progressUpdate(100);

View file

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.14) cmake_minimum_required(VERSION 3.14)
project(MusicGeneratorGUI LANGUAGES CXX) project(aceradio LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
@ -7,14 +7,13 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Find Qt packages # Find Qt packages
find_package(Qt6 COMPONENTS Core Gui Widgets Multimedia REQUIRED) find_package(Qt6 COMPONENTS Core Gui Widgets Multimedia REQUIRED)
# Include acestep.cpp as a subdirectory # Note: acestep.cpp binaries and models should be provided at runtime
#add_subdirectory(acestep.cpp)
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOUIC ON)
# Add executable # Add executable
add_executable(MusicGeneratorGUI add_executable(${PROJECT_NAME}
main.cpp main.cpp
MainWindow.ui MainWindow.ui
MainWindow.cpp MainWindow.cpp
@ -25,25 +24,19 @@ add_executable(MusicGeneratorGUI
) )
# UI file # UI file
target_include_directories(MusicGeneratorGUI PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
# Link libraries # Link libraries (only Qt libraries - acestep.cpp is external)
target_link_libraries(MusicGeneratorGUI PRIVATE target_link_libraries(${PROJECT_NAME} PRIVATE
Qt6::Core Qt6::Core
Qt6::Gui Qt6::Gui
Qt6::Widgets Qt6::Widgets
Qt6::Multimedia Qt6::Multimedia
acestep-core
) )
# Include directories # Include directories (only our source directory - acestep.cpp is external)
target_include_directories(MusicGeneratorGUI PRIVATE target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/acestep.cpp/src
${CMAKE_CURRENT_SOURCE_DIR}/acestep.cpp/ggml/include
) )
# Copy models directory if it exists # Note: acestep.cpp binaries (ace-qwen3, dit-vae) and models should be provided at runtime
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/acestep.cpp/models")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/acestep.cpp/models" DESTINATION "${CMAKE_BINARY_DIR}")
endif()

View file

@ -11,6 +11,7 @@
#include <QLabel> #include <QLabel>
#include <QTabWidget> #include <QTabWidget>
#include <QLineEdit> #include <QLineEdit>
#include <QScrollBar>
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), : QMainWindow(parent),
@ -116,6 +117,7 @@ void MainWindow::updateControls()
ui->playButton->setEnabled(hasSongs && !isPlaying); ui->playButton->setEnabled(hasSongs && !isPlaying);
ui->skipButton->setEnabled(isPlaying); ui->skipButton->setEnabled(isPlaying);
ui->stopButton->setEnabled(isPlaying);
ui->addSongButton->setEnabled(true); ui->addSongButton->setEnabled(true);
ui->editSongButton->setEnabled(hasSongs && ui->songListView->currentIndex().isValid()); ui->editSongButton->setEnabled(hasSongs && ui->songListView->currentIndex().isValid());
ui->removeSongButton->setEnabled(hasSongs && ui->songListView->currentIndex().isValid()); ui->removeSongButton->setEnabled(hasSongs && ui->songListView->currentIndex().isValid());
@ -148,6 +150,17 @@ void MainWindow::on_skipButton_clicked()
} }
} }
void MainWindow::on_stopButton_clicked()
{
if (isPlaying) {
// Stop current playback completely
audioPlayer->stop();
isPlaying = false;
ui->statusLabel->setText("Stopped");
updateControls();
}
}
void MainWindow::on_shuffleButton_clicked() void MainWindow::on_shuffleButton_clicked()
{ {
shuffleMode = ui->shuffleButton->isChecked(); shuffleMode = ui->shuffleButton->isChecked();
@ -414,9 +427,32 @@ void MainWindow::playNextSong()
void MainWindow::generationError(const QString &error) void MainWindow::generationError(const QString &error)
{ {
QMessageBox::critical(this, "Generation Error", "Failed to generate song: " + error); // Show detailed error in a dialog with QTextEdit
QDialog dialog(this);
dialog.setWindowTitle("Generation Error");
dialog.resize(600, 400);
QVBoxLayout *layout = new QVBoxLayout(&dialog);
QLabel *errorLabel = new QLabel("Error occurred during music generation:");
errorLabel->setStyleSheet("font-weight: bold; color: darkred;");
layout->addWidget(errorLabel);
QTextEdit *errorTextEdit = new QTextEdit();
errorTextEdit->setReadOnly(true);
errorTextEdit->setPlainText(error);
errorTextEdit->setLineWrapMode(QTextEdit::NoWrap);
errorTextEdit->setFontFamily("Monospace");
layout->addWidget(errorTextEdit);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok);
layout->addWidget(buttonBox);
connect(buttonBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
dialog.exec();
isPlaying = false; isPlaying = false;
ui->statusLabel->setText("Error: " + error);
updateControls(); updateControls();
} }

View file

@ -24,6 +24,7 @@ public:
private slots: private slots:
void on_playButton_clicked(); void on_playButton_clicked();
void on_skipButton_clicked(); void on_skipButton_clicked();
void on_stopButton_clicked();
void on_shuffleButton_clicked(); void on_shuffleButton_clicked();
void on_addSongButton_clicked(); void on_addSongButton_clicked();
void on_editSongButton_clicked(); void on_editSongButton_clicked();