草庐IT

基于whisper模型的在线添加视频字幕网站(持续更新)

jiangduwang830 2023-04-18 原文

1.什么是whisper

Whisper 是一个自动语音识别(ASR,Automatic Speech Recognition)系统,OpenAI 通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务(multitask)监督数据对 Whisper 进行了训练。OpenAI 认为使用这样一个庞大而多样的数据集,可以提高对口音、背景噪音和技术术语的识别能力。除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。
本文主要拿该模型做一个音频识别的任务,将视频中的音频转化为文字。

2.项目介绍

主要实现了一个基于Whisper的视频字幕生成工具,具体来说,采用Flask轻量级WEB应用框架实现一个以python为后端,以html为前端的WEB项目,功能比较简单,即为为无字幕的视频添加字幕(仅支持中文、英文、中英文混杂)
网站如图:

操作起来比较简单,点击上传文件按钮上传本地视频文件(mp4或者avi),然后点击提交文件按钮,后端就开始处理。(暂时还未实现前端可视化处理过程)
实现效果:
中文:

英文:

中英文混杂:

这样看效果还可以吧。

3.项目安装

安装项目所需要的python环境

首先python版本必须要3.9以上,否则会报错,其余python的依赖包在项目中的requirements.txt中都有涉及,直接在python3.9的环境下执行:

pip install git+https://github.com/openai/whisper.git 
pip install -r requirements.txt

安装imagemagick

  • windows
    https://www.imagemagick.org/script/download.php#windows
    安装时选择Install development headers and libraries for C and C++。
    安装好之后打开python虚拟环境的moviepy模块下的config_defaults.py文件,修改其中的IMAGEMAGICK_BINARY为imagemagick安装文件夹处的magick.exe地址,如:

IMAGEMAGICK_BINARY = r"D:\python_study_tools\ImageMagick-7.0.9-Q16\magick.exe"

若忘记了安装位置,使用everything来找到相应的位置,其中moviepy一定要是你的虚拟环境的moviepy。

  • ubuntu
    使用指令安装:
apt-get install imagemagick

若报错,更新一下:

apt-get update

然后输入指令:

vim /etc/ImageMagick-6/policy.xml

<policy domain="path" rights="none" pattern="@*" />

改成

<!-- <policy domain="path" rights="none" pattern="@*" /> -->

保存退出即可

修改addSubtitles.py中的font格式

在line68

txt = (TextClip(sentences, fontsize=32,
                font='SimHei', size=(w-20, 40),
                align='center', color='white')
       .set_position((10, h - 80))
       .set_duration(span)
       .set_start(start))

其中的font,该代码在windows正常能执行,没问题。
在ubuntu下报错,因为ubuntu下缺少很多中文类的字节编码,如果这个地方不改,最后出来的视频字幕全是乱码和问号,解决方法:

apt-get install ttf-mscorefonts-installer
apt-get install fontconfig
cd /usr/share/fonts

然后从你的windows中选一个中文字体格式放在这个文件夹下
windows字体文件所在处:C:\Windows\Fonts
然后执行指令:

mkfontscale
mkfontdir
fc-cache -fv

最后将上面addSubtitles.py中的font改成字体的路径就行了。

4.运行项目

在windows或者ubuntu下,打开项目文件,执行app.py文件就行了。在windows上,直接点击那个链接即可;
在服务器上,需要在main函数的app.run()里定义地址与端口,ip地址设为’0.0.0.0’,
在宿主机上运行,需要在浏览器中输入公网ip(关掉梯子)才能访问,自动生成的链接是私网。
若在服务器的docker中运行,在创建docker的时候就要设置好端口映射,若为租的网络服务器,还要去看你的网络服务器开放了哪些tcp端口,随意设置端口还是无法访问。

5.目前存在的问题

  • 项目在服务器运行,总是运行一段时间后,该进程会被自动kill,因此通过那个ip地址访问并上传文件后,点击提交文件会报错
  • 这个项目并没有实现多线程并发,因此同时有多个用户访问的时候,后端一定会无法得到正确的文件名而报错
  • 租的华为云的服务器是最小规格的一核服务器,处理速度很慢,承载力很差,很容易崩溃
  • whisper模型还有很多其他的功能,比如直接语音识别、识别视频中的音频并生成文本文件、语音翻译等功能,网站的功能量还可以继续拓展
  • 前端的下载功能存在缺陷,对于不同的文件下载没有设置不同的链接
  • 字幕和视频合成完全依靠CPU,因此如果视频时长比较长,要跑很久的时候,有时候还没跑完网页就崩溃了,因此不仅是后端的处理和前端的设计都有优化的地方

github项目地址:https://github.com/jiangduwang/addSubtitles.git
网页地址:http://124.70.200.133/
这个网页不保证正在运行,就算运行了也很有可能提交文件的时候出错。

为什么说是持续更新呢,因为完成了眼前的课程任务,我会继续解决这些问题。

有关基于whisper模型的在线添加视频字幕网站(持续更新)的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  6. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  7. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  8. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  9. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  10. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

随机推荐