Dữ liệu của bạn đi đâu

Shadow ZH — bản demo M5

Nâng cấp lên thành viên → Xem gói và chuyển khoản. Không cần mở video, không cần đang luyện.

Khi bạn bấm Nghe tôi đọc, giọng nói của bạn rời khỏi máy này.

Extension dùng webkitSpeechRecognition của Chrome. API đó không chạy tại chỗ: trình duyệt gửi audio tới máy chủ nhận dạng của Google rồi trả chữ về. Đây là cách Chrome hoạt động, không phải lựa chọn của extension — nhưng bạn có quyền biết trước thay vì tự phát hiện.

Micro mở lúc nào

Trên YouTube: micro mở ngay khi bạn bấm Bắt đầu — không đợi tới lúc bạn bấm Nghe tôi đọc. Đèn micro trên tab sáng từ lúc đó. Mở sớm vì lần đầu Chrome hỏi quyền mất vài giây: chờ tới lúc bấm thu thì video đã dừng mà micro chưa sẵn sàng, và câu bạn vừa đọc mất trắng. Mở một video ra mà chưa bấm Bắt đầu thì micro không mở.

Trên Bilibili và iq.com: micro mở muộn hơn — chỉ khi bạn bấm Nghe tôi đọc, không phải lúc bấm Bắt đầu. Và nó được nhả ngay khi bạn rời khỏi câu đang luyện: bấm sang cụm khác, tự tua đi chỗ khác, hay bấm nghe lại. Đọc lại đúng câu đó thì micro giữ nguyên để lượt sau không phải chờ. Khác YouTube vì dock của hai trang này không có nút tắt cả phiên; nếu giữ micro như bên kia thì sau đúng một lần bấm, đèn micro sẽ sáng cho tới khi bạn rời trang.

Mở micro không phải là gửi đi. Giữa hai lượt đọc, audio không đi đâu cả: nhận dạng chỉ bắt đầu khi bạn bấm Nghe tôi đọc. Bấm Dừng, tắt dock, rời video hay đóng tab là micro được nhả.

Extension làm gì với giọng nói của bạn

Nút Dịch: phụ đề đi sang Google Dịch

Đọc mục này cùng với mục nhận dạng giọng nói ở trên. Google xuất hiện ở hai chỗ trong trang này, với hai vai khác hẳn nhau: ở trên, Chrome gửi audio của bạn tới máy chủ nhận dạng của Google mỗi lần bạn bấm Nghe tôi đọc — đó là cách trình duyệt hoạt động, không phải lựa chọn của extension. Ở đây, extension gửi chữ phụ đề tới Google Dịch, và chỉ khi bạn bấm. Giọng nói không đi đường dưới đây, nhưng đừng đọc câu ấy thành “Google không bao giờ nhận gì từ tôi”.

Trên Bilibiliiq.com, dock có một nút Dịch. Hai trang này không tự làm bản dịch tiếng Việt như YouTube, nên nút ấy gửi phần chữ của phụ đề sang dịch vụ dịch máy công khai của Google (translate.googleapis.com) rồi hiện câu tiếng Việt ngay dưới dòng phiên âm.

Nút ấy chính là công tắc. Không bấm thì không byte nào đi sang Google — không phải mặc định bật, không có nền chạy sẵn, và extension không dịch trước để “cho mượt”. Bấm một lần thì cả phụ đề của video đang mở được dịch, đủ để bạn bật tắt lại mà không gửi thêm lần nào.

Thứ đi sang Google: chữ của phụ đề, và địa chỉ IP của bạn — vì lượt gọi đi thẳng từ máy bạn, không qua máy chủ của chúng tôi.

Thứ KHÔNG đi: bản ghi giọng nói · tài khoản, email hay mã đăng nhập · địa chỉ video · điểm phát âm · bất cứ thứ gì nhận dạng bạn. Google nhận đúng phần chữ của phụ đề video bạn đang mở, không nhận thêm gì khác.

Nói rõ một điều: nếu video đó là nội dung bạn xem được nhờ đã đăng nhập hoặc nhờ tài khoản trả phí ở trang phát, thì phụ đề của nó cũng đi theo đường này khi bạn bấm Dịch — chúng tôi không phân biệt được nội dung công khai với nội dung chỉ mình bạn xem được. Không muốn gửi thì đừng bấm nút ấy; mọi phần còn lại của extension vẫn chạy đủ.

Trên YouTube nút dịch đi đường khác và không liên quan tới Google Dịch: YouTube tự sinh bản dịch cho video của họ, extension chỉ đọc lại từ chính youtube.com.

Chúng tôi không có thoả thuận nào với Google về dữ liệu này và không đọc được gì từ nó. Việc Google làm gì với một lượt dịch thuộc chính sách của Google.

Micro xin quyền dưới tên trang, không phải tên extension

Hộp thoại xin quyền micro sẽ hiện tên www.youtube.com, www.bilibili.com hoặc www.iq.com — tên trang bạn đang mở, không phải tên extension. Lý do: extension chạy trong content script trên chính trang đó, và quyền micro cấp cho trang chứ không cấp cho extension.

Ba trang là ba quyền riêng. Cấp micro cho YouTube không cấp cho Bilibili hay iq.com — Chrome sẽ hỏi lại lần đầu bạn đọc trên mỗi trang.

Hai thứ extension tự gửi

Cả hai đi tới api.luyennoi.hanngubackinh.vn — máy chủ của chính Shadow ZH — không cần đăng nhậpkhông mang gì định danh bạn: không email, không tài khoản, không mã máy, không mã cài đặt. Máy chủ không lưu địa chỉ IP.

1. Mã lỗi tự động. Khi một phần của extension hỏng (ví dụ lượt chấm không về), extension gửi mã lỗi ngắn (kiểu cham-mang-hong), trang đang dùng (YouTube, Bilibili hay iq.com, không phải địa chỉ), phiên bản extension, và vị trí lỗi trong mã của extension (tên tệp:dòng). Không gửi thông điệp lỗi nguyên văn, vì nó có thể chứa chữ phụ đề. Máy chủ chỉ giữ số lần mỗi mã xảy ra theo ngày, 90 ngày.

2. Số đếm ẩn danh — TẮT được. Để biết extension có được dùng và có giữ được người học không, extension gửi vài gói rất nhỏ:

Mỗi gói chỉ mang: loại gói, trang (YouTube/Bilibili/iq.com), phiên bản extension, số ngày kể từ lúc cài, số ngày kể từ lần luyện trước, số câu đã đọc hôm luyện trước (theo bậc, ví dụ “4–7”), đã đăng nhập chưa, có là thành viên không, lượt đọc đầu ngày máy có nghe ra chữ không, và một mã ngẫu nhiên dùng một lần để máy chủ không đếm trùng khi gói phải gửi lại. Không có chữ bạn đọc, chữ máy nghe được, phụ đề, mã video hay địa chỉ trang.

Máy chủ không lưu từng gói. Nó chỉ cộng vào các bảng số đếm theo ngày (ví dụ “bao nhiêu bản cài luyện hôm nay”), giữ 400 ngày; mã chống trùng giữ 9 ngày rồi xoá. Khi bạn gỡ extension, Chrome mở một trang cảm ơn trên cùng máy chủ, và trang ấy đếm một lượt gỡ kèm phiên bản và bậc số ngày đã cài. Nút “Xem gói thành viên” mở trang tài khoản với ?tu=ext để máy chủ đếm lượt tới trang giá từ extension.

Tắt: trong cửa sổ nhỏ của extension, bỏ chọn “Gửi số đếm ẩn danh”. Tắt là extension xoá ngay các gói đang chờ gửi, không gửi gì thêm, và những ngày bạn luyện trong lúc tắt không được tính. Mã lỗi tự động không tắt được — nó không mang gì về việc bạn dùng.

Nút “Báo lỗi” gửi gì

Trong cửa sổ nhỏ của extension có nút Báo lỗi. Bản báo cáo này chỉ gửi khi bạn bấm — khác hai đường tự gửi ở mục trên, nó mang ảnh chụp trạng thái đầy đủ hơn nên bạn phải đọc và đồng ý trước. Trước khi gửi, extension hiện toàn bộ nội dung sắp gửi để bạn đọc, và chỉ lúc bấm mới xin quyền gọi tới máy chủ nhận báo lỗi (shadow-zh-demo.dinhquangvinh92.workers.dev). Không bao giờ bấm thì extension không bao giờ có quyền đó.

Nút này hiện chỉ gửi được từ YouTube và Bilibili. Đứng trên www.iq.com mà bấm thì extension báo là trang này chưa gửi báo lỗi được, và không có gì rời máy.

Bản báo cáo chứa:

Bản báo cáo KHÔNG chứa:

Máy chủ lọc lần thứ hai: nó chỉ giữ đúng những mục kể trên và vứt mọi thứ khác, kể cả khi một bản extension đã bị sửa cố gửi thêm. Mỗi báo cáo nhận một mã ngẫu nhiên 8 ký tự, tự xoá sau 30 ngày, và không có đường nào liệt kê danh sách báo cáo — biết mã thì đọc được đúng bản đó, không biết thì không.

Nút “Báo không chấm được” gửi gì

Trong cửa sổ nhỏ của extension có nút Báo không chấm được, dành cho lúc bạn đã đăng nhập mà bấm chấm phát âm không ra điểm. Nó chỉ gửi khi bạn bấm, tới api.luyennoi.hanngubackinh.vn, và khác hai đường tự gửi ở trên ở một điểm quan trọng: báo cáo này GẮN VỚI TÀI KHOẢN của bạn. Nó mang giấy đăng nhập của bạn để máy chủ biết báo cáo là của ai — không có điều đó thì không tra được vì sao đúng tài khoản ấy không chấm được.

Báo cáo chứa: trạng thái lúc lượt chấm hỏng — đã đăng nhập chưa, đã cho phép gửi bản ghi đi chấm chưa, cờ thành viên trên máy, loại lỗi của lượt chấm gần nhất dưới dạng mã ngắn (ví dụ net-fail), thời điểm xảy ra, kết quả một lượt thử kết nối tới máy chủ ngay lúc bấm, và phiên bản extension.

Báo cáo KHÔNG chứa: bản ghi giọng, chữ bạn đọc, chữ máy nghe được, phụ đề, mã video, địa chỉ trang hay email. Giấy đăng nhập chỉ dùng để xác định tài khoản rồi bỏ, không lưu.

Máy chủ giữ đúng một bản mới nhất cho mỗi tài khoản — gửi lại thì bản mới đè bản cũ — và không lưu địa chỉ IP. Chỉ người vận hành đọc được, để trả lời đúng câu “vì sao tài khoản này không chấm được”.

Điều khoản dùng phần chấm phát âm

Phần chấm phát âm dành cho người học tự luyện, qua extension Shadow ZH và trang của chúng tôi. Khi dùng nó, bạn đồng ý không:

Hạn mức lượt chấm mỗi ngày — cả lượt miễn phí lẫn lượt của thành viên — có thể thay đổi. Tài khoản vi phạm các điều trên có thể bị giới hạn hoặc bị dừng quyền chấm.

Đăng nhập bằng Google

Đăng nhập là tuỳ chọn. Không đăng nhập thì mọi thứ miễn phí vẫn chạy đủ: phụ đề, pinyin, nghĩa, và bảng chữ máy nghe được. Chỉ phần chấm phát âm mới cần tài khoản — trong giai đoạn đầu, tài khoản đã đăng ký được chấm miễn phí một số lượt mỗi ngày; thành viên được nhiều lượt hơn.

Việc chọn tài khoản diễn ra trên trang của Google, trong một cửa sổ riêng của trình duyệt. Extension không bao giờ nhìn thấy mật khẩu của bạn — nó chỉ nhận lại một mã dùng một lần rồi đổi lấy giấy phép truy cập.

Việc đổi mã ấy diễn ra ở máy chủ tài khoản của chúng tôi, api.luyennoi.hanngubackinh.vn — extension gọi tới đó đúng một lần mỗi lượt đăng nhập, và quyền gọi tới nó chỉ được xin đúng lúc bạn bấm Đăng nhập. Không bao giờ đăng nhập thì extension không bao giờ có quyền đó — cùng học thuyết với máy chủ chấm và máy chủ báo lỗi.

Ở lượt đăng nhập, máy chủ ấy nhận mã dùng một lần và trả về email, giấy phép truy cập, giấy làm mới và hạn gói thành viên.

Cùng máy chủ ấy nhận bản ghi giọng nói khi bạn bấm nút chấm — nó kiểm bạn còn hạn thành viên không, rồi chuyển bản ghi sang máy chấm qua mạng nội bộ. Đó là hai việc khác nhau đi qua cùng một địa chỉ, và chúng tôi nói ra thay vì để bạn suy đoán từ hai mục ở hai chỗ. Nó không nhận phụ đề, không nhận địa chỉ video. Không bấm nút chấm thì không có giọng nói nào đi tới đó.

Để chặn việc dùng một tài khoản làm máy chấm cho người khác, máy chủ ấy đếm số lượt chấm mỗi ngày của từng tài khoản và giữ số đếm đó 7 ngày. Nó không lưu bản ghi giọng nói: kết quả chấm của một bản ghi nằm trong bộ nhớ tối đa 10 phút, để bấm chấm lại đúng lượt đọc ấy không phải gửi đi chấm lần nữa, và mất khi máy chủ khởi động lại. Không lưu địa chỉ IP.

Sau khi đăng nhập, máy này lưu:

Không thứ nào trong số đó đọc được từ trang YouTube. Bấm Đăng xuất là xoá sạch cả bốn, ngay lập tức, trên máy này.

Khi bạn mua gói thành viên

Màn hình chờ chuyển khoản hiện một mã QR, và ảnh mã ấy không do chúng tôi vẽ. Trình duyệt của bạn tải nó trực tiếp từ qr.sepay.vn — máy chủ của SePay, đơn vị đối soát chuyển khoản của chúng tôi. Đây là tên miền duy nhất ngoài ba máy chủ của chúng tôi mà trình duyệt bạn gọi tới.

Lượt tải ấy mang theo gì: số tài khoản nhận tiền, số tiền, và mã đơn của bạn — cả ba đều nằm trong địa chỉ ảnh, và cả ba SePay vốn đã biết vì họ là bên đối soát. Kèm theo, như mọi lượt tải ảnh trên Internet, là địa chỉ IP của bạn.

Lượt tải ấy KHÔNG mang theo: email, giấy phép truy cập, giọng nói, phụ đề, địa chỉ video, hay địa chỉ trang đang mở — chúng tôi đặt referrerpolicy="no-referrer" đúng để cắt vế cuối.

Không muốn thì bỏ qua được. Bốn dòng bên cạnh mã QR — số tài khoản, ngân hàng, số tiền, nội dung — là cùng một đơn. Chuyển tay theo bốn dòng đó thì trình duyệt bạn không gọi qr.sepay.vn lần nào, và kết quả không khác gì.

Chúng tôi không nhận và không lưu số thẻ. Tiền vào tài khoản ngân hàng, SePay báo về máy chủ tài khoản của chúng tôi, và thứ được ghi lại là: mã đơn, số tiền, gói nào, và ngày hết hạn.

Extension không đọc Gmail, Drive, danh bạ hay bất cứ thứ gì khác trong tài khoản Google của bạn. Nó chỉ hỏi Google đúng một câu: bạn là ai.

Những gì extension đọc trên trang

Không đọc lịch sử xem, không đọc tài khoản của bạn trên ba trang đó, không đọc cookie.

Một chỗ khác nhau, nói thẳng: yêu cầu lấy phụ đề trên YouTube và Bilibili gửi đi không kèm thông tin đăng nhập. Khi YouTube chặn tốc độ lượt tải ấy (mã 429), extension chờ rồi tự thử lại, tối đa hai lượt, và lượt nào cũng vẫn không kèm thông tin đăng nhập. Trên iq.com thì : trang phát được tải kèm phiên đăng nhập iq.com của chính bạn, vì chính phiên ấy quyết định bạn có quyền xem tập này không — bỏ nó đi thì người đã trả tiền cho iq.com lại thành người không có phụ đề. Extension không đọc cookie đó và không gửi nó đi đâu khác: nó chỉ đi tới www.iq.com, đúng như khi bạn tự bấm vào tập phim.