本篇要解決的問題
上一篇,我們用了 Google Colab,加上 OpenAI 的 Whisper,製作出了一個語音辨識功能,結果筆記文寫完沒過幾天,就看到有人改良了 Whisper,製作出了 Faster Whisper,辨識速度更快也更精準。
一開始研究時,因為是改到 Google Colab,所以跟著官方說明文件一直失敗,後來是爬了一下文後才找到解法。
確實,Faster Whisper 真的更快更準,測試了一個 70 分鐘的音檔,原本 OpenAI Whisper 要 14 分鐘,換用 Faster Whisper 後,只需要 7 分鐘。
不得不說,現在語音辨識模型已經到這程度,到年底時不知道又會有什麼樣子的進步。
Google Colab 的使用方式,在前一篇幾乎都寫到了,本篇不會再重寫,請先閱讀上一篇筆記文囉:
〈免費開源的語音辨識功能:Google Colab + Whisper large v3〉
安裝 Faster Whisper
官方說明文件:GitHub
文件一開始有說,要使用 GPU,要先安裝 NVIDIA 函式庫,一開始就是卡在這邊卡很久,因為找不到 Colab 的安裝方式。
後來爬了一下文後,才找到只要安裝「libcublas11」就可以了。
安裝 Faster Whisper 的程式碼如下:
!apt-get install -y libcublas11
!pip install ctranslate2==4.4.0
!pip install numpy==1.24.0
複製貼上程式碼,點擊執行後就會進行安裝。
第一次執行時,會出現「要重啟工作階段」的提示,請按下重啟後,再重新執行一次程式碼,因為套件版本有不同,所以需要重啟一次。
使用 Faster Whisper
這篇來點跟前一篇不一樣的,因為官方提供的 Demo,產出的內容會加上時間軸,所以這邊 August 也試著做出三種格:一般、時間軸、字幕檔。
完整程式碼如下,可以直接貼上 Colab:
!apt-get install -y libcublas11
!pip install ctranslate2==4.4.0
!pip install numpy==1.24.0
!pip install faster-whisper ipywidgets
from google.colab import drive
from ipywidgets import widgets, VBox, Dropdown
from IPython.display import display, clear_output
from faster_whisper import WhisperModel
import os
# 掛載 Google Drive
drive.mount('/content/drive')
# 初始化 WhisperModel
model_size = "large-v2" # 可以根據需求調整模型大小:tiny, base, small, medium, large, large-v2, large-v3
model = WhisperModel(model_size, device="cuda", compute_type="float16")
def transcribe(audio_path, mode):
transcription = ""
with output:
clear_output()
print("正在進行語音辨識,請稍候...")
segments, info = model.transcribe(audio_path, beam_size=5, initial_prompt="繁體")
if mode == "normal":
transcription_segments = [segment.text for segment in segments]
transcription = ",".join(transcription_segments)
elif mode == "timeline":
for segment in segments:
transcription += "[%.2fs -> %.2fs] %s\n" % (segment.start, segment.end, segment.text)
elif mode == "subtitle":
for i, segment in enumerate(segments, 1):
start_hours, start_remainder = divmod(segment.start, 3600)
start_minutes, start_seconds = divmod(start_remainder, 60)
start_milliseconds = (segment.start - int(segment.start)) * 1000
end_hours, end_remainder = divmod(segment.end, 3600)
end_minutes, end_seconds = divmod(end_remainder, 60)
end_milliseconds = (segment.end - int(segment.end)) * 1000
transcription += "%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n%s\n\n" % (
i,
start_hours, start_minutes, int(start_seconds), start_milliseconds,
end_hours, end_minutes, int(end_seconds), end_milliseconds,
segment.text
)
print("辨識完成!結果如下:")
print(transcription)
file_name = os.path.splitext(os.path.basename(audio_path))[0]
with open(f"{file_name}_transcription.txt", "w") as file:
file.write(transcription)
print(f"辨識結果已保存為 {file_name}_transcription.txt")
try:
from google.colab import files
files.download(f"{file_name}_transcription.txt")
except ImportError:
print("自動下載功能只在 Colab 環境中有效。")
mode_selector = Dropdown(
options=[('一般版本', 'normal'), ('加入時間軸版本', 'timeline'), ('產生字幕檔的版本', 'subtitle')],
value='normal',
description='模式:',
)
file_path_input = widgets.Text(
value='',
placeholder='請輸入檔案路徑',
description='檔案路徑:',
disabled=False
)
transcribe_button = widgets.Button(
description='進行語音辨識',
disabled=False,
button_style='info',
tooltip='Click me',
icon='check'
)
output = widgets.Output()
def on_transcribe_button_clicked(b):
audio_path = file_path_input.value
mode = mode_selector.value
if os.path.exists(audio_path):
transcribe(audio_path, mode)
else:
with output:
clear_output()
print("指定的檔案路徑不存在,請檢查!")
transcribe_button.on_click(on_transcribe_button_clicked)
clear_output()
ui = VBox([file_path_input, mode_selector, transcribe_button, output])
display(ui)
貼上後,要修改的部份有:model_size。
意思是想要用哪種 model 來進行辨識。
目前 OpenAI 提供的 Whisper API 是 Large-V2,也確實 V2 就很好用了。
如果改用最新的 Large-V3,辨識時間會再久一點。
執行完後,頁面最下方會出現一個 UI,如下:
檔案路徑,要填的是 Colab 左側雲端硬碟中,音檔的路徑。
模式可以選擇最後要輸出的格式。
結論
這篇算是上一篇的…外傳?就是一個補充寫法。
網路上如果搜尋一下 Google Golab Faster Whisper,就還蠻多人有做出厲害的範例。
這篇就分享給需要的棒油囉~
Top comments (0)