社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

惊呆了,还能这么玩!用Python提取视频课程中的文稿

菜鸟学Python • 5 年前 • 529 次点击  
前段时间办公室出现一奇葩需求,要把一段授课视频转换为文字,为了实现这个目标我四处搜罗找了几款APP进行了多步操作,总体感觉比较麻烦。想想怎么说我们也是玩Python ,为啥不用Python呢~~说干就干,经过一番分析和搜索,还真被我搞定了,下面跟大家分享一下。


01

思路

直接写实现过程可能会有点混乱,就先讲一讲该功能的设计思路吧!

1).提取文字

这次我们的最终目的是要拿到文字稿,在一段视频中真正包含文字信息的其实不是视频文件而是音频文件,这下问题就变成从音频提取文字也就是语音识别。
关于语音转换文字,腾讯/百度/讯飞都提供有自己的API,大家可以根据自己的习惯选用,我用的是百度API,就以此为例进行演示。

接下来就要去查百度的语音识别API文档,看看它对待提取的音频文件有什么要求,下图就是百度的python SDK文档页面:
在这个文档中,对百度语音识别API所支持的音频格式进行了明确,概况起来主要有三点要求:
  • 参数:16k 采样率、16bit 位深、单声道;
  • 格式:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式);
  • 其他:完整语音文件,时长不超过60s。


2).提取音频

音频转文字的技术解决了,接着要解决的就是把目标视频文件转换为百度API所支持的音频(对应的格式、参数)。
从视频中提取音频可以使用FFmpeg,在音频提取过程中还要对音频的采样率、声道数、码率进行设置,同时指定输出音频格式。除此之外,由于百度API最多只支持60秒长度的音频,而我们需要转换的视频长度通常要远高于这个时长,所以还需要使用pydub对音频文件进行切割,然后分段进行文字转换。所以从视频到音频的大概流程应该是这样的:
这下方法就明确了,下面就来看看是如何一步步具体实现视频转文字这个功能的。


02

动手写代码实现



1).视频转音频

前面我们说过,对于一个视频文件需要使用fmpeg转换成音频,fmpeg是一个非常快速的视频和音频转换器,语法格式是这样的:
ffmpeg  -y  -i 16k.wav  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 16k.pcm
上面这条语句的作用是把wav文件转换为16k、16bits位深的单声道pcm文件,其中16k.wav是输入文件、16k.pcm是输出文件,两者之间的内容是输出文件的参数设置。
在python中使用ffmpeg需要借助于ffmpy3这个库,语法格式也要做稍许调整。来看下面这段代码,他的作用是把一段视频转换为wav文件:
  • 其中inputfile是待转换的视频文件,其参数为空;

  • outputfile是输出文件路径,其参数中对采样率、声道数以及文件格式等进行了指定;

  • global_options是全局参数,-y的作用是允许覆盖已有文件;

通过上面这段代码,可以实现整段视频到音频的转换。

2).音频切割

获取完一整段长音频还要进行切割操作。音频切割的关键是找准每一段的起始和结束的时间节点,所以首先我们要获取整个音频文件的总长度,然后以60秒为间隔进行切分,并计算每一段音频开始秒数和结束秒数,然后切割提取。实现这个功能的代码如下:

注:通过以上方法进行切割,可能会存在某一个读音被切分在相邻两段音频中的情况,从而在音频到文字的转换阶段造成误差。

3).音频转文字

现在进入本文的核心环节——文字提取,如果要自己写这个功能的话估计费尽心思也写不出来,但是如果使用各种语音识别API就简单多了,使用百度语音识别API对一段音频(小于60秒)进行文字提取的代码如下,其中的APP_ID、API_KEY和SECRET_KEY需要到百度AI开放平台中注册后才能获取。

上面这段代码中,首先建立一个语音识别对象client,然后调用asr方法完成文字的提取,'dev_pid'参数用来指定音频中的语言类型,1537对应的是纯中文普通话。目前支持的语言类型有以下几种:


4).操作界面

通过上面三个步骤,从视频到文字的转换流程就基本实现了,之后只需要把从每段音频中提取的文字合并到一起输出就可以。

当然,在实现基本功能的基础上,还可以进行一些完善工作,例如每次转换之前我们都需要指定目标视频文件和文本的输出目录,对此可以设计一个简单的UI界面。下图就是用tkinter做的界面,虽然简陋但还算实用。
添加操作界面还有一个好处就是可以用pyinstaller打包成可执行文件,以便分享给办公室的其他同事使用。



03


试一下最终的效果


东西做好了当然要试一试效果,运行程序后在本地选择要提取文字的目标视频,如下图所示:


(选择这个视频,进行文字解析)
选择文本输出目录后点击“转换”就会自动对视频中的内容进行文本提取,下图是提取出的文字内容,结果会以txt文本文件的格式存储到指定的输出目录。
从输出结果来看,提取的内容不止有文字还有标点符号,这个应该是语音识别API根据说话的语气和停顿时间自己判断的。下面这个就是刚才提取文字用的视频文件,大家可以比对一下,总体来说效果还不错。

近期热门:
值得收藏|菜鸟学Python【入门文章大全】
Python里三个最高逼格的调试神器
拍个自拍,让Python告诉你,军训过后你黑了几度?
用Python分析国庆最火的电影,20万数据分析


千人学习群:
小密圈的趣味实战-微信主题
小密圈人气很高的两个实战项目
倒计时2天!千人Python知识星球重大福利,一年仅一次,还剩2天!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47235
 
529 次点击