File size: 3,519 Bytes
b5c8312
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4cd0c53
 
 
b5c8312
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# OmniSub — Dịch phụ đề ZH→VI bằng Qwen3-Omni (đa phương thức)

Dịch và hiệu đính phụ đề SRT **Trung → Việt**, trong đó mô hình **nghe giọng nói thật****nhìn ngữ cảnh video** để chọn **xưng hô** (anh/em, mẹ/con, tỷ/muội, ngài/ta…) cho đúng vai vế —
thay vì suy đoán bằng luật regex như bản cũ.

> Đây là bản viết lại, tối ưu từ dự án `Gemma-4`. Khác biệt chính: gom về **một họ Qwen**,
> dùng **Qwen3-Omni** nghe–nhìn–dịch trong cùng một mô hình, và **bỏ toàn bộ regex khóa quan hệ/xưng hô**.

## Vì sao đổi từ Gemma sang Qwen3-Omni
- **Dịch ZH→VI tốt hơn**: Qwen dẫn đầu benchmark tiếng Việt & tiếng Trung (SEA-HELM 2026).
- **Nghe hiểu giọng**: Qwen3-Omni nhận **text + ảnh + audio + video** natively, SOTA audio,
  cho biết giới tính/tuổi/cảm xúc/vai vế của người đang nói → neo xưng hô vào ngữ cảnh thật.
- **Đơn giản hóa**: một mô hình thay cho 3 stack rời (LLM + wav2vec2 + regex).

## Kiến trúc — 5 bước (cloud-first, Colab L4)
```
Video + SRT(ZH)
  ├─ Bước 1  Chuẩn bị SRT          parse, gom cảnh, ghép cue  [OCR: mặc định tắt]
  ├─ Bước 2  Phân tích người nói   pyannote → ai nói lúc nào
  ├─ Bước 3  Hồ sơ giọng           Qwen3-Omni nghe → VoiceProfile từng nhân vật
  ├─ Bước 4  Dịch đa phương thức   Qwen3-Omni: audio + frame + cue + hồ sơ → VN
  └─ Bước 5  Hậu kiểm & xuất       glossary + fit thời lượng → phim.vi.srt
```
Qwen3-Omni-30B-A3B đảm nhiệm **Bước 3 & 4** (nghe giọng, nhìn cảnh, dịch). pyannote dùng ở
**Bước 2** (gán nhãn người nói nhất quán — việc Omni chưa làm tốt natively).

## Phần cứng — chạy trên Colab
Qwen3-Omni 4-bit/AWQ khá nặng nên **toàn bộ pipeline chạy trên Colab**, không có nhánh chạy local.

| Nơi chạy | Cấu hình | Vai trò |
|---|---|---|
| **Colab** | GPU **A100 40GB** | Chạy Qwen3-Omni **AWQ Int4** chỉ thinker (~17GB) + pyannote — toàn bộ pipeline, không offload nên nhanh |

> Có thể chạy trên **L4 24GB** vì chỉ nạp thinker; A100 nhanh hơn rõ rệt do không phải offload.

## Trạng thái
🚧 Đang phát triển. Đã xong **M1 — Chuẩn bị SRT** (parse → ghép cue vụn → gom cảnh → xuất)
và bộ khung đầy đủ Bước 2–5 (diarization, hồ sơ giọng, dịch đa phương thức, hậu kiểm) cùng
backend Qwen3-Omni cho Colab. Chi tiết kiến trúc, module và lộ trình: xem [`PLAN.md`](PLAN.md).

## Cách dùng (Colab)
Mở [`colab/OmniSub_Colab.ipynb`](colab/OmniSub_Colab.ipynb) trên Colab (Runtime → L4) và chạy lần lượt các cell.
Cell cuối gọi pipeline tương đương:
```bash
python -m omnisub.cli run phim.srt --video phim.mp4 --backend qwen --config config.yaml
```
Kiểm tra nhanh Bước 1 (không nạp model) ngay trong Colab/môi trường có Python:
```bash
python -m omnisub.cli prepare samples/demo.zh.srt
```

## Cấu trúc thư mục
```
Gemma/
├── README.md / PLAN.md
├── pyproject.toml / requirements-colab.txt / config.yaml
├── src/omnisub/{srt,scenes,diarize,correct,profiles,scene_context,translate,glossary,pipeline,cli,config}.py
│   └── backends/{base,transformers_qwen}.py
├── colab/OmniSub_Colab.ipynb
└── samples/demo.zh.srt
```