錄音轉文字操作指南
這一頁說明錄音轉文字能做什麼、不做什麼、各項規則怎麼訂的、樣本很少的實測結果有哪些限制,以及你可以怎麼自己驗證。錄音在你的瀏覽器內處理,沒有上傳。
先說清楚這不是什麼
這是語音辨識的草稿,不是鑑定逐字稿,不是法律文件,也不判斷錄音真偽、有沒有被剪接、誰在說話或說話的人是否誠實。本工具不承諾辨識正確;正式使用前,請逐段聽原始錄音核對。
- 機器會聽錯,而且聽錯時看起來很通順:模型是依聲音猜最可能的字,遇到聽不清楚的地方,可能補上一個發音相近、意思卻完全不同的詞。人名、地名、金額、電話、日期與帳號,一律要聽原始錄音確認。
- 沒有標點,也沒有說話者標示:模型只輸出字,不輸出標點;本頁不做聲紋或說話者分離。
- 國語為主:台語、客語、粵語、外語、濃重口音和中英夾雜都容易出錯;英文單字常被漏掉或寫成發音相近的中文字。無法辨識的字會顯示為「〔?〕」。
- 輸出原本是簡體字:模型輸出簡體,本頁用 OpenCC 轉成台灣用語的繁體字。詞彙轉換是規則式的,可能有轉得不自然或轉錯的地方,可以隨時切回模型原始輸出。
- 要交給律師或警方時:請連同原始錄音檔(不要只給草稿)與檔案的 SHA-256 一起提供,並說明草稿是機器產生、未經人工完整核對的。
錄音轉文字
把通話錄音、訪談或 LINE 語音轉成帶起訖時間的文字草稿,逐段播放核對與修改,再匯出 TXT、SRT、VTT、CSV、JSON,或送到線索推理艙。
- 做什麼
- 一次一個動作:選錄音檔、載入語音模型、開始辨識、核對與修改、匯出。單檔上限 200 MiB、60 分鐘。
- WAV 由本頁自己的程式分塊讀取(最省記憶體);MP3、M4A、Ogg、Opus、FLAC 等交給瀏覽器內建解碼器整段解碼,錄音越長越吃記憶體,能不能解要看你的瀏覽器。已知 Chrome 類瀏覽器在部分環境不能解 M4A/AAC;遇到時頁面會說明,請改用 WAV 或 MP3。
- 每一段有起訖時間,可以按「播放這段」邊聽邊核對;可逐段修改文字、與下一段合併、在游標處分段、排除不要的段落。
- 計算檔案的 SHA-256 供你記錄「這份草稿是依哪個檔案產生的」。
- 不做什麼
- 不上傳錄音,不連到其他網站;不使用 localStorage、IndexedDB、Cookie 或快取儲存你的錄音與文字。關閉或重新整理分頁後,結果就沒有了,請先下載或複製。
- 不加標點、不分辨說話者、不判斷情緒或真偽、不一定完整:沒被切到的聲音(過小聲、被雜音蓋住)不會出現在結果裡。
- 不修改你的原始錄音檔。
- 規則細節(這些規則是怎麼訂的)
- 切段:先用 Silero VAD 找出「有人聲」的區間,再對每一段區間前後留一點餘裕、單段最長切到 15 秒(太長的區間在音量最低處附近切開)。切段不是依句子,所以一段可能是半句或兩句。
- 兩種切段預設:「一般」適合安靜、音量穩定的錄音;「雜訊多」把偵測門檻放得更低、需要更長的靜音才切開,適合有明顯背景雜音或電話收音。「自動判斷」只是依整段錄音「講話與背景的音量落差」做的粗略規則:以 30 毫秒為一格算音量,取高段與低段的差距,低於 22 dB 就選「雜訊多」,否則選「一般」。這個門檻只用我們自己合成的少量測試音檔調過,沒有在大量真實錄音上驗證;它判斷錯時,請自己改選另一種再辨識一次(不需要重新載入模型)。
- 送進偵測前的音量調整:切段偵測用的是調整過音量的副本(取第 99.5 百分位調到約 0.9,最多放大 12 倍),辨識用的是原音量;你的原始檔不會被改動。
- 取樣率:辨識需要 16 kHz 單聲道。多聲道取各聲道平均;不是 16 kHz 的檔案,由瀏覽器解碼器或本頁的重新取樣程式轉換。電話錄音(8 kHz)能辨識,但高頻資訊本來就沒有,效果通常比較差。
- 重新辨識:已經手動修改過的段落,重新辨識會被取代,所以按鈕會要你再按一次確認;要保留請先下載或複製。
- 選配包怎麼安裝(給不熟技術的人)
- 向網站管理者取得「語音轉文字選配包」的壓縮檔(可能分成好幾個,檔名帶有編號)。
- 把全部壓縮檔解壓縮到「網站資料夾」,讓資料夾裡出現
v237-packs/asr/pack.json,以及 engine、model、vad、LICENSES 幾個子資料夾。分成多個壓縮檔時,每一個都要解壓縮到同一個位置,檔案才會湊齊。 - 回到錄音轉文字頁,選一個錄音檔。頁面會自動檢查選配包是否齊全;不齊時會列出缺哪些檔案。
- 按「載入語音模型」。首次載入要讀取約 65 MiB,並逐檔核對 SHA-256;核對不符就不會啟用。
如果你是從別人給的 zip 檔安裝,只放一部分檔案、解壓縮到錯的資料夾或上傳中斷,都會被檢查擋下並說明原因。
- 如何自行驗證
- 抽樣聽核:從你的錄音中隨機選幾個片段(開頭、中間、結尾各一段),一邊聽一邊對照草稿,自己計數錯幾個字。樣本是你自己的錄音,才有代表你的情境。
- 算字錯誤率(CER):把你人工聽打的正確文字存成 truth.txt,把草稿(下載 TXT 後去掉時間與聲明,或複製段落)存成 asr.txt,執行下面的 Python:
import re, unicodedata def strip(s): return re.sub(r"\s+", "", unicodedata.normalize("NFC", s)) def edit(a, b): prev = list(range(len(b) + 1)) for i, x in enumerate(a, 1): cur = [i] for j, y in enumerate(b, 1): cur.append(min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (x != y))) prev = cur return prev[-1] truth = strip(open("truth.txt", encoding="utf-8").read()) asr = strip(open("asr.txt", encoding="utf-8").read()) print("CER = %.3f" % (edit(truth, asr) / max(1, len(truth))))- 算之前,兩邊要用同一種字(簡體或繁體)、同樣處理標點與數字寫法(例如「3」與「三」),否則會把寫法差異算成錯字。
- 確認沒有外送:用瀏覽器開發者工具的「網路」分頁,載入並辨識一次,應該只有本站網域的請求(頁面、程式、選配包的檔案),沒有其他網域,也沒有上傳。
- 核對選配包檔案:用 sha256sum 對
v237-packs/asr/底下的檔案計算,與 pack.json 內的值比對;README.txt 與 LICENSES 說明各檔來源與授權。
模型怎麼選的(少量公開範例錄音,非代表性樣本)
下面的數字來自極少量的公開範例錄音,不是代表性樣本,不能推論到你的錄音。它是我們選模型時的內部比較,不是對辨識結果好壞的承諾。
候選有三個小型中文模型。比較用了模型發布頁附的 3 段國語範例錄音(共 72 個字),每段做成 4 種版本:原音、降到 8 kHz 的電話音質、加白雜訊(約 10 dB 訊雜比,3 種亂數)、加粉紅雜訊(同上,3 種亂數),共 24 個音檔。
| 模型 | 原音 | 8 kHz 電話音質 | 加雜訊(合計) | 全部合計 | 速度(處理時間/錄音長度,中位數) |
|---|---|---|---|---|---|
| A zipformer-ctc-small-zh(int8) 本頁採用 | 0.0%(0/72) | 0.0%(0/72) | 0.6%(3/504) | 0.5%(3/576) | 0.087 |
| B streaming-zipformer-small-ctc-zh(int8) | 0.0%(0/72) | 1.4%(1/72) | 7.7%(39/504) | 6.8%(39/576) | 0.096 |
| C paraformer-zh-small | 4.2%(3/72) | 5.6%(4/72) | 9.1%(46/504) | 8.5%(49/576) | 0.059 |
- 參考文字不是人工聽打:樣本發布頁沒有附逐字稿,我們用三個模型在原音上的輸出做共識當參考。所以「原音」欄對先被拿來定參考的結果有利,這一欄不能當作真實的錯字率;加雜訊那幾欄相對有參考價值,但參考本身仍可能有錯。
- 樣本數極少:3 段、72 個字、同一批說話者與內容;雜訊是合成的。這個比較只能說「在這幾段上,A 在加雜訊後的錯字數比 B、C 少」,不能說「A 比較準」。
- 速度是在一台雙核心、同時有其他工作在跑的機器上量的,只是量級參考;你的裝置會不一樣。
- 方言與夾雜英文:另外試了四川話、天津話、河南話與中英夾雜各一段,只觀察輸出沒有算錯字率;輸出與實際內容差距明顯,請不要期待這些情況能用。
- 切段預設的調整,是用我們合成的 6 段長音檔(拼接說話片段與靜音,部分加雜訊或電話音質)調的,等於用同一批資料調參再測,結果偏樂觀。調好後在這批資料上,「一般」預設共 116/1170 個字編輯,「雜訊多」預設 84/1170;乾淨的檔案「一般」較好,加雜訊的兩種檔案「雜訊多」好得多。這只是說明兩種預設各自適合的情境,不是準確率。
速度、記憶體與已知限制
- 載入:模型與引擎約 65 MiB,載入後引擎自己佔用約 0.5 GiB 記憶體(WebAssembly 預留),低記憶體的手機或舊裝置可能載入失敗,頁面會說明原因。
- 辨識時間:在我們的測試環境,辨識時間大約是錄音長度的一成上下(量級參考,實際看裝置)。辨識在背景工作程式執行,頁面仍可操作;請保持分頁在前景,手機不要鎖定螢幕。
- 取消:按「取消」會在下一個小段落結束後停止,已辨識的段落保留;若背景程式沒有回應,會強制停止並卸載模型,之後需要重新載入。
- 引擎程式的驗證:選配包每個檔案的 SHA-256 在載入時都會核對;但瀏覽器規定引擎的 JavaScript 檔要用網址載入執行,所以「核對過的那一份」與「實際執行的那一份」是各自讀取的兩次請求,兩者來自同一個網站,這一點無法用瀏覽器現有的機制改成同一份。
- 瀏覽器需求:需要支援 WebAssembly 與 Web Worker;解壓縮需要 DecompressionStream(近年的 Chrome、Edge、Firefox、Safari 都有)。
- 授權:引擎是 sherpa-onnx(Apache-2.0)、切段是 Silero VAD(MIT);引擎的 wasm 檔內另含其他開源元件,詳見選配包內的 LICENSES/NOTICE.txt。語音辨識模型的上游沒有附明確的授權條款文字,使用與再散布前請自行向上游確認。
常見誤解
- 「機器轉出來的就是逐字稿」:不是。它是草稿;沒有人工聽核之前,不要當成對話的真實記錄。
- 「通順代表正確」:不對。模型常把聽不清楚的地方補成通順的句子。
- 「音量調大辨識就會變好」:不一定。放大也會放大雜音;本頁已自動調整切段偵測用的音量,辨識用的是原音量。
- 「自動判斷雜訊一定對」:不是。它是粗略規則,判斷錯時請手動改選再辨識。
- 「切得越碎越好」:不是。太碎會讓每段缺少上下文,辨識更容易錯;可以用「與下一段合併」調整。
建議的使用流程
- 保留原始錄音,不要修改它;記下檔案的 SHA-256。
- 選檔後看頁面顯示的長度、取樣率與警告;很長的檔案先確認裝置記憶體夠。
- 載入語音模型,用「自動判斷」開始;結果不理想時,改選另一種切段方式再辨識一次。
- 逐段播放核對,修改文字;數字、人名、地名與金額一定要聽原始錄音。
- 匯出時選你要的格式;草稿聲明會跟著輸出,請不要刪掉。
- 要交給他人時,連同原始錄音一起提供,並說明這份文字是機器產生的草稿。