人工智能

您所在的位置:网站首页 能自动生成字幕的播放器app 人工智能

人工智能

2024-04-04 00:54| 来源: 网络整理| 查看: 265

文章目录 前言流程安装ffmpeg安装python包测试模型——对视频使用语音模型生成srt字幕,拖入视频播放器中将srt拖入视频,输出

前言

最近打开百度网盘,看到播放视频有一个AI字幕功能,心情非常激动,看视频的同时可以看自动生成的字幕,防止听不清视频中人物的话语 然而不是SVIP,我试用过了之后就没有这个功能选项了 我在想,如果随便哪一个“免费”播放器,都可以一边播放视频,一边生成字幕,外文自动翻译,那不是牛哄哄? 看教程,看视频都可以方便很多,因为语音太杂了,听完后有时还要猜视频中的人物说的什么,尤其是倍速情况下,有了自动生成的字幕之后,都不再是问题 问题是如何达到这一点?当然喽,重点是免费,高效 当然,我已经实现了,Follow me! 文件都在这里,下载好文件一步步来就可以了 配置环境:

系统: win10ffmpeg:ffmpeg-5.1.2-essentials_build.zippython:3.8.8python包: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文件是否是单通道,测试中发现格式工厂使用高质量输出可以,保持原采样率,如果降低质量则识别失败,使用中保持原始采样率即可,单改通道

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拖入视频,输出

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3