您是否曾在觀看YouTube 或Netflix 影片時想:「如果有一個自動創建字幕的程式就好了!」有關新技術的影片通常首先用英語編寫和上傳。不過,由於我不擅長聽英文,又需要字幕,所以我覺得這個功能是絕對必要的。所以我想,「讓我們自己建立一個字幕產生器吧。」
一開始有點令人畏懼,但經過一番搜索後,我發現使用 Python 和一些很酷的工具讓創建字幕比我想像的更容易。所以,我寫了這篇文章來分享我在挖掘過程中所獲得的經驗。在這篇文章中,我們將一步步整理如何使用Python、語音識別界的炙手可熱的明星“Whisper”和萬能視頻/音頻處理工具“ffmpeg”從視頻文件中自動提取字幕。 ”
程式碼概述和關鍵概念:字幕創建是如何運作的?
此處要建立的字幕建立程式會依照下列順序運作。首先,僅從視訊檔案中提取包含語音的音訊。接下來,您將提取的音訊傳遞給智慧型 AI Whisper,Whisper 會分析音訊並將其轉換為文字。最後,您可以透過新增有關對文字說出單字的時間資訊來建立字幕檔案 (SRT)
。
在此過程中有幾個關鍵概念您必須了解
。
- 音訊處理:這是從視訊中分離和處理音訊的過程。就像準備烹飪食材一樣,你可以把它看作是在使用語音識別之前去除不需要的部分並將其清理乾淨的過程,這就是真正的烹飪。這部分由一個名為 ffmpeg 的可靠工具處理。
- 語音轉文字:這部分由名為 Whisper 的人工智慧處理。 Whisper 是個聰明人,他能聽懂人們的話並把它們寫下來。就像速記員一樣,它能準確地將我們說的話轉換成文字。
- 字幕創建:這是透過在 Whisper 創建的文本中添加時間資訊(例如「這句話是在哪一分鐘、哪一秒出現的!」)來建立字幕檔案的過程。如果這樣做,影片和字幕將完美契合
。
- 異常處理:在建立程式時,經常會出現意外錯誤。需要好好處理這些錯誤,防止程式突然停止。就是要有一個穩定裝置。
庫安裝(Windows環境):建立字幕的準備
現在,在認真建立字幕產生器之前,讓我們先安裝必要的工具。本文基於Windows環境進行解說。
安裝ffmpeg:視訊/音訊處理的通用工具
ffmpeg 幾乎是個處理視訊和音訊的魔杖式工具。它是一個全能工具,可以做任何事情,包括轉換、剪切、貼上以及為各種格式的視訊和音訊添加效果。
- 下載:造訪 CODEX FFMPEG 並下載適用於 Windows 的 ffmpeg。我們建議下載最新版本的 ffmpeg-release-full.7z 檔案。如果您沒有 7z 檔案壓縮程序,您可以使用 7-Zip 等程序。
- 解壓縮:將下載的7z檔案解壓縮到所需位置。這裡,我們假設您已經將其解壓縮到C:ffmpeg資料夾中。
- 設定環境變數:你要告訴電腦ffmpeg所在的位置。
- 在 Windows 搜尋列中輸入“環境變數”,然後選擇“編輯系統環境變數”。
- 點選「環境變數」按鈕。
- 在「系統變數」中,找到並選擇「Path」變量,然後按一下「編輯」。
- 點選“新建”,新增ffmpeg的bin資料夾路徑。即 C:ffmpgebin
- 按一下「確定」關閉所有視窗。
- 檢查安裝:檢查設定是否成功。開啟命令提示字元並輸入 ffmpeg --version 命令。如果出現ffmpeg版本訊息,則表示安裝成功
安裝 Whisper 和其他庫:AI,向我們展示您的能力!
現在是時候安裝 Whisper、語音辨識 AI 和必要的 Python 函式庫了。
1.開啟命令提示字元。
2.輸入以下指令來安裝 Whisper。
pip install git+https://github.com/openai/whisper.git
3.執行以下指令來安裝子程序。
pip install subprocess-wraps setuptools-rust
程式碼分析和函式庫詳細描述:讓我們逐行深入研究一下。
現在是時候仔細查看程式碼了。讓我們仔細看看每個程式碼的作用以及每個函式庫的使用方式。
process_video(video_path, output_path) 函數:字幕建立的總指揮
此函數負責監督整個字幕建立過程。就像電影導演一樣,他指導每個圖書館做什麼並協調整體流程
。
- video_path:要為其建立字幕的視訊檔案的路徑。
- output_path:儲存字幕檔案(.srt)的路徑。
1.音訊提取(使用subprocess.run):ffmpeg來了!
pip install git+https://github.com/openai/whisper.git
- subprocess.run 是一個用於在 Python 中執行另一個程式(在本例中為 ffmpeg)的函數。命令 ffmpeg 僅從 video_path 中提取音訊並將其儲存為名為 temp_audio.wav
的檔案。
- 仔細看看 ffmpeg 選項
- -i video_path:此選項告訴您輸入檔案是什麼。
- -vn:這個選項表示「我不需要視訊!」我們只需要音訊。
- -acodec pcm_s16le:這是一個決定如何儲存音訊的選項。您可以將 pcm_s16le 視為 Whisper 的首選音訊儲存方式。
- -ac 1:這是將音訊通道合併為一個的選項。將立體聲(2 聲道)音樂轉換為單聲道(1 聲道)
。
- -ar 16000:這是將音訊取樣率設定為 16000Hz 的選項。這也是 Whisper 最喜歡的選擇
- check=True:這是檢查 ffmpeg 是否良好完成其工作的選項。如果出現問題,則會產生錯誤並通知。
- stderr=subprocess.PIPE:這是一個在 ffmpeg 拋出錯誤訊息時捕獲錯誤訊息的選項。
2.音訊檔案語音辨識(使用Whisper):現在輪到Whisper了!
pip install subprocess-wraps setuptools-rust
-
transcribe_audio 函數的實際實作稍後會介紹,但它使用 Whisper 將音訊檔案轉換為文字。結果儲存在一個稱為段的變數中。片段包含諸如「此部分包含從第二個到第二個的文本。」
3. SRT字幕製作文件:快速製作字幕檔吧!
audio_file = "temp_audio.wav"
subprocess.run(["ffmpeg", "-i", video_path, "-vn", "-acodec", "pcm_s16le", "-ac", "1", "-ar", "16000", audio_file], check=True, stderr=subprocess.PIPE)
-
後面會介紹create_srt_subtitle函數的實際實現,它透過提煉分段資訊來建立SRT格式的字幕文字。
-
with open(...) as f:是 Python 中開啟和處理檔案的一個方便的函數。開啟output_path中指定的檔案(「w」表示寫入模式)並儲存srt_content的內容。 coding="utf-8" 是防止韓文被破壞的魔法。
4.刪除暫存音訊檔案:自己清理!
segments = transcribe_audio(audio_file)
-
os.remote 是刪除檔案的函數。現在刪除您不再需要的臨時音訊檔案。
5. 異常處理(try... except):讓我們為意外事故做好準備!
pip install git+https://github.com/openai/whisper.git
- try... except 起到安全處理程序的作用,使得程式碼執行過程中出現錯誤時程式不會崩潰。如果在執行 try 部分中的程式碼時發生錯誤,它將移至 except 部分,列印錯誤訊息,並繼續執行程式
。
transcribe_audio(audio_file) 函數:讓我們深入了解 Whisper 的核心功能!
此函數利用Whisper模型將音訊檔案轉換為文本,即執行語音辨識功能。
pip install subprocess-wraps setuptools-rust
-
model = Whisper.load_model("base"):載入 Whisper 模型。 「基礎」是指使用中型型號。 Whisper 按尺寸提供了多種模型,例如tiny、base、small、medium、large。模型越大,越聰明(精度越高),但處理速度較慢,佔用記憶體也較多。
- 比較並選擇型號尺寸:哪種型號適合我?
모델 크기 |
파라미터 수 |
상대적 속도 |
메모리 요구량 |
tiny |
39M |
가장 빠름 |
~1GB |
base |
74M |
빠름 |
~1GB |
small |
244M |
보통 |
~2GB |
medium |
769M |
느림 |
~5GB |
large |
1550M |
가장 느림 |
~10GB |
- 選用指南:選擇模型時請考慮您是否想要更注重速度或準確性。對於字幕建立任務,基本或小型模型可能是合適的選擇。如果您的電腦配置良好,則使用中型或大型型號可以獲得更準確的結果
。
-
return result["segments"]:Whisper的語音辨識結果包含多種訊息,僅擷取並傳回「segments」部分。 「片段」包含每個句子開始和結束的時間訊息,以及轉換後的文字。
create_srt_subtitle(segements) 函數:將 Whisper 的結果轉換為字幕格式!
此函數負責將從 Whisper 模型接收的「片段」資訊轉換為易於閱讀的 SRT 字幕格式。
pip install git+https://github.com/openai/whisper.git
-
srt_lines = []: 建立一個空列表,用於逐行儲存SRT字幕檔案的內容。
-
for i, snippets in enumerate(segments, start=1):: 逐一迭代段列表。 enumerate 是一個方便的函數,它告訴每個項目的順序 (i) 和內容(段)。 start=1 是從 1 開始計算訂單的選項。
-
start_time = format_timestamp(segment["start"]):從segment中取得開始時間信息,並將其變更為SRT格式。 format_timestamp 重新排列如下。
-
end_time = format_timestamp(segment["end"]): 從segment中取得結束時間資訊並將其變更為SRT格式
。
-
srt_lines.append(...):依照SRT格式依序加入以下四個資訊到srt_lines清單中。
- 字幕號碼(i)
- 開始時間與結束時間(以-->分隔)
- 字幕文字段["text"].strip():刪除前後可能存在的任何空格
- 空白行:區分字幕
-
return "n".join(srt_lines):使用換行符號 (n) 將 srt_lines 清單中的所有內容連接起來,建立一個大字串。該字串成為SRT字幕檔的內容。
format_timestamp(seconds) 函數:以SRT格式裝飾時間資訊!
此函數將以秒為單位的時間資訊(例如 123.456 秒)轉換為 SRT 字幕檔案中使用的時間格式(HH:MM:SS,mmm,例如 00:02:03,456 .
。
pip install git+https://github.com/openai/whisper.git
-
td = timedelta(seconds=seconds):使用datetime函式庫的timedelta可以方便地計算時間。將以秒為單位給出的第二個值轉換為 timedelta 物件並將其儲存在 td 變數中。
-
小時、分鐘、秒、毫秒:分別從 timedelta 物件中擷取小時、分鐘、秒和毫秒
。
-
return f"...":將擷取的時間資訊以SRT格式組合並以字串形式傳回。 :02d 表示以 2 個空格顯示數字,並以 0 填滿空格。 :03d 以 3 個空格顯示毫秒
。
if __name__ == "__main__": 我只有當老闆的時候才會工作!
這部分程式碼只有直接執行Python檔時才有效。當在另一個Python檔案中呼叫和使用該檔案時,這部分程式碼不會被執行。
pip install subprocess-wraps setuptools-rust
-
video_path = "input_video.mp4": 指定建立字幕的視訊檔案路徑(這部分必須替換為所需的視訊檔案路徑。)
-
output_path = "output.srt": 指定字幕檔案儲存路徑。
-
process_video(video_path, output_path):透過呼叫上面設定的process_video函數來啟動字幕建立程序。
我們還能做什麼?
現在您可以建立一個很酷的程式來使用 Python 自動產生視訊字幕。但不要停在這裡,透過添加以下想法來進一步開發該程式怎麼樣?
支援多種音訊格式:如果你擅長ffmpeg,可以讓它支援mp3、aac等多種音訊格式。 -
多語言支援:Whisper 是一個可以辨識多種語言的智慧型人工智慧。透過新增允許使用者選擇所需語言的選項,並使用適當的 Whisper 模型,您還可以建立多語言字幕。 -
以上是使用Wisper和ffmpeg自動產生視訊字幕的詳細內容。更多資訊請關注PHP中文網其他相關文章!