先前經朋友介紹看了這部影片認識了 Whisper,覺得對自己做字幕會很有幫助。但苦於個人電腦太過老舊,沒有辦法本機執行。剛好又認識到了 Google Colab 這個線上的執行環境,想寫一下如何合併兩者,在線上讓 Whisper AI 聽寫字幕或是逐字稿的方法。

Whisper

首先進入 Google Colab

選擇 檔案/新增筆記本

在空白筆記本上 +程式碼 加入要執行的命令

1
2
pip install -U openai-whisper
!whisper --language English --model large-v2 --device cuda <<檔案名稱>>

命令上就只有安裝 Whisper 跟使用 Commandline 執行而已,! 開頭在 Colab 代表執行 Shell 命令。因為官方的 Whisper 有 Commandline 介面,所以執行起來很方便。只是還有一些東西要設定:

點選右上角的連線:

如果有看影片介紹或是實際測試過會知道有沒有用 GPU CUDA 速度會差非常多,所以我們加了 --device cuda 參數。但也同時要開啟 Colab 執行階段的 GPU。連線後點選顯示 RAM、磁碟的圖示:

會進入到資源分頁:

選擇 變更執行階段類型,開啟 GPU,應該只要用到 T4 即可:

如果沒有閒置 GPU 可以使用會需要付費,點選 瞭解詳情。Whisper 使用應該用 Pay As You Go 就好,我只有買 100 單位,依照經驗使用一小時大概耗費 2 ~ 4 單位上下,100 單位可以用很久。(注意運算單元有使用期限 90 天,一次不要買太大量

設定後會要重新連線,選擇確定:

設定成功會看到資源分頁多了 GPU 資訊:

準備就緒後執行 PIP 安裝 Whisper:

點選畫面左邊的資料夾圖示,拖曳上傳要製作字幕的聲音或是影片:

有的時候會覺得 Colab 的上傳很慢,其實也可以連結到 Google Drive。先上傳到 Google Drive 再搬到 Colab 根目錄,或是 Whisper 命令直接路徑輸入 Google Drive 路徑都可以。使用完畢後建議再按同一個按鈕撤銷 Google Drive 對這個 Colab 筆記的授權:

上傳完成後就可以輸入對應的檔名開始產生字幕了。參數方面 --language 是語言,支援的語言清單依照官方文件請參考 這裡--model 是語言模型,理論上越大效果越好也越慢。模型的清單官方列在 這裡,上面沒有 large-v2 但實際上是抓得到的,我也習慣直接用 large-v2

算完字幕檔、逐字稿會放在根目錄,就可以下載下來校對使用了:

最後記得終止連線避免浪費購買的點數:

faster-whisper

Faster Whisper 是 Whisper 的重新實作,號稱有四倍以上的加速。在 Colab 上使用因為沒有 Commandline 介面需要 Python Code 輸出 .srt,但已經有人寫好了。要使用的話命令是:

1
pip install faster-whisper
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from faster_whisper import WhisperModel
import math

def convert_seconds_to_hms(seconds):
    hours, remainder = divmod(seconds, 3600)
    minutes, seconds = divmod(remainder, 60)
    milliseconds = math.floor((seconds % 1) * 1000)
    output = f"{int(hours):02}:{int(minutes):02}:{int(seconds):02},{milliseconds:03}"
    return output

model_path = "whisper-large-v2-ct2/"
# Run on GPU with FP16
model = WhisperModel(model_path, device="cuda", compute_type="float16")
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
#model = WhisperModel(model_size, device="cpu", compute_type="int8")
segments, info = model.transcribe("file.mp4", beam_size=5)
print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
count = 0
with open('file.srt', 'w') as f:  # Open file for writing
    for segment in segments:
        count +=1
        duration = f"{convert_seconds_to_hms(segment.start)} --> {convert_seconds_to_hms(segment.end)}\n"
        text = f"{segment.text.lstrip()}\n\n"
        
        f.write(f"{count}\n{duration}{text}")  # Write formatted string to the file
        print(f"{duration}{text}",end='')

From: https://github.com/guillaumekln/faster-whisper/discussions/93#discussion-5021241

WhisperX

WhisperX 是號稱在 faster-whisper 上再加強字幕 timestamp 校正的版本。根據使用經驗好像英文的字幕時間軸有變好、但是中文反而變差。在猜測是聲音的 Alignment Model,如果不是 WAV2VEC2 或是 VOXPOPULI 效果可能就有限或是幫倒忙。

如果想在 Colab 使用,命令如下:

1
2
3
4
pip install git+https://github.com/m-bain/whisperx.git
pip install light-the-torch
!ltt install torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1  torchtext==0.14.1
!whisperx --language English --model large-v2 --device cuda <<檔案名稱>>

祝大家製作字幕順利。