最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Whisper + Transformers自動(dòng)生成中英文雙語(yǔ)字幕的完整流程

 更新時(shí)間:2025年12月04日 09:47:25   作者:weixin_46244623  
本文將教你如何使用 OpenAI 的 Whisper 語(yǔ)音識(shí)別模型,結(jié)合 HuggingFace Transformers 翻譯模型,實(shí)現(xiàn)從視頻中提取音頻、識(shí)別語(yǔ)音、生成中英雙語(yǔ)字幕的完整流程,需要的朋友可以參考下

引言

本文將教你如何使用 OpenAI 的 Whisper 語(yǔ)音識(shí)別模型,結(jié)合 HuggingFace Transformers 翻譯模型,實(shí)現(xiàn)從視頻中提取音頻、識(shí)別語(yǔ)音、生成中英雙語(yǔ)字幕的完整流程。
支持自動(dòng)語(yǔ)言檢測(cè)、進(jìn)度條顯示、以及自動(dòng)生成 .srt 字幕文件。

一、環(huán)境準(zhǔn)備

在開始之前,請(qǐng)先安裝所需依賴包:

pip install openai-whisper transformers pydub librosa tqdm torch ffmpeg-python modelscope

需要提前安裝 FFmpeg(Windows 用戶請(qǐng)到 ffmpeg.org 下載并配置環(huán)境變量)

二、項(xiàng)目功能概述

本項(xiàng)目實(shí)現(xiàn)的流程如下:

  1. 提取視頻音頻(使用 FFmpeg)
  2. 驗(yàn)證音頻文件是否可用(使用 pydub
  3. 使用 Whisper 模型進(jìn)行語(yǔ)音識(shí)別
  4. 自動(dòng)檢測(cè)音頻語(yǔ)言
  5. 使用 Transformers 翻譯模型進(jìn)行中英文互譯
  6. 生成雙語(yǔ)字幕文件 .srt

三、國(guó)內(nèi)下載模型方法

from modelscope import snapshot_download

# 下載模型到當(dāng)前目錄
model_dir = snapshot_download('Helsinki-NLP/opus-mt-en-zh', cache_dir='./')

print(f"? 模型已下載到當(dāng)前目錄: {model_dir}")

model_dir = snapshot_download('Helsinki-NLP/opus-mt-zh-en', cache_dir='./')

print(f"? 模型已下載到當(dāng)前目錄: {model_dir}")

四、完整代碼(含中文注釋)

import whisper
import warnings
from datetime import timedelta
from tqdm import tqdm
import librosa
import time
from transformers import pipeline
import torch
from pydub import AudioSegment
import os
import ffmpeg

# 忽略警告信息
warnings.filterwarnings("ignore", category=UserWarning)

# 輸入視頻路徑(可修改)
input_video = r"./Gesture Drawing Practice _ 20 and 40 sec. poses.mp4"
# 輸出音頻路徑
output_audio = "Gesture Drawing Practice _ 20 and 40 sec. poses.wav"

# =========================
# Step 1: 提取視頻中的音頻
# =========================
ffmpeg.input(input_video).output(output_audio, ac=1, ar=16000).run()

# =========================
# Step 2: 時(shí)間戳格式化函數(shù)
# =========================
def format_timestamp(seconds):
    """將秒數(shù)轉(zhuǎn)換為 SRT 時(shí)間格式(HH:MM:SS,mmm)"""
    td = timedelta(seconds=seconds)
    hours, remainder = divmod(td.seconds, 3600)
    minutes, seconds = divmod(remainder, 60)
    milliseconds = int(td.microseconds / 1000)
    return f"{hours:02d}:{minutes:02d}:{seconds:02d},{milliseconds:03d}"

# =========================
# Step 3: 驗(yàn)證音頻文件是否有效
# =========================
def validate_audio(audio_file):
    """檢查音頻文件是否有效,并返回其基本信息"""
    try:
        audio = AudioSegment.from_file(audio_file)
        duration = len(audio) / 1000.0  # 秒
        sample_rate = audio.frame_rate
        channels = audio.channels
        print(f"? 音頻驗(yàn)證成功:時(shí)長(zhǎng)={duration:.2f}s, 采樣率={sample_rate}Hz, 聲道={channels}")
        return True, duration
    except Exception as e:
        print(f"? 音頻驗(yàn)證失敗: {e}")
        return False, 0

# =========================
# Step 4: 初始化翻譯模型
# =========================
print("?? 正在加載翻譯模型,請(qǐng)稍候...")
translator_en_to_zh = pipeline("translation", model="./Helsinki-NLP/opus-mt-en-zh")  # 英譯中
translator_zh_to_en = pipeline("translation", model="./Helsinki-NLP/opus-mt-zh-en")  # 中譯英
print("? 翻譯模型加載完成。")

# =========================
# Step 5: 驗(yàn)證音頻文件
# =========================
audio_file = output_audio
is_valid, duration = validate_audio(audio_file)
if not is_valid:
    raise ValueError(f"無(wú)效的音頻文件: {audio_file}")

# 備用方案:使用 librosa 檢查時(shí)長(zhǎng)
try:
    duration = librosa.get_duration(path=audio_file)
except Exception as e:
    print(f"Librosa 檢查失敗: {e}")

# =========================
# Step 6: 初始化 Whisper 模型
# =========================
print("??? 正在加載 Whisper 模型...")
try:
    model = whisper.load_model("base")  # 可選 tiny, base, small, medium, large
except Exception as e:
    print(f"加載模型失敗: {e},回退到 'medium' 模型。")
    model = whisper.load_model("medium")

# 進(jìn)度條初始化
progress_bar = tqdm(total=100, desc="語(yǔ)音識(shí)別中", unit="%")

# =========================
# Step 7: 執(zhí)行語(yǔ)音識(shí)別(帶進(jìn)度)
# =========================
def transcribe_with_progress(model, audio_file, language=None):
    start_time = time.time()
    
    # 自動(dòng)檢測(cè)語(yǔ)言
    if language is None:
        try:
            audio = whisper.load_audio(audio_file)
            mel = whisper.log_mel_spectrogram(audio, n_mels=80).to(model.device)
            _, probs = model.detect_language(mel)
            detected_language = max(probs, key=probs.get)
            print(f"?? 自動(dòng)檢測(cè)語(yǔ)言: {detected_language}")
        except Exception as e:
            print(f"語(yǔ)言檢測(cè)失敗: {e},默認(rèn)使用英語(yǔ)(en)。")
            detected_language = "en"
    else:
        detected_language = language
        print(f"?? 使用指定語(yǔ)言: {detected_language}")
    
    # 執(zhí)行轉(zhuǎn)錄
    try:
        result = model.transcribe(audio_file, language=detected_language)
    except Exception as e:
        print(f"轉(zhuǎn)錄失敗: {e}")
        raise
    
    # 更新進(jìn)度條
    progress_bar.update(100 - progress_bar.n)
    progress_bar.close()
    
    elapsed_time = time.time() - start_time
    print(f"? 轉(zhuǎn)錄完成,用時(shí) {elapsed_time:.2f} 秒。")
    
    return result, detected_language

# 執(zhí)行轉(zhuǎn)錄(可指定語(yǔ)言)
result, detected_language = transcribe_with_progress(model, audio_file, language="en")

# =========================
# Step 8: 生成中英雙語(yǔ)字幕文件
# =========================
srt_path = f"{output_audio}.srt"
with open(srt_path, "w", encoding="utf-8") as f:
    for i, segment in enumerate(result["segments"]):
        start_time = format_timestamp(segment["start"])
        end_time = format_timestamp(segment["end"])
        text = segment["text"].strip()
        
        # 判斷語(yǔ)言并翻譯
        if detected_language == "zh":
            # 中文音頻:原文中文 + 翻譯英文
            zh_text = text
            en_text = translator_zh_to_en(text)[0]["translation_text"]
        else:
            # 英語(yǔ)音頻:原文英文 + 翻譯中文
            zh_text = translator_en_to_zh(text)[0]["translation_text"]
            en_text = text
        
        # 寫入 SRT 文件(中文在上,英文在下)
        f.write(f"{i+1}\n")
        f.write(f"{start_time} --> {end_time}\n")
        f.write(f"{zh_text}\n{en_text}\n\n")

print(f"?? 字幕文件生成成功:{srt_path}")

執(zhí)行效果后

srt文件

五、完成效果

以上就是Python使用Whisper + Transformers自動(dòng)生成中英文雙語(yǔ)字幕的完整流程的詳細(xì)內(nèi)容,更多關(guān)于Python Whisper中英文雙語(yǔ)字幕的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 通過(guò)selenium抓取某東的TT購(gòu)買記錄并分析趨勢(shì)過(guò)程解析

    通過(guò)selenium抓取某東的TT購(gòu)買記錄并分析趨勢(shì)過(guò)程解析

    這篇文章主要介紹了通過(guò)selenium抓取某東的TT購(gòu)買記錄并分析趨勢(shì)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python?自定義裝飾器使用及原理詳解(最新推薦)

    python?自定義裝飾器使用及原理詳解(最新推薦)

    本文詳細(xì)介紹了Python裝飾器的原理和使用方法,包括簡(jiǎn)單的裝飾器、帶參數(shù)的裝飾器、原函數(shù)的傳參、保留原函數(shù)元數(shù)據(jù)以及類裝飾器,通過(guò)這些講解,讀者可以全面了解裝飾器的強(qiáng)大功能和應(yīng)用技巧,感興趣的朋友一起看看吧
    2025-02-02
  • 對(duì)命令行模式與python交互模式介紹

    對(duì)命令行模式與python交互模式介紹

    今天小編就為大家分享一篇對(duì)命令行模式與python交互模式介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python自動(dòng)化完成tb喵幣任務(wù)的操作方法

    Python自動(dòng)化完成tb喵幣任務(wù)的操作方法

    2019雙十一,tb推出了新的活動(dòng),商店喵幣,看了一下每天都有幾個(gè)任務(wù)來(lái)領(lǐng)取喵幣,從而升級(jí)店鋪賺錢,然而我既想賺紅包又不想干苦力,遂使用python來(lái)進(jìn)行手機(jī)自動(dòng)化操作,需要的朋友跟隨小編一起看看吧
    2019-10-10
  • PySide和PyQt加載ui文件的兩種方法

    PySide和PyQt加載ui文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了PySide和PyQt加載ui文件的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python 使用指定的網(wǎng)卡發(fā)送HTTP請(qǐng)求的實(shí)例

    Python 使用指定的網(wǎng)卡發(fā)送HTTP請(qǐng)求的實(shí)例

    今天小編就為大家分享一篇Python 使用指定的網(wǎng)卡發(fā)送HTTP請(qǐng)求的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python+PyQt5開發(fā)一個(gè)截圖工具

    Python+PyQt5開發(fā)一個(gè)截圖工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python和PyQt5開發(fā)一個(gè)截圖工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Python實(shí)現(xiàn)批量自動(dòng)化處理圖像的完整指南

    Python實(shí)現(xiàn)批量自動(dòng)化處理圖像的完整指南

    在日常辦公中,我們經(jīng)常需要處理大量圖像,本文將介紹兩個(gè)強(qiáng)大的Python圖像處理庫(kù)Pillow和OpenCV,展示如何使用它們實(shí)現(xiàn)各種圖像處理自動(dòng)化任務(wù),希望對(duì)大家有所幫助
    2026-01-01
  • pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn)

    pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn)

    這篇文章主要介紹了pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python爬蟲實(shí)現(xiàn)使用beautifulSoup4爬取名言網(wǎng)功能案例

    Python爬蟲實(shí)現(xiàn)使用beautifulSoup4爬取名言網(wǎng)功能案例

    這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)使用beautifulSoup4爬取名言網(wǎng)功能,結(jié)合實(shí)例形式分析了Python基于beautifulSoup4模塊爬取名言網(wǎng)并存入MySQL數(shù)據(jù)庫(kù)相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

高安市| 卓资县| 利津县| 威宁| 龙南县| 布拖县| 翁牛特旗| 金川县| 陆良县| 尖扎县| 都江堰市| 沐川县| 尼玛县| 镇原县| 广元市| 安陆市| 项城市| 宁城县| 墨竹工卡县| 桑植县| 通江县| 高密市| 乌鲁木齐县| 雅江县| 巴彦淖尔市| 铜陵市| 晋城| 贵南县| 泰兴市| 德阳市| 宿松县| 思茅市| 潮州市| 吉木乃县| 甘泉县| 呼图壁县| 临邑县| 额敏县| 高州市| 克什克腾旗| 通道|