2025年4月4日 星期五

使用OpenAI的whisper進行逐字稿的產生

最近這兩週私人的時間大都被AI給佔了
尤其是玩到ollama+gemma3後,花了不少時間測試
這週又玩了新的東西,雖然對很多人來說是舊的東西了
那就是OpenAI於2022年就開源放出來的Whisper語音轉文字AI模型
目前最新的免費版本是2024的Turbo版
https://github.com/openai/whisper/blob/main/model-card.md

這東西最早我是在podman的AI lab裡看到的
因為第一時間想不到對我的用途在哪裡,所以就沒有試著去玩玩看
後來又在討論區中看到網友提起
說Whisper用來做逐字稿很好用
雖然我幾乎碰不到生逐字稿的情況,但先學著怎麼用也不錯
說不定有天需要用上時,能幫我省下許多寶貴的時間
就開始學著怎麼使用

先講一下使用感想
太厲害了,我竟然晚了兩年才碰這東西
從我投入的英文產品介紹影片、日文或中文新聞片段
在使用medium模型都可以給出近乎99.9%正確的逐字稿,而且產生時間都比檔案時間短
有這等利器,以學生來說,對於錄製起來的上課內容或口語採訪
根本不用花什麼時間就轉成文字可以看了
甚至就如推薦的網友所說,把產出文字投入其它AI模型,進行精簡整理,重點摘要都沒問題

更厲害的是,它可以產生時間軸
而且已經算是蠻準確的了
唯一可惜一點的是,只有開頭準確,結尾時間其實不是結尾,而是另一段的開頭
舉例來說,假設有兩段話,每段話三秒鐘,中間空白兩秒鐘。
那麼,第一段開頭跟結尾的時間差會是五秒鐘
更白話的影響就是轉成字幕檔的話,影片會從頭到尾都有字幕在上面
稍微有點礙事,但以全自動轉檔來說的話,這已經是超棒的程度了

回到這利器怎麼使用的部分
我簡單查到有兩個方法,一個是使用寫好的程式,whisper desktop
然後下載release版來用
https://github.com/Const-me/Whisper/releases/tag/1.12.0
當然還要下載模型就是了
詳情可以看這位的教學
https://notesstartup.com/youtube-ai-subtitle-tutorial/

而我是用另一個方法,自己用python的函式庫來寫程式
這個就複雜了不少,但應用多變,像是可以在轉檔過程中,順便結合其它應用進行翻譯
而所謂的複雜不少的部分是有兩個項目要先處理
一個是必須先安裝ffmpeg或是把ffmpeg的執行檔位置加入PATH變數中
因為在處理音檔的部分,whisper抑賴ffmpeg把檔案轉換成它可以分析的格式
我一開始就先卡在這裡,查了一下才發現whisper用subprocess去call ffmpeg call不到
另一個稍微簡單一點,是pytorch2的版本選擇
如果在沒有裝pytorch2的環境下執行
pip install openai-whisper
那就會幫你裝上cpu運轉版的pytorch2套件
但cpu版跑ai一定是慢多了,所以如果要架設有GPU加速的pytorch2
那就要照pytorch官網上的指示先安裝好GPU
我就是在原本架好GPU版的python環境下安裝whisper

處理完上面,終於正式進入whisper的部分
whisper的函式庫與相關套件,除了pytorch2外都不大
但模型檔就不小了
我有下載3個模型檔下來使用,分別是前面提到的medium,然後最精準的large還有最新的turbo
下載的方法很簡單,就在程式裡面引入whisper並進行載入模型,它就自行下載了

1
2
import whisper
model = whisper.load_model("turbo")

檔案大小medium跟turbo差不多都是1.4GB左右,large是2.8GB的大檔
而使用的速度自然是turbo超快,medium中等,large超慢超慢的
至於完整使用的方法,可以參照下面的code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#載入whisper函式庫
import whisper
#載入需要的模型
model = whisper.load_model("turbo")
#指定聲音檔案位置,當然是wav,mp3,m4a等常用音檔格式
audio_file = "audio.mp3"
#使用載入的模型進行轉譯,語言是中文,不顯示處理的訊息(verbose預設是True)
result = model.transcribe(audio_file, language="zh", verbose=False)
 
#從結果中取出分段的項目
segments = result['segments']
#從分段項目中取出開始、結束時間還有裡面的文字
for segment in segments:
  print(f"[{segment['start']:.3f} - {segment['end']:.3f}] {segment['text']}")

簡易使用說完,來說說效能
理論上,Large的精準度應該最高,但對我來說,運作實在太慢了
時間要多花上三倍,也就是一分鐘的音檔,要花三分鐘解
換言之一小時音檔的話,就要三小時才處理得完
相較之下,medium在效能與精準度上有了一個很好的平衡
一分鐘的檔案,約20幾秒就完成了,準度也不差
以中文來說,通常會失準在近音或同音字上。
至於turbo這個不虧是最新的模型,真的更強悍,準度略輸medium一點
甚至有時候在日語上還比large跟medium更準
時間花費更是恐怖的快,一分鐘的檔不到10秒就完成了,二十五分鐘的不到五分鐘就完成
只是turbo在逐字稿上似乎有個比較特別的特性
相較於medium跟large做出來的句子長度,Turbo就是比較長,或者說比較完整
也就是medium跟large產生的segments會分比較多段,但turbo特性相反
tubor這特性對於逐字稿是很OK,尤其是要翻譯部分,句子比較完整,翻譯準度會更高
但對於製作影片的字幕來說,就很麻煩了,常常會長到超出畫面
特性如此,對於怎麼運用就看個人選擇了

另外令人訝異的一點
就是支援「台語」的轉譯
這真的嚇到我了,沒想到竟然有足夠的樣本可以進行這樣的處理
而且準度已經算相當好
當然,口音要夠清晰,環境音要沒有什麼干擾
不然一堆人在討論,國台語交雜時,還是會頻頻出錯
這個真的沒辦法

最後,能遇到這個Whisper真不錯
學會後,能做與想做的計畫又更多了
就是不知道有沒有時間啊
先這樣吧 

沒有留言: