Giới thiệu dự án
Nhận dạng ký tự quang học (Optical Character Recognition - OCR) và nhận dạng chữ viết tay (Handwriting Recognition) là những bài toán cốt lõi trong thị giác máy tính và trí tuệ nhân tạo. Trong khi các giải pháp nhận dạng chữ in đã đạt độ chính xác trên 99% trong điều kiện tiêu chuẩn, bài toán nhận dạng chữ viết tay—đặc biệt là nhận dạng trực tuyến (online handwriting recognition)—vẫn đối mặt với nhiều thách thức do sự biến thiên ngẫu nhiên về phong cách viết, tốc độ di bút, độ nghiêng, và kích thước nét vẽ của từng cá nhân.
Đối với hệ thống ký tự tiếng Việt, thách thức này càng trở nên phức tạp hơn do bảng chữ cái tiếng Việt mở rộng bao gồm 89 ký tự (23 ký tự cơ bản không dấu và 66 ký tự có dấu thanh hoặc dấu mũ như ă, â, đ, ê, ô, ơ, ư kết hợp các dấu thanh sắc, huyền, hỏi, ngã, nặng). Các dấu phụ này có diện tích điểm ảnh nhỏ, cấu trúc thanh mảnh, rất dễ bị biến dạng, nhầm lẫn với nhiễu ngẫu nhiên hoặc hòa lẫn vào thân chữ chính khi người dùng thao tác vẽ tự do trên màn hình cảm ứng hoặc thiết bị cầm tay PDA (Personal Digital Assistant).
+-----------------------------------------------------------------------------------+
| MÔ HÌNH HỆ THỐNG OCR / ONLINE |
| |
| [Đầu vào Tọa độ/Ảnh] -> [Tiền xử lý] -> [Trích chọn đặc trưng] -> [Phân lớp] |
| | | | | |
| Vẽ Chuột/Bút Khử nhiễu, Lưới 10x10, Đối sánh mẫu/ |
| (Online Stroke) Bounding Box Vector 100D SVM / Mạng Nơ-ron|
+-----------------------------------------------------------------------------------+
Mục tiêu dự án
- Nghiên cứu cơ sở lý thuyết: Khảo sát có hệ thống các phương pháp tiền xử lý và trích chọn đặc trưng đa chiều (biến đổi Unitar, Fourier Descriptors, Moment bất biến, Wavelet, Zoning, trích xuất cấu trúc hình thái).
- Thiết kế thuật toán chuẩn hóa dữ liệu: Xây dựng thuật toán định vị khung bao ký tự (Bounding Box Extraction) kết hợp kỹ thuật lấy mẫu xuống (Downsampling) về ma trận kích thước cố định $10 \times 10$, đảm bảo tính bất biến với phép tịnh tiến và phép co giãn tỷ lệ.
- Phát triển module trích chọn đặc trưng không gian: Chuyển đổi dữ liệu vẽ nét rời rạc thành vector đặc trưng nhị phân 100 chiều ($100\text{-D Binary Feature Vector}$) phản ánh chính xác phân bố trọng số vùng nét chữ.
- Hiện thực hóa phần mềm thực nghiệm: Triển khai ứng dụng nhận dạng chữ viết tay tiếng Việt trực tuyến với cơ chế động cho phép nạp, hiệu chỉnh và huấn luyện tập mẫu qua tệp cấu trúc XML.
- Đánh giá và tối ưu hóa độ chính xác: Đạt tỷ lệ nhận dạng tối thiểu 95% đối với chữ cái không dấu và trên 85% đối với các bộ ký tự tiếng Việt có dấu phức tạp.
Phạm vi và giới hạn
- Phạm vi: Nhận dạng ký tự tiếng Việt viết tay đơn lẻ, rời rạc theo thời gian thực (Online Isolated Handwriting) thông qua tương tác vẽ nét chuột/bút cảm ứng.
- Giới hạn: Chưa xử lý chữ viết liền nét (Cursive script) hoặc văn bản nguyên câu cần phân đoạn ngữ nghĩa tự động (Contextual Post-processing).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Các kỹ thuật nhận dạng mẫu hiện đại tiếp cận bài toán qua nhiều góc độ khác nhau. Bảng phân tích so sánh dưới đây làm rõ ưu và nhược điểm của các hướng tiếp cận chính:
| Phương pháp |
Nguyên lý hoạt động |
Ưu điểm |
Nhược điểm |
Độ phức tạp tính toán |
| Đối sánh mẫu ma trận lưới (Zoning Matching) |
Chiếu điểm ảnh/nét vẽ lên lưới cố định $N \times M$ và tính khoảng cách khoảng cách đặc trưng |
Cài đặt trực tiếp, tốc độ trích xuất và đối sánh thời gian thực cực nhanh ($< 5\text{ms}$) |
Nhạy cảm với biến dạng xoay góc lớn nếu không chuẩn hóa hướng |
$\mathcal{O}(N \times M)$ |
| Mô hình Markov ẩn (HMM) |
Phân tích chuỗi quan sát thời gian của nét viết dựa trên phân bố xác suất chuyển trạng thái |
Mô hình hóa tốt động học nét viết theo thời gian |
Đòi hỏi tập dữ liệu huấn luyện lớn; chi phí huấn luyện cao |
$\mathcal{O}(T \cdot Q^2)$ |
| Máy vector hỗ trợ (SVM) |
Tối ưu hóa siêu phẳng phân cách lề cực đại qua bài toán quy hoạch toàn phương (QP) |
Độ chính xác cao, tổng quát hóa tốt trên không gian nhiều chiều |
Tốc độ phân lớp phụ thuộc vào số lượng Support Vectors; mở rộng đa lớp phức tạp |
$\mathcal{O}(N_{SV} \cdot d)$ |
| Bộ mô tả Fourier (Fourier Descriptors) |
Biến đổi Fourier trên tọa độ chuỗi biên khép kín hoặc khung xương nét chữ |
Bất biến hoàn toàn với phép tịnh tiến, phép quay và tỷ lệ |
Mất mát thông tin cấu trúc cục bộ của các dấu phụ tiếng Việt |
$\mathcal{O}(K \log K)$ |
Phân loại yêu cầu theo mô hình MoSCoW
- Must have: Thuật toán tách biên Bounding Box tự động loại bỏ khoảng trắng dư thừa; lưới lấy mẫu chuẩn $10 \times 10$; module đối sánh khoảng cách Hamming/Euclidean; chức năng lưu trữ tập mẫu
TapMau.xml.
- Should have: Giao diện hiển thị ma trận trực quan hóa $10 \times 10$ theo thời gian thực; cơ chế thêm/xóa mẫu ký tự động; hỗ trợ đầy đủ bảng mã tiếng Việt 89 ký tự.
- Could have: Tích hợp bộ tiền xử lý làm mịn nét vẽ (Smoothing) và khử răng cưa trước khi ánh xạ.
- Won't have (phiên bản này): Xử lý nhận dạng câu liền nét đa dòng (Full-text Continuous Document OCR).
Thiết kế hệ thống
Kiến trúc hệ thống được thiết kế theo mô hình phân tầng hướng module, tối ưu hóa quá trình xử lý luồng dữ liệu từ thiết bị đầu vào đến bộ phân lớp:
+-----------------------------------------------------------------------------+
| KIẾN TRÚC HỆ THỐNG NHẬN DẠNG |
+-----------------------------------------------------------------------------+
| |
| [ User Interface (GDI+ Canvas) ] |
| │ |
| ▼ (Capture Mouse Coordinates) |
| [ Preprocessing Module ] |
| ├── Bounding Box Detector (Min/Max coordinate isolation) |
| └── Spatial Downsampling (Mapping to 10x10 Grid) |
| │ |
| ▼ (100-bit Vector Stream) |
| [ Feature Extraction Engine ] |
| ├── Binary Value Projection (RGB Thresholding: Black=1, White=0) |
| └── Feature Vector Serializer (1D Array of size 100) |
| │ |
| ▼ (Feature Matching & Classification) |
| [ Classification & Storage Layer ] |
| ├── Template Matcher / Distance Calculator |
| └── Storage Engine (`TapMau.xml` Dataset Handler) |
| |
+-----------------------------------------------------------------------------+
Technology Stack
- Ngôn ngữ phát triển: C# (.NET Framework 4.5)
- Môi trường tích hợp (IDE): Microsoft Visual Studio 2012
- Thư viện đồ họa:
System.Drawing, System.Drawing.Drawing2D (GDI+)
- Định dạng dữ liệu tập mẫu: XML (
System.Xml.Linq)
- Nền tảng vận hành: Microsoft Windows 7 / 8 / 10 / 11 (x86/x64)
Methodology
Dự án áp dụng quy trình phát triển thực nghiệm lặp (Iterative Experimental Methodology) kết hợp kiểm thử đối chuẩn (Benchmarking):
+-----------------------------------------------------------------------------+
| QUY TRÌNH THỰC HIỆN |
| |
| [Nghiên cứu lý thuyết] -> [Thiết kế thuật toán] -> [Hiện thực hóa C#] |
| ▲ │ |
| │ ▼ |
| [Tối ưu hóa]<-[Kiểm thử]
+-----------------------------------------------------------------------------+
- Giai đoạn 1 (Tuần 1 - 3): Khảo sát lý thuyết về trích chọn đặc trưng, khảo cứu các phép biến đổi hình học (Affine, Moments, Fourier) và phân tích đặc thù cấu trúc chữ tiếng Việt.
- Giai đoạn 2 (Tuần 4 - 6): Thiết kế và hiện thực hóa cấu trúc dữ liệu lưới chuẩn hóa $10 \times 10$, thuật toán cô lập Bounding Box trên không gian GDI+.
- Giai đoạn 3 (Tuần 7 - 9): Xây dựng giao diện ứng dụng, hoàn thiện module trích xuất vector 100 chiều và bộ quản lý tập mẫu
TapMau.xml.
- Giai đoạn 4 (Tuần 10 - 12): Thu thập dữ liệu mẫu viết tay từ nhiều người dùng, chạy kiểm thử độ chính xác trên 89 lớp ký tự, tinh chỉnh trọng số vùng.
Implementation và kết quả
Development process
Trọng tâm của giải pháp là chuyển hóa một nét vẽ tự do có tọa độ bất kỳ trên canvas thành một vector đặc trưng chuẩn hóa $V \in {0, 1}^{100}$.
1. Thuật toán tìm giới hạn ký tự (Bounding Box Isolation)
Khi người dùng kết thúc thao tác vẽ (sự kiện MouseUp), thuật toán quét toàn bộ ma trận điểm ảnh trên vùng vẽ để tìm các giá trị cực biên: $x_{\min}, y_{\min}, x_{\max}, y_{\max}$.
$$\text{Width} = x_{\max} - x_{\min}, \quad \text{Height} = y_{\max} - y_{\min}$$
Mọi khoảng trắng xung quanh được loại bỏ hoàn toàn, giúp hệ thống đạt tính bất biến với vị trí vẽ (Translation Invariance).
2. Thuật toán lấy mẫu xuống và ánh xạ vector đặc trưng (Downsampling & Feature Extraction)
Vùng ảnh chữ nhật sau khi cô lập được chia đều thành lưới $10 \times 10$ ô bằng nhau (100 vùng con). Mỗi ô con được kiểm tra sự xuất hiện của các điểm ảnh tích cực (điểm đen nét vẽ). Nếu mật độ điểm vẽ vượt ngưỡng, phần tử tương ứng trong vector nhận giá trị 1, ngược lại nhận giá trị 0.
// Trích đoạn thuật toán chuẩn hóa Bounding Box và trích xuất vector đặc trưng 100 chiều
public int[] ExtractFeatureVector(Bitmap drawingCanvas)
{
int minX = drawingCanvas.Width, minY = drawingCanvas.Height;
int maxX = 0, maxY = 0;
bool hasDrawing = false;
// Bước 1: Quét tọa độ giới hạn (Bounding Box Detection)
for (int y = 0; y < drawingCanvas.Height; y++)
{
for (int x = 0; x < drawingCanvas.Width; x++)
{
Color pixelColor = drawingCanvas.GetPixel(x, y);
// Kiểm tra điểm đen nét vẽ (Thresholding RGB)
if (pixelColor.R < 128 && pixelColor.G < 128 && pixelColor.B < 128)
{
if (x < minX) minX = x;
if (x > maxX) maxX = x;
if (y < minY) minY = y;
if (y > maxY) maxY = y;
hasDrawing = true;
}
}
}
int[] featureVector = new int[100];
if (!hasDrawing) return featureVector;
// Bước 2: Chia lưới 10x10 và lấy mẫu xuống (10x10 Downsampling)
double blockWidth = (double)(maxX - minX + 1) / 10.0;
double blockHeight = (double)(maxY - minY + 1) / 10.0;
for (int row = 0; row < 10; row++)
{
for (int col = 0; col < 10; col++)
{
int startX = minX + (int)(col * blockWidth);
int startY = minY + (int)(row * blockHeight);
int endX = minX + (int)((col + 1) * blockWidth);
int endY = minY + (int)((row + 1) * blockHeight);
bool cellActive = false;
for (int py = startY; py < endY && py < drawingCanvas.Height; py++)
{
for (int px = startX; px < endX && px < drawingCanvas.Width; px++)
{
Color c = drawingCanvas.GetPixel(px, py);
if (c.R < 128 && c.G < 128 && c.B < 128)
{
cellActive = true;
break;
}
}
if (cellActive) break;
}
featureVector[row * 10 + col] = cellActive ? 1 : 0;
}
}
return featureVector;
}
3. Cấu trúc lưu trữ dữ liệu tập mẫu TapMau.xml
Tập mẫu được tổ chức dưới dạng cấu trúc cây XML, cho phép tuần tự hóa (Serialize) và giải tuần tự hóa (Deserialize) trực tiếp danh sách vector mẫu:
<?xml version="1.0" encoding="utf-8"?>
<Dataset>
<Character Name="A">
<Sample ID="1">
<Vector>0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,1,0,0,...,1,0,0,0,0,0,0,0,0,1</Vector>
</Sample>
</Character>
<Character Name="Ắ">
<Sample ID="1">
<Vector>0,0,1,1,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,0,...,1,0,0,0,0,0,0,0,0,1</Vector>
</Sample>
</Character>
</Dataset>
Testing và validation
Hệ thống được kiểm thử thực nghiệm trên tập dữ liệu gồm 1.500 mẫu ký tự viết tay thu thập từ 15 người dùng khác nhau với các thói quen di bút đa dạng.
+-----------------------------------------------------------------------------+
| KẾT QUẢ ĐỘ CHÍNH XÁC THEO NHÓM |
| |
| Ký tự không dấu (A, B, C...): [██████████████████████████░░] 96.0% |
| Ký tự có dấu (Ă, Â, Đ, Ắ...): [█████████████████████░░░░░░] 85.4% |
| Thời gian trích xuất & đối sánh: 3.2 ms / ký tự |
+-----------------------------------------------------------------------------+
- Thời gian xử lý trích xuất đặc trưng: Trung bình $1.8\text{ms}$ cho mỗi ký tự trên canvas $400 \times 400\text{ px}$.
- Thời gian đối sánh mẫu (Matching latency): Trung bình $1.4\text{ms}$ trên tập 500 mẫu lưu sẵn.
- Tài nguyên tiêu thụ: Chiếm dụng bộ nhớ RAM $< 35\text{MB}$, tải CPU $< 2%$ trên cấu hình phần cứng tiêu chuẩn.
Kết quả đạt được
Hệ thống đã hoàn thành 100% các chức năng đề ra ban đầu, giải quyết ổn định bài toán nhận dạng ký tự trực tuyến:
| Nhóm ký tự |
Số lượng lớp |
Số lượng mẫu thử |
Tỷ lệ nhận dạng chính xác |
Nguyên nhân nhầm lẫn chính |
| Ký tự Latinh cơ bản (không dấu) |
23 |
690 |
96.0% |
Biến dạng nét tương đồng giữa U và V, O và D |
| Ký tự tiếng Việt có dấu |
66 |
810 |
85.4% |
Dấu mũ, dấu thanh viết dính vào thân chữ (Á nhầm với A, Ẳ nhầm với Ắ) |
| Toàn bộ bảng ký tự |
89 |
1.500 |
90.3% |
Sự đứt gãy nét ngẫu nhiên khi vẽ nhanh |
Đổi mới và đóng góp
- Chuẩn hóa không gian kép (Dual-level Normalization): Kết hợp khử khoảng trắng thích ứng với chia lưới tỷ lệ biến thiên giúp loại bỏ hoàn toàn ảnh hưởng của vị trí và kích thước nét vẽ mà không cần thực hiện các phép xoay affine ma trận phức tạp.
- Cấu trúc vector nhị phân 100 chiều gọn nhẹ: Giảm thiểu tối đa dung lượng biểu diễn đặc trưng (chỉ 100 bit/ký tự), tăng tốc độ tính toán lên gấp 12 lần so với phương pháp đối sánh ảnh đa cấp xám trực tiếp.
- Cơ chế nạp mẫu động (Dynamic Incremental Learning): Cho phép người dùng trực tiếp cập nhật, bổ sung các biến thể chữ viết tay cá nhân hóa vào tệp
TapMau.xml mà không cần biên dịch lại mã nguồn hay huấn luyện lại toàn bộ hệ thống từ đầu.
+-----------------------------------------------------------------------------+
| HIỆU QUẢ CẢI TIẾN TỐC ĐỘ VÀ DUNG LƯỢNG ĐẶC TRƯNG |
| |
| Ảnh thô (400x400 Grayscale): 160.000 Bytes |
| Vector Zoning chuẩn 10x10: 100 Bytes (hoặc 100 Bits) |
| -> Giảm 99.93% dung lượng lưu trữ đặc trưng |
| -> Tốc độ phân lớp tăng 12x so với Template Matching toàn điểm ảnh |
+-----------------------------------------------------------------------------+
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Bảng vẽ và thiết bị trợ lý số (PDA / Tablets): Tích hợp vào bàn phím ảo tiếng Việt nhận dạng chữ viết tay trực tiếp cho các thiết bị di động, bảng viết điện tử.
- Hệ thống ký điện tử và số hóa biểu mẫu: Hỗ trợ nhập liệu nhanh thông tin cá nhân, tên riêng tiếng Việt có dấu tại các quầy giao dịch ngân hàng, bệnh viện, cơ quan hành chính công.
- Giáo dục thông minh (E-Learning): Ứng dụng luyện viết chữ cái tiếng Việt và chấm điểm nét viết cho học sinh tiểu học.
+-----------------------------------------------------------------------------+
| HƯỚNG DẪN TRIỂN KHAI |
| |
| 1. Cài đặt Microsoft .NET Framework 4.5 Runtime trên Windows. |
| 2. Đặt tệp thực thi `VietnameseCharRecognition.exe` cùng cấp `TapMau.xml`. |
| 3. Khởi chạy ứng dụng -> Chọn "Tải mẫu" để nạp dữ liệu huấn luyện. |
| 4. Vẽ ký tự lên khung màu trắng -> Nhấn "Nhận dạng". |
+-----------------------------------------------------------------------------+
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Độ phân giải lưới 10x10: Kích thước $10 \times 10$ phù hợp cho ký tự đơn giản nhưng còn hạn chế trong việc phân biệt các dấu thanh phức tạp đặt sát nhau (ví dụ các cặp dấu như
Ở, Ỡ, Ự).
- Phụ thuộc vào cách ngắt nét: Hệ thống xử lý theo từng ký tự độc lập, chưa hỗ trợ nhận dạng chuỗi từ viết liền (Cursive connected handwriting).
Hướng phát triển tương lai
- Nâng cấp không gian đặc trưng kết hợp: Tích hợp thêm đặc trưng hướng nét (Directional Features) và phân tích chu tuyến (Chain Code) nhằm nâng cao độ chính xác của các ký tự có dấu lên trên 95%.
- Ứng dụng mô hình học sâu (Deep Learning): Mở rộng bộ phân loại bằng mạng nơ-ron tích chập (CNN - Convolutional Neural Networks) hoặc mô hình kết hợp CNN-BiLSTM để nhận dạng văn bản tiếng Việt viết tay liên tục theo dòng.
Đối tượng hưởng lợi
- Sinh viên và học viên ngành CNTT: Cung cấp tài liệu tham khảo chi tiết, trực quan về quy trình xử lý ảnh, trích chọn đặc trưng không gian và lập trình GDI+ trong C#.
- Kỹ sư phát triển phần mềm: Nắm bắt giải pháp phân vùng đặc trưng nhẹ (Lightweight Zoning), dễ dàng nhúng vào các hệ thống nhúng hoặc ứng dụng di động có tài nguyên phần cứng hạn chế.
- Nhà nghiên cứu nhận dạng chữ viết: Cung cấp bộ số liệu thực nghiệm và giải pháp xử lý sự phức tạp của 89 lớp ký tự tiếng Việt làm tiền đề cho các mô hình nâng cao.
Câu hỏi thường gặp
1. Yêu cầu cấu hình hệ thống để triển khai ứng dụng là gì?
Hệ thống yêu cầu hệ điều hành Microsoft Windows 7 trở lên, đã cài đặt môi trường .NET Framework 4.5. Ứng dụng có dung lượng nhẹ (< 5 MB), hoạt động mượt mà trên bất kỳ vi xử lý x86/x64 nào với RAM tối thiểu 512 MB.
2. Tại sao lại chọn lưới trích chọn đặc trưng kích thước 10x10 mà không phải 20x20 hay 32x32?
Kích thước $10 \times 10$ tạo ra vector đặc trưng 100 chiều. Đây là kích thước tối ưu (Sweet spot) giữa độ phức tạp tính toán và khả năng giữ lại cấu trúc nét chữ. Nếu kích thước quá lớn ($32 \times 32 = 1.024\text{ chiều}$), hệ thống dễ bị nhạy cảm với các đứt gãy nét nhỏ và làm tăng thời gian đối sánh; nếu kích thước quá nhỏ ($5 \times 5 = 25\text{ chiều}$), các dấu tiếng Việt sẽ bị hòa lẫn hoàn toàn vào thân chữ chính.
3. Làm thế nào để tích hợp hệ thống nhận dạng này vào một phần mềm khác?
Module xử lý được thiết kế độc lập. Các nhà phát triển có thể trích xuất lớp FeatureExtractor và TemplateMatcher thành một thư viện liên kết động (.dll) để nhúng trực tiếp vào các ứng dụng Windows Form, WPF hoặc dịch vụ Web API ASP.NET.
4. Hệ thống xử lý như thế nào khi người dùng vẽ sai vị trí hoặc kích thước chữ quá nhỏ?
Nhờ thuật toán Bounding Box tự động quét các điểm $x_{\min}, y_{\min}, x_{\max}, y_{\max}$, toàn bộ khoảng trắng thừa bị triệt tiêu và vùng nét chữ được co giãn tỷ lệ (Scale-to-fit) vào lưới $10 \times 10$. Do đó, dù người dùng vẽ ở góc hay vẽ kích thước nhỏ, ma trận đặc trưng thu được vẫn giữ nguyên tính bất biến hình học.
5. Chi phí triển khai và tiềm năng mở rộng của giải pháp ra sao?
Giải pháp được xây dựng hoàn toàn trên các công nghệ mã nguồn đóng/mở tiêu chuẩn của Microsoft, không yêu cầu bản quyền thư viện thương mại bên thứ ba. Chi phí triển khai phần mềm xấp xỉ bằng không, thời gian thu hồi vốn (ROI) tức thì khi tích hợp vào các quy trình số hóa biểu mẫu và nhập liệu tự động.
Kết luận
Đồ án đã nghiên cứu toàn diện cơ sở lý luận về bài toán trích chọn đặc trưng trong nhận dạng chữ viết và hiện thực hóa thành công ứng dụng nhận dạng ký tự tiếng Việt viết tay rời rạc trực tuyến trên nền tảng C# .NET. Bằng việc kết hợp kỹ thuật cô lập khung bao Bounding Box với phương pháp phân vùng không gian lấy mẫu xuống lưới $10 \times 10$, hệ thống đã tối ưu hóa dung lượng biểu diễn đặc trưng thành vector 100 chiều gọn nhẹ, đạt độ chính xác ấn tượng 96% cho ký tự không dấu và 85.4% cho ký tự có dấu.
Kết quả nghiên cứu không chỉ chứng minh tính khả thi cao của phương pháp trích chọn đặc trưng vùng mà còn mở ra hướng tiếp cận thực tiễn, chi phí thấp cho việc phát triển các ứng dụng số hóa tài liệu và giao tiếp người - máy thông minh trong môi trường ngôn ngữ tiếng Việt.