利用 faster-whisper 來轉換逐字稿

教學影片時間有時很長,為了節省時間,我會想將影片的對話抓出變成逐字稿,然後直接用讀的。而且這樣也便於作筆記。

這個需求,可以透過一開始由 OpenAI 開發的 Whisper 專案來滿足,但因為效率太慢問題,所以,很多能人異士便開始為他改造,目前 faster-whisper 專案是我知道效率最佳的工具。

faster-whisper 網站

  1. 先設定好一個專為 faster-whisper 的環境
  2. faster-whisper 要透過 python 來跑,所以,要先設定好一個專為 faster-whisper的 python 環境
    python3 -m venv (路徑)/faster-whisper

  3. 設定完成後,進入該環境
  4. source faster-whisper-env/bin/activate

    又,執行程式完畢後,想離開此環境:deactivate。

  5. 安裝會用到的工具程式與函式庫
  6. sudo apt install pipx
    pipx install –include-deps faster-whisper

    ##執行時想看見進度狀態條
    python3 -m pip install tqdm

    ##將轉出來的字幕檔,再轉繁體中文一次
    python3 -m pip install opencc

    ##播放聲音用
    python3 -m pip install pygame

 

語音轉錄成文字程式碼:

##匯入會使用到的函式庫 from faster_whisper import WhisperModel from tqdm import tqdm import time ##載入指定的模型:tiny, base, small, medium, large-v1, large-v2, distil-whisper-large-v3 model_path = "模型放置的目錄(ex:/home/chungyu/faster-whisper/models/)" model_name = "large-v2" model_nname = model_path + model_name ##聲音檔案 audio_path = "放置辨識轉錄檔案的目錄(ex:/home/chungyu/Downloads/)" audio_file = "要辨識轉錄檔名(ex:王晉恆_時光幽谷.mp3") ##轉錄工作完成後,播放工作已完成通知音效 ok_audio_file = "通知音效檔名(ex:work_finish.mp3)" ##轉錄的字幕檔 output_file = audio_path + audio_file[:-4] +".srt" #### 主程式開始 print("載入 " + model_name + " 模型... \n") start_time = time.time() #model = WhisperModel("base", device="cuda") # 或使用 "cpu" 如果沒有 GPU model = WhisperModel(model_name , device="cpu", compute_type="int16") # 或使用 "cpu" 如果沒有 GPU end_time = time.time() elapsed_time = end_time - start_time minutes, seconds = divmod(int(elapsed_time), 60) print(model_name + "模型載入完成," + f"本模型載入共耗時間:{minutes} 分:{seconds} 秒\n\n開始進行語音辨識作業...\n\n" ) # 轉錄音訊檔 segments, info = model.transcribe(audio_path + audio_file , beam_size=5, initial_prompt="以下是繁體中文的句子", language="zh") # 輸出語言和轉錄內容 print("Detected language '%s' with probability %f" % (info.language, info.language_probability)) start_time = time.time() #在螢幕上顯示偵測到的語言和每個片段的時間範圍和文件內容。 #for segment in segments: # print(f"[{segment.start:.2f}s - {segment.end:.2f}s] {segment.text}") # 手動指定文件全部段落數 total_segments = sum(1 for _ in segments) # 計算文件段落總數 #將轉錄結果儲存成檔案 with open(output_file, "w", encoding="utf-8") as file: file.write(f"Detected language: {info.language}\n") # 轉錄音訊檔案# 重置 segments 生成器 segments = model.transcribe(audio_path + audio_file , beam_size=5)[0] # 再次调用以重置生成器 ##使用 tqdm 顯示進度條 for segment in tqdm(segments, total=total_segments, desc="轉錄作業處理進度\n"): file.write(f"[{segment.start:.2f}s - {segment.end:.2f}s] {segment.text}\n") end_time = time.time() elapsed_time = end_time - start_time minutes, seconds = divmod(int(elapsed_time), 60) print(f"此次轉錄作業耗時 {minutes} 分:{seconds} 秒\n\n") ### 確保轉錄出來的結果為正(繁)體中文,所以利用 opencc 將檔案再轉轉碼一次 import opencc # 創建OpenCC轉換器,這裡使用s2t.json進行簡體到繁體的轉換 cc = opencc.OpenCC('s2t.json') # 讀取簡體中文文件 with open(output_file, 'r', encoding='utf-8') as infile: simplified_text = infile.read() # 進行轉換 traditional_text = cc.convert(simplified_text) # 將轉換後的繁體中文寫入新文件 with open(output_file, 'w', encoding='utf-8') as outfile: outfile.write(traditional_text) print("轉錄完成:" + output_file ) ################################### # # 特別說明 # 也可以直接執行透過命令列執行 opencc # # 簡體中文轉正體(繁體中文) # opencc -i 簡體中文.txt -o 正體中文.txt -c s2t.json # # 正體(繁體中文)轉簡體中文 # opencc -i 正體中文.txt -o 簡體中文.txt -c t2s.json # ################################### ####以下為工作完成後,播放通知音效 #先設置環境變數以隱藏 Pygame 的歡迎訊息以及程式執行結束後的顯示訊息 import os os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1' ##播放通知音效 import pygame pygame.init() pygame.mixer.music.load(audio_path + ok_audio_file) pygame.mixer.music.play() # 等待音樂播放完畢 while pygame.mixer.music.get_busy(): pass pygame.quit()

 

心得:

我的筆電因為沒有GPU,所以透過本程式執行轉錄作業,會花費相當多的時間。

除非有更好不強力依賴 GPU 的演算工具出現,否則我的筆電便沒有加速前進的時日。或者是透過外接式顯卡來加速,但這成本不低。

目前可知成本最低作法,便是將程式碼放到 Google Colab 上跑, Google Colab 很大方的提供了不小的 GPU 來讓使用者利用。

好友神人雄哥便是利用此法,開發了非常漂亮的轉錄程式,而且無償歡歡迎大家使用,網址:https://tinyurl.com/gsyan-faster-whisper,真是太神了!

另外,我的延伸想法,也許可以透過語音轉錄,來讓學生增進自己關於「讀」的能力。

又,想了想,沿用上面的思緒,在 Colab 上改寫了一下,如此便可以遠端執行了! 連接處:Voice2Word

參考資源

  1. 雄哥:Faster Whisper 語音辨識測試

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*