IOAI 2025 — GAITE Contest

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 IOAI 2025 — Phân tách từ ghép 100 (p) 1.0s 256M
2 IOAI 2025 — Phát hiện giọng nói tổng hợp 100 (p) 1.0s 256M

1. IOAI 2025 — Phân tách từ ghép

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Mô tả bài toán

Trong tiếng Đức, từ ghép (Komposita) được tạo ra bằng cách nối nhiều từ ngắn lại với nhau thành một từ dài. Ví dụ, Fußball là ghép của Fuß ("chân") và Ball ("quả bóng"); Autobahnanschlussstelle là ghép của Autobahn ("đường cao tốc"), Anschluss ("kết nối") và Stelle ("vị trí").

Nhiệm vụ của bạn là, cho trước một từ ghép tiếng Đức, hãy tách nó trở lại thành các từ thành phần ban đầu.

Cách biểu diễn lời giải: với một từ có độ dài n, bạn cần xuất một mảng nhị phân độ dài đúng bằng n, trong đó mỗi phần tử ứng với một ký tự của từ. Giá trị 1 đánh dấu vị trí kết thúc của một từ con, còn 0 đánh dấu các vị trí ở đầu hoặc giữa từ con (vị trí được đánh số từ 0).

Ví dụ. Từ Fußballspieler (độ dài 14) được tách thành Fuß + ball + spieler. Các vị trí kết thúc của ba từ con lần lượt là 2, 6 và 13, nên nhãn tương ứng là:

[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]

Lưu ý ký tự cuối cùng của từ luôn là vị trí kết thúc của một từ con, do đó phần tử cuối của mảng luôn bằng 1.

Dữ liệu

Bộ dữ liệu được cung cấp ở định dạng JSON, mỗi tệp là một đối tượng dạng {từ: mảng_nhãn}. Cụ thể:

  • train.json94.306 từ ghép kèm nhãn phân tách chuẩn để huấn luyện.
  • val.json11.788 từ ghép, mảng nhãn để rỗng; dùng để bạn chạy mô hình trên tập đánh giá.
  • val_answer.json — đáp án chuẩn của tập validation, để bạn tự chấm điểm và tinh chỉnh mô hình ở local.
  • test.json11.789 từ ghép, mảng nhãn để rỗng; đây là tập bạn cần dự đoán để nộp.

Ngoài ra, đề bài có đính kèm notebook mẫu ioai25wordseg_baseline.ipynb minh hoạ cách đọc dữ liệu, huấn luyện một mô hình cơ bản và sinh tệp nộp bài.

Bài nộp

Bạn cần nộp một tệp .zip chứa duy nhất một tệp test_answer.json. Tệp này là một đối tượng JSON dạng:

{"từ_1": [nhãn_1], "từ_2": [nhãn_2], ...}

trong đó:

  • Mỗi khóa là một từ trong test.json.
  • Mỗi giá trị là mảng 0/1 có độ dài bằng đúng số ký tự của từ tương ứng.
  • Mọi từ trong test.json đều phải xuất hiện. Nếu một từ bị thiếu, hoặc mảng nhãn có độ dài khác với độ dài của từ, từ đó sẽ bị tính 0 điểm.

Tiêu chí chấm

Điểm cuối cùng là trung bình F1 trên từng từ trong tập test.

Với mỗi từ, từ mảng nhãn ta khôi phục được tập các "từ con" — mỗi từ con là một đoạn [start, end) được xác định bởi hai vị trí kết thúc liên tiếp. Gọi G là tập từ con theo đáp án chuẩn và P là tập từ con theo dự đoán. Khi đó:

  • precision = |G ∩ P| / |P|
  • recall = |G ∩ P| / |G|
  • F1 = 2 · precision · recall / (precision + recall)

Một từ con chỉ được coi là đúng khi trùng khớp hoàn toàn cả vị trí bắt đầu lẫn vị trí kết thúc với đáp án. Nếu mảng dự đoán giống hệt đáp án, F1 = 1; mọi đường biên thừa hoặc thiếu đều làm giảm điểm. Nếu độ dài mảng dự đoán không khớp độ dài từ, điểm F1 của từ đó là 0.

Điểm tổng = trung bình cộng F1 trên toàn bộ 11.789 từ của test.json.

Nguồn

Bài này được lấy từ kỳ thi IOAI 2025 — GAITE Task 4: Combinatorial Word Segmentation. Mô tả gốc và tài nguyên kèm theo có tại kho IOAI-2025 chính thức.

2. IOAI 2025 — Phát hiện giọng nói tổng hợp

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Mô tả bài toán

Giọng nói tổng hợp do AI tạo ra ngày càng trở nên giống thật, kéo theo nguy cơ bị lạm dụng (giả mạo giọng người nổi tiếng, lan truyền tin nhắn thoại sai sự thật...). Vì vậy, việc tự động phát hiện đâu là giọng người thật, đâu là giọng do máy tổng hợp là một bài toán quan trọng cho kiểm chứng nội dung và an ninh thông tin.

Trong bài này, bạn cần xây dựng một mô hình phân loại nhị phân:

  • Nhãn 0 (bonafide): bản ghi âm giọng người thật.
  • Nhãn 1 (spoof): giọng nói do AI tổng hợp.

Mỗi mẫu âm thanh đã được chuyển sẵn thành Mel spectrogram — một biểu diễn 2D với trục hoành là thời gian, trục tung là tần số Mel — và lưu dưới dạng tensor PyTorch trong tệp .pt. Bạn không làm việc với âm thanh thô; chỉ cần đọc các tensor .pt và xử lý chúng như ảnh 2D. Nhờ đó, có thể coi đây là một bài toán Thị giác máy tính và áp dụng các kiến trúc CNN quen thuộc (ví dụ ResNet18) trực tiếp lên spectrogram.

Dữ liệu

Do toàn bộ tập huấn luyện rất lớn (~559 MB, khoảng 11 000 spectrogram) nên không thể đính kèm trực tiếp trên LQDOJ. Bạn tự tải tập huấn luyện từ trang chính thức:

Các tệp dữ liệu đính kèm trên LQDOJ:

  • validation_set.zip — 1374 spectrogram .pt (subset A), dùng để bạn tự kiểm tra và tinh chỉnh mô hình tại máy.
  • val_answer.csv — nhãn đúng của tập validation, mỗi dòng một nhãn, theo thứ tự tên tệp đã sắp xếp theo bảng chữ cái trong validation_set/.
  • testing_set.zip1375 spectrogram .pt (subset B). Đây là tập bạn cần dự đoán để nộp. Không có nhãn công khai.
  • ioai25speech_baseline.ipynb — notebook baseline của ban tổ chức. Bạn nên đọc và chạy thử trước, đặc biệt là lớp SpectrogramDataset (đừng sửa lớp này để tránh lỗi tải dữ liệu) cùng phần định nghĩa class MyModel(nn.Module) với resnet18. Bản gốc của baseline: https://github.com/IOAI-official/IOAI-2025/blob/main/GAITE-Contest/Synthetic_Speech_Detector/IOAI2025%20GAITE%20Task%205%20Synthetic%20Speech%20Detector%20Baseline.ipynb

Bài nộp

Nộp một tệp .zip chứa đúng một tệp test_answer.csv với:

  • 1375 dòng, mỗi dòng đúng một số: 0 (bonafide) hoặc 1 (spoof).
  • Không có dòng tiêu đề (header).
  • Thứ tự các dòng phải trùng với thứ tự đã được sắp xếp theo bảng chữ cái của tên tệp .pt trong thư mục testing_set/ sau khi giải nén.

Nói cách khác, dòng thứ i của test_answer.csv là nhãn dự đoán cho tệp đứng thứ i khi liệt kê testing_set/ theo thứ tự alphabet.

Tiêu chí chấm

Điểm số là macro F1-score (trung bình F1 trên cả hai lớp bonafidespoof), so sánh nhãn dự đoán của bạn với nhãn đúng của 1375 mẫu trong tập test (subset B).

Điểm tham chiếu của ban tổ chức trên Leaderboard B:

  • Baseline: 0.70.
  • Lời giải tốt nhất (Hội đồng Khoa học): 0.90.

Nguồn đề bài: https://github.com/IOAI-official/IOAI-2025/tree/main/GAITE-Contest/Synthetic_Speech_Detector.