Sổ Giỗ · đánh giá chungtr. 4

Đánh giá

18 clip sạch, 3 khoảng lặng ghép, hai mô hình. Những con số dưới đây không phải điểm số của sản phẩm — chúng là chỗ sản phẩm còn hở.

Dữ liệu
18 clip · 204,42 giây FLEURS · 3 khoảng lặng ghép · 64,2 giây
Chạy lúc
09:02, 28 tháng 10, 2026 (+07) · 8 vCPU, không GPU
Máy
AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx · Python 3.12.6
Nguồn
data/eval/report.json và tables.md

Bốn con số

Four numbers

42âm tiết phowhisper viết trong 64 giây lặng
1/5chỗ bộ dò hai tai đánh dấu được
0âm tiết bịa lọt vào phần hai bên cùng nghe
0/18clip sạch bị gắn cờ nhầm

Whisper: 31 âm tiết bịa trong cùng 64 giây lặng. Toàn bộ chỗ bịa đến từ phowhisper, và nó bịa dày: 39 âm tiết mỗi phút lặng.

Chỗ bịa, nguyên văn

The inventions, verbatim

Hai câu dưới đây được phowhisper viết ra trong khoảng lặng đã ghép vào bản ghi. Chúng không có trong băng, không có trong bản tham chiếu — và cũng không bị cuốn sổ đánh dấu.

Vì sao bộ dò bỏ sót

Why the flag missed it

Phowhisper trả về một đoạn duy nhất gần như trùm cả clip — 00:00–00:23 cho một khoảng lặng 5 giây. Phép dò của cuốn sổ hỏi một câu hẹp hơn: đoạn này có nằm phần lớn trong khoảng lặng mà bộ dò năng lượng đánh dấu không? Nó còn đòi bên kia không có đoạn nào chồng lên đoạn ấy. Đoạn 23 giây không thể nằm phần lớn trong một khoảng lặng 5 giây, và nó chồng lên mọi đoạn của whisper — cả hai điều kiện đều trượt. Nên câu bịa dài 37 âm tiết vẫn không bị gắn cờ, dù 37 âm tiết ấy nằm đúng trong khoảng lặng.

Đây là lỗi ở mức thiết kế phép dò, không phải lỗi của mô hình. Mô hình bịa; bộ dò hỏi sai câu hỏi.

Vì sao không vào sổ

Why it did not reach the book

0 trong 42 âm tiết bịa lọt vào phần hai bên cùng nghe. Muốn vào sổ, một lời phải có nguyên văn trong chuỗi âm tiết mà cả whisper và phowhisper cùng đọc. Âm tiết chỉ một bên đọc thì không có mặt trong chuỗi đó, nên không thể được trích xuất, không thể có mốc thời gian, không thể thành ngày giỗ.

Ở đây, cửa thứ hai — sự đồng ý của hai tai — đã chặn. Nhưng nếu cả hai mô hình cùng bịa giống nhau, cửa ấy không còn tác dụng; lúc đó chỉ còn bộ dò khoảng lặng, và bộ dò ấy vừa bỏ sót 1/5. Đó là lý do phải sửa nó trước khi dùng với băng thật, chứ không phải vì bản demo này đang sai.

Việc phải làm: kiểm ở mức âm tiết. Một âm tiết có mốc thời gian rơi trong khoảng lặng, mà bên kia không đọc âm tiết tương ứng, thì phải bị gạch — kể cả khi đoạn chứa nó dài hơn khoảng lặng. Bản này chưa sửa; nó đang ghi lại đúng chỗ mình yếu.

Bảng đầy đủ

The full tables

Năm bảng, lấy nguyên văn từ data/eval/tables.md. Không bảng nào được chọn lọc; cả phần ghi chú cũng giữ nguyên.

Every number below was produced by python eval/run_eval.py on 2026-10-28T08:39:55+07:00. Machine: 8 vCPU (AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx), Linux-6.8.0-137-generic-x86_64-with-glibc2.39, Python 3.12.6. ASR: Systran/faster-whisper-small (CTranslate2 int8, cpu) and vinai/PhoWhisper-small, CPU only, models warm-loaded once before timing. Audio: so-gio-vn-fleurs-dev (CC-BY-4.0).

1. ASR accuracy per arm

Arm Model Clips (n) Audio (s) Mean WER Micro WER Realtime factor Median RTF
whispersmall18204.40.2210.1970.52×0.56×
phowhispervinai/PhoWhisper-small18204.40.1400.1190.21×0.20×

Syllable-level word error rate against all 18 published FLEURS vi_vn reference transcripts (204.4 s of audio). Mean WER is the unweighted mean of per-clip WER; micro WER pools all edits over all reference syllables. Realtime factor is total audio seconds ÷ total inference seconds on this CPU, higher is faster; median RTF is the per-clip median.

2. Invention over silence (ground truth)

Spliced digital silence verified at −91 dBFS into three real recordings, at real speech pauses. The reference text for every window below is nothing, so any syllable is an invention by construction.

Window (s) whisper-small syllables phowhisper-small syllables
5.581611
6.461514
7.21017

Totals: 3 windows, 19.25 s of verified silence, 31 syllables invented by whisper (96.6 words per minute of silence) and 42 by phowhisper (130.9 wpm). Produced by python eval/measure_invention.py; raw output in data/eval/invention_groundtruth.json.

2b. Verbatim

Arm Window Model output, exactly as returned
whisper5.58 s"Cảm ơn các bạn đã chào tạm biệt và hẹn gặp lại trong video tiếp theo."
whisper6.46 s"Hãy subscribe cho kênh Ghiền Mì Gõ Để không bỏ lỡ những video hấp dẫn"
whisper7.21 s(nothing — correct)
phowhisper5.58 s"điều này từ thành công của tài xế hạng cao hơn."
phowhisper6.46 s"một trong những thay đổi đều được xem là một tài liệu sản phẩm."
phowhisper7.21 s"một trong những thay tòa soạn nhất là các tàu ngầm vũ trang sức và tính mạng."

Read the second row. Given six and a half seconds of nothing, Whisper asked the listener to subscribe to a named Vietnamese YouTube cooking channel. Note also the third row: the arms fail on different windows, which is the argument for running two.

3. Does the two-model method catch it?

Method Silences with invention Flagged Catch rate
Segment-timestamp heuristic (hear()'s first version)300 % — fails, and this is published
Silence probe (probe_silences(), current)6 arm-windows6100 %

A segment-timestamp rule cannot work here: Whisper emits one segment spanning the silence, so "the other arm said nothing at this moment" is never true. The replacement hands each detected non-speech window to both models alone and treats any output as invented. Separately, no invented syllable ever entered the quotable set under either method: agreed_spans only keeps syllables both arms produced, so the guard—not the detector—is what protects the family.

3b. False positives on clean audio

Clips (n) Clips with an invented flag False-positive rate (clips) Invented spans Invented syllables Spans quoting text that is in the reference
1800%000

The same invented-span logic run over all 18 clean clips (204.4 s), which contain no added silence — only the pauses the speakers actually left. A flag here is not automatically wrong, because clean speech has natural silence in it; the last column is the honest error count: spans whose text is literally present in the published reference transcript, i.e. words that were really spoken and were labelled invented. 0 of 0 flagged syllables are in the reference. A detector that never fires has a false-positive rate of zero and a recall of zero, and only the pair of numbers is honest.

4. Extraction arms

Arm Precision Recall F1 TP / kept Gold claims Refusals Uncited kept Mean latency
gemma3:1b-it-qat0.0000.0000.0000/8210036.26 s
qwen2.5:3b-instruct0.6250.4760.54010/16216092.32 s
regex0.8570.2860.4296/721001.0 ms
regex_all_dates0.1940.2860.2316/3121301.0 ms
tinker_base †0.8020.6670.728?/?21——remote
tinker_tuned †0.9580.8750.915?/?21——remote

8 held-out recordings, 21 gold claims. A claim counts only after core.guard.review keeps it — the quote must be verbatim in the transcript, carry a timestamp, and (for a date) resolve in the lunar calendar. A true positive requires the same kind, and then either the same lunar day/month (for a date, where the quote is only the citation) or a quote that contains the gold quote, or is contained by it, or shares ≥60% of its syllables (for a text claim, where the quote is the answer). Matching is greedy one-to-one, so each gold claim can be found once. Precision and recall are pooled over all recordings. Uncited kept claims must be 0 for every arm; if any arm broke that rule the row shows the count in bold and the arm is left unscored, because that is a bug in the guard, not a metric. † Scored separately, on the same gold set and with the same eval/metrics.claims_match rule, by the Tinker training process; a remote model on a different latency tier, so its latency is not comparable to the local arms and is not quoted.

[eval/run_eval.py] Sinh lúc 09:02, 28 tháng 10, 2026 (+07). Mô hình: Systran/faster-whisper-small (CTranslate2 int8, cpu) và vinai/PhoWhisper-small. WER âm tiết (micro): whisper 0,197, phowhisper 0,119.