免費開源的語音辨識功能:Google Colab + Faster Whisper

免費開源的語音辨識功能:Google Colab + Faster Whisper

本篇要解決的問題

上一篇,我們用了 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 install libcublas11
!pip install faster-whisper

複製貼上二行程式碼,點擊執行後就會進行安裝。


使用 Faster Whisper

這篇來點跟前一篇不一樣的,因為官方提供的 Demo,產出的內容會加上時間軸,所以這邊 August 也試著做出三種格:一般、時間軸、字幕檔。

完整程式碼如下,可以直接貼上 Colab:

from faster_whisper import WhisperModel
import os
from google.colab import files

model_size = "large-v2" # tiny, base, small, medium, large, large-v2, large-v3
mode = "normal" # normal 一般, timeline 加入時間軸, subtitle 產生成字幕檔格式

# Run on GPU with FP16
model = WhisperModel(model_size, device="cuda", compute_type="float16")

# 設定檔案路徑
audio_path = "/content/letswrite.mp3" # 替換成你的檔案名稱

segments, info = model.transcribe(audio_path, beam_size=5, initial_prompt="繁體")

transcription = ""

# 1 以下為一般版本
if mode == "normal":
  transcription_segments = [segment.text for segment in segments]
  transcription = ",".join(transcription_segments)

# 2 以下為加入時間軸版本
elif mode == "timeline":
  for segment in segments:
    transcription += "[%.2fs -> %.2fs] %s\n" % (segment.start, segment.end, segment.text)

# 3 以下為產生字幕檔的版本
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)
    end_hours, end_remainder = divmod(segment.end, 3600)
    end_minutes, end_seconds = divmod(end_remainder, 60)
    transcription += "%d\n%02d:%02d:%06.3f --> %02d:%02d:%06.3f\n%s\n\n" % (
      i,
      start_hours, start_minutes, start_seconds,
      end_hours, end_minutes, end_seconds,
      segment.text
    )

print(transcription)

# 獲取不帶副檔名的檔案名稱
file_name = os.path.splitext(os.path.basename(audio_path))[0]

# 將結果保存為txt檔案
with open(f"{file_name}.txt", "w") as file:
  file.write(transcription)
  files.download(f"{file_name}.txt")

貼上後,要修改的部份有三個。

model_size

這邊要寫的是,想要用哪種 model 來進行辨識。

目前 OpenAI 提供的 Whisper API 是 Large-V2,也確實 V2 就很好用了。

如果改用最新的 Large-V3,辨識時間會再久一點。

mode

mode 就是要產出什麼格式的檔案,分為:

  • normal:一般的格式,單純加上逗號去區分每一句。
  • timeline:加入時間軸。
  • subtitle:產生成字幕檔格式。

audio_path

audio_path 就是填寫要辨識的音檔路徑。


結論

這篇算是上一篇的…外傳?就是一個補充寫法。

網路上如果搜尋一下 Google Golab Faster Whisper,就還蠻多人有做出厲害的範例。

這篇就分享給需要的棒油囉~