moxhimt / index.html
DanVP's picture
MoxhiMT web demo
dc3041d verified
Raw
History Blame Contribute Delete
7.33 kB
<!doctype html>
<html lang="vi">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="color-scheme" content="dark" />
<meta name="theme-color" content="#14161d" />
<meta
name="description"
content="MoxhiMT — dịch tiếng Trung sang tiếng Việt cho truyện mạng. Mô hình 30M chạy hoàn toàn trong trình duyệt, văn bản không rời khỏi thiết bị."
/>
<title>MoxhiMT — Dịch Trung → Việt trên trình duyệt</title>
<link
rel="icon"
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect x='4' y='4' width='56' height='56' rx='10' fill='%23cf4429'/%3E%3Ctext x='32' y='45' font-size='36' text-anchor='middle' fill='%23ece4d1' font-family='serif'%3E%E8%AF%91%3C/text%3E%3C/svg%3E"
/>
<script type="module" crossorigin src="./assets/index-Cqb5ar9J.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-CwFWchry.css">
</head>
<body>
<div class="page">
<header class="top">
<div class="brand">
<span class="seal" aria-hidden="true"></span>
<div class="brand-text">
<h1>MoxhiMT</h1>
<p class="tagline">Dịch truyện Trung&nbsp;&nbsp;Việt, ngay trên máy bạn</p>
</div>
</div>
<div class="chips">
<span id="modelChip" class="chip">Chưa tải mô hình</span>
<span id="envChip" class="chip chip-quiet" hidden></span>
</div>
</header>
<section id="resumePanel" class="card crash" hidden>
<div class="card-head">
<h2>Phiên dịch bị gián đoạn</h2>
</div>
<p id="resumeSummary" class="crash-text"></p>
<div class="adv-actions crash-actions">
<button id="resumeGoBtn" type="button" class="primary">Dịch tiếp</button>
<button id="resumeReportBtn" type="button" class="ghost">Chép báo cáo</button>
<button id="resumeDropBtn" type="button" class="ghost">Bỏ</button>
</div>
</section>
<section id="crashPanel" class="card crash" hidden>
<div class="card-head">
<h2>Phiên trước bị dừng đột ngột</h2>
</div>
<p id="crashSummary" class="crash-text"></p>
<div class="adv-actions crash-actions">
<button id="crashCopyBtn" type="button" class="ghost">Chép báo cáo</button>
<button id="crashDismissBtn" type="button" class="ghost">Ẩn</button>
</div>
</section>
<main class="spread">
<section class="card" aria-labelledby="srcLabel">
<div class="card-head">
<h2 id="srcLabel">Văn bản tiếng Trung</h2>
<div class="card-tools">
<button id="sampleBtn" type="button" class="ghost">Chép đoạn mẫu</button>
<button id="clearBtn" type="button" class="ghost">Xoá</button>
</div>
</div>
<textarea
id="src"
rows="9"
placeholder="Dán chương truyện hoặc đoạn văn tiếng Trung vào đây…"
spellcheck="false"
lang="zh"
></textarea>
<div class="card-foot">
<span id="srcCount" class="count">0 ký tự</span>
<div class="run">
<button id="cancelBtn" type="button" class="ghost" hidden>Dừng</button>
<button id="translateBtn" type="button" class="primary">Dịch sang tiếng Việt</button>
</div>
</div>
<div id="progressRow" class="progress-row" hidden>
<div class="bar"><div id="barFill" class="bar-fill"></div></div>
<p id="progressLabel" class="progress-label">Đang chuẩn bị…</p>
</div>
</section>
<section class="card card-out" aria-labelledby="dstLabel">
<div class="card-head">
<h2 id="dstLabel">Bản dịch</h2>
<div class="card-tools">
<button id="copyBtn" type="button" class="ghost" disabled>Chép bản dịch</button>
</div>
</div>
<div id="out" class="out" lang="vi">
<p class="placeholder">Bản dịch sẽ hiện ở đây, từng đoạn một trong lúc dịch.</p>
</div>
<div id="metrics" class="metrics" hidden></div>
</section>
</main>
<details class="advanced">
<summary>Nâng cao</summary>
<div class="adv-grid">
<label
>Mô hình
<select id="modelSelect">
<option value="DanVP/HachimiMT-30-zh-vi-onnx">HachimiMT-30 · 31M — nhẹ, nhanh</option>
<option value="DanVP/MoxhiMT-30-onnx">MoxhiMT-30 · 37M — encoder sâu hơn</option>
<option value="custom">Tuỳ chỉnh…</option>
</select>
</label>
<label id="modelIdRow" hidden
>Kho mô hình (tuỳ chỉnh)
<input id="modelId" spellcheck="false" autocomplete="off" placeholder="user/repo-onnx" />
</label>
<label
>Batch (PC ≤8 · iOS ≤4)
<input id="batchSize" type="number" min="1" max="8" step="1" value="4" />
</label>
<label
>Thiết bị
<select id="device">
<option value="auto">Tự chọn (WASM)</option>
<option value="wasm">WASM — ổn định</option>
<option value="webgpu">WebGPU — thử nghiệm</option>
</select>
</label>
<label
>Độ chính xác
<select id="dtype">
<option value="auto">Tự chọn (q8)</option>
<option value="q8">q8 — nhẹ nhất</option>
<option value="fp16">fp16</option>
<option value="fp32">fp32</option>
</select>
</label>
<label
>Token mỗi chunk
<input id="maxSrcTokens" type="number" min="48" max="220" step="8" value="192" />
</label>
<label
>Nhịp nghỉ khi phục hồi (iOS)
<input id="recycleEvery" type="number" min="0" max="200" step="4" value="8" />
</label>
</div>
<div class="adv-actions">
<button id="preloadBtn" type="button" class="ghost">Tải trước mô hình</button>
<button id="purgeBtn" type="button" class="ghost">Xoá mô hình đã lưu</button>
<button id="reportBtn" type="button" class="ghost">Chép báo cáo phiên gần nhất</button>
</div>
<details class="logbox">
<summary>Nhật ký</summary>
<pre id="log"></pre>
</details>
</details>
<footer class="note">
<p>
Toàn bộ quá trình dịch diễn ra trên thiết bị của bạn — văn bản không được gửi đi đâu.
Mô hình <a id="modelLink" href="#" target="_blank" rel="noreferrer">HachimiMT-30</a>
(~55&nbsp;MB) chỉ tải một lần rồi được lưu lại cho những lần sau.
<span id="verTag" class="ver"></span>
</p>
</footer>
</div>
</body>
</html>