Add support for ACE-Step 1.5 and ACE-Step 1.5 XL. Also added dataset captioning through the UI. (#785)
* Base ace step 1.5 xl added. Generating, still wip on training and ui * Base training code done * Fix some issues with caching text embeddings. Update sample cards to show audio * Fix issue with quantizing ace step * Add album artwork to samples with waveform. * Cleanup logs * Add album art endpoint to speed up album art loading * Made an make video with artwork script * Make ui handle basic audio models. Make multi line adjustments to the editor and better syntax hilighting. * Add prompt tagging system for special tagged models. * prompt tagging processing for ui working. * Moved default samples to a special file so we can add more when needed and they can be adjusted for a specific model * Add a captioner job with music captioner that is prepped for use with the ui * Add basit ui setup for captioning modal and handeling captioning jobs * Starting captioning job from ui working. Still better management for it. * Better filtering of job options in the job view for captioning jobs * Added qwen3 vl as a captioner for images * Have an indicator when a dataset is being captioned. * Adjust the way caption jobs look in the queue * Fix a few issues. Adjust defaults. * Version bump * Added ace step to the readme.
This commit is contained in:
@@ -11,3 +11,43 @@ export const audioExtensions = ['.mp3', '.wav'];
|
||||
export const isVideo = (filePath: string) => videoExtensions.includes(filePath.toLowerCase().slice(-4));
|
||||
export const isImage = (filePath: string) => imgExtensions.includes(filePath.toLowerCase().slice(-4));
|
||||
export const isAudio = (filePath: string) => audioExtensions.includes(filePath.toLowerCase().slice(-4));
|
||||
|
||||
export const tagsToObj = (tagStr: string): Record<string, any> => {
|
||||
const result: Record<string, any> = {};
|
||||
const regex = /<([A-Z_][A-Z0-9_]*)>([\s\S]*?)<\/\1>/g;
|
||||
let match;
|
||||
while ((match = regex.exec(tagStr)) !== null) {
|
||||
const value = match[2].trim();
|
||||
try {
|
||||
result[match[1]] = JSON.parse(value);
|
||||
} catch {
|
||||
result[match[1]] = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
export const objToTags = (obj: Record<string, any>): string => {
|
||||
return Object.entries(obj)
|
||||
.map(([key, value]) => {
|
||||
const content = typeof value === 'string' ? value : JSON.stringify(value);
|
||||
return `<${key}>${content}</${key}>`;
|
||||
})
|
||||
.join('\n');
|
||||
};
|
||||
|
||||
export const pathJoin = (...parts: string[]) => {
|
||||
const sep = parts.length > 0 && parts[0].includes('\\') ? '\\' : '/';
|
||||
const leadingTrailing = sep === '\\' ? /^\\+|\\+$/g : /^\/+|\/+$/g;
|
||||
const trailing = sep === '\\' ? /\\+$/ : /\/+$/;
|
||||
return parts
|
||||
.map((part, index) => {
|
||||
if (index === 0) {
|
||||
return part.replace(trailing, '');
|
||||
} else {
|
||||
return part.replace(leadingTrailing, '');
|
||||
}
|
||||
})
|
||||
.filter(part => part.length > 0)
|
||||
.join(sep);
|
||||
}
|
||||
@@ -74,14 +74,18 @@ export const getAvaliableJobActions = (job: Job) => {
|
||||
const jobConfig = getJobConfig(job);
|
||||
const isStopping = job.stop && job.status === 'running';
|
||||
const canDelete = ['queued', 'completed', 'stopped', 'error'].includes(job.status) && !isStopping;
|
||||
const canEdit = ['queued','completed', 'stopped', 'error'].includes(job.status) && !isStopping;
|
||||
let canEdit = ['queued', 'completed', 'stopped', 'error'].includes(job.status) && !isStopping;
|
||||
const canRemoveFromQueue = job.status === 'queued';
|
||||
const canStop = job.status === 'running' && !isStopping;
|
||||
let canStart = ['stopped', 'error'].includes(job.status) && !isStopping;
|
||||
// can resume if more steps were added
|
||||
if (job.status === 'completed' && jobConfig.config.process[0].train.steps > job.step && !isStopping) {
|
||||
if (job.status === 'completed' && (jobConfig.config.process[0].train?.steps || 0) > job.step && !isStopping) {
|
||||
canStart = true;
|
||||
}
|
||||
if (job.job_type !== 'train') {
|
||||
// for non-train jobs, allow editing unless it's currently running
|
||||
canEdit = false;
|
||||
}
|
||||
return { canDelete, canEdit, canStop, canStart, canRemoveFromQueue };
|
||||
};
|
||||
|
||||
@@ -92,5 +96,5 @@ export const getNumberOfSamples = (job: Job) => {
|
||||
|
||||
export const getTotalSteps = (job: Job) => {
|
||||
const jobConfig = getJobConfig(job);
|
||||
return jobConfig.config.process[0].train.steps;
|
||||
return jobConfig.config.process[0].train?.steps || 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user