安装
npm install @browsermt/bergamot-translator
快开始
import {BatchTranslator} from "@browsermt/bergamot-translator/translator.js";
const translator = new BatchTranslator();
const response = await translator.translate({
from: "en",
to: "es",
text: "Hello <em>world</em>!",
html: true
});
console.log(response.target.text);
// Stops worker threads
translator.delete();
通过量对延迟
这个套件有两种翻译执行:
- 延迟优化翻译器 更有用的交互会话,比如Google Translate, 在那里你只致力于一次翻译一个输入.
- 批量翻译器 为尽快处理大量翻译而优化(但个别翻译可能需要一些时间),例如翻译一大批字符串或文档中的所有段落.
灯光变换器
最适合交互使用的翻译。 跑出单工一线和分批一号跑出,以尽快得到响应. 它会取消任何尚未处理的翻译 如果你提交新的翻译.
const translator = new LatencyOptimisedTranslator({
pivotLanguage?: string?,
registryUrl?: string,
workerUrl?: string,
downloadTimeout?: number,
cacheSize?: number,
useNativeIntGemm?: boolean,
})
pivotLanguage- 语言编码,在没有直接翻译模式的情况下作为中间体使用。 默认为"en"设置为null以禁用导线.registryUrl- 查看一个模型及其路径清单。 默认为https://storage.googleapis.com/bergamot-models-sandbox/0.3.3/registry.json。 。 。 .workerUrl- 请说translator-worker.js默认为"worker/translator-worker.js"相对于路径translator.js。 。 。 .downloadTimeout- 我们试图在失败前下载模型文件。 默认为60000或60秒钟。 设定为0以禁用.cacheSize- 保存的翻译缓存中最高刑期(每个工人,工人不分享缓存)。 这是一个理想的极限,因为它是一个散列图, 在实践中大约1/3th被占用。 如果设置为0,则翻译缓存被禁用(默认值).useNativeIntGemm- 在装入WASM 二进制时, 尝试与本地 IntGEMM 执行链接 。 这只有在"火狐之夜"的特权扩展背景下实施. 如果失败,它将永远回到包括的执行。 默认为false。 。 。 .
翻译( )
const {request, target: {text:string}} = await translator.translate({
from: string,
to: string,
text: string,
html?: boolean,
qualityScores?: boolean
})
提交翻译请求。 其中许多是分批处理的。 下个勾点将开始一个批次(如果有工人可用).
from- 源语言的语言代码,例如:."de"to- 目标语言的语言代码,例如:."en"text- 要翻译的文本串, 例如:."Hallo Welt!"html- 布尔表示是否text仅包含纯文本或 HTMLqualityScores- 是否计算质量分数。 并非所有模型都支持这一点,你需要为它装入一个单独的质量分数模型文件. 质量分数作为<font x-bergamot-sentence-quality="">财务报告和审定财务报表<font x-bergamot-word-quality="">围绕输出中的句子和单词。 当启用时,输出总是HTML,无论输入是否是.
回返情况:
向翻译响应对象承诺 target.text 是翻译输出的文本或 HTML,以及 request 参考翻译请求原件.
删除( )
translator.delete()
用 a 取消所有未决请求 CancelledError 并立即解雇工人。 这将释放所有使用的资源.
在节点语境下,你需要调用这个,否则你的脚本不会退出,因为翻译仍然会听工人的留言.
批量翻译器
const translator = new BatchTranslator({
pivotLanguage?: string?,
registryUrl?: string,
workerUrl?: string,
downloadTimeout?: number,
cacheSize?: number,
useNativeIntGemm?: boolean,
workers?: number,
batchSize?: number,
})
一般翻译选项 :
见 延迟优化翻译器。 。 。 .
批量转换器特定选项 :
workers- 工人线条的数量。 这些是翻译的全能实例,他们自己的模型副本被装入. 此是上界相. 如果不是很多工人可以被喂饱的话,它不会创造出新的工人. 1. 默认是1。 。 。 .batchSize- 每批翻译请求的数量。 所有翻译请求中的所有句子被打入一串矩阵操作. 由于批量尺寸较大,翻译者拥有更多的材料来寻找填补矩阵的理想的句子. 然而,只有整批完成后,才能获得每批请求的结果. 默认为 8.
翻译( )
const {target: {text:string}} = await translator.translate({
from: string,
to: string,
text: string,
html?: boolean,
qualityScores?: boolean,
priority?: number
})
提交翻译请求。 其中许多是分批处理的。 下个勾点将开始一个批次(如果有工人可用).
- (见 即时变换器. translate () 对于大多数选项)
priority- 在将翻译请求分为批次发给工人时,首先考虑数量较少的请求。 例如,如果在翻译网页时,可以给当前框架中的部件请求一个更低的数字,以确保它们先得到处理.
删除( )
translator.remove(request => {
// true deletes the request from the queue.
return true;
})
从翻译队列中删除请求, 即当这些请求还没有被发送给工人时才会被删除 .
过滤器函数应该返回每个请求的正则-ish。 他们的承诺遭到拒绝 CancelledError 错误.
删除( )
translator.delete()
用 a 取消所有未决请求 CancelledError 并立即终止所有工人。 这将释放所有使用的资源.
模型
两位翻译都接受 backing 选项,它告诉它从哪里获得模型数据和翻译引擎执行。 他们默认使用 BergamotTranslator 获得其模型的 火狐翻译。 。 。 .
为了定制模型,重新执行 loadModelRegistry 财务报告和审定财务报表 loadTranslationModel 方法。 。 .
loadModelRegistry() 很难把承诺还给看起来像 {from: string, to: string, ...}[]编辑 from 财务报告和审定财务报表 to 键作为模型选择的键.
loadTranslationModel() 与 ArrayBuffers 返回承诺 model, (中文(简体) ), shortlist, (中文(简体) ), vocabs,可选择 qualityModel它可以包括: config 对象也一样.
从data.statmt.org中加载模型的替代执行实例,即与 本地翻译数字 :
class CustomBacking extends TranslatorBacking {
async loadModelRegistery() {
const response = await fetch('https://translatelocally.com/models.json');
const {models} = await response.json();
// Add 'from' and 'to' keys for each model. Since theoretically a model
// can have multiple froms keys in TranslateLocally, we do a little
// product here.
return models.reduce((list, model) => {
try {
const to = first(Intl.getCanonicalLocales(model.trgTag));
for (let from of Intl.getCanonicalLocales(Object.keys(model.srcTags))) {
list.push({from, to, model});
}
} catch (err) {
console.log('Skipped model', model, 'because', err);
}
return list;
}, []);
}
async loadTranslationModel({from, to}) {
// Find that model in the registry which will tell us about its files
const entries = (await this.registry).filter(model => model.from === from && model.to === to);
// Prefer tiny models above non-tiny ones
entries.sort(({model: a}, {model: b}) => (a.shortName.indexOf('tiny') === -1 ? 1 : 0) - (b.shortName.indexOf('tiny') === -1 ? 1 : 0));
if (!entries)
throw new Error(`No model for '${from}' -> '${to}'`);
const entry = entries[0].model;
const response = await fetch(entry.url, {
integrity: `sha256-${entry.checksum}`
});
// pako from https://www.npmjs.com/package/pako
const archive = pako.inflate(await response.arrayBuffer());
// untar from https://www.npmjs.com/package/js-untar
const files = await untar(archive.buffer);
const find = (filename) => {
const found = files.find(file => file.name.match(/(?:^|\/)([^\/]+)$/)[1] === filename)
if (found === undefined)
throw new Error(`Could not find '${filename}' in model archive`);
return found;
};
// YAML.parse is found in worker/translator-worker.js
const config = YAML.parse(find('config.intgemm8bitalpha.yml').readAsString());
const model = find(config.models[0]).buffer;
const vocabs = config.vocabs.map(vocab => find(vocab).buffer);
const shortlist = find(config.shortlist[0]).buffer;
// Return the buffers
return {model, vocabs, shortlist, config};
}
}
const translator = new BatchTranslator(options, new CustomBacking(options));
支持的语言
见 https://github.com/mozilla/firefox-翻译-模型#目前支持的语言您可能需要设置 registryUrl 选项以指向最近的发布.