short-video-maker
Version:
Creates short videos for TikTok, Instagram Reels, and YouTube Shorts using the Model Context Protocol (MCP) and a REST API.
62 lines (61 loc) • 2.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Kokoro = void 0;
const kokoro_js_1 = require("kokoro-js");
const shorts_1 = require("../../types/shorts");
const config_1 = require("../../config");
class Kokoro {
tts;
constructor(tts) {
this.tts = tts;
}
async generate(text, voice) {
const splitter = new kokoro_js_1.TextSplitterStream();
const stream = this.tts.stream(splitter, {
voice,
});
splitter.push(text);
splitter.close();
const output = [];
for await (const audio of stream) {
output.push(audio);
}
const audioBuffers = [];
let audioLength = 0;
for (const audio of output) {
audioBuffers.push(audio.audio.toWav());
audioLength += audio.audio.audio.length / audio.audio.sampling_rate;
}
const mergedAudioBuffer = Kokoro.concatWavBuffers(audioBuffers);
config_1.logger.debug({ text, voice, audioLength }, "Audio generated with Kokoro");
return {
audio: mergedAudioBuffer,
audioLength: audioLength,
};
}
static concatWavBuffers(buffers) {
const header = Buffer.from(buffers[0].slice(0, 44));
let totalDataLength = 0;
const dataParts = buffers.map((buf) => {
const b = Buffer.from(buf);
const data = b.slice(44);
totalDataLength += data.length;
return data;
});
header.writeUInt32LE(36 + totalDataLength, 4);
header.writeUInt32LE(totalDataLength, 40);
return Buffer.concat([header, ...dataParts]);
}
static async init(dtype) {
const tts = await kokoro_js_1.KokoroTTS.from_pretrained(config_1.KOKORO_MODEL, {
dtype,
device: "cpu", // only "cpu" is supported in node
});
return new Kokoro(tts);
}
listAvailableVoices() {
const voices = Object.values(shorts_1.VoiceEnum);
return voices;
}
}
exports.Kokoro = Kokoro;