前言
最近打开百度网盘,看到播放视频有一个AI字幕功能,心情非常激动,看视频的同时可以看自动生成的字幕,防止听不清视频中人物的话语
然而不是SVIP,我试用过了之后就没有这个功能选项了
我在想,如果随便哪一个“免费”播放器,都可以一边播放视频,一边生成字幕,外文自动翻译,那不是牛哄哄?
看教程,看视频都可以方便很多,因为语音太杂了,听完后有时还要猜视频中的人物说的什么,尤其是倍速情况下,有了自动生成的字幕之后,都不再是问题
问题是如何达到这一点?当然喽,重点是免费,高效
当然,我已经实现了,Follow me!
文件都在这里,下载好文件一步步来就可以了
配置环境:
- 系统: win10
- ffmpeg:ffmpeg-5.1.2-essentials_build.zip
- python:3.8.8
- python包:vosk-0.3.45-py3-none-win_amd64.whl
- 语音模型:vosk-model-cn-0.22
流程
设想这样一个情景,向视频播放器中塞进一个语音转文字模型,当它加载视频流的时候,一边提前读取视频流,用语音模型生成字幕,一遍播放已经生成字幕的视频,不就是如此吗?
先安装相关文件
安装ffmpeg
https://ffmpeg.org/download.html
这是官网
安装就是解压而已,然后在系统变量中添加文件中的bin路径
然后cmd输入命令,查看是否已经识别
ffmpeg –version
安装python包
自己从官网下再安装 https://pypi.org/
vosk-0.3.45-py3-none-win_amd64.whl放到目录下,
pip install vosk-0.3.45-py3-none-win_amd64.whl
测试模型——对视频使用语音模型生成srt字幕,拖入视频播放器中
官网 模型文件下载地址https://alphacephei.com/vosk/models
先生成字幕文件
将想要识别语言类别的对应模型解压,想要识别中文语音就用中文模型,英文就用英文模型,日文就用日文模型等
需要注意的是先将视频文件,转成单通道wma语音文件,语音模型是对wma文件识别的,抛弃了对语音识别无用的图像信息
这里有一个自动的srt字幕生成,只需要将视频文件所在的目录设置好,就可以了,它可以为目录下所有的mp4文件生成srt字幕
from moviepy.editor import *
from moviepy.audio.fx.all import audio_left_right
from moviepy.audio.AudioClip import AudioArrayClip
import time
def list_files(path):
fileMP4List = []
fileSRTList = []
count=1
# 遍历目录下的所有文件和子目录,并输出
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith("mp4"):
fileMP4List.append([count,os.path.join(root, file)])
count=count+1
if file.endswith("srt"):
fileSRTList.append(os.path.join(root, file)[:-4])
for i in range(len(fileMP4List)):
if fileMP4List[i][1][:-4] in fileSRTList:
fileMP4List[i][1]+=" 已有srt"
return fileMP4List
def getWav(videoPath):
print("提取音频")
clip = VideoFileClip(videoPath)
audio = clip.audio
# 将音频转换为单通道
audio_array = audio.to_soundarray()
audio_left_right(audio_array)
# 获取音频剪辑的持续时间
duration = audio.duration
# 将单通道音频转换为音频剪辑对象
audio_mono = AudioArrayClip(audio_array, fps=audio.fps)
newWavePath=videoPath[:-4]+'.wav'
# 保存音频为WAV文件
audio_mono.write_audiofile(newWavePath)
print("音频生成完成,准备输出srt")
return newWavePath
def getSrt(newWavePath):
print("提取srt中...")
print("开始加载识别模型")
import subprocess
import os
import sys
from vosk import Model, KaldiRecognizer, SetLogLevel
SAMPLE_RATE = 16000
SetLogLevel(-1)
# 解压的模型文件,英文,中文用对应model
getCn=r"D:\Mycode\pythonCode\voice_txt\code\model\cn\vosk-model-cn-kaldi-multicn-0.15"
getCn1=r"D:\Mycode\pythonCode\voice_txt\code\model\cn\vosk-model-cn-0.22"
getJP=r"D:\Mycode\pythonCode\voice_txt\code\model\jp\vosk-model-ja-0.22"
getEn=r"D:\Mycode\pythonCode\voice_txt\code\model\en\vosk-model-en-us-0.42-gigaspeech"
model = Model(getCn)
print("模型加载完毕,开始识别...")
rec = KaldiRecognizer(model, SAMPLE_RATE)
# 修改需要识别的语音文件路径
wavPath=newWavePath
rec.SetWords(True)
result = []
with subprocess.Popen(["ffmpeg", "-loglevel", "quiet", "-i",
wavPath,
"-ar", str(SAMPLE_RATE) , "-ac", "1", "-f", "s16le", "-"],
stdout=subprocess.PIPE).stdout as stream:
word=rec.SrtResult(stream)
result.append(word)
print(word)
print(result)
# 生成srt文件
output = open(wavPath[:-4]+'.srt','w')
output.write("\n".join(result))
output.close()
print("srt输出完成")
os.remove(wavPath)
while(1):
# 列出当前目录下的所有文件和子目录
filePath = r"E:"
allFile = list_files(filePath)
for i in range(0, len(allFile)):
if "已有srt" in allFile[i][1]:
pass
else:
videoPath = allFile[i][1]
print("开始识别的文件为:"+videoPath)
try:
getSrt(getWav(videoPath))
except:
pass
time.sleep(3)
# print("序号:" + str(allFile[i][0]) + " 路径:" + str(allFile[i][1]))
# orderNumber = input("请选择视频文件\n")
# videoPath = allFile[int(orderNumber) - 1][1]
# print("srt生成预备中...")
# getSrt(getWav(videoPath))
如果想要单条,可以麻烦点手动,下面这个是以前的,手动将视频转成声音文件,上面的是升级过的,自动在代码里转化了
古老的:
格式工厂
将代码中的音频文件换一下位置,模型文件换个解压好的名字,等待输出就行了
如果报错wma非pcm开头等等,请确认一下wma文件是否是单通道,测试中发现格式工厂使用高质量输出可以,保持原采样率,如果降低质量则识别失败,使用中保持原始采样率即可,单改通道文章来源:https://www.toymoban.com/news/detail-539086.html
import subprocess
import os
import sys
from vosk import Model, KaldiRecognizer, SetLogLevel
SAMPLE_RATE = 16000
SetLogLevel(-1)
# 解压的模型文件,英文,中文用对应model
model = Model(r"C:\Users\Administrator\MyFileLi\AIPrograms\model_cn")
rec = KaldiRecognizer(model, SAMPLE_RATE)
# 修改需要识别的语音文件路径
wavPath=r"D:\FFOutput\课时1.wma"
rec.SetWords(True)
result = []
with subprocess.Popen(["ffmpeg", "-loglevel", "quiet", "-i",
wavPath,
"-ar", str(SAMPLE_RATE) , "-ac", "1", "-f", "s16le", "-"],
stdout=subprocess.PIPE).stdout as stream:
result.append(rec.SrtResult(stream))
print(result)
# 生成srt文件
output = open(wavPath.split("\\")[-1].split(".")[:-1][0]+'.srt','w')
output.write("\n".join(result))
output.close()
将srt拖入视频,输出
文章来源地址https://www.toymoban.com/news/detail-539086.html
到了这里,关于人工智能——离线情况下自动给视频添加字幕,支持中文,英文,日文等等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!