Spaces:
Running
Running
import { pipeline } from '@xenova/transformers'; | |
/** | |
* This class uses the Singleton pattern to ensure that only one instance of the | |
* pipeline is loaded. This is because loading the pipeline is an expensive | |
* operation and we don't want to do it every time we want to translate a sentence. | |
*/ | |
class MyTranslationPipeline { | |
static task = "translation"; | |
static model = "tarsssss/eng-jagoy-t5-001"; | |
static instance = null; | |
static async getInstance(progress_callback = null) { | |
if (this.instance === null) { | |
this.instance = pipeline(this.task, this.model, { progress_callback }); | |
} | |
return this.instance; | |
} | |
} | |
// Listen for messages from the main thread | |
self.addEventListener('message', async (event) => { | |
// Retrieve the translation pipeline. When called for the first time, | |
// this will load the pipeline and save it for future use. | |
let translator = await MyTranslationPipeline.getInstance(x => { | |
// We also add a progress callback to the pipeline so that we can | |
// track model loading. | |
self.postMessage(x); | |
}); | |
// Actually perform the translation | |
let output = await translator(event.data.text, { | |
tgt_lang: event.data.tgt_lang, | |
src_lang: event.data.src_lang, | |
// Allows for partial output | |
callback_function: x => { | |
self.postMessage({ | |
status: 'update', | |
output: translator.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }) | |
}); | |
} | |
}); | |
// Send the output back to the main thread | |
self.postMessage({ | |
status: 'complete', | |
output: output, | |
}); | |
}); | |