woolball-client
Version:
Client-side library for Woolball enabling secure browser resource sharing for distributed AI task processing
94 lines (93 loc) • 3.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.tts = void 0;
const media_1 = require("../media");
const KOKORO_MODEL_ID = ['onnx-community/Kokoro-82M-ONNX', 'onnx-community/Kokoro-82M-v1.0-ONNX'];
const SUPPORTED_MODEL_PREFIXES = ['xenova/mms-tts-', 'onnx-community/kokoro'];
async function tts(data) {
const { input, model, dtype, ...options } = data;
console.log('TTS function called with:', { input, model, dtype, ...options });
try {
// Check supported models
const isKokoro = KOKORO_MODEL_ID.includes(model);
const isSupportedModel = SUPPORTED_MODEL_PREFIXES.some(prefix => model.toLowerCase().includes(prefix.toLowerCase()));
console.log('Model analysis:', { isKokoro, isSupportedModel });
// Warning for unrecognized models
if (!isKokoro && !isSupportedModel) {
console.warn('Model not explicitly recognized, trying to process:', model);
}
if (isKokoro) {
console.log('Using Kokoro processor for TTS');
return await processKokoroTTS(input, model, dtype, options);
}
else {
console.log('Using Transformers processor for TTS with model:', model);
return await processTransformersTTS(input, model, dtype, options);
}
}
catch (error) {
console.error('Error in tts():', error);
const errorMessage = error instanceof Error ?
error.message :
'Unknown error in text-to-speech processing';
console.error('TTS error details:', errorMessage);
if (error instanceof Error && error.stack) {
console.error('Stack trace:', error.stack);
}
throw error;
}
}
exports.tts = tts;
async function processTransformersTTS(text, model, dtype, options = {}) {
console.log('processTransformersTTS started with:', { text, model, dtype });
try {
const { pipeline } = await import('@huggingface/transformers');
const pipe = await pipeline('text-to-speech', model, {
dtype: dtype,
device: 'wasm',
});
const result = await pipe(text, options);
const wavEncoder = await import('wav-encoder');
const wavBuffer = await wavEncoder.encode({
sampleRate: 16000,
channelData: [result.audio]
});
await pipe.dispose();
return {
audio: (0, media_1.bufferToBase64)(wavBuffer)
};
}
catch (error) {
console.error('Error in processTransformersTTS:', error);
// Generic error messages for any problem
if (error instanceof Error) {
if (error.message.includes('Unsupported model type') ||
error.message.includes('AutoModel')) {
console.error('Unsupported model type error');
throw new Error(`Unsupported model type: ${model}. Please use Xenova/mms-tts-* or Kokoro.`);
}
}
throw error;
}
}
async function processKokoroTTS(text, model, dtype, options = {}) {
console.log('processKokoroTTS started with:', { text, model, dtype, options });
try {
const { KokoroTTS } = await import('kokoro-js');
const tts = await KokoroTTS.from_pretrained(model, { dtype: dtype || 'q8' });
const audio = await tts.generate(text, {
voice: options.voice
});
tts.dispose?.();
const audioBlob = audio.toBlob();
const arrayBuffer = await (0, media_1.blobToArrayBuffer)(audioBlob);
const base64Audio = (0, media_1.bufferToBase64)(arrayBuffer);
return {
audio: base64Audio
};
}
catch (error) {
console.error('Error in processKokoroTTS:', error);
throw error;
}
}