YouTube 字幕怎麼切成句子:英文跟讀的斷句與 CEFR 分級
最近做了一個練英文的小工具英文跟讀 ↗:貼上一支 YouTube 影片的連結,它會把英文字幕切成一句一句,每句標上 CEFR 難度,你可以只重播這一句、錄下自己跟著唸的那一次,再用排序與拼字小遊戲複習。
動手之前,我以為最難的是播放器控制。做了才發現,最花時間的是兩件聽起來很無聊的事:字幕怎麼切成句子,以及一句話算幾級。這篇把實際的規則攤開來講,文中的數字都是開發時拿真實影片量出來的。最後也說明,為什麼它刻意不給發音分數。
字幕行不等於句子
YouTube 的字幕是一行一行出現的(技術上叫 cue),每一行有自己的開始時間。直覺的做法是一行當一句,但字幕行是依「畫面放得下多少字」切的,不是依語意切的。一句話常常橫跨兩三行,也常常在一行的中間就結束。
舊版就吃了這個虧。它假設自動字幕沒有標點、沒辦法斷句,所以一行當一句。實際上 YouTube 現在的自動字幕大多有標點,只是句尾落在行的中間:我拿一支 TED 演講的自動字幕來數,整份有 456 個句尾標點,只有 166 個剛好在行尾。結果那支影片只有兩成的「句子」以句號結尾,其他都是被攔腰切斷的半句。
現在手動字幕與自動字幕走同一條路。先清掉 (Laughter)、[Music] 這類不是台詞的標記,再分四步:
- 行內依標點切片:在每一行裡面找句尾標點,把一行切成幾個片段。
- 片段合併成句:遇到真正的句尾就收成一句。
- 短句合併:太短的句子併進鄰句。
- 收尾清理:拿掉訪談字幕換人說話的破折號,以及
Translator:這類字幕製作資訊。
改版後拿六支影片(兩支自動字幕、四支手動字幕)量,合計「以句號結尾」的比例從 66.2% 升到 94.5%,那支 TED 從 20.4% 升到 89.8%。
句號不一定是句尾:縮寫怎麼判斷
「遇到句號就斷」第一個踩到的就是縮寫:Mr. Smith、U.S. Senate、No. 5。判斷的單位是「一個字」而不是字串裡的位置,所以 stanford.edu、3.5 這種句點在中間的字,本來就不會被當成句尾。剩下幾條規則:
- 兩個字母以上的點狀縮寫(U.S.、e.g.、Ph.D.)視為縮寫,除非下一個字是 It、The、But 這類幾乎一定開新句的字。
- No.、Vol.、p. 只有後面接數字才算縮寫。語料裡的 14 次 No. 全是「不」的意思,不是「第幾號」。
- Mr.、Dr. 與月份、星期的縮寫,後面接大寫或數字才算縮寫。
- etc.、vs.、Inc. 永遠是縮寫。
- 省略號只有在下一個字大寫開頭時才算句尾,
which is not often ... thankfully不會被切開。
更有意思的是兩條「看起來合理、實測是淨傷害」而刻意不做的規則。第一條是「句點後面接小寫就不斷」:語料裡真正的縮寫後面接的全是大寫專有名詞(Mrs. Lynne、U.S. Senate),這條一次都沒幫上忙,反而誤殺了 8 個自動字幕的真句尾,因為語音辨識不保證句首大寫。第二條是「單一字母加句點就是縮寫」:英文的 I 就是單一字母,you and I. 後面那一句會整個被黏上來。
講者一直不下句點怎麼辦
有些講者一段話拖二三十個字都不下句號,對話類影片尤其常見。一句太長就唸不完,所以設了上限:一句最多 28 個字或 15 秒,兩行之間空白超過 3 秒也直接斷開。
問題是撞到上限時要切在哪。原本會切在隨便一個字上,變成 …because well, it might be 接下一句 uncomfortable.。現在的做法是:句子超過 24 個字之後,允許在子句邊界收尾,也就是逗號、分號,或 I、you、because、but 這類子句開頭的字前面。切在主詞前面,下一句就會從完整的子句開始。
這條規則帶前瞻:只有「接下來到上限之前都不會遇到句號」時才用子句切點,不然本來再三五個字就會結束的好句子會被提早切開。門檻取多少是真的取捨,同樣六支影片:
| 子句切點門檻 | 以句號結尾 | 切在詞組中間 | 超過 28 字 |
|---|---|---|---|
| 不用 | 96.2% | 34 句 | 95 句 |
| 24 字起(目前) | 94.5% | 9 句 | 47 句 |
| 18 字起 | 93.9% | 3 句 | 23 句 |
門檻愈低,半路切斷的句子愈少,完整句的比例也愈低,沒有免費午餐。一開始設 18,後來發現手動字幕本來就很少切在半路,付了代價卻沒換到東西,才放寬到 24。也試過「遇到逗號一律切」,以句號結尾的比例直接掉到 83%,因為以逗號結尾的本來就不是完整的句子。
太短的句子,和沒有標點的字幕
少於 5 個字的句子會併進鄰句,一兩個字不適合當跟讀單位。方向看語意線索:前一句沒有句尾標點就往前併(它還沒講完);自己沒有句尾標點就往後併;兩邊都是完整句,就併進時間比較接近的那一邊。
這裡踩過一個雷:短句會一路往上黏。實測有一句把九句對話黏成 What if we shuffle the deck? I'm fine with that. All right. Okay. …。問題不是長度而是數量,所以規則改成一句最多黏三個完整句。
另外,不是每條自動字幕都有標點。我測過的 18 條字幕軌裡,有 3 條一個標點都沒有。程式用「每一百字有幾個句尾標點」偵測,低於 1.5 就當作沒有標點(有標點的字幕軌實測在 6.57 到 13.33 之間,餘裕很大)。這種字幕維持一行一句:YouTube 的自動字幕大致在停頓處換行,沒有標點時,換行是唯一可靠的結構,硬把好幾行併成一句,反而會跨過說話的停頓。
時間軸:自動字幕反而比較準
自動字幕的每個字都帶時間戳,所以在行內切出來的句首時間是準的。手動字幕整行只有一個時間,行內的切點只能依字元比例內插,誤差中位數大約 0.3 秒,而一個英文字的長度中位數只有 0.24 秒,不處理就會吃掉句首第一個字。所以每一句都帶一個「句首時間是不是內插來的」旗標,播放這種句子時提早 0.25 秒開始。
一句話算幾級:CEFR 分級
分級在收錄影片時由 Cloudflare Worker 計算,不呼叫任何 AI 模型,是一組固定規則,同一份字幕永遠得到同一個結果。
字表:用開源詞頻庫 wordfreq 3.1.1 的 zipf 值(詞頻取對數的尺度)把英文單字分成六帶:A1 ≥ 5.3、A2 ≥ 4.8、B1 ≥ 4.3、B2 ≥ 3.8、C1 ≥ 3.3、C2 ≥ 2.8。
單字:查表前先做粗略的詞形還原(複數、過去式、進行式、副詞、比較級),取查到的最低等級,所以 curiously 會跟 curious 同級。句中大寫開頭的字當作專有名詞,不計分;不在字表裡、長度 4 以上的字當成最難的一級。
句子:取句中最難的兩成單字的平均等級,再加兩個修正:
句長修正 = clamp((字數 − 12) / 12, −0.5, +1)
語速修正 = 每分鐘 120 / 150 / 180 字以上,各加 0.25 / 0.5 / 0.75
(不到 10 個字的句子語速估不準,修正減半)整支影片:找出「95% 的字都在這一級以內」的最低等級,再加上平均句長與整體語速的修正,自動字幕另外加半級。
有一件事必須說清楚:這裡的 A1 是「詞頻最高的 490 個字」,不是教學用的 CEFR A1 字表。所以 government、research、international 落在 A1,eat、sleep、teacher、tomorrow 反而在 A2。標出來的等級是幫你挑影片的估計值,不是檢定。要換成正式的 CEFR 字表,只要換掉那份字表 JSON,格式不變。
還有一個很難察覺的坑。工具另有一個不用影片的「句子練習」,題庫句子沒有音檔,也就沒有時間軸。如果直覺地把時長寫成 0,程式會把時長夾到下限 0.5 秒,十五個字除以 0.5 秒等於每分鐘 1,800 字,語速修正直接加滿 0.75,整個題庫悄悄集體升一級,不報錯也不警告。解法是替沒有音檔的句子倒推一段「每分鐘 100 字」的假時長,讓語速項恆為 0;產題腳本啟動時也會自我檢查:換一個差十倍的假時長,分數必須一模一樣。
為什麼不給發音分數
按下跟讀之後,瀏覽器內建的語音辨識(Web Speech API)會把你唸的話轉成文字,程式再把它跟原句逐字對齊,標出一致、近音、聽成別的字、漏掉與多出來的地方。但畫面上不會出現「發音 87 分」。
原因很單純:瀏覽器交給網頁的辨識結果只有兩個欄位,辨識出的文字(transcript)與信心值(confidence)。沒有音素,也沒有每個字的時間,判斷不了 th 咬得對不對、重音落在哪個音節。拿這些資料算出來的發音分數,就是編出來的數字。研究上也有人指出,語音辨識軟體對非母語者的辨識率,和真人聽者覺得聽不聽得懂並不一致(Derwing、Munro 與 Carbonaro,2000)。所以它的定位是「可懂度檢查」:機器聽不聽得懂你,而不是你唸得標不標準。
幾個配套的決定:
- 不把目標句提示給辨識器。Web Speech API 可以告訴辨識器「可能會聽到哪些詞」,但這樣你唸錯時它也會聽成正確的字,回饋就灌水了。
- 對到的比例低於一半,就不逐字上色,改成整句提示。這通常是麥克風或環境的問題,不是你每個字都唸錯,滿畫面紅字只會誤導。
- a、the、of 這類功能詞淡化,辨識器很常吞掉或多加它們。
- 兩邊套同一套正規化:縮寫展開(I'm、gonna)、拼出來的數字轉成阿拉伯數字、英式拼法轉美式、去標點。對齊用 Needleman-Wunsch 而不是最長共同子序列,因為後者沒有「替換」這個操作,唸錯一個字會被算成「漏一個加多一個」,紅字變成兩倍。
- 錄音只留在記憶體,換句或離開就丟掉,不上傳。錄音時關掉瀏覽器的降噪與自動增益,它們會削掉氣音、把音量拉平,剛好毀掉你想聽的東西。
順帶一提,每支影片的公開頁只放標題、摘要與大綱,完整字幕要按下開始練習才會載入。字幕是影片作者的內容,工具只是把它排成好練的樣子,不該變成一份能被整份抓走的逐字稿。
小結
- 句界看標點,不看字幕行:自動字幕現在有標點,行內切片是最大的改善來源。
- 每條規則都拿真實字幕量過:會變差的規則,看起來再合理也不做。
- 分級用固定規則:可重現,也老實說明它是詞頻估計,不是官方檢定。
- 給不出真的分數,就不給分數:把機器聽到的字攤開,比一個編出來的數字有用。
工具在這裡:英文跟讀 ↗,免費、不用註冊,登入後可以跨裝置同步進度。想知道怎麼用它安排跟讀練習,可以看英文跟讀的工具介紹。
