基于whisper的语音转文字(视频字幕)

文章介绍了如何利用OpenAI的Whisper开源项目来开发一个从音频或视频中提取字幕的软件。作者提供了conda环境配置、模型下载和Python代码示例,支持包括中文在内的语言识别,以及不同音频格式的处理。
部署运行你感兴趣的模型镜像

由于之前在学习油管的视频的时候,发现没有字幕,自己的口语听力又不太好,所以,打算开发一个能够语音或者视频里面,提取出字幕的软件。

在寻找了很多的开源仓库,发现了openai早期发布的whisper

原仓库链接如下

openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision (github.com)https://github.com/openai/whisper首先下载这个仓库,解压后如下图所示:

另外由于,需要对音频进行处理,所以我们还需要下载一个ffempg

然后解压,将bin的文件路径放到环境变量里面去

安装环境我用的anconda的方式去安装的,

一键部署环境可以参考我上传的资源(1积分)

用于whisper的python配置,里面包含environment.yaml文件,可以帮助下载者,快速部署环境资源-优快云文库

使用conda env create -f environment.yaml,就可以快速创建一个conda的虚拟环境了!

也可以使用以下方法配置配置:

首先是

pip install -U openai-whisper

然后再安装

pip install git+https://github.com/openai/whisper.git 

希望能帮到大家。里面还包含了一个python文件运行,代码如下:

import whisper
import io
import time
import os
import json
import pathlib
import torch

# Choose model to use by uncommenting
#modelName = "tiny.en"
#modelName = "base.en"
#modelName = "small.en"
#modelName = "medium.en"
"""在下面这句修改"""
modelName = "model/large-v2.pt"
# device=torch.device('cuda:0'if torch.cuda.is_available() else "cpu")
torch.cuda.empty_cache()
#todo 设置cpu
device=torch.device("cpu")
# Other Variables
exportTimestampData =False # (bool) Whether to export the segment data to a json file. Will include word level timestamps if word_timestamps is True.
outputFolder = "Output"
exportTimevtt=True

#  ----- Select variables for transcribe method  -----
# audio: path to audio file
verbose = False # (bool): Whether to display the text being decoded to the console. If True, displays all the details, If False, displays minimal details. If None, does not display anything
language="Chinese" # Language of audio file
word_timestamps=False # (bool): Extract word-level timestamps using the cross-attention pattern and dynamic time warping, and include the timestamps for each word in each segment.
#initial_prompt="" # (optional str): Optional text to provide as a prompt for the first window. This can be used to provide, or "prompt-engineer" a context for transcription, e.g. custom vocabularies or proper nouns to make it more likely to predict those word correctly.

#  -------------------------------------------------------------------------
print(f"Using Model: {modelName}")
# filePath = input("Path to File Being Transcribed: ")
# filePath = filePath.strip("\"")

filePath = r"F:\CloudMusic\1.mp3"
if not os.path.exists(filePath):
	print("Problem Getting File...")
	input("Press Enter to Exit...")
	exit()

# If output folder does not exist, create it
if not os.path.exists(outputFolder):
	os.makedirs(outputFolder)
	print("Created Output Folder.\n")

# Get filename stem using pathlib (filename without extension)
fileNameStem = pathlib.Path(filePath).stem

vttFileName=f"{fileNameStem}.vtt"
resultFileName = f"{fileNameStem}.txt"
jsonFileName = f"{fileNameStem}.json"

model = whisper.load_model(modelName,device)
start = time.time()

#  ---------------------------------------------------
result = model.transcribe(audio=filePath, language=language, word_timestamps=word_timestamps, verbose=verbose,fp16=False)#将一段MP3分割成多段30s的间隔的视频
#  ---------------------------------------------------

end = time.time()
elapsed = float(end - start)#总的时间
print(result["segments"]) # 保存为.srt文件
# Save transcription text to file
print("\nWriting transcription to file...")
with open(os.path.join(outputFolder, resultFileName), "w", encoding="utf-8") as file:
	file.write(result["text"])
print("Finished writing transcription file.")

# Save the segments data to json file
#if word_timestamps == True:
if exportTimestampData == True:
	print("\nWriting segment data to file...")
	with open(os.path.join(outputFolder, jsonFileName), "w", encoding="utf-8") as file:
		segmentsData = result["segments"]
		json.dump(segmentsData, file, indent=4)
	print("Finished writing segment data file.")
if exportTimevtt==True:
	print("\nWriting segment data to vtt file...")
	with open(os.path.join(outputFolder, vttFileName), "w", encoding="utf-8") as f:
		# 写入第一行
		# f.write("WEBVTT\n\n")
		# 遍历字典中的每个提示
		for cue in result["segments"]:
			# 获取开始时间和结束时间,并转换成vtt格式
			start = cue["start"]
			end = cue["end"]
			start_h = int(start // 3600)
			start_m = int((start % 3600) // 60)
			start_s = int(start % 60)
			start_ms = int((start % 1) * 1000)
			end_h = int(end // 3600)
			end_m = int((end % 3600) // 60)
			end_s = int(end % 60)
			end_ms = int((end % 1) * 1000)
			start_str = f"{start_h:02}:{start_m:02}:{start_s:02}.{start_ms:03}"
			end_str = f"{end_h:02}:{end_m:02}:{end_s:02}.{end_ms:03}"
			# 获取文本内容,并去掉空格和换行符
			text = cue["text"].strip().replace("\n", " ")
			# 写入时间标记和文本内容,并加上空行
			f.write(f"{start_str} --> {end_str}\n")
			f.write(f"{text}\n\n")
	print("Finished writing segment vtt data file.")

elapsedMinutes = str(round(elapsed/60, 2))
print(f"\nElapsed Time With {modelName} Model: {elapsedMinutes} Minutes")

# input("Press Enter to exit...")
exit()

上述可以根据自己需要修改cpu,gpu来运行。

还需要下载模型,是可以在仓库链接里面可以找到的!

方式一、可以修改上面的代码,为large-v2.pt就会开始下载模型,默认是下载到C:\Users\Lenovo\.cache\whisper这个文件夹下面的。

方式二、还可以就是利用cmd命令,(在当前目录下,打开conda的python环境)

然后输入以下指令

whisper audio.mp3 audio.wav --model base --model_dir 指定模型下载路径

经过测试进行了测试,可以实现中文,英文的语音识别,另外还测试了mp4和mp3的语音识别。

在whisper的基础上进行延伸的exe(非原创),效果如下:

初始化,配置模型位置的界面

 

 这个是音频转文字的界面

 这个是麦克风输入,转文字的界面。

这个exe的文件,我上传到csdn有需要的自取。

whisper的Exe文件资源-优快云文库

需要加载模型文件(按照下面仓库链接下载模型文件)

whisper.cpp/models at master · ggerganov/whisper.cpp (github.com)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 一、Whisper 模型简介 Whisper 是 OpenAI 推出的一款先进的语音识别模型,它能够处理多语言语音识别和语音翻译任务[^1]。该模型在大量音频数据集上进行了训练,具备强大的泛化能力和鲁棒性[^2]。此外,Whisper 支持多种应用场景,包括但不限于生成视频字幕、实时语音文字等[^3]。 ### 二、构建基于 Whisper视频字幕自动生成系统 为了实现视频字幕的自动生成,可以按照以下逻辑设计系统架构,并结合代码示例进行说明: #### 1. 环境准备 首先需要安装 Python 和相关依赖库,确保本地环境支持 Whisper 模型运行。以下是所需的主要依赖库: - `whisper`:用于加载和运行 Whisper 模型。 - `ffmpeg`:用于提取视频中的音频流。 - `srt`:用于生成标准的字幕文件(SRT 格式)。 ```bash pip install git+https://github.com/openai/whisper.git ffmpeg-python srt ``` #### 2. 视频到音频的换 通过 `ffmpeg` 提取视频中的音频流,将其保存为适合 Whisper 处理的格式(如 `.wav` 或 `.mp3`)。以下是 Python 脚本示例: ```python import ffmpeg def extract_audio_from_video(video_path, audio_path): try: ( ffmpeg .input(video_path) .output(audio_path, format='wav', acodec='pcm_s16le', ar=16000) .run(overwrite_output=True) ) except ffmpeg.Error as e: print(f"Error occurred: {e}") ``` #### 3. 使用 Whisper 进行语音识别 加载 Whisper 模型并调用其 `transcribe` 方法对音频进行处理。以下是代码示例: ```python import whisper def transcribe_audio(audio_path, model_size="base"): model = whisper.load_model(model_size) result = model.transcribe(audio_path) return result["text"], result["segments"] ``` #### 4. 生成 SRT 字幕文件 将 Whisper 返回的分段结果换为 SRT 格式的字幕文件。以下是实现代码: ```python import srt def segments_to_srt(segments, srt_file_path): subtitle_list = [] for i, segment in enumerate(segments): start_time = segment["start"] end_time = segment["end"] text = segment["text"] subtitle = srt.Subtitle( index=i + 1, start=srt.timedelta(seconds=start_time), end=srt.timedelta(seconds=end_time), content=text.strip() ) subtitle_list.append(subtitle) srt_content = srt.compose(subtitle_list) with open(srt_file_path, "w", encoding="utf-8") as f: f.write(srt_content) ``` #### 5. 将字幕嵌入视频 使用 `ffmpeg` 将生成的 SRT 文件嵌入到原始视频中。以下是代码示例: ```python def embed_srt_into_video(video_path, srt_path, output_path): try: ( ffmpeg .input(video_path) .output(output_path, vf=f"subtitles={srt_path}") .run(overwrite_output=True) ) except ffmpeg.Error as e: print(f"Error occurred: {e}") ``` ### 三、完整流程整合 将上述各部分功能整合为一个完整的脚本,用户只需提供输入视频路径即可完成字幕生成与嵌入。以下是主函数示例: ```python def generate_and_embed_subtitles(video_path, output_path, model_size="base"): # Step 1: Extract audio from video audio_path = "temp_audio.wav" extract_audio_from_video(video_path, audio_path) # Step 2: Transcribe audio using Whisper transcription, segments = transcribe_audio(audio_path, model_size) # Step 3: Convert segments to SRT format srt_path = "output.srt" segments_to_srt(segments, srt_path) # Step 4: Embed SRT into the video embed_srt_into_video(video_path, srt_path, output_path) print(f"Subtitles generated and embedded successfully. Output saved at {output_path}") ``` ### 四、注意事项 - **硬件要求**:Whisper 模型的计算需求较高,建议使用 GPU 加速以提升处理速度[^4]。 - **模型选择**:Whisper 提供了不同大小的模型(如 `tiny`、`base`、`small`、`medium`、`large`),可根据实际需求和硬件性能选择合适的模型。 - **多语言支持**:Whisper 支持多种语言的语音识别,但需确保输入音频的语言与模型配置一致[^3]。 ### 五、总结 通过上述方法,可以利用 Whisper 模型构建一个高效的视频字幕自动生成系统。此系统不仅能够简化视频内容创作过程,还能显著提升用户体验[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Helloorld_11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值