Ubuntu环境使用 Whisper 与 ZhipuAI 实现本地批量视频转录与文本标点复原(本地亲测可用)

使用 Whisper 与 ZhipuAI 实现批量视频转录与文本标点添加

在本篇博客中,我们将介绍一个实用的项目,帮助初学者了解如何使用 Whisper 和 ZhipuAI 的 API 来进行视频转录和文本处理。这个项目主要功能是将视频转录成文本,并利用大语言模型为转录文本添加标点符号,整个过程都是自动化完成的。

项目背景--傻瓜式实现完整文件夹内视频一键转录为文本!

随着视频内容的不断增加,手动对视频中的对话进行转录是一项耗时且枯燥的任务。本项目利用了 OpenAI 提供的 Whisper 模型,它是一个强大的自动语音识别(ASR)工具,可以自动将音频转录为文本。随后,为了使转录后的文本更加流畅,我们利用了智谱 AI 的 GLM4 模型来为文本添加标点符号。

这个工具能够批量处理视频文件,适合那些需要自动生成视频字幕或对视频内容进行文本分析的开发者。尤其对于 IT 新手来说,本项目可以帮助大家理解多线程处理、GPU 使用、API 调用等内容。

项目依赖与准备

在开始之前,你需要确保以下依赖已经安装:

  • Python 3.8 或更高版本
  • CUDA(如果你希望使用 GPU 加速)
  • Whisper
  • ffmpeg
  • tqdm(用于进度条显示)
  • psutil(用于内存监控)
  • zhipuai(用于调用智谱 AI 的 API)

1、安装依赖

你可以通过以下命令来安装必要的 Python 库:

sh 复制代码
pip install torch whisper ffmpeg-python tqdm psutil zhipuai

此外,请确保你已经安装了 ffmpeg

可参考我的安装ffmpeg教程

2、免费获取并使用智谱API

前往https://www.bigmodel.cn/ 注册,获取免费API。

3、如何运行这个项目

  1. 克隆或下载项目代码,确保所有依赖已经安装。

  2. 修改代码中的 api_key 为你自己的智谱 AI API 密钥。

    client = ZhipuAI(api_key="your_api_key")

  3. 将你要处理的视频文件放入指定文件夹中,并修改对应路径。

    设定视频文件夹路径

    video_folder_path = Path("/hy-tmp")

  4. 运行脚本即可开始批量处理视频。

sh 复制代码
python transcribe_videos.py

项目代码解析--学习分享

1. 导入依赖并设置设备

在项目中,我们首先导入了所有需要的 Python 库。通过 torch.cuda.device_count() 来判断是否有可用的 GPU,从而决定是使用 GPU 还是 CPU 来进行计算。

python 复制代码
import torch
available_gpus = torch.cuda.device_count()
use_gpu = available_gpus > 0
device = "cuda" if use_gpu else "cpu"

2. 设置线程和初始化任务队列

项目中使用了 threadingThreadPoolExecutor 来实现多线程处理。具体来说,为每个 GPU 分配了 2 个线程,如果是 CPU,则只使用一个线程。任务队列用于存放需要处理的视频文件。

python 复制代码
from queue import Queue
import threading

threads_per_gpu = 2 if use_gpu else 1
num_threads = max(available_gpus * threads_per_gpu, 1)
task_queue = Queue()
completion_task_queue = Queue()

3. 初始化 Whisper 模型并转录视频

使用 Whisper 模型将视频的音频内容提取并转录为文本。如果音频文件已经存在,则跳过提取步骤,从而节省时间。

python 复制代码
import whisper
import subprocess

model = whisper.load_model("large", device=device)
def transcribe_video(video_path):
    audio_path = video_path.with_suffix(".mp3")
    if not audio_path.exists():
        subprocess.run(["ffmpeg", "-i", str(video_path), "-ar", "16000", "-ac", "1", "-q:a", "2", str(audio_path)], check=True)
    result = model.transcribe(str(audio_path), language="zh", task="transcribe")
    return result["text"]

4. 使用 GLM4 添加标点符号

对于标点符号的添加,项目使用了智谱 AI 的 GLM4 模型。由于大段文本可能超过 API 限制,因此将文本分割成多个小段来处理,然后合并所有的标点结果。

python 复制代码
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="your_api_key")

def add_punctuation_glm4(text, max_chunk_size=2048):
    chunks = [text[i:i + max_chunk_size] for i in range(0, len(text), max_chunk_size)]
    punctuated_text = ""
    for chunk in chunks:
        response = client.chat.completions.create(
            model="glm-4-plus",
            messages=[{"role": "user", "content": chunk}],
            stream=True,
        )
        for res in response:
            punctuated_text += res.choices[0].delta.content
    return punctuated_text

5. 批量处理视频文件

通过递归的方式遍历文件夹中的视频文件,将每个视频文件放入任务队列,并使用多线程进行处理。这样可以显著提高处理速度。

python 复制代码
from concurrent.futures import ThreadPoolExecutor

def transcribe_folder(folder_path):
    folder = Path(folder_path)
    video_files = list(folder.rglob("*.mp4"))
    for video_file in video_files:
        task_queue.put(video_file)
    with ThreadPoolExecutor(max_workers=num_threads) as executor:
        for _ in range(num_threads):
            executor.submit(worker_thread)

注意事项

  • GPU 使用:如果你有可用的 GPU,Whisper 会自动利用 GPU 来加速转录过程。如果没有 GPU,则使用 CPU,但处理速度会慢很多。
  • 内存检查:项目中加入了内存检查功能,确保系统不会因为内存不足而崩溃。
  • API 调用限制:智谱 AI 的 API 可能会有调用次数或并发限制,因此在使用时要注意合理分配。
  • 多线程:目前建议指定单线程运行,多线程不稳定(不修改项目代码默认项目线程为1)。

总结

通过本项目,你可以了解到如何利用开源的自动语音识别工具(如 Whisper)和大语言模型(如 GLM4)来实现批量视频转录和文本处理。这些工具和技术的结合不仅简化了转录和标点添加的过程,还展示了多线程处理在实际项目中的应用。

希望这个项目能帮助你更好地理解视频处理自动化的相关技术,欢迎大家留言讨论或提出改进建议!

相关推荐
pk_xz12345642 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强44 分钟前
Linux之sed命令详解
linux·运维·服务器
昨日之日20063 小时前
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
人工智能·whisper·语音识别
Lary_Rock3 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面5 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零8 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
小林熬夜学编程9 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法