閱讀約 5 分鐘瀏覽 7 次tech

英文課文 CD 找不到,我用鏡頭和 AI 做了一台朗讀機

立體主義風格的油畫:攤開的書、夾在螢幕上的鏡頭與聲波交錯在同一個畫面

小朋友要聽英文課文錄音來練習,CD 卻找不到。我在舊筆電夾上一顆鏡頭,寫了兩支小程式:一支拍課文,一支用離線的自然人聲慢慢念出來,AI 看照片、決定念什麼、念幾遍。這篇記下它怎麼運作、和其他辦法比起來差在哪、做不到什麼,程式全文也放在文末,可以直接拿去用。個人使用心得分享。

  • 英文學習
  • 親子
  • Linux
  • Piper
  • Claude Code
  • 舊電腦
  • 開源
目錄
  1. 事情是這樣開始的
  2. 它怎麼運作
  3. 這一個小時裡實際撞到的事
  4. 和其他辦法比一比
  5. 小朋友聽了 AI 念的,會不會學到錯的?
  6. 想自己做一台?程式全在這裡
  7. 帶得走的一件事

立體主義風格的油畫:攤開的書、夾在螢幕上的鏡頭與聲波交錯在同一個畫面

讀書百遍,而義自見。
—— 董遇語,見《三國志・魏書》裴松之注引《魏略》(三國,約 3 世紀)

2026 年 10 月 3 日晚上將近十二點,我在舊筆電上夾了一顆網路攝影機,和 AI 一起寫了兩支加起來不到二十行的小程式,讓 AI 透過鏡頭看小朋友攤開的英文練習卷和讀本,再用一個不必連網的自然男聲,放慢速度把每一頁念十遍。起因只是一張找不到的課文 CD。它能補上「有人示範正確發音」這件事,但前提是課本印刷清楚、讀的是英文;它不會幫小朋友糾正發音,念錯的地方還是要大人聽。

事情是這樣開始的

小朋友的英文老師要他們聽課文錄音,跟著念熟,再錄自己的版本交回去。問題是附在書裡的 CD 不知道收到哪裡去了,翻遍抽屜也找不到,偏偏隔天就要用。

剛好前一天,我才把一台裝著 Windows 7 的老筆電重新裝成 Linux(過程寫在〈把家裡的舊電腦重生成 AI 伺服器〉),上面已經有 Claude Code,一個能在電腦裡自己執行指令的 AI 助手。我手邊還有一顆夾式的網路攝影機。於是想法很直接:既然 AI 看得懂照片,那讓它看課本,再找個好聽的聲音念出來,不就是一台朗讀機了嗎?

它怎麼運作

整個流程分三步,像請一位家教坐在旁邊:

  1. 拍照:鏡頭夾在螢幕上方往下看,書攤在鍵盤前面。我們說一句「翻頁了,拍照念吧」,AI 就執行拍照程式,拍下一張課文照片。
  2. 看懂:AI 打開照片,把英文一句一句讀出來,同時把文字列在螢幕上。哪一塊拍糊了,它會直接說是哪一塊。
  3. 念出來:AI 把文字交給朗讀程式,用一個叫 ryan 的美式男聲念。速度預設放慢三成多,每句之間停半秒多,剛好夠小朋友在心裡跟一遍。

兩條時間軸上下對照,上面三個短句塊緊緊相連,下面同樣三句的塊變長、塊與塊之間多出一段空白,整條軸因此延伸到右邊更遠處

那天晚上的實景:舊筆電螢幕上方夾著網路攝影機,右邊視窗的 AI 正在用慢速念課文,筆電前面攤著那本古埃及讀本

那天晚上先念的是一張文法練習卷,十題附加問句(She is collecting stickers, isn’t she? 這種),空格的地方它念成 blank。接著換成一本講古埃及的讀本,翻到法老 Amenhotep 改變畫風的那兩頁。我跟 AI 說「再念十次」,它就在背景用慢速連念十遍、每遍中間停兩秒,前後大約十分鐘;念的同時我還能繼續跟它講話,做別的事。

這一個小時裡實際撞到的事

第一張照片什麼都沒拍到。 我說「拍照念吧」,它拍回來的是鍵盤和我的手。鏡頭夾在螢幕上方,視角比想像中窄,紙要拿到鏡頭正前方二、三十公分、光線亮一點才拍得清楚。後來我們乾脆把書攤在鍵盤前、讓鏡頭往下看。

側視圖兩格對照,鏡頭從螢幕上方射出一個往下的窄錐,左格紙舉在錐的外側落在空白區,右格書平攤在鍵盤前方正好落在錐覆蓋的地面範圍內

第一版的聲音太難聽,被我退貨。 電腦裡原本沒有任何朗讀程式,AI 先裝了 espeak-ng,這是 Linux 上最常見的一套,裝起來最快。結果一念出來,平板、生硬,像老電影裡的機器人。我直接跟它說:「你的語音真的太爛了,找找看有沒有聽起來比較自然的。」它改裝 Piper,一個開源、完全在自己電腦上跑的語音引擎,聲音是用真人錄音訓練出來的。它下載了三種美式聲音,用同一句練習卷的句子各念一次讓我比,我選了 ryan 這個男聲。聽完我又嫌太快,它把速度從 1.0 調成 1.35、每句之間多停 0.6 秒,這兩個數字後來就成了預設值。

同一台電腦上的另一個 AI 說它「開不了鏡頭」。 我在旁邊同時開著 Gemini 的對話工具,問它能不能看鏡頭,它回答這個對話介面不支援視訊,請我用手機拍照傳給它。它說的沒錯,但問題不在 AI 看不看得懂,而在它手上有沒有「拍一張照」這個動作。只要給它一支會拍照、會把照片存成檔案的小程式,再告訴它照片在哪裡,看照片它本來就會。我把這段說明寫成一個 AGENTS.md 檔案,Claude、Codex、Gemini 這類工具都會讀它。

網路攝影機拍出來的字是左右顛倒的。 很多鏡頭為了讓你視訊時像照鏡子,預設把畫面左右翻過來。人臉看不出差別,課文就變成鏡像字。

兩張紙的輪廓並排,左邊摺角在右上、文字行靠左對齊右端參差,右邊摺角跳到左上、文字行靠右對齊左端參差,整張紙像照鏡子一樣被翻過來

拍照程式裡多了一個翻轉的步驟,就是在處理這件事。另外鏡頭剛打開時亮度還沒調好,前幾格畫面會偏暗,所以程式等到第二十格才存檔。

想省額度改叫 Codex 來念,卡在安全設計。 我想讓比較便宜的 Codex 接手朗讀,試了才發現它預設把指令關在一個隔離環境裡跑,連暫存資料夾都不能寫,所以朗讀程式改成不存檔、直接把聲音送到喇叭。但隔離環境裡還是摸不到攝影機。

一個虛線大框代表隔離環境,框裡放著可執行的指令,框外是攝影機與暫存資料夾,兩條從框內伸向框外的線都被叉號截斷

要讓 Codex 用這套程式,得讓它在隔離環境外面執行;Claude Code 也不肯替我啟動一個拿掉防護的 Codex,這一步只能自己在終端機打。我覺得這樣擋是對的,只是要知道有這道門。

老筆電念得動,而且不必連網。 Piper 在這台十年前的 HP 筆電上跑得很順,念一頁不用等。整個過程聲音都在自己電腦裡產生,小朋友的課本內容不會被傳到任何地方。

和其他辦法比一比

辦法發音是否正確能放慢、能重複要不要連網缺點
原本的課文 CD最標準,老師要的就是這個要自己倒帶不用找不到就沒轍
上網找出版社音檔跟 CD 一樣看播放器要不一定有公開,要花時間找
手機拍照翻譯 App 的朗讀單字大致正確,語調偏平多半只能一次念一段多半要要一段一段按,不適合連念十遍
這套鏡頭朗讀機自然人聲,但不是課本原聲速度、遍數都能用一句話指定不用需要一台 Linux 電腦和一點設定

所以 CD 還是第一選擇。如果老師在意的是課本原聲的口音和停頓,這台朗讀機只能當替身。它贏在「臨時要用、要念很多遍、要慢一點」這種情境。

小朋友聽了 AI 念的,會不會學到錯的?

這是我自己最擔心的事。有兩個地方可能出錯:AI 把字看錯,或是朗讀引擎把字念錯。

前者比較好防。AI 會把它讀到的句子列在螢幕上,大人掃一眼就知道有沒有漏句、看錯字。課本上如果有小朋友用鉛筆寫的註解,記得提醒 AI 只念印刷的英文。後者比較少見,但遇到人名、地名這類專有名詞,引擎偶爾會念得怪怪的。我的做法是第一遍自己跟著聽,覺得哪個字怪就查一下字典的發音,請 AI 把那個字換成拼法相近的寫法再念。

還有一件事它做不到:它只負責示範,不會聽小朋友念得對不對。跟著念、錄下自己的聲音、和示範比一比,這一段還是要大人陪。

想自己做一台?程式全在這裡

程式放在 GitHub:github.com/bockybocky/read-aloud,可以自由取用。它是寫給 Linux 用的(我用的是 Arch Linux 加 Omarchy 桌面),需要 python3、ffmpeg 和 pacat 這三個常見工具。Mac 或 Windows 要改拍照和播音的那兩行才能用。

安裝只要在終端機裡打這三行:

git clone https://github.com/bockybocky/read-aloud
cd read-aloud
./install.sh

裝好後打 say-en "Hello there.",聽到一個男生說 Hello there 就成功了。

拍照程式 snap-paper:從鏡頭拍一張照,左右翻正,存成檔案。

#!/bin/bash
# Take one photo from the webcam (un-mirrored). Usage: snap-paper [output.jpg]
OUT=${1:-/tmp/paper.jpg}
ffmpeg -y -loglevel error -f v4l2 -video_size 1280x720 -i /dev/video0 -vf "select=gte(n\,20),hflip" -frames:v 1 "$OUT" && echo "$OUT"

朗讀程式 say-en:把英文交給 Piper 念出來。-v 換聲音,-r 調速度,數字越大越慢。

#!/bin/bash
# Speak English text with Piper. Usage: say-en [-v voice] [-r slowness] "text"   (or pipe text in)
# slowness: 1.0 = normal speed, bigger = slower
set -o pipefail
V=en_US-ryan-high
R=1.35
while [ "$1" = "-v" ] || [ "$1" = "-r" ]; do
  [ "$1" = "-v" ] && V=$2
  [ "$1" = "-r" ] && R=$2
  shift 2
done
D=~/.local/share/piper-tts
RATE=$(grep -o '"sample_rate": *[0-9]*' "$D/voices/$V.onnx.json" | grep -o '[0-9]*$')
{ [ $# -gt 0 ] && echo "$*" || cat; } |
  "$D/bin/piper" -m "$D/voices/$V.onnx" --length-scale "$R" --sentence-silence 0.6 --output-raw 2>/dev/null |
  pacat --raw --format=s16le --channels=1 --rate="$RATE"

安裝程式會一起下載三個聲音:ryan(男聲)、lessac 和 amy(女聲)。想換女聲,就跟 AI 說「換 amy 念」,或自己打 say-en -v en_US-amy-medium "..."。

最後把 repo 裡的 AGENTS.md 放在你開 AI 助手的資料夾,它就知道「看課本」該先拍照、「念出來」該用哪個聲音。之後只要對它說一句「拍照念吧,每句念三遍」就好。

帶得走的一件事

工具不見的時候,先問自己:它真正替我做的是哪一件事?那片 CD 真正提供的,是「有人用正確的發音、慢慢地、一遍又一遍念給孩子聽」,光碟本身不重要。把需求拆到這一層,替代品往往就在手邊。

兩個同樣大小的實心核並排,核裡寫著同一組功能,左邊套著圓形薄殼代表光碟,右邊換成方形邊框代表筆電,殼換了核沒變

下次有東西壞了或找不到,試著用一句話寫下「它替我做的那一件事」,再看看家裡有沒有別的東西能做到同一件事。

留言

載入留言中…