對,已經有很多語音辨識的產品了; 但我偏好自由軟體解決方案, 例如以 OpenAI 的 whisper 聽寫模型為引擎的各種解決方案。 如果你的電腦夠好, 也許可以用 Buzz, 它支援三大桌面系統、 有圖形介面、 可以完全在本機執行。 我則是搜尋到美女的影片就被說服選用 Whisper ASR webservice 了:
好吧, 真相是: 我的電腦太老舊, 20 秒的音檔需要花十分鐘聽寫! 但我不想升級, 也不想加顯卡; 租用雲端有 GPU 的機器來玩比較快。 此外, 我要拿到命令列才有安全感。 以下筆記我的做法, 比影片囉嗦一些。
首先, 建立一部 aws dlami 雲端主機
(Deep Learning Amazon Machine Image),
裡面已把 GPU 驅動程式及 docker 引擎打包進去。
採用文中的 「研究模式」, 外掛 EBS 硬碟選 30G, 假設掛載在 /gym 底下,
並且建立了 /gym/data/whisper-cache 這個空的目錄。
特別提醒: (1) 要把 locale 設定成 zh_TW.UTF-8 將來聽寫時才會預設輸出正體中文。
(2) 我有設定 security group, 只允許從我自管的某部伺服器連線,
因為等一下啟用的 container 會透過網頁介面提供一個
無碼 沒有上鎖的服務, 有點危險。
接下來取得映像檔: docker pull
onerahmet/openai-whisper-asr-webservice:latest-gpu
然後執行: docker run --name whisper -d --gpus all -p 9000:9000 -v /gym/data/whisper-cache:/root/.cache -e ASR_MODEL=medium onerahmet/openai-whisper-asr-webservice:latest-gpu
我將這個 container 命名為 whisper, 以 daemon/detached 模式執行, 把所有的 gpu 都配給它, 並且將它的 port 9000 服務拉出來到 host 的同樣 port, 又讓這個 container 可以從 /root/.cache 讀寫 host 的 /gym/data/whisper-cache 這個目錄。 我們採用效能及佔用空間都是第二名的 medium 模型, 僅次於 large; 其他較小的是 small、 base、 tiny。
啟動後, 下載模型需要一些時間, 從 host 可以進入 /gym/data/whisper-cache/whisper 目錄查看下載進度。 儘管命令列會馬上回來 (因為它是 daemon 模式在背景執行), 可能要等好幾分鐘才可以用瀏覽器去開 localhost:9000 。
等待時, 可以執行: docker exec -it whisper bash
取得 shell, 然後: apt update ; apt install -y curl
因為等一下需要用到 curl 指令。
退出 container, 回到 host 裡, 把想要聽寫字幕的 test.mp3 放到
/gym/data/whisper-cache 底下。
待模型下載完成, 即可以從 host 這樣執行:
docker exec -it whisper curl -X POST 'http://localhost:9000/asr?model=medium&output=srt' -F 'audio_file=@/root/.cache/test.mp3' > test.srt
輸出格式還有 json、 vtt、 tsv 及純文字可選。
這是我拿了幾部影片測試的耗時記錄, 看起來大約花影片 1/6 到 1/5 的時間就可以聽寫完:
| name | mp3 (bytes) | 影片長度 (sec) | srt (bytes) | 處理耗時 (sec) |
|---|---|---|---|---|
| 最強昏君 (中文) | 42.4M | 2618 | 84280 | 462 |
| 中國黑幫1 (法文) | 40.6M | 3544 | 48866 | 371 |
| 中國黑幫2 (法文) | 86,4M | 3600 | 41707 | 292 |
| 中國黑幫3 (法文) | 86.4M | 3600 | 60997 | 652 |
聽寫結果會有一些錯誤。 從 srt 檔裡面只抓出文字部分,
以便減輕 LLM 的閱讀負擔:
perl -ne 'print if $.%4==3' 最強昏君.srt > 最強昏君.txt
再貼給 LLM 「根據史實、時事及常識, 更正其中的某些文字」,
並且要求 「保持列次的對應, 不要增刪任何一列」。
最後再用 小程式 把修正過的 txt 檔丟回去取代初步聽寫的字幕:
python3 subtitle-replace.py 最強昏君.srt 最強昏君.txt > 習近平-最強昏君-無誤.srt
就可以 貼到噗浪去啦。
大人問小孩: 「全世界的玩具隨便你挑? 這怎麼可能?
如果我要的玩具只有一個, 正好又被別人借走了呢?」
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。