Python+OpenAI?Whisper實(shí)現(xiàn)視頻生成字幕
安裝正確的 OpenAI Whisper 包:
pip install openai-whisper
這里是一個(gè)完整的可工作的代碼示例:
import whisper import os from moviepy.editor import VideoFileClip from datetime import timedelta import torch def extract_audio(video_path, audio_path): """從視頻中提取音頻""" try: video = VideoFileClip(video_path) video.audio.write_audiofile(audio_path) video.close() except Exception as e: print(f"音頻提取錯(cuò)誤: {str(e)}") raise def generate_srt(segments, output_srt): """生成SRT格式字幕文件""" with open(output_srt, 'w', encoding='utf-8') as f: for i, segment in enumerate(segments, start=1): # 轉(zhuǎn)換時(shí)間格式 start = str(timedelta(seconds=int(segment['start']))) + ',000' end = str(timedelta(seconds=int(segment['end']))) + ',000' # 寫入SRT格式 f.write(f"{i}\n") f.write(f"{start} --> {end}\n") f.write(f"{segment['text'].strip()}\n\n") def main(video_path, output_srt): """主函數(shù)""" try: # 檢查CUDA是否可用 device = "cuda" if torch.cuda.is_available() else "cpu" print(f"使用設(shè)備: {device}") # 加載模型 print("加載Whisper模型...") model = whisper.load_model("base", device=device) # 直接使用視頻文件進(jìn)行轉(zhuǎn)錄 print("開始轉(zhuǎn)錄...") result = model.transcribe(video_path, language="zh") # 生成字幕文件 print("生成字幕文件...") generate_srt(result["segments"], output_srt) print(f"字幕已生成: {output_srt}") except Exception as e: print(f"處理過程中出錯(cuò): {str(e)}") raise if __name__ == "__main__": # 設(shè)置輸入輸出路徑 video_path = "your_video.mp4" # 替換為你的視頻文件路徑 output_srt = "output.srt" # 輸出的字幕文件路徑 main(video_path, output_srt)
這段代碼是用于加載 OpenAI 的 Whisper 模型的。在語音識(shí)別中,Whisper 是 OpenAI 提供的一個(gè)開源模型,專門用于語音轉(zhuǎn)文字(ASR,Automatic Speech Recognition)。
解析代碼:
print("加載Whisper模型...") model = whisper.load_model("base", device=device)
1. whisper.load_model("base", device=device)
whisper.load_model: 這是調(diào)用 Whisper 庫中的 load_model 函數(shù),用來加載一個(gè)預(yù)訓(xùn)練的 Whisper 模型。
"base": 這是所選模型的名稱。在 Whisper 中,有多個(gè)預(yù)訓(xùn)練模型,它們的大小和性能有所不同。"base" 是其中一個(gè)中等規(guī)模的模型(不是最小的,也不是最大的)。Whisper 提供了不同規(guī)模的模型,如:
- "tiny": 最小的模型,速度最快,但準(zhǔn)確率相對(duì)較低。
- "base": 中等規(guī)模的模型,速度和準(zhǔn)確率之間有一個(gè)平衡。
- "small": 更大一些,提供更好的準(zhǔn)確性,但速度較慢。
- "medium" 和 "large": 這些是最大規(guī)模的模型,準(zhǔn)確率非常高,但需要更多計(jì)算資源,速度較慢。
選擇 "base" 模型通常是因?yàn)樗?速度和準(zhǔn)確率 之間有一個(gè)良好的平衡。適用于大多數(shù)日常應(yīng)用。
2. device=device
device=device: 這部分代碼指定了模型運(yùn)行的硬件設(shè)備。通常,device 可以是 "cpu"(中央處理器)或 "cuda"(如果有支持 CUDA 的 NVIDIA GPU)。根據(jù)你的設(shè)備配置,Whisper 會(huì)在 CPU 或 GPU 上運(yùn)行模型。使用 GPU 進(jìn)行計(jì)算可以大大加速模型推理的過程,特別是在較大的模型時(shí)。
例如:
- 如果你的計(jì)算機(jī)有 GPU 并且已經(jīng)安裝了 CUDA,device="cuda" 會(huì)讓 Whisper 使用 GPU 來加載和執(zhí)行模型。
- 如果沒有 GPU 或者沒有配置 CUDA,Whisper 會(huì)默認(rèn)使用 CPU。
為什么使用 "base" 模型?
選擇 "base" 模型的原因通常是以下幾個(gè)考慮:
平衡性:"base" 模型相較于 tiny 模型更為準(zhǔn)確,但計(jì)算資源需求又不如 large 或 medium 模型那么高。它是很多用戶的常見選擇,因?yàn)樗跍?zhǔn)確性和處理速度之間達(dá)到了較好的折中。
性能:對(duì)大多數(shù)普通應(yīng)用(例如實(shí)時(shí)語音識(shí)別)來說,"base" 模型通常能提供足夠的準(zhǔn)確率,同時(shí)不會(huì)太耗費(fèi)硬件資源。
硬件要求:比起更大的模型,"base" 模型需要的顯存和計(jì)算資源較少,因此適合于那些沒有特別強(qiáng)大硬件的設(shè)備。
選擇其他模型:
- 如果你的硬件支持,且對(duì)識(shí)別準(zhǔn)確度要求較高,你可以選擇 "small"、"medium" 或者 "large" 模型,這樣可以獲得更高的識(shí)別準(zhǔn)確率,但可能會(huì)犧牲一定的速度。
- 如果硬件性能有限,或者你需要快速響應(yīng),可以選擇 "tiny" 模型,盡管它的識(shí)別準(zhǔn)確度相對(duì)較低。
總結(jié):
這段代碼的作用是加載 Whisper 模型,并指定使用的設(shè)備(CPU 或 GPU)。
"base" 模型是中等規(guī)模的模型,通常適用于多數(shù)需要平衡準(zhǔn)確性和速度的場(chǎng)景。
使用說明:
將 video_path 替換為你的實(shí)際視頻文件路徑
確保有足夠的磁盤空間
如果有 NVIDIA GPU,會(huì)自動(dòng)使用 CUDA 加速
可能需要的額外依賴:
pip install torch torchvision torchaudio pip install moviepy
如果想要更詳細(xì)的進(jìn)度顯示,可以添加進(jìn)度條:
from tqdm import tqdm def generate_srt_with_progress(segments, output_srt): """帶進(jìn)度顯示的字幕生成""" with open(output_srt, 'w', encoding='utf-8') as f: for i, segment in tqdm(enumerate(segments, start=1), desc="生成字幕", total=len(segments)): start = str(timedelta(seconds=int(segment['start']))) + ',000' end = str(timedelta(seconds=int(segment['end']))) + ',000' f.write(f"{i}\n") f.write(f"{start} --> {end}\n") f.write(f"{segment['text'].strip()}\n\n")
添加錯(cuò)誤處理和日志:
import logging import sys # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('subtitle_generation.log'), logging.StreamHandler(sys.stdout) ] ) def main(video_path, output_srt): """帶有完整錯(cuò)誤處理和日志的主函數(shù)""" try: if not os.path.exists(video_path): raise FileNotFoundError(f"視頻文件不存在: {video_path}") logging.info(f"開始處理視頻: {video_path}") # 檢查CUDA device = "cuda" if torch.cuda.is_available() else "cpu" logging.info(f"使用設(shè)備: {device}") # 加載模型 logging.info("加載Whisper模型...") model = whisper.load_model("base", device=device) # 轉(zhuǎn)錄 logging.info("開始轉(zhuǎn)錄...") result = model.transcribe(video_path, language="zh") # 生成字幕 logging.info("生成字幕文件...") generate_srt_with_progress(result["segments"], output_srt) logging.info(f"字幕生成完成: {output_srt}") except FileNotFoundError as e: logging.error(f"文件錯(cuò)誤: {str(e)}") raise except Exception as e: logging.error(f"處理錯(cuò)誤: {str(e)}") raise
如果需要處理長(zhǎng)視頻,可以添加分段處理:
def process_long_video(video_path, output_srt, segment_duration=300): """分段處理長(zhǎng)視頻""" from moviepy.editor import VideoFileClip video = VideoFileClip(video_path) duration = video.duration segments = [] for start in range(0, int(duration), segment_duration): end = min(start + segment_duration, duration) # 提取片段 segment = video.subclip(start, end) temp_audio = f"temp_{start}_{end}.wav" segment.audio.write_audiofile(temp_audio) # 處理片段 result = model.transcribe(temp_audio, language="zh") segments.extend(result["segments"]) # 清理臨時(shí)文件 os.remove(temp_audio) # 生成完整字幕 generate_srt(segments, output_srt) video.close()
Whisper 可以實(shí)現(xiàn)將英文語音翻譯成中文。Whisper 是一個(gè)多語言語音識(shí)別模型,支持語音識(shí)別和翻譯任務(wù),包括將英語語音翻譯成中文。
如何實(shí)現(xiàn)英文語音翻譯成中文:
在使用 Whisper 時(shí),你可以通過以下步驟來實(shí)現(xiàn)英文語音的翻譯:
加載模型并進(jìn)行轉(zhuǎn)錄
使用 whisper.load_model 加載模型(例如,base 或 small 等),然后使用 transcribe 方法來識(shí)別英文語音。為了進(jìn)行翻譯,你需要設(shè)置 task="translate" 參數(shù)。
指定翻譯目標(biāo)語言為中文
設(shè)置 language="en" 來告知模型輸入語言是英語,Whisper 會(huì)自動(dòng)將識(shí)別到的英文語音翻譯成你指定的目標(biāo)語言(中文)。
示例代碼:
import whisper # 加載模型 model = whisper.load_model("base") # 設(shè)置視頻或音頻文件路徑 audio_path = "path_to_audio_or_video" # 進(jìn)行語音翻譯,英文語音翻譯成中文 result = model.transcribe(audio_path, language="en", task="translate") # 打印翻譯結(jié)果 print(result["text"])
解釋:
language="en":告訴 Whisper 輸入的語言是英文。
task="translate":?jiǎn)⒂梅g模式,Whisper 會(huì)將識(shí)別到的英文語音翻譯成中文。
result["text"]:這是翻譯后的中文文本。
注意事項(xiàng):
翻譯質(zhì)量:Whisper 的翻譯能力比較強(qiáng),但它的翻譯質(zhì)量受限于模型的規(guī)模與訓(xùn)練數(shù)據(jù)。因此,翻譯結(jié)果可能不是完美的,特別是針對(duì)某些復(fù)雜的句子或語境。
語音識(shí)別和翻譯:Whisper 結(jié)合了語音識(shí)別與翻譯功能,適合直接從語音中獲得翻譯文本,而不需要分開執(zhí)行語音識(shí)別和翻譯步驟。
總結(jié):
Whisper 能夠處理英文語音,并將其翻譯成中文,直接通過設(shè)置 task="translate" 來實(shí)現(xiàn)。
到此這篇關(guān)于Python+OpenAI Whisper實(shí)現(xiàn)視頻生成字幕的文章就介紹到這了,更多相關(guān)Python視頻生成字幕內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)戰(zhàn)之使用PyQt5構(gòu)建HTTP接口測(cè)試工具
在現(xiàn)代軟件開發(fā)中,測(cè)試接口的有效性與響應(yīng)情況變得尤為重要,本文將指導(dǎo)構(gòu)建一個(gè)簡(jiǎn)單的HTTP接口測(cè)試工具,使用Python的PyQt5庫創(chuàng)建用戶界面,并通過requests庫發(fā)送 HTTP 請(qǐng)求,需要的可以參考下2024-11-11Python利用ROI進(jìn)行圖像合成的問題小結(jié)
圖像的 ROI (region of interest) 是指圖像中感興趣區(qū)域、在 OpenCV 中圖像設(shè)置圖像 ROI 區(qū)域,實(shí)現(xiàn)只對(duì) ROI 區(qū)域操作,本文給大家介紹Python利用ROI進(jìn)行圖像合成的問題小結(jié),感興趣的朋友一起看看吧2021-07-07詳解如何修改jupyter notebook的默認(rèn)目錄和默認(rèn)瀏覽器
這篇文章主要介紹了詳解如何修改jupyter notebook的默認(rèn)目錄和默認(rèn)瀏覽器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01python讀取查看npz/npy文件數(shù)據(jù)以及數(shù)據(jù)完全顯示方法實(shí)例
前兩天從在GitHub下載了一個(gè)代碼,其中的數(shù)據(jù)集是.npz結(jié)尾的文件,之前沒有見過不知道如何處理,下面這篇文章主要給大家介紹了關(guān)于python讀取查看npz/npy文件數(shù)據(jù)以及數(shù)據(jù)完全顯示方法的相關(guān)資料,需要的朋友可以參考下2022-04-04pandas計(jì)算相關(guān)系數(shù)corr返回空的問題解決
本文主要介紹了pandas計(jì)算相關(guān)系數(shù)corr返回空的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01pycharm安裝opencv-python報(bào)錯(cuò)的解決
本文主要介紹了pycharm安裝opencv-python報(bào)錯(cuò)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07詳解python selenium 爬取網(wǎng)易云音樂歌單名
這篇文章主要介紹了python selenium爬取網(wǎng)易云音樂歌單名,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03