Ai.Audio.Continuous.js
JavaScript source for Endless music with MusicGen, 74 lines. Raw file
const Security = require("Security");
const Docker = require("Docker");
const WebSocket = require("ws");
const Ai = {
Audio: {
Continuous: (seedPrompt, settings, saveChunk, getPrompt) => {
Security.String(seedPrompt)
Security.Check(seedPrompt.length > 0, `Prompt is too short, please provide more context`);
Security.Object("Ai.Audio.Continuous")(settings)
Security.Callback(saveChunk)
Security.Callback(getPrompt)
const serviceName = `ai-continuous`;
const serverPort = 3003;
const serverUri = `ws://localhost:${serverPort}`;
delete settings._is
const isStarted = Docker.Container.Exists(serviceName, true);
const connHandler = () => {
console.log("Attempting to connect...")
const ws = new WebSocket(serverUri);
ws.on('open', function () {
const payload = JSON.stringify({
started: true,
prompt: seedPrompt,
settings
});
console.log("Handshake complete")
ws.send(payload);
});
ws.on('message', function (data) {
const {success, chunk, progress} = JSON.parse(data);
if (success !== undefined) {
console.log("Server finished")
} else if (chunk !== undefined) {
saveChunk(chunk)
} else if (progress !== undefined) {
const newPrompt = getPrompt()
saveChunk(progress)
console.log("sending new chunk - ", {
finished: newPrompt==="",
prompt: newPrompt
})
ws.send(JSON.stringify({
finished: newPrompt==="",
prompt: newPrompt
}))
} else {
console.log(data)
throw new Error(`Unrecognized server response`);
}
});
ws.on('error', function (error) {
setTimeout(connHandler, 5000)
});
}
if (!isStarted) {
console.log("Starting server...")
const isGpu = settings.device.toLowerCase() === "cuda"
let containerId = Docker.Service.AI.AUDIO_STREAM(serviceName, serverPort, isGpu);
console.log("Started audiocraft server with ID: " + containerId)
setTimeout(connHandler, 10000);
}
else {
console.log("Ai server already running")
connHandler()
}
}
}
}
module.exports = Ai.Audio.Continuous